Solidity
該合約未實現所有功能,因此無法創建
我嘗試使用 Remix 創建這個合約。我不得不對網站上發布的程式碼進行一些更改,因為它已經過時了。我不得不將 throw 更改為 revert() 並將 sha3() 更改為 keccak256()。
Remix 不會創建合約。它說:“該合約沒有實現所有功能,因此無法創建。”
我究竟做錯了什麼?任何幫助深表感謝。
pragma 可靠性 ^0.4.4; 合約代幣{ 函式 totalSupply() 常量公共回報 (uint totalSupply); 函式 balanceOf(address _owner) 常量公共返回 (uint balance); function transfer(address _to, uint _value) public 返回(bool 成功); function transferFrom(address _from, address _to, uint _value) public 返回(bool 成功); 函式批准(地址_spender,uint_value)公共返回(布爾成功); function allowed(address _owner, address _spender) 常量公共收益(剩餘 uint); 事件傳輸(地址索引_from,地址索引_to,uint _value); 事件批准(地址索引_owner,地址索引_spender,uint_value); } 合約 StandardToken 是 Token { 函式 transfer(address _to, uint256 _value) 公共返回 (bool 成功) { //預設假設 totalSupply 不能超過最大值 (2^256 - 1)。 //如果你的token省略了totalSupply並且隨著時間的推移可以發行更多的token,你需要檢查它是否沒有包裹。 //用這個替換if。 //if (balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]) { if (balances[msg.sender] >= _value && _value > 0) { 餘額[msg.sender] -= _value; 餘額[_to] += _value; 轉移(msg.sender,_to,_value); 返回真; } 否則 { 返回假;} } 函式 transferFrom(address _from, address _to, uint256 _value) 公共返回 (bool 成功) { //和上面一樣。如果要防止包裝 uint,請將此行替換為以下內容。 //if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to]) { if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0) { 餘額[_to] += _value; 餘額[_from] -= _value; 允許[_from][msg.sender] -= _value; 轉移(_from,_to,_value); 返回真; } 否則 { 返回假;} } 函式 balanceOf(address _owner) 常量公共返回 (uint256 balance) { 返回餘額[_owner]; } 函式批准(地址_spender,uint256 _value)公共返回(布爾成功){ 允許[msg.sender][_spender] = _value; 批准(msg.sender,_spender,_value); 返回真; } 功能津貼(地址_owner,地址_spender)常量公共回報(uint256剩餘){ 允許返回[_owner][_spender]; } 映射(地址 => uint256)餘額; 允許映射(地址 => 映射(地址 => uint256)); uint256 公共總供應; } //給這個合約起任何你喜歡的名字 合約 TestToken 是 StandardToken { 函式()公共{ //如果乙太幣被發送到這個地址,把它發回。 恢復(); } /* 令牌的公共變數 */ /* 筆記: 以下變數是可選的虛榮心。不必包括它們。 它們允許自定義代幣合約,並且絕不會影響核心功能。 一些錢包/界面甚至可能懶得看這些資訊。 */ 字元串公共名稱=“TestToken”;//花哨的名字:例如西蒙雄鹿 uint8 公共小數 = 0; //顯示多少個小數。IE。可以有 1000 個帶有 3 位小數的基本單位。含義 0.980 SBX = 980 個基本單位。這就像將 1 wei 與 1 ether 進行比較。 字元串公共符號=“TTT”;//一個標識符:例如SBX 字元串公開版本=“1.0”;//人類0.1標準。只是一個任意的版本控制方案。 // // 為您的代幣更改這些值 // //確保此函式名稱與上面的合約名稱匹配。因此,如果您的代幣名為 TutorialToken,請確保上面的//合約名稱也是 TutorialToken 而不是 ERC20Token 功能TestToken()公共{ 餘額[msg.sender] = 100000; // 給創建者所有初始令牌(例如 100000) 總供應量 = 100000;// 更新總供應量(例如 100000) name = "TestToken"; // 設置名稱以供顯示 小數 = 0; // 用於顯示的小數位數 符號=“TTT”;// 設置符號用於顯示目的 } /* 批准然後呼叫接收合約 */ 函式approveAndCall(address _spender, uint256 _value, bytes _extraData) 公共返回(bool 成功) { 允許[msg.sender][_spender] = _value; 批准(msg.sender,_spender,_value); //呼叫要通知的合約的receiveApproval函式。這會手動製作函式簽名,因此不必為此在此處包含契約。 //receiveApproval(address _from, uint256 _value, address _tokenContract, bytes _extraData) //假設什麼時候呼叫*應該*成功,否則將使用香草批准代替。 if(!_spender.call(bytes4(bytes32(keccak256("receiveApproval(address,uint256,address,bytes)"))), msg.sender, _value, this, _extraData)) { revert(); } 返回真; } }
問題
totalSupply()
是缺少實現。似乎自動生成的吸氣劑不算數。所以你需要顯式地創建函式。contract StandardToken is Token { uint256 _totalSupply; function totalSupply() constant returns (uint256 totalSupply) { totalSupply = _totalSupply; } }
同意安德烈,這是因為它
totalSupply
被聲明為介面的一部分,然後從未定義。不一致導致我快速檢查編譯指示,但0.4.4
由於存在revert
.這
pragma solidity ^0.4.18; contract Token { uint public totalSupply;
加上這個近59
// uint256 public totalSupply;
因為這將是多餘的。
我覺得我應該提醒你不要繼續進行一些只是表面調查的事情。(沒有保修)。考慮使用一組目前且經過充分審查的契約,而不是修補其中有錯誤的契約。尋找不明顯的疏忽需要大量的程式碼。
希望能幫助到你。