Blockchain 松露部署合同可以';无法通过Etherscan进行验证
我面临的问题是,块菌生成的字节码与solcjs(本地编译器)和Remix(在线编译器)不同。因此,我无法通过Etherscan验证我的合同(请参阅) 我的环境:Blockchain 松露部署合同可以';无法通过Etherscan进行验证,blockchain,ethereum,truffle,consensys-truffle,Blockchain,Ethereum,Truffle,Consensys Truffle,我面临的问题是,块菌生成的字节码与solcjs(本地编译器)和Remix(在线编译器)不同。因此,我无法通过Etherscan验证我的合同(请参阅) 我的环境: 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 $
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) 我创建了一个简单的智能合约:
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) 初始化一个新的块菌项目,并将Ownable.sol复制到“contract”文件夹中
因此,项目结构必须如下所示:
test-comtract
-- contracts
-- Ownable.sol
-- migrations
-- 1_initial_migration.js
-- 2_deploy_contracts.js
-- test
truffle.js
3) 编译块菌项目:
$ cd test-comtract
$ truffle compile
编译后,将创建“build”文件夹
4) 转到“build”文件夹并在那里搜索Ownable.json文件。在此文件中,在“unlinked_binary”属性中搜索生成的字节码。该值如下所示:
0x6060604052341561000C57FE5B5B6008054600160A060020A03191633600160A060020A03161790555B5B60F3806100386000396000F3006060405263FFFFFFFF60E060020A600035041668DA5CB5B8114602A578063F2FDE38B146053575BFE5B341560315BF6037606E565B6060160A020A0390921682525190800FFFFFFFF6060606060F3B5B5B3606060560057FE5B0060606057B5B00606060606050707070707600160160F5B5B5B006060606060606060606060606060606060606060606060606060606050160A060020A031681565B600005433600160A060020A0390811691161460985760006000FD5B600160A060020A0381161560C2576000854600160A060020A031916600160A060020A0383161790555B5B50560A165627A7A7230582007FC60D96CFFBD50E58FBC028C1E4B6F3DF356BD439481A479EF8D25500029
5) 试图通过混音在线编译器编译。https//ethereum.github.io/browser solidity/#version=soljson-v0.4.11+commit.68ef5810.js&optimize=true
汇编结果如下:
6060604052341561000C57FE5B60008054600160A060020A03191633600160A060020A031617905B5B61119806100396000396000F300606040604065263FFFFFF7C010000000000000000000000000000000000000000000000000000000000000000000000000000000350416638DA5CB5B811460435706F2FDE38B146C575BFE541604A57FE5B60506050606060606875B604080160A0600A020A039092168252519081900F35B3156073573FE5B6085600160A060020A03600435166096565B005B6000054600160A060020A031681565B600005433600160A060020A0390811691460B157600060006FD5B160A060020A0381161560E8576000805473FFFFFFFFFFFFFFFF1916600160A060020A0381790555B505B505600A165627A7230581EB1DE901E30EC9818544272A70946CD9CB7CD82377BA3D60029
6) 试图通过solcjs的帮助进行编译:
$ cd test-comtract/contracts
$ solcjs --optimize --bin Ownable.sol
在“测试合同/合同”文件夹中,将创建文件“Ownable.sol:Ownable.bin”
6060604052341561000C57FE5B60008054600160A060020A03191633600160A060020A031617905B5B61119806100396000396000F300606040604065263FFFFFF7C010000000000000000000000000000000000000000000000000000000000000000000000000000000350416638DA5CB5B811460435706F2FDE38B146C575BFE541604A57FE5B60506050606060606875B604080160A0600A020A039092168252519081900F35B3156073573FE5B6085600160A060020A03600435166096565B005B6000054600160A060020A031681565B600005433600160A060020A0390811691460B157600060006FD5B600160A060020A03811615660E8576000805473FFFFFFFFFFFFFFFFFFFF1916600160A060020A0381790555B50B500600A165627A7230582083CB56EA55B0A181817B132BDF14B0B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1916600160020A060020A038627B1627B7229
结果:SolJS字节码与混音字节码相同,但与块菌字节码不同。
7) 我还通过truffle将Ownable.sol部署到以太坊(TEST_NET)。您可以通过以下URL查看:
也许有人面临着这样的问题。我将非常感激听到任何版本为什么会发生。也许这是块菌框架的一个已知缺陷。在谷歌,我发现更多的文章描述了类似的问题,但没有人提出解决方案。我非常需要帮助
提前谢谢
--
Alex在solc/truffle compile中有一个编译器优化,目前etherscan在编译契约时不支持该优化
向以太扫描发送了一条评论 有一个支持Truffle编译的verifier 2.0
您可以像我一样开始猜测优化级别和编译器。你可能会在100次尝试后得到它。是的。从现在起,我不会从truffle在mainnet上部署任何东西。这对于测试和开发来说是很好的,但是它与etherscan不一致。为此,您需要连接所有内容并在将来使用混音。我创建了
truffle plugin verify
以在Etherscan上自动验证truffle合同
npm安装块菌插件验证
truffle.js
或truffle config.js
文件中module.exports={
/*…松露的其余部分*/
插件:[
“块菌插件验证”
]
}
module.exports={
/*…松露的其余部分*/
api_密钥:{
以太扫描:“我的API密钥”
}
}
将合同迁移到公共网络后,您可以通过运行以下命令在Etherscan上对其进行验证:
truffle run verify ContractName [--network networkName]
更多信息可以在我的文章中找到。问题恰恰在于编译器优化。“跑步:200”一切都很好。我将向Etherscan发送电子邮件。非常感谢@亚历克斯:也许是个愚蠢的问题,但我还是不明白。举个例子,如果我看混音和solc.js输出,例如我有两条尾巴:“18e44d771a60029”和“17f0b7b8d00029”。为什么你认为这两个完全相同?参见下面的Rosco的解决方案:<代码> Tuffle插件验证< /代码> -这对MeaNKS起了很大作用,这是有效的!!