Solidity

該合約未實現所有功能,因此無法創建

  • December 24, 2017

我按照這裡找到的教程:https ://steemit.com/ethereum/@maxnachamkin/how-to-create-your-own-ethereum-token-in-an-hour-erc20-verified

我嘗試使用 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;

因為這將是多餘的。

我覺得我應該提醒你不要繼續進行一些只是表面調查的事情。(沒有保修)。考慮使用一組目前且經過充分審查的契約,而不是修補其中有錯誤的契約。尋找不明顯的疏忽需要大量的程式碼。

希望能幫助到你。

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