Solidity
使用介面驗證代幣合約
我設法在 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 ”輸出