Blockchain 松露部署合同可以';无法通过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 $

我面临的问题是,块菌生成的字节码与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

$ 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安装插件
  • npm安装块菌插件验证
    
  • 将插件添加到
    truffle.js
    truffle config.js
    文件中
  • module.exports={
    /*…松露的其余部分*/
    插件:[
    “块菌插件验证”
    ]
    }
    
  • 在您的Etherscan帐户上生成API密钥(请参阅)
  • 将Etherscan API密钥添加到块菌配置中
  • module.exports={
    /*…松露的其余部分*/
    api_密钥:{
    以太扫描:“我的API密钥”
    }
    }
    

    将合同迁移到公共网络后,您可以通过运行以下命令在Etherscan上对其进行验证:

    truffle run verify ContractName [--network networkName]
    


    更多信息可以在我的文章中找到。

    问题恰恰在于编译器优化。“跑步:200”一切都很好。我将向Etherscan发送电子邮件。非常感谢@亚历克斯:也许是个愚蠢的问题,但我还是不明白。举个例子,如果我看混音和solc.js输出,例如我有两条尾巴:“18e44d771a60029”和“17f0b7b8d00029”。为什么你认为这两个完全相同?参见下面的Rosco的解决方案:<代码> Tuffle插件验证< /代码> -这对MeaNKS起了很大作用,这是有效的!!