簡體   English   中英

松露部署的合同無法通過Etherscan進行驗證

[英]Truffle deployed contracts can't be verified through Etherscan

我面臨的問題是,松露生成的字節碼不同於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)啟動一個新的松露項目並將Ownable.sol復制到“合同”文件夾中。

所以項目的結構必須如下:

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”屬性中搜索生成的字節碼。 值如下所示:

5)試圖通過Remix在線編譯器編譯。 HTTPS // ethereum.github.io /瀏覽器的堅固性/#版本= soljson-v0.4.11 + commit.68ef5810.js&優化=真

編譯結果如下:

6)嘗試通過solcjs幫助編譯:

$ cd test-comtract/contracts 
$ solcjs --optimize --bin Ownable.sol

在“test-comtract / contracts”文件夾中將創建文件“Ownable.sol:Ownable.bin”

結果:SolJS字節碼與Remix字節碼相同,但與松露字節碼不同。

7)我還通過松露將Ownable.sol部署到以太坊(TEST_NET)。 您可以通過以下網址查看:

https://ropsten.etherscan.io/address/0x6c8e1b321ce94b12069222b543558d4159527ecd

也許有人面臨這樣的問題。 我會非常感激地聽到任何版本的原因。 也許這是Truffle框架的一個已知錯誤。 在谷歌我發現更多的文章描述了類似的問題,但沒有人提出解決方案。 我非常需要幫助

提前致謝!

- 亞歷克斯

在solc / truffle-compile中有一個編譯器優化,此時etherscan在編譯契約時不支持。

https://github.com/trufflesuite/truffle-compile/blob/331809c73389f27f9dda40229061bb75b18f27ca/index.js#L70

發送評論給etherscan關於它!

有一個驗證程序2.0支持Truffle的編譯。

https://etherscan.io/verifyContract2

你可以做我做的事情並開始猜測優化級別和編譯器。 你可能會在100次嘗試后得到它。 我做到了。 從現在開始,我不會在松露的主網上部署任何東西。 它非常適合測試和開發,但它與etherscan不一致。 為此,您需要連接所有內容並在將來使用remix。

我創建了truffle-plugin-verify來自動化Etherscan上的Truffle合同驗證。


  1. 用npm安裝插件
npm install truffle-plugin-verify
  1. 將插件添加到truffle.jstruffle.js truffle-config.js文件中
module.exports = {
  /* ... rest of truffle-config */

  plugins: [
    'truffle-plugin-verify'
  ]
}
  1. 在您的Etherscan帳戶上生成API密鑰(請參閱Etherscan網站
  2. 將您的Etherscan API密鑰添加到您的松露配置中
module.exports = {
  /* ... rest of truffle-config */

  api_keys: {
    etherscan: 'MY_API_KEY'
  }
}

將合同遷移到公共網絡后,您可以通過運行以下方式在Etherscan上進行驗證:

truffle run verify ContractName [--network networkName]

更多信息可以在存儲庫或我的文章中自動驗證Etherscan上的Truffle智能合約

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM