智能合约
Solidity smart contract wrapper
1 创世区块

1.1 创世区块文件genesis.json
{
"config":{
"chainId":15,
"homesteadBlock":0,
"eip155Block":0,
"eip158Block":0
},
"coinbase":"0x0000000000000000000000000000000000000000",
"difficulty":"0x40000",
"extraData":"",
"gasLimit":"0xffffffff",
"nonce":"0x0000000000000042",
"mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp":"0x00",
"alloc":{
}
}
1.2 执行创建创世区块命令
geth --datadir "privateChain" init genesis.json
1.3 进入控制台

(下次可直接进入控制台)
geth --datadir "privateChain" console
输入exit可以退出控制台。
1.4 查看账户信息
personal.listAccounts
或者
eth.accounts
1.5 创建账户
1.5.1 创建一个账户。密码设置为789
personal.newAccount("passowrd")
1.5.2 同时会输出地址
0xc4d205f1d0c0edcc1c69390a96b6fe16c6cf65c4
1.5.3 定义一个变量addr0
,方便后面使用
addr0 = "0xc4d205f1d0c0edcc1c69390a96b6fe16c6cf65c4"
1.5.4 再创建一个账号
personal.newAccount("passowrd")
1.5.5 同时会输出其地址
0xe8c48bf1c6ad70a8751898da6a898bfcec7e1334
1.5.6 定义一个变量addr1
,方便后面使用
addr1 = "0xe8c48bf1c6ad70a8751898da6a898bfcec7e1334"

1.6 查询余额
web3.eth.getBalance(addr0)
或者
eth.getBalance(eth.accounts[0])
现在查询到的余额为0
2 挖矿
开始挖矿
miner.start()
挖一个区块
admin.sleepBlocks(1)
停止挖矿
miner.stop()
2.1 同步执行上述代码
miner.start();admin.sleepBlocks(1);miner.stop()
产生一个区块3分多钟,一个区块奖励5个ETH

2.2 再次查询余额
eth.getBalance(eth.accounts[0])

addr0
的余额为5000000000000000000
wei,即5ETH[图片上传失败...(image-f1b3a-1571224710528)]
3 转账
3.1 创建一个金额变量amount
,额度为1个ETH,转账的以wei
作为基本单位
amount = web3.toWei(1)
3.2 从addr0
转给addr1
1一个ETH
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
出现一个错误,解锁即可

3.3 解锁出账账户,解锁时需要密码789
personal.unlockAccount(eth.accounts[0])

或者
personal.unlockAccount(eth.accounts[0],"789");
或者,也可以为账号设置解锁有效时间10000秒,传第3个参数,秒级参数,如:
personal.unlockAccount(eth.accounts[0],"789",10000);
3.4 紧接着查询转账后的余额

结果余额并没有变动。
一笔交易发送出去,并不会立即返回交易的变动信息。需要区块打包完成后,才能查询到结果。
3.5 需要挖矿打包这笔交易,将这笔交易信息打包到新的区块中。
miner.start();admin.sleepBlocks(1);miner.stop()

那个null
是个什么鬼。。。。
3.6 再次查询余额,发现新的区块打包后,又把奖励给了addr0

addr1 = 1000000000000000000
(18个0)
addr0 = 9000000000000000000
(18个0)
4 合约部署
在部署合约前需要先解锁账户(就像银行转账要输入密码一样),解锁操作参考 3.3小节。
解锁成功后,账户就准备完毕啦,接下来就是编写合约代码。
4.1 编写合约代码
pragma solidity ^0.4.0;
contract SimpleStorage {
uint storedData;
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
}
在浏览器中编译合约代码

var simplestorageContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]);
var simplestorage = simplestorageContract.new(
{
from: web3.eth.accounts[1],
data: '0x6060604052341561000f57600080fd5b60d38061001d6000396000f3006060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c14606e575b600080fd5b3415605857600080fd5b606c60048080359060200190919050506094565b005b3415607857600080fd5b607e609e565b6040518082815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a723058205716ac70f9ebadb10d8a3d10a0b40b9abbf4343f3c709084b86d9f129c9709500029',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
部署成功后,控制台输出如下
Contract mined! address: 0x0ebb2886e4c38e4ed7a0ba43fe6cee46939c7d8a transactionHash: 0x4344ee2d82f1193aa98ee2d9d40a48504de0967e05403cf728171f290ced723b
现在我们查看下新账户的余额,可以看到余额有所变化
eth.getBalance(eth.accounts[1])
调用合约函数
simplestorage.set()
simplestorage.get()
网友评论