一、基本说明
以太坊目前还处于频繁更新的阶段,后续相关接口可能会有变化。当前本文对应以太坊的0.2x.x版本。
二、合约编译
编写好合约代码之后,需要将合约编译为字节码,并为了后续调用以及供其他人调用,还需要保存下ABI(
Application Binary Interface)。不管是本地安装了solidify使用solc编译,还是在线编译(
https://remix.ethereum.org
),都会得到两个数据,abi和bin,bin即为按16进制输出的二进制代码。
关于包含library库的合约的编译说明:
如果你的合约使用了libraries,按正常方式编译后会发现字节码中会包含类似“__LibraryName________”的字符串。这是因为,在编译的时候编译器还不知道你所使用的库的地址,所以这里提供了占位字符串。对于这种情况,需要我们人工指定库部署在链上的地址。
也就是:
1、部署合约前,需要先部署好需要用到的库(其实每个库也都是一个合约,只是它比较特殊而已),获取库地址。
2、编译合约时,可以通过指定 --libraries “LibraryName:libraryaddress” 参数来提供库地址,多个“库名:库地址”对之间可以用逗号或空格分隔,如
--libraries "IterableMapping:0xf912c00b0c9ec43c0171a42c276e445f7a186f69”;库地址的前导0x可有可无。
3、当然编译时不指定--libraries参数也可以,这样可以在编译完成后,人工将占位字符串替换为库地址。这种操作下,库地址就是不包含0x的了,如用“f912c00b0c9ec43c0171a42c276e445f7a186f69”完整替换占位字符串。
三、合约部署
合约部署有两种方式,通过web3控制台部署和编程通过RPC部署。
(一)web3控制台部署合约
注意:部署前需要解锁账户。以下假定账户已经解锁。
1、指定abi
形式:
abi = web3.eth.contract(abijson)
例如:
abi = web3.eth.contract([{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":