译文出自:登链翻译计划
译者:Tiny熊
本文永久链接:learnblockchain.cn/article…
校对者: 无

Etherscan是以太坊上最受欢迎的浏览器。 它的一大功能是验证智能合约的源代码。 使用户可以在使用合约之前通过源码了解合约的功能。 从而增加用户对合约的信任,也因此使开发者受益。

通过Etherscan网站表单提交代码是验证代码的主要方法,但是这需要很多手动工作。 需要输入诸如编译器版本和构造函数参数之类的内容,并且需要提交展开后的合约源代码(译者注:这里是指当合约引用了其他的文件时,需要把引用展开),该合约源代码需要与部署的代码完全匹配。

有些人使用命令行工具来展开Truffle合约,并使用基于浏览器的Remix IDE来部署展开后的源代码。 然后,把相同的展开后的源代码复制到Etherscan验证表单提交。 这是一个非常繁琐的过程,应该自动化。

这是为什么我创建了 truffle-plugin-verify 插件,它通过Etherscan API来自动验证Truffle合约。 此插件是一个开源项目,有许多不同的参与者,包括Ren的一些开发人员。 使用这个插件只需一个简单的命令即可验证合约:

truffle run verify ContractName

依赖条件

本文中,我们假设您已经有一个可部署的Truffle项目。 如果没有,可以参考此Truffle教程,该教程也说明了如何使用Infura设置Truffle项目的部署。

你也可以查看本文在GitHub上的源代码。

合约

我们以 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.jstruffle.js文件中,以便Truffle启用该插件:

module.exports = {/* ... rest of truffle-config */plugins: ['truffle-plugin-verify']
}

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

要创建Etherscan API密钥,首先需要在Etherscan网站上创建一个帐户。 创建帐户后,可以在个人资料页上添加新的API密钥,如上图所示。 创建新密钥后,将其添加到truffle-config.js 或 truffle.js文件的api_keys下的:

module.exports = {/* ... rest of truffle-config */api_keys: {etherscan: 'MY_API_KEY'}
}

当前,你可以不提交 API key到代码库中,建议使用 dotenv 来保存 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}
};

你的配置文件可能和上面有所不同,但是只要设置了公共网络部署,并且正确设置了pluginsapi_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开发者只需一个简单的命令就可以验证任何智能合约,这为手动验证提供一种简单、自动的替代方法。

本翻译得到登链社区及 CellNetwork 支持。

原文地址:Automatically verify Truffle smart contracts on Etherscan
作者:Rosco Kalis

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

用 Truffle 插件自动在Etherscan上验证合约代码相关推荐

  1. [AHK]获取文华财经上的合约代码

    SetTitleMatchMode,2 DetectHiddenText,on WinGetText,allText,赢顺云交易 strArray:=StrSplit(allText,"`n ...

  2. JS脚本实现CSDN免登陆免关闭广告插件自动展开“阅读更多”内容

    最近在CSDN查资料,总是弹出以下弹窗,然后就自动跳转到登录页面,蛋疼! 于是重新捣腾了一下,修改了原来的脚本,最新的脚本代码如下: 温馨提示:在打开CSDN页面后立刻执行以下脚本即可免登陆免关闭广告 ...

  3. 在Etherscan上自动验证Truffle智能合约

    安装并启用truffle-plugin-verify 使用npm或yarn安装truffle插件: npm install -D truffle-plugin-verify yarn add -D t ...

  4. 在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练

    在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练 自动驾驶汽车的深度神经网络(DNN)开发是一项艰巨的工作.本文验证了DGX多节点,多GPU,分布式训练在DXC机器 ...

  5. go token验证_GitHub - goflyfox/gtoken: 基于gf框架的token插件,通过服务端验证方式实现token认证;...

    gtoken 介绍 基于GoFrame框架的token插件,通过服务端验证方式实现token认证:已完全可以支撑线上token认证,通过Redis支持集群模式:使用简单,大家可以放心使用: gtoke ...

  6. sex 无需下载_elipse FTP插件 - Sexftp 支持FTP上传、下载、比较等功能

    Sexftp简介 Sexftp是FTP上传与下载的eclipse插件,集成在ECLIPSE中,方便开发人员进行FTP相关操作,省去来回切换工具及选择目录的麻烦. Sexftp支持上传.下载等基本操作; ...

  7. 独立开发变现周刊(第72期):在Reddit上验证想法,建立年收入18万美元的自动化求职平台...

    分享独立开发.产品变现相关内容,每周五发布. (合集:https://www.ezindie.com/weekly). 目录 1.Beautiful.ai:PowerPoint插件,以10倍的速度制作 ...

  8. 【转载】插件自动升级

    ESFramework介绍之(20)―― 插件自动升级 当我们的服务平台搭建成功后,所需要做的主要事情就是开发服务端功能插件(IFunAddin)和客户端插件(IPassiveAddin),每个插件对 ...

  9. iOS架构-自动打包并上传到App Store(python)(21)

    这里是摘自一篇用python 语法写的脚本,这里只是为了更好的理解自动化打包上传App Store的原理的. 一. iOS 自动打包并上传到App Store(python) 我们平时大都是用Appl ...

  10. jquery插件---自动补全类插件

    jquery插件---自动补全类插件 (1)AutoComplete-JQuery jQuery插件易于集成到现在的表单中(Form). (2)Facebook like Autocomplete 基 ...

最新文章

  1. simple_html_dom meta,HTML DOM Meta content 属性
  2. python编程语法-语法知识【Python核心编程】
  3. 10个关于文件操作的小功能(Python),都很实用~
  4. 如何在私有链部署智能合约
  5. 关于欧拉工程的一道递推题
  6. volatile学习(可见性,不保证原子性,禁止指令重排(双端检索机制))
  7. Minor GC和Full GC
  8. MySQL服务无法正常启动的解决方法(1053错误)
  9. 概率论(基本概念术语)的理解
  10. 教大家如何选购直播声卡
  11. AD18的安装教程(包括资料)
  12. 计算机体系结构和计算机组成哪个重要,计算机组成和体系结构教学初探.doc
  13. 中班机器人歌曲_幼儿园机器人教案音乐
  14. 孤独求败:美国海军邀黑客“黑掉军舰”
  15. 批量同时创建邮箱和AD账户
  16. 蚂蚁金服 花呗借呗 招聘公告
  17. 奔波真是辛苦啊,然而生命终将逝去,只希望当一切都结束的时候,能够没有遗憾吧。
  18. 首先下载安装data.table包_首次揭秘“超级签”与企业包行业内幕!
  19. jQuery框架介绍
  20. Cesium中自定义材质material

热门文章

  1. 企业高层对IT部门的需求
  2. 印度人是怎样开发软件的?
  3. MATLAB实现连续周期信号的频谱分析(正余弦波信号举例)
  4. Google之海量数据的交互式分析工具Dremel
  5. 这辈子都没有好好的认认真真的过过一天
  6. linux rsh(remote shell) 命令详解
  7. c++编译器和连接器介绍
  8. 用python绘制彩色_使用Python/Matplotlib基于彩色地图绘制(极轴)色轮
  9. 【大数据部落】用R Shiny生态快速搭建交互Web网页APP应用
  10. eclipse中安装TestNg