geth部署并调用智能合约
ben 2018-07-01
eth
solidity
# 1.安装geth客户端(以mac为例)
brew tap ethereum/ethereum
brew install ethereum
# 2.启动以太坊开发者节点
geth --datadir devNet --dev console 2>> test.log
其中: –dev:启用开发者网络(模式),开发者网络会使用POA共识,默认预分配一个开发者账户并且会自动开启挖矿 –datadir:后面的参数是区块数据及秘钥存放目录。 第一次输入命令后,它会放在当前目录下新建一个devNet目录来存放数据。 console:进入控制台 >2>> test.log:表示把控制台日志输出到test.log文件
# 3.创建一个新的账户并转1个eth到该账户中
# 查看该节点下的账户信息(开发者模式下会默认分配一个有余额的账户):
eth.accounts
personal.listAccounts
# 查看账户余额
eth.getBalance(eth.accounts[0])
# 新建一个账户
personal.newAccount("ahxiao") # 该命令会创建一个新的账户,账户密码为ahxiao
# 此时再查看节点中的账户,会发现多了一个账户,以列表的形式展示,查该账户的余额为0
# 默认的账户给新的账户转帐1个以太币
eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value: web3.toWei(1, "ether")})
# 4.准备工作做好了,接下来就是部署智能合约了
# 部署智能合约之前,还需要解锁账户
以新账户为例子,执行下面命令,返回 true 即解锁成功
personal.unlockAccount(eth.accounts[1],"ahxiao")
# 编写合约代码(以主流语言Solidity为例)
pragma solidity ^0.4.18;
contract hello {
string greeting;
function hello(string _greeting) public {
greeting = _greeting;
}
function say() constant public returns (string) {
return greeting;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
可在Browser-Solidity页面中解析获取部署代码,以上面合约代码为例,解析之后为
var _greeting = /* var of type string here */ ;
var helloContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_greeting","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]);
var hello = helloContract.new(
_greeting,
{
from: web3.eth.accounts[0],
data: '0x608060405234801561001057600080fd5b5060405161027c38038061027c83398101604052805101805161003a906000906020840190610041565b50506100dc565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061008257805160ff19168380011785556100af565b828001600101855582156100af579182015b828111156100af578251825591602001919060010190610094565b506100bb9291506100bf565b5090565b6100d991905b808211156100bb57600081556001016100c5565b90565b610191806100eb6000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663954ab4b28114610045575b600080fd5b34801561005157600080fd5b5061005a6100cf565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561009457818101518382015260200161007c565b50505050905090810190601f1680156100c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561015b5780601f106101305761010080835404028352916020019161015b565b820191906000526020600020905b81548152906001019060200180831161013e57829003601f168201915b50505050509050905600a165627a7a7230582081f7cabb38430112b3bc48f085ef94f531e0ffb63d6b5eee001e5d5aae34bf7b0029',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
上面声明了三个变量_greeting、helloContract、hello,其中_greeting = ***,*号内容我们自己指定,以hello world为例,然后我们需要做的是将前两个变量的具体内容替换到hello中,替换完的内容为:
hello=web3.eth.contract([{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_greeting","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]).new(
"Hello World!",
{
from: web3.eth.accounts[1],
data: '0x608060405234801561001057600080fd5b5060405161027c38038061027c83398101604052805101805161003a906000906020840190610041565b50506100dc565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061008257805160ff19168380011785556100af565b828001600101855582156100af579182015b828111156100af578251825591602001919060010190610094565b506100bb9291506100bf565b5090565b6100d991905b808211156100bb57600081556001016100c5565b90565b610191806100eb6000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663954ab4b28114610045575b600080fd5b34801561005157600080fd5b5061005a6100cf565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561009457818101518382015260200161007c565b50505050905090810190601f1680156100c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561015b5780601f106101305761010080835404028352916020019161015b565b820191906000526020600020905b81548152906001019060200180831161013e57829003601f168201915b50505050509050905600a165627a7a7230582081f7cabb38430112b3bc48f085ef94f531e0ffb63d6b5eee001e5d5aae34bf7b0029',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
将该段部署代码copy到geth命令行中,回车执行,当返回下面代码则表示部署成功
Contract mined! address: 0xd0940110f97dbdcf4be58cec50fcac1afe780e31 transactionHash: 0x86131d9c4a5f7a89ea1bfafdd72cef4a492eeec87619e6af8d3fe6a2bd61d12b
# 调用智能合约
hello.say()