部署智能合约
智能合约的部署过程也是一次普通的交易过程,我们需要将智能合约的数据整合到交易体的数据区(data),并发送出去。 一旦交易被捕获且挖矿完成,我们的合约就已经部署在了区块链上并具有了一个独一无二的地址。通过该地址,我们就能和智能合约通信,并调用合约的方法。
承接上文,我们整理部署交易所需要的数据:ABI 和 bin 字节码。
> var myAbi = output.contracts['Vault.sol:Vault'].abi undefined > var myContract = eth.contract(JSON.parse(myAbi)) undefined > var myBinCode = "0x" + output.contracts['Vault.sol:Vault'].bin undefined
我们整理了3个变量 myAbi 、myContract 与 myBinCode 。我们已经准备好了部署所需的所有变量,下面开始智能合约的部署。
首先解锁持有以太币的账户。
> personal.unlockAccount(eth.accounts[0], '123', 300) true
接着调用特殊的合约生成方法(其底层也是一个交易发送方法)来部署合约。
> var deployObject = { from: eth.accounts[0], data: myBinCode, gas: 1000000 } undefined > var myContractInstance = myContract.new(deployObject) undefined
此时挖矿的 Geth 节点窗口将持续打包挖矿,并出现一条接收到合约创建指令的日志:
INFO [09-16|23:04:23.160] Submitted contract creation fullhash=0xbd0d5a8b1b24500e7d9ee49d7170aaa24f017f402b0964bcafed717ea7c8e8ca contract=0x1f0723b71f5824567E9aCc1f1079E91FCd958a50
挖矿成功!合约已经部署到了区块链上,并具有了自己的独一无二地址。
0x1f0723b71f5824567E9aCc1f1079E91FCd958a50
这个地址是根据发送者的地址 0x53dc408a8fa060fd3b72b30ca312f4b3f3232f4f 与发送者的发送交易数量 nonce 唯一计算的出的地址。我们可以通过创建的变量myContractInstance 来查看我们和合约的详细情况。
> myContractInstance { abi: [{ constant: false, inputs: [{...}], name: "set", outputs: [], payable: false, stateMutability: "nonpayable", type: "function" }, { constant: true, inputs: [], name: "get", outputs: [{...}], payable: false, stateMutability: "view", type: "function" }], address: "0x1f0723b71f5824567e9acc1f1079e91fcd958a50", transactionHash: "0xbd0d5a8b1b24500e7d9ee49d7170aaa24f017f402b0964bcafed717ea7c8e8ca", allEvents: function(), get: function(), set: function() }
我们已经创建了合约的实例,接下来围绕着该合约实例,我们就可以发送交易(消息)来通讯并且设置合约中的存储值了。下面我们来获取 Vault 合约中的 vault 存储值。由于get方法并不会修改区块链上的存储区,所以呼叫这个方法是 ...