在主网上部署和调用以太坊智能合约

版权声明:本文为博主原创文章,转载请注明来自 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

猜你喜欢

转载自blog.csdn.net/hello2mao/article/details/80074897