用 Truffle 插件自动在Etherscan上验证合约代码

区块链资讯登链社区2020-07-28 18:29:24  阅读 -评论 0

Etherscan是以太坊上最受欢迎的浏览器。它的一大功能是验证智能合约的源代码[5]。使用户可以在使用合约之前通过源码了解合约的功能。从而增加用户对合约的信任,也因此使开发者受益。
通过Etherscan网站表单提交代码是验证代码的主要方法,但是这需要很多手动工作。需要输入诸如编译器版本和构造函数参数之类的内容,并且需要提交展开后的合约源代码(译者注:这里是指当合约引用了其他的文件时,需要把引用展开),该合约源代码需要与部署的代码完全匹配。
有些人使用命令行工具来展开Truffle合约,并使用基于浏览器的Remix IDE来部署展开后的源代码。然后,把相同的展开后的源代码复制到Etherscan验证表单提交。这是一个非常繁琐的过程,应该自动化。
这是为什么我创建了 truffle-plugin-verify[6] 插件,它通过Etherscan API来自动验证Truffle合约。此插件是一个开源项目,有许多不同的参与者,包括Ren[7]的一些开发人员。使用这个插件只需一个简单的命令即可验证合约:
truffle run verify ContractName
依赖条件
本文中,我们假设您已经有一个可部署的Truffle项目。如果没有,可以参考此Truffle教程[8],该教程也说明了如何使用Infura设置Truffle项目的部署。
你也可以查看本文在GitHub上的源代码[9]。
合约
我们以 Casino 合约为例。在合约中,玩家可以下注 1-10个ETH。为确保合约不会亏空,玩家只能押注合约总金额的一小部分。
中奖号码是对当前区块号进行模运算的结果。这个运算在测试中可以的,但是要注意,在正式生产中可能会被滥用。
在本文中,我们将专门对合约进行进一步拆分,以使合约分散到多个文件中。便于展示插件的全部功能。
contracts/Killable.sol
pragma solidity ^0.5.8;
contract Killable {
    address payable public owner;
    constructor() public {
        owner = msg.sender;
    }
    function kill() external {
        require(msg.sender == owner, "Only the owner can kill this contract");
        selfdestruct(owner);
    }
}
contracts/Casino.sol
pragma solidity ^0.5.8;
import "./Killable.sol"
contract Casino is Killable {
    event Play(address payable indexed player, uint256 betSize, uint8 betNumber, uint8 winningNumber);
    event Payout(address payable winner, uint256 payout);
    function fund() external payable {}
    function bet(uint8 number) external payable {
        require(msg.value <= getMaxBet(), "Bet amount can not exceed max bet size");
        require(msg.value >0, "A bet should be placed");
        uint8 winningNumber = generateWinningNumber();
        emit Play(msg.sender, msg.value, number, winningNumber);
        if (number == winningNumber) {
            payout(msg.sender, msg.value * 10);
        }
    }
    function getMaxBet() public view returns (uint256) {
        return address(this).balance / 100;
    }
    function generateWinningNumber() internal view returns (uint8) {
        return uint8(block.number % 10 + 1); // Don't do this in production
    }
    function payout(address payable winner, uint256 amount) internal {
        assert(amount > 0);
        assert(amount <= address(this).balance);
        winner.transfer(amount);
        emit Payout(winner, amount);
    }
}
验证合约
现在我们已经准备好合约,我们可以展示使用truffle-plugin-verify验证该合约有多么简单。
1. 安装 & 启用 truffle-plugin-verify
可以使用npm或yarn安装Truffle插件:
npm install -D truffle-plugin-verify
yarn add -D truffle-plugin-verify
安装后,将以下内容添加到truffle-config.js或truffle.js文件中,以便Truffle启用该插件:
module.exports = {
  /* ... rest of truffle-config */
  plugins: [
    'truffle-plugin-verify'
  ]
}

2. 创建一个Etherscan API密钥并将其添加到Truffle

要创建Etherscan API密钥,首先需要在Etherscan网站[10]上创建一个帐户。创建帐户后,可以在个人资料页[11]上添加新的API密钥,如上图所示。创建新密钥后,将其添加到truffle-config.js 或 truffle.js文件的api_keys下的:
module.exports = {
  /* ... rest of truffle-config */
  api_keys: {
    etherscan: 'MY_API_KEY'
  }
}
当前,你可以不提交 API key到代码库中,建议使用 dotenv[12] 来保存 API key, 然后在git 库中忽略 .env文件,然后在truffle-config.js 或 truffle.js配置文件读取它,读取方式如下:
var HDWalletProvider = require("truffle-hdwallet-provider");
require('dotenv').config();
module.exports = {
  networks: {
    rinkeby: {
      provider: function() {
        return new HDWalletProvider(`${process.env.MNEMONIC}`, `https://rinkeby.infura.io/v3/${process.env.INFURA_ID}`)
      },
      network_id: 4
    }
  },
  plugins: [
   'truffle-plugin-verify'
  ],
  api_keys: {
    etherscan: process.env.ETHERSCAN_API_KEY
  }
};
你的配置文件可能和上面有所不同,但是只要设置了公共网络部署,并且正确设置了plugins和api_keys就可以。
3. 部署及验证合约
truffle-plugin-verify的使用设置好了,接下来就是实际部署和验证智能合约。
部署:
truffle migrate --network rinkeby
这将花费一些时间,部署完之后,将显示以下类似的内容:
Summary
=======
> Total deployments:   2
> Final cost:          0.0146786 ETH
部署合同后,我们就可以使用truffle-plugin-verify对我们的Casino合同进行Etherscan验证:
truffle run verify Casino --network rinkeby
依旧需要花费一些时间,并最终返回:
Pass - Verified: https://rinkeby.etherscan.io/address/0xAf6e21d371f1F3D2459D352242564451af9AA23F#contracts
结论
本文中,我们讨论了通过Etherscan在线表单进行验证代码的麻烦程度,因为每次部署合约时都需要执行几个手动步骤。在本文中,我们通过 truffle-plugin-verify开发者只需一个简单的命令就可以验证任何智能合约,这为手动验证提供一种简单、自动的替代方法。
本翻译得到登链社区[13]及 CellNetwork[14] 支持。
参考资料
[1]登链翻译计划: https://github.com/lbc-team/Pioneer
[2]Tiny熊: https://learnblockchain.cn/people/15
[3]Automatically verify Truffle smart contracts on Etherscan: https://kalis.me/verify-truffle-smart-contracts-etherscan/
[4]Rosco Kalis: https://kalis.me/
[5]验证智能合约的源代码: https://medium.com/etherscan-blog/verifying-contracts-on-etherscan-f995ab772327
[6]truffle-plugin-verify: https://www.npmjs.com/package/truffle-plugin-verify
[7]Ren: https://renproject.io/
[8]此Truffle教程: https://learnblockchain.cn/2019/03/30/dapp_noteOnChain
[9]源代码: https://github.com/rkalis/truffle-plugin-verify/tree/master/docs/kalis-me-tutorial-code
[10]Etherscan网站: https://etherscan.io/
[11]个人资料页: https://etherscan.io/myapikey
[12]dotenv: https://www.npmjs.com/package/dotenv
[13]登链社区: https://learnblockchain.cn/
[14]CellNetwork: https://www.cellnetwork.io/?utm_souce=learnblockchain

声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们kefu@lianshijie.com

参与讨论 (0 人参与讨论)

相关推荐

AE Studio:Aeternity生态未来的智能合约开发工具

AE Studio原名Fire Editor,是一个全新供aeternity生态系统开发者写入、编译、部署智能合约,以及调用本地的状态函数的平台。AE Studio可以实时开发智能合约和区块链应用。

中信银行打造“区块链”信用证结算!

中信银行打造“区块链”信用证结算!

科技不会改变金融的实质,但却能让金融服务更高效,能让资金供、需方信息不对称的问题更好地解决。近期,中信银行首个区块链项目——基于区块链的国内信用证信息传输系统(简称BCLC)(一期)成功上线,这是国内银行业第一次将区块链技术应用于信用证结算领域。 据中信银行国际业务部总经理助理张栩青介绍,将现在流行的区块链技术应用在国内信用证中,改变了银行传统信用证业务模式,信用证的开立、通知、交单、承兑报文

中国信息技术部门成立区块链研究实验室

中国信息技术部门成立区块链研究实验室

暴走时评:本月初,中国政府对国内的ICO和数字货币交易所的打击在世界范围内引起了强大反响,但政府已经多次声明不会将区块链与数字货币划等号,依然非常重视区块链技术在中国的发展。鉴于中国工业和信息化部成立了一个专门研究区块链的实验室,这一论调也得到了进一步的证实。 虽然中国政府最近在大力打击比特币交易所和ICO,但仍然致力于开发区块链在其他领域的潜力。 据财新网报道,中国工业和信息化部已经成立了一

 分布式账本中的生命科学

分布式账本中的生命科学

生物科学是医学领域涉及遗传研究,疾病预防和生活方式治疗(lifestyle treatments)的学科。它已经存在了很长时间,但区块链技术的基础设施应用给该学科提供了重大进步的可能性。 根据Pistoia Alliance进行的2016年6月份高级制药和生命科学领袖调查,83%的受访者表示,他们预计在五年内将全面采用区块链技术。 Pistoia Alliance是一个全球性的非营利组织,致

区块链vs.核能:日本最大电力公司东京电力(TEPCO)寻求使用区块链减轻对核电的依赖

区块链vs.核能:日本最大电力公司东京电力(TEPCO)寻求使用区块链减轻对核电的依赖

东京电力公司 (TEPCO) 对于能源过度中心化的风险可以说绝不陌生。 也许最著名的就是2011年发生的福岛核电站事故,这个日本最大的能源公司如今正在寻求区块链技术来防止这种灾难再次发生。 然而,从使用微型风车的分布式风力发电到用于存储在电力成本低时购买的电力的智能电池,可替代能源项目一直以来都属于个人慈善事业。 然而,TEPCO风险投资部门主管Jeffrey Char认为区块链能够帮助为这

继证监会发表代币发行声明之后,香港交易所Gatecoin将下线部分ICO币

继证监会发表代币发行声明之后,香港交易所Gatecoin将下线部分ICO币

经过一系列监管以及合规审查后,香港交易所Gatecoin将会下线那些被金融监管部门定性为"证券"的代币。 香港加密货币交易所Gatecoin透露,如果在该平台交易的ICO代币在法律上符合"证券"定义,他们就会下线这些代币。据巴比特上月报道,香港主要的金融监管部门证券及期货事务监察委员会(SFC)表达了对ICO这种日渐普及的募资模式的担忧。 尽管ICO中售卖的数字代币通常都被定义为虚拟商品,但

IBM与超级账本共同加入去中心化身份基金会(DIF),推动创建区块链ID行业标准

IBM与超级账本共同加入去中心化身份基金会(DIF),推动创建区块链ID行业标准

IBM与超级账本已经签署协议加入去中心化身份基金会(DIF),这个于今年初成立的联盟旨在帮助推动基于区块链的ID系统的互操作性和标准。 这两个企业区块链大佬加入了这个有各种企业组成的团体,其中包括像微软和埃森哲这样的大企业,还有像Civic和Gem这样的创业公司,以及像uPort和Sovrin这样的开源项目。 DIF执行主管告诉Coindesk说: "这应该是一个信号,表明在这一领域有广泛的

为打击人口贩卖,牙买加警方盯上了犯罪分子的比特币钱包

为打击人口贩卖,牙买加警方盯上了犯罪分子的比特币钱包

作为打击人口贩卖计划的一部分,牙买加警方已经开始行动,锁定了那些试图用比特币和数字支付来掩人耳目的犯罪分子。 越来越多的人口贩卖者都开始转向数字货币来帮助他们进行地下活动并接收非法活动所得,但牙买加警方已经盯上他们了。 牙买加的'大生意' 不幸的是,人口贩卖以及性奴市场规模十分庞大,预计涉资1500亿美元。在牙买加,大约有7000个妇女、儿童以及成年男性被奴役,他们的操控者出售奴役服务的价格

麦妖榜
更新日期 2019-09-03
排名用户贡献值
1牛市来了30910
2BitettFan24187
3等待的宿命23810
4区块大康20369
5六叶树20310
6linjm122719429
7天下无双16192
8lizhen00215280
9让时间淡忘14586
10yelanyi050511349
返回顶部 ↑