期待结果
默认情况下,etherscan只能查看合约上发生的tx,无法调用合约方法。不过,etherscan提供verify contract功能,完成验证之后,可以读取和写入合约,即下图中Tab页签Read Contract和Write Contract。
实现步骤
- 合并合约:将所有import导入的合约和库(library)都写到一个文件中
- 验证合约:进入verify contract页面,指定已部署合约地址和名称
- 编译合约:选择Compiler版本和优化方案
第一步比较繁琐,如果你使用了open-zeppelin之类的通用库,需要翻翻好多个目录才能把依赖的合约凑齐并放置在一个文件当中,而且特别要注意加上版本宏定义pragma solidity ^0.5.0;
。
第二步填入合约地址和名称,注意名称必须和源文件中的合约名称一致。etherscan会扫描出代码中所有的合约和库名称。可以说这里的名称就是寻常程序的main函数。
第三步是有一定窍门的,也是不好把握的地方。我的做法是先去查看truffle compile之后的json文件,比如此处的CacContract.json文件,搜索version关键字,定位到compiler处:
"compiler": {
"name": "solc",
"version": "0.5.0+commit.1d4f565a.Emscripten.clang"
}
这样大概就知道了编译器的版本。Optimization建议不要开启,否则编译好的二进制和部署上链的二进制有差异,原因是solidity的编译器会朝着最少gas消耗的方向进行指令优化,举个例子,sstore指令用于给状态变量赋值,首次在某处赋值写入需要消耗20000 gas,但是再次写入只需要花费5000 gas,所以考虑到gas成本,优化过程中指令就可能减少,那么相应的二进制也会发生改变。此时,源码验证就不能通过。
最终方法验证
通过Read Contract扫描出来的方法,通过证书编号查询出证书内容:
于 2019-04-02