无法通过 Etherscan 验证 Truffle 部署的合约
Truffle deployed contracts can't be verified through Etherscan
我遇到了 truffle 生成的字节码与 solcjs(本地编译器)和 Remix(在线编译器)不同的问题。因此我无法通过 Etherscan 验证我的合约(参见 https://etherscan.io/verifyContract)
我的环境:
OS: Ubuntu 15.10
$ uname -a
Linux sasha 4.2.0-42-generic #49-Ubuntu SMP Tue Jun 28 21:26:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ truffle version
Truffle v3.2.4
$ solcjs --version
0.4.11+commit.68ef5810.Emscripten.clang
我尝试做的事情:
1) 我创建了一个简单的智能合约 Ownable:
pragma solidity ^0.4.11;
contract Ownable {
address public owner;
function Ownable() {
owner = msg.sender;
}
modifier onlyOwner {
if (msg.sender != owner) throw;
_;
}
function transferOwnership(address newOwner) onlyOwner {
if (newOwner != address(0)) {
owner = newOwner;
}
}
}
2) 初始化一个新的 truffle 项目并将 Ownable.sol 复制到 "contract" 文件夹中。
所以项目的结构必须如下:
test-comtract
-- contracts
-- Ownable.sol
-- migrations
-- 1_initial_migration.js
-- 2_deploy_contracts.js
-- test
truffle.js
3) 编译truffle项目:
$ cd test-comtract
$ truffle compile
编译后将创建"build"文件夹。
4) 转到 "build" 文件夹并在那里搜索 Ownable.json 文件。在此文件中,在 "unlinked_binary" 属性中搜索生成的字节码。该值如下所示:
0x6060604052341561000c57fe5b5b60008054600160a060020a03191633600160a060020a03161790555b5b60f3806100386000396000f300606060405263ffffffff60e060020a6000350416638da5cb5b8114602a578063f2fde38b146053575bfe5b3415603157fe5b6037606e565b60408051600160a060020a039092168252519081900360200190f35b3415605a57fe5b606c600160a060020a0360043516607d565b005b600054600160a060020a031681565b60005433600160a060020a0390811691161460985760006000fd5b600160a060020a0381161560c25760008054600160a060020a031916600160a060020a0383161790555b5b5b505600a165627a7a72305820607fc60d96cffbd50e58fbc028c1e4b6f3dfdf356bd439390481a479ef8d25500029
5) 尝试通过 Remix 在线编译器进行编译。 https//ethereum.github.io/browser-solidity/#version=soljson-v0.4.11+commit.68ef5810.js&optimize=true
编译结果如下图:
6060604052341561000c57fe5b5b60008054600160a060020a03191633600160a060020a03161790555b5b610119806100396000396000f300606060405263ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416638da5cb5b81146043578063f2fde38b14606c575bfe5b3415604a57fe5b60506087565b60408051600160a060020a039092168252519081900360200190f35b3415607357fe5b6085600160a060020a03600435166096565b005b600054600160a060020a031681565b60005433600160a060020a0390811691161460b15760006000fd5b600160a060020a0381161560e8576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b5b505600a165627a7a723058201eb1de901e30ec9818544272a4c70946cd9cb7cd848237ba3dca118e44d771a60029
6) 尝试通过 solcjs 的帮助进行编译:
$ cd test-comtract/contracts
$ solcjs --optimize --bin Ownable.sol
在 "test-comtract/contracts" 文件夹中将创建文件 "Ownable.sol:Ownable.bin"
6060604052341561000c57fe5b5b60008054600160a060020a03191633600160a060020a03161790555b5b610119806100396000396000f300606060405263ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416638da5cb5b81146043578063f2fde38b14606c575bfe5b3415604a57fe5b60506087565b60408051600160a060020a039092168252519081900360200190f35b3415607357fe5b6085600160a060020a03600435166096565b005b600054600160a060020a031681565b60005433600160a060020a0390811691161460b15760006000fd5b600160a060020a0381161560e8576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b5b505600a165627a7a7230582083a10cb56ea55b0a181cbc132bdf1bd4e0e8a02d5664db73bbc62217f0b7b8d00029
结果:SolJS 字节码与 Remix 字节码相同,但不同于 truffle 字节码。
7) 我还通过 truffle 将 Ownable.sol 部署到以太坊 (TEST_NET)。您可以通过以下方式看到它 URL:
https://ropsten.etherscan.io/address/0x6c8e1b321ce94b12069222b543558d4159527ecd
也许有人面临这样的问题。我将非常感谢听到它为什么快乐的任何版本。也许这是 Truffle 框架的一个已知错误。在 google 我发现更多的文章描述了类似的问题,但没有人提出解决方案。我非常需要帮助
提前致谢!
--
亚历克斯
solc/truffle-compile 中有一个编译器优化,目前 etherscan 在编译合约时不支持。
已向 etherscan 发送评论!
有支持Truffle编译的verifier 2.0
您可以像我一样开始猜测优化级别和编译器。您可能会在尝试 100 次后得到它。我做到了。从现在开始,我不会在 truffle 的主网上部署任何东西。它非常适合测试和开发,但它与 etherscan 不一致。为此,您需要连接所有内容并在将来使用混音。
我创建了 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'
}
}
将您的合约迁移到 public 网络后,您可以通过 运行:
在 Etherscan 上验证它
truffle run verify ContractName [--network networkName]
可以在 the repository or in my article Automatically verify Truffle smart contracts on Etherscan 上找到更多信息。
我遇到了 truffle 生成的字节码与 solcjs(本地编译器)和 Remix(在线编译器)不同的问题。因此我无法通过 Etherscan 验证我的合约(参见 https://etherscan.io/verifyContract)
我的环境:
OS: Ubuntu 15.10
$ uname -a
Linux sasha 4.2.0-42-generic #49-Ubuntu SMP Tue Jun 28 21:26:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ truffle version
Truffle v3.2.4
$ solcjs --version
0.4.11+commit.68ef5810.Emscripten.clang
我尝试做的事情:
1) 我创建了一个简单的智能合约 Ownable:
pragma solidity ^0.4.11;
contract Ownable {
address public owner;
function Ownable() {
owner = msg.sender;
}
modifier onlyOwner {
if (msg.sender != owner) throw;
_;
}
function transferOwnership(address newOwner) onlyOwner {
if (newOwner != address(0)) {
owner = newOwner;
}
}
}
2) 初始化一个新的 truffle 项目并将 Ownable.sol 复制到 "contract" 文件夹中。
所以项目的结构必须如下:
test-comtract
-- contracts
-- Ownable.sol
-- migrations
-- 1_initial_migration.js
-- 2_deploy_contracts.js
-- test
truffle.js
3) 编译truffle项目:
$ cd test-comtract
$ truffle compile
编译后将创建"build"文件夹。
4) 转到 "build" 文件夹并在那里搜索 Ownable.json 文件。在此文件中,在 "unlinked_binary" 属性中搜索生成的字节码。该值如下所示:
0x6060604052341561000c57fe5b5b60008054600160a060020a03191633600160a060020a03161790555b5b60f3806100386000396000f300606060405263ffffffff60e060020a6000350416638da5cb5b8114602a578063f2fde38b146053575bfe5b3415603157fe5b6037606e565b60408051600160a060020a039092168252519081900360200190f35b3415605a57fe5b606c600160a060020a0360043516607d565b005b600054600160a060020a031681565b60005433600160a060020a0390811691161460985760006000fd5b600160a060020a0381161560c25760008054600160a060020a031916600160a060020a0383161790555b5b5b505600a165627a7a72305820607fc60d96cffbd50e58fbc028c1e4b6f3dfdf356bd439390481a479ef8d25500029
5) 尝试通过 Remix 在线编译器进行编译。 https//ethereum.github.io/browser-solidity/#version=soljson-v0.4.11+commit.68ef5810.js&optimize=true
编译结果如下图:
6060604052341561000c57fe5b5b60008054600160a060020a03191633600160a060020a03161790555b5b610119806100396000396000f300606060405263ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416638da5cb5b81146043578063f2fde38b14606c575bfe5b3415604a57fe5b60506087565b60408051600160a060020a039092168252519081900360200190f35b3415607357fe5b6085600160a060020a03600435166096565b005b600054600160a060020a031681565b60005433600160a060020a0390811691161460b15760006000fd5b600160a060020a0381161560e8576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b5b505600a165627a7a723058201eb1de901e30ec9818544272a4c70946cd9cb7cd848237ba3dca118e44d771a60029
6) 尝试通过 solcjs 的帮助进行编译:
$ cd test-comtract/contracts
$ solcjs --optimize --bin Ownable.sol
在 "test-comtract/contracts" 文件夹中将创建文件 "Ownable.sol:Ownable.bin"
6060604052341561000c57fe5b5b60008054600160a060020a03191633600160a060020a03161790555b5b610119806100396000396000f300606060405263ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416638da5cb5b81146043578063f2fde38b14606c575bfe5b3415604a57fe5b60506087565b60408051600160a060020a039092168252519081900360200190f35b3415607357fe5b6085600160a060020a03600435166096565b005b600054600160a060020a031681565b60005433600160a060020a0390811691161460b15760006000fd5b600160a060020a0381161560e8576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b5b505600a165627a7a7230582083a10cb56ea55b0a181cbc132bdf1bd4e0e8a02d5664db73bbc62217f0b7b8d00029
结果:SolJS 字节码与 Remix 字节码相同,但不同于 truffle 字节码。
7) 我还通过 truffle 将 Ownable.sol 部署到以太坊 (TEST_NET)。您可以通过以下方式看到它 URL:
https://ropsten.etherscan.io/address/0x6c8e1b321ce94b12069222b543558d4159527ecd
也许有人面临这样的问题。我将非常感谢听到它为什么快乐的任何版本。也许这是 Truffle 框架的一个已知错误。在 google 我发现更多的文章描述了类似的问题,但没有人提出解决方案。我非常需要帮助
提前致谢!
-- 亚历克斯
solc/truffle-compile 中有一个编译器优化,目前 etherscan 在编译合约时不支持。
已向 etherscan 发送评论!
有支持Truffle编译的verifier 2.0
您可以像我一样开始猜测优化级别和编译器。您可能会在尝试 100 次后得到它。我做到了。从现在开始,我不会在 truffle 的主网上部署任何东西。它非常适合测试和开发,但它与 etherscan 不一致。为此,您需要连接所有内容并在将来使用混音。
我创建了 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'
}
}
将您的合约迁移到 public 网络后,您可以通过 运行:
在 Etherscan 上验证它truffle run verify ContractName [--network networkName]
可以在 the repository or in my article Automatically verify Truffle smart contracts on Etherscan 上找到更多信息。