版权声明:本文为博主原创文章,转载请注明来自 http://blog.csdn.net/hello2mao https://blog.csdn.net/hello2mao/article/details/80074897
一、概述
在主网上部署和调用以太坊智能合约主要分为以下几步:
(1)连接主网
(2)部署合约
(3)调用合约
二、连接主网
通过运行在主网中的节点所提供的RPC连接主网。
使用geth命令在本地运行一个连接主网的全节点,geth会尝试持续连接网络上的节点直到找到一个对等体,如果节点运行在一台面向互联网的服务器上,那么节点也会接受来自其它节点的连接请求。需要暴露部分管理API以供合约的部署和调用。
geth --rpc --rpcapi=eth,web3 --rpccorsdomain='*'
三、部署合约
部署合约有很多方式:rpc、ipc、web3等,本次使用web3方式。
假设本次部署的合约如下:
contract Multiply7 {
event Print(uint);
function multiply(uint input) returns (uint) {
Print(input * 7);
return input * 7;
}
}
编译合约,获得abi,web3的部署代码如下:
var abi = [{"constant":false,"inputs":[{"name":"input","type":"uint256"}],"name":"multiply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"","type":"uint256"}],"name":"Print","type":"event"}]
var multiply7 = web3.eth.contract(abi).new({
from: web3.eth.accounts[0],
data: '0x608060405234801561001057600080fd5b5060f58061001f6000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b348015604f57600080fd5b50606c600480360381019080803590602001909291905050506082565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a72305820dfe915307a3c6a7dce2534d4808b6b6770a3fa5ffac148871a1c909365a9d5e90029',
gas: '4700000'
}, function (e, contract) {
console.log(JSON.stringify(contract));
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
部署成功显示:
Contract mined! address: 0x379705f96a4907860d198cab420b04480e166a8b transactionHash: 0x654b2700d7c81d42738a6ced53107b627eac99e02b7408d4afb4b539dbe626e
四、调用合约
调用合约需要用到两个参数
(1)合约的abi
(2)合约地址,即上文中的0x379705f96a4907860d198cab420b04480e166a8b
如下是调用合约方法multiply的示例:
var multi = web3.eth.contract(abi).at("0x379705f96a4907860d198cab420b04480e166a8b")
multi.Print(function(err, data) { console.log(JSON.stringify(data)) })
multi.multiply.sendTransaction(6, {from: eth.accounts[0]})
"0x4f2b35f6e1e88a801d2389cbc0c72b033a7e4d25720f6364856324a059549dca"
回调返回:
"address":"0x379705f96a4907860d198cab420b04480e166a8b","args":{"":"42"},"blockHash":"0xc411e394e7967c640f92fd5f7abe1a7e976435ec1c725fc19f5b1011bd413cda","blockNumber":2166783,"event":"Print","logIndex":17,"removed":false,"transactionHash":"0x4f2b35f6e1e88a801d2389cbc0c72b033a7e4d25720f6364856324a059549dca","transactionIndex":18}
返回结果是42,合约调用成功。
扫描二维码关注公众号,回复:
3767927 查看本文章
五、参考
【1】http://ethdocs.org/en/latest/contracts-and-transactions/accessing-contracts-and-transactions.html
【2】https://ethereum.stackexchange.com/questions/10574/how-can-i-connect-to-public-chain-using-web3
【3】https://github.com/ethereum/go-ethereum