一個簡單的例子是編寫一個能夠註冊,保存社區成員信息和簡單電子錢包功能的帳戶合約javascript
pragma solidity ^0.4.24;
import "./SafeMath.sol";//開源的安全操做unit256的合約
contract Account{
using SafeMath for uint256;
//新成員建立事件
event NewMember(string _name, string _avator);
//成員信息結構
struct Member {
string name;//名字
string avatar;//頭像
bool isExist;//是否註冊
uint256 balance;//可週轉餘額
}
//地址到成員信息的mapping
mapping(address => Member) internal addressToMember;
//限制調用的條件
modifier onlyMemberOf(address _from){
require(addressToMember[_from].isExist);
_;
}
// 註冊
function registerMember(string _name, string _avatar) public {
require(!isMemberOf());
addressToMember[msg.sender] = Member(_name, _avatar, true, 0);
emit NewMember(_name, _avatar);
}
// 判斷是否註冊
function isMemberOf() public view returns (bool) {
return addressToMember[msg.sender].isExist;
}
// 獲取我的信息
function getMemberInfo() public view onlyMemberOf(msg.sender) returns (string name, string avatar, uint256 balance) {
return (addressToMember[msg.sender].name,addressToMember[msg.sender].avatar, addressToMember[msg.sender].balance);
}
//獲取當前合約中的總餘額
function getTotalBalance() public view returns (uint256) {
return address(this).balance;
}
//取出可週轉餘額
function withdraw(uint256 amount) public onlyMemberOf(msg.sender) returns (uint256) {
require(address(this).balance >= amount);
addressToMember[msg.sender].balance = addressToMember[msg.sender].balance.sub(amount);
msg.sender.transfer(amount);
return addressToMember[msg.sender].balance;
}
}
複製代碼
$ geth --identity "MY Etherum" --rpc --rpccorsdomain "*" --datadir data --port "8545" --rpcapi "db,eth,net,web3,personal" --networkid 666 console
複製代碼
$ npm install -g -production windows-build-tools
$ npm install -g ganache-cli
$ npm install -g truffle
$ npm install -g vue-cli
複製代碼
$ vue init webpack ecourse // vue init webpach + 你的項目名
$ cd ecourse
$ npm install --save element-ui vue-router vuex web3@1.0.0-beta.36 web3-net@1.0.0-beta.36
複製代碼
具體的配置能夠參考博客使用 Web3 和 Vue.js 來建立你的第一個以太坊 dAPP,這裏我主要指出使用web3 1.0 標準的不一樣配置vue
import Web3 from 'web3'
let getWeb3 = new Promise(function (resolve, reject) {
var web3js = window.web3;
var web3Provider;
if (typeof web3js !== 'undefined') {
web3Provider = web3js.currentProvider;
} else {
web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:7545');
}
var web3 = new Web3(web3Provider);
resolve({
injectedWeb3: web3.eth.net.isListening(), // 新的api
web3() {
return web3
}
})
})
.then(result => {
return new Promise(function (resolve, reject) {
result.web3().eth.net.getId((err, networkId) => { // 新的api
if(err) {
reject(new Error('Unable to retrieve network ID'))
} else {
console.log('retrieve newworkId: ' + networkId)
result = Object.assign({}, result, {networkId})
resolve(result)
}
})
})
})
.then(result => {
return new Promise(function (resolve, reject) {
result.web3().eth.getCoinbase((err, coinbase) => {
if(err) {
reject(new Error('Unable to retrieve coinbase'))
} else {
coinbase = result.web3().utils.toChecksumAddress(coinbase);
console.log('retrieve coinbase: '+ coinbase);
result = Object.assign({}, result, {coinbase});
resolve(result)
}})
})
});
export default getWeb3
複製代碼
import Web3 from 'web3'
import {store} from '../store/'
let web3 = window.web3;
web3 = new Web3(web3.currentProvider);
web3.currentProvider.publicConfigStore.on('update', ({selectedAddress, networkVersion}) => {
store.dispatch('pollWeb3', {
coinbase: selectedAddress
})
});
複製代碼
import Web3 from 'web3'
import {address, ABI} from './constant/ecourse_abi'
import {store} from '../store/'
let getContract = new Promise(function(resolve, reject) {
let web3 = new Web3(window.web3.currentProvider);
let ecourseContractInstance = new web3.eth.Contract(ABI, address);//新的api
if (!ecourseContractInstance) {
reject("no contract instance build")
}
resolve(ecourseContractInstance);
});
export default getContract
複製代碼
async beforeCreate() {
if(!this.$store.state.web3.web3Instance) {
await this.$store.dispatch('registerWeb3');
await this.$store.dispatch('getContractInstance');
}
},
複製代碼
// 爲避免報錯,能夠在調用合約函數以前,進行一個判斷
if(typeof this.$store.state.contractInstance !== "function") {
await this.$store.dispatch('getContractInstance');
}
// 一個調用函數的例子
this.$store.state.contractInstance().methods.withdraw(this.formInline.balance)
.send({from:this.$store.state.web3.coinbase, gas: 300000})
.on('receipt', receipt => {
this.$message('取款成功');
})
.on('error', error => {
this.$message('取款失敗');
})
// 另外一個調用函數的例子
this.$store.state.contractInstance().methods.getMemberInfo()
.call({from: state.web3.coinbase}) //注意!!!!!from不能省略,由於metamask默認的msg.sender是accounts[0]
.then(res => {
console.log('account info: ' + res);
})
.catch(error => {
console.log(error);
})
複製代碼
個人項目地址:Github
有問題,能夠隨時提問java