Solidity

使用介面驗證代幣合約

  • August 31, 2019

我設法在 Kovan 測試網上部署了一個帶有介面的代幣合約。

現在我想驗證程式碼。然而,這是一個比我想像的更大的問題。

合約成功部署到:https ://kovan.etherscan.io/address/0x4f7ff19bebc746be431a8a9b60ef1e380582a0f2

對於驗證,我選擇 etherscan 中的多文件驗證。因為主要的契約進口和介面(見下面的程式碼)。

以下是我在驗證過程中填寫的欄位:

我在欄位中填寫的內容

發送請求後,我收到以下錯誤:

錯誤

該網站顯示了預期的和給定的字節碼。兩個字節碼看起來都非常相似。但是我注意到一些字元是不同的。你們中有人知道錯誤可能是什麼嗎?

我已經連結到已部署的契約。這是合約程式碼:

標準契約.sol

pragma solidity ^0.4.21;

import "./StandardTokenInterface.sol";


contract StandardToken is StandardTokenInterface {

   uint256 constant private MAX_UINT256 = 2**256 - 1;
   mapping (address => uint256) public balances;
   mapping (address => mapping (address => uint256)) public allowed;
   /*
   NOTE:
   The following variables are OPTIONAL vanities.
   */
   string public name;                   //fancy name: eg Simon Bucks
   uint8 public decimals;                //How many decimals to show.
   string public symbol;                 //An identifier: eg SBX

   function StandardToken(
       uint256 _initialAmount,
       string _tokenName,
       uint8 _decimalUnits,
       string _tokenSymbol
   ) public {
       balances[msg.sender] = _initialAmount;               // Give the creator all initial tokens
       totalSupply = _initialAmount;                        // Update total supply
       name = _tokenName;                                   // Set the name for display purposes
       decimals = _decimalUnits;                            // Amount of decimals for display purposes
       symbol = _tokenSymbol;                               // Set the symbol for display purposes
   }

   function transfer(address _to, uint256 _value) public returns (bool success) {
       require(balances[msg.sender] >= _value);
       balances[msg.sender] -= _value;
       balances[_to] += _value;
       emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars
       return true;
   }

   function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
       uint256 allowance = allowed[_from][msg.sender];
       require(balances[_from] >= _value && allowance >= _value);
       balances[_to] += _value;
       balances[_from] -= _value;
       if (allowance < MAX_UINT256) {
           allowed[_from][msg.sender] -= _value;
       }
       emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars
       return true;
   }

   function balanceOf(address _owner) public view returns (uint256 balance) {
       return balances[_owner];
   }

   function approve(address _spender, uint256 _value) public returns (bool success) {
       allowed[msg.sender][_spender] = _value;
       emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars
       return true;
   }

   function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
       return allowed[_owner][_spender];
   }
}

標準介面.sol

pragma solidity ^0.4.21;

contract StandardTokenInterface {
   /* This is a slight change to the ERC20 base standard.
   function totalSupply() constant returns (uint256 supply);
   is replaced with:
   uint256 public totalSupply;
   This automatically creates a getter function for the totalSupply.
   This is moved to the base contract since public getter functions are not
   currently recognised as an implementation of the matching abstract
   function by the compiler.
   */
   /// total amount of tokens
   uint256 public totalSupply;

   /// @param _owner The address from which the balance will be retrieved
   /// @return The balance
   function balanceOf(address _owner) public view returns (uint256 balance);

   /// @notice send `_value` token to `_to` from `msg.sender`
   /// @param _to The address of the recipient
   /// @param _value The amount of token to be transferred
   /// @return Whether the transfer was successful or not
   function transfer(address _to, uint256 _value) public returns (bool success);

   /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
   /// @param _from The address of the sender
   /// @param _to The address of the recipient
   /// @param _value The amount of token to be transferred
   /// @return Whether the transfer was successful or not
   function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);

   /// @notice `msg.sender` approves `_spender` to spend `_value` tokens
   /// @param _spender The address of the account able to transfer the tokens
   /// @param _value The amount of tokens to be approved for transfer
   /// @return Whether the approval was successful or not
   function approve(address _spender, uint256 _value) public returns (bool success);

   /// @param _owner The address of the account owning tokens
   /// @param _spender The address of the account able to transfer the tokens
   /// @return Amount of remaining tokens allowed to spent
   function allowance(address _owner, address _spender) public view returns (uint256 remaining);

   // solhint-disable-next-line no-simple-event-func-name
   event Transfer(address indexed _from, address indexed _to, uint256 _value);
   event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

以下是我使用的建構子參數:

10000, "MyFavToken", 18, "MFav"

伙計們,我真的很討厭我的生活。我花了 10 多個小時才找到解決這個問題的方法。

我用各種不同的方法編譯了契約。部署與每一個都有效,但仍然無法驗證契約。

過了一會兒,我發現我沒有將 etherscan 上的優化複選框設置為“是”。

我一直在編譯優化,沒有意識到我必須告訴 etherscan!

您能否確保用於編譯已部署字節碼的編譯器版本與您在 Etherscan 中用於驗證的編譯器版本相同?

如果您使用truffle,請輸入truffle version並檢查“ Solidity vX.XX ”輸出

引用自:https://ethereum.stackexchange.com/questions/74446