Truffle项目搭建编译部署验证合约
Posted bug的搬运工
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Truffle项目搭建编译部署验证合约相关的知识,希望对你有一定的参考价值。
Truffle项目搭建、编译、部署、验证合约以及过程中的坑点处理
环境依赖
1.nodejs
2.python
安装truffle
//安装
npm install -g truffle
//查看版本
truffle version
搭建项目
mkdir demo
cd demo
truffle unbox webpack
出现报错,网络被墙下载失败
修改 C:\\Windows\\System32\\drivers\\etc\\hosts 增加如下内容
# GitHub Start
192.30.255.112 gist.github.com
192.30.255.112 github.com
192.30.255.112 www.github.com
151.101.56.133 avatars0.githubusercontent.com
151.101.56.133 avatars1.githubusercontent.com
151.101.56.133 avatars2.githubusercontent.com
151.101.56.133 avatars3.githubusercontent.com
151.101.56.133 avatars4.githubusercontent.com
151.101.56.133 avatars5.githubusercontent.com
151.101.56.133 avatars6.githubusercontent.com
151.101.56.133 avatars7.githubusercontent.com
151.101.56.133 avatars8.githubusercontent.com
151.101.56.133 camo.githubusercontent.com
151.101.56.133 cloud.githubusercontent.com
151.101.56.133 gist.githubusercontent.com
151.101.56.133 marketplace-screenshots.githubusercontent.com
151.101.56.133 raw.githubusercontent.com
151.101.56.133 repository-images.githubusercontent.com
151.101.56.133 user-images.githubusercontent.com
# GitHub End
再次运行 truffle unbox webpack 运行成功
编写合约和脚本
constrcts目录和migrations目录默认会生成三个合约和两个脚本,为了演示简单方便,这里只用一个合约和脚本演示,将两个目录文件删除,加入以下的合约和脚本
//contracts\\Test.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Test
address public owner;
uint public num;
constructor()
owner = msg.sender;
modifier restricted()
if (msg.sender == owner) _;
function setNum(uint _num) public restricted
num = _num;
//migrations\\1_initial_migration.js
const Test = artifacts.require("Test");
module.exports = function(deployer)
deployer.deploy(Test);
;
编译合约
//仅默认编译自上次编译后被修改过的文件,来减少不必要的编译。
//如果想编译全部文件,可以使用 truffle compile --compile-all
truffle compile
之前 truffle version 可以看到返回的solidity版本是0.5.16,而合约中我们规定的solidity版本要大于0.8.0,编译失败,所有需要指定solidity的版本,打开truffle-config.js,修改最下方的配置
// Configure your compilers
compilers:
solc:
version: "0.8.0", // Fetch exact version from solc-bin (default: truffle's version)
// docker: true, // Use "0.5.1" you've installed locally with docker (default: false)
// settings: // See the solidity docs for advice about optimization and evmVersion
// optimizer:
// enabled: false,
// runs: 200
// ,
// evmVersion: "byzantium"
//
再次编译,编译成功,生成build\\contracts\\Test.json文件
部署合约
ropsten测试币
这里我们把合约部署到以太坊ropsten测试链上,因为这个链测试币容易领取,测试币领取链接
配置网络
1.安装 truffle-hdwallet-provider
npm i truffle-hdwallet-provider
2 . 修改truffle-config.js 这里配置了两个环境,一个本地节点 一个ropsten
const HDWalletProvider = require('truffle-hdwallet-provider');
const mnemonic = "easily icon 。。。"; //助记词,使用该账户来部署合约
module.exports =
networks:
//本地环境
development:
host: "127.0.0.1", // Localhost (default: none)
port: 7545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
,
//ropsten
ropsten:
provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161`),
network_id: 3, // Ropsten's id
networkCheckTimeout: 10000,
gas: 5500000, // Ropsten has a lower block limit than mainnet
timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50)
skipDryRun: true // Skip dry run before migrations? (default: false for public nets )
,
// Configure your compilers
compilers:
solc:
version: "0.8.0", // Fetch exact version from solc-bin (default: truffle's version)
部署
//--network ropsten 使用配置中networks下的ropsten网络
//多合约下,默认仅部署新合约,重新全部执行 --reset
truffle migrate --network ropsten
部署成功,复制合约地址到区块浏览器查看
验证合约
安装 truffle-plugin-verify
npm i truffle-plugin-verify
获取api key
区块浏览器注册账号(需要切换到主网,测试网没有登陆注册),登录后 https://etherscan.io/myapikey 获取api key
修改truffle-config.js
区块浏览器无法直接访问,需要代理访问, truffle-config.js 增加如下内容,配置代理,引入验证插件,配置apiKey
verify:
proxy:
host: '127.0.0.1',
port: '19180'
,
plugins: [
'truffle-plugin-verify'
],
api_keys:
etherscan: 'API_KEY',
,
验证合约
truffle run verify Test --network ropsten
验证成功,刷新区块浏览器可以看到合约代码已验证
验证使用 Truffle 部署的智能合约代码
【中文标题】验证使用 Truffle 部署的智能合约代码【英文标题】:Verify smart contract code deployed with Truffle 【发布时间】:2018-10-12 18:12:53 【问题描述】:我正在使用 Truffle 在 Rinkeby 网络上部署智能合约。智能合约包含一个库的导入(Ownable)。
我正在尝试在 Etherscan 上验证合同,但我无法 :(
Truffle 似乎“扁平化”了合约代码,但我找不到用于编译的实际输出。
我检查了构建文件夹,我可以找到字节码和部署字节码,但找不到“扁平化”合约源。
我在哪里可以找到这些信息?
在 Rinkeby 上部署:
michael$ truffle deploy --reset --network rinkeby
Using network 'rinkeby'.
Running migration: 1_initial_migration.js
Replacing Migrations...
... 0xe179c58d10d66def5d26a06c89848b88c812458f1c2e92bcff40372e6c476f08
Migrations: 0xa06c5370a513ad9aa25213db9610d77a9533c4c1
Saving successful migration to network...
... 0xaa08dbc87a185613854689ffe408e3dc441344191c52194d835124e37a2a4fd1
Saving artifacts...
Running migration: 2_deploy_contracts.js
Replacing BlockBetGameRegistry...
... 0x9bc7e990dc4ef9dd87f5c69c8a65b0e22cbcda10102abc7067fcfb451ca429bc
BlockBetGameRegistry: 0x7be5198a14ff47815a85adc47bb5f1da31d352e6
Saving successful migration to network...
... 0xb942099bc2201d955bf60ce7ecba9edbe2f664b744f8543d43aa5588ff4d2f2f
Saving artifacts...
合同代码:
pragma solidity 0.4.18;
import 'zeppelin-solidity/contracts/ownership/Ownable.sol';
contract BlockBetGameRegistry is Ownable
address[] public games;
event eventGameAdded(address game);
function addGame (address _contractAddress) onlyOwner public
require(_contractAddress != address(0));
games.push(_contractAddress);
eventGameAdded(_contractAddress);
function numberOfGames () view public returns (uint256)
return games.length;
【问题讨论】:
【参考方案1】:正如另一个答案所述,没有本地 Truffle 功能可以帮助解决这个问题。然而,Truffle 团队在今年年初确实发布了插件功能。所以我创建了truffle-plugin-verify
来自动在 Etherscan 上验证 Truffle 合约。
-
使用 npm 安装插件
npm install truffle-plugin-verify
-
将插件添加到您的
truffle.js
或truffle-config.js
文件中
module.exports =
/* ... rest of truffle-config */
plugins: [
'truffle-plugin-verify'
]
-
在您的 Etherscan 帐户上生成 API 密钥(请参阅 Etherscan website)
将您的 Etherscan API 密钥添加到您的 truffle 配置中
module.exports =
/* ... rest of truffle-config */
api_keys:
etherscan: 'MY_API_KEY'
将合约迁移到公共网络后,您可以通过运行以下命令在 Etherscan 上对其进行验证:
truffle run verify ContractName [--network networkName]
更多信息可以在the repository或我的文章Automatically verify Truffle smart contracts on Etherscan中找到。
【讨论】:
刚用过这个。太棒了。希望我在 17/18 年积极编写/部署/验证合同时能拥有这个!干得好!【参考方案2】:不幸的是,Truffle 还不支持这一点。它目前是一个开放的功能请求(请参阅feature request)。这似乎是 Truffle 背后的工程师相信支持的一个流行问题,因此实施它可能只是时间问题。
在此之前,您必须使用一个实用程序来为您扁平化您的代码。 cmets中提到了2个:sol-merger和truffle-flattener。
【讨论】:
以上是关于Truffle项目搭建编译部署验证合约的主要内容,如果未能解决你的问题,请参考以下文章
solidity 智能合约(3):使用truffle编译部署及测试合约
区块链入门Truffle 项目实战,Solidity IDE, 智能合约部署
Truffle 部署的合约无法通过 Etherscan 进行验证