代幣轉移:內在氣體太低
我通過這個連結創建了一種加密貨幣。我已經在 Mist 中部署了合約。我正在使用乙太坊錢包中的 transferFrom() 函式將貨幣從一個賬戶轉移到另一個賬戶,但出現內在氣體太低錯誤(執行失敗。消耗了所有提供的氣體)。雖然我的 primaryAccount(我試圖從中轉移)包含足夠的乙太幣(超過 20,000 個乙太幣)。
函式 transferFrom(address _from, address _to, uint256 _value) 返回 (bool 成功) { if (balanceOf[_from] 津貼[_from][msg.sender]) 拋出;// 檢查津貼 balanceOf[_from] -= _value; // 從發送者中減去 balanceOf[_to] += _value; // 將相同的內容添加到收件人 津貼[_from][msg.sender] -= _value; 獎勵=計算獎勵(現在); balanceOf[block.coinbase] += 獎勵; 轉移(_from,_to,_value); 返回真; }
而其他類似的函式,如 transfer() 執行良好。無法理解為什麼兩個函式的行為不同。我正在添加錯誤圖像以供參考。
我想我得到了答案。Mist不存在低gas問題。該函式沒有執行,因為在呼叫時
approveAndCall
我們正在使用allowance[msg.sender][_spender] = _value;
但在transferFrom()
函式中我們正在檢查值allowance[_from][msg.sender])
。我將其修改為if (_value > allowance[msg.sender][_from]) throw;
intransferFrom
並且一切都開始正常工作。
我懷疑你的問題是因為你沒有批准呼叫所需的轉移
transferFrom(...)
。以下是相關功能:
/* Send coins */ function transfer(address _to, uint256 _value) { if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows balanceOf[msg.sender] -= _value; // Subtract from the sender balanceOf[_to] += _value; // Add the same to the recipient Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took place } /* Allow another contract to spend some tokens in your behalf */ function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success) { allowance[msg.sender][_spender] = _value; tokenRecipient spender = tokenRecipient(_spender); spender.receiveApproval(msg.sender, _value, this, _extraData); return true; } /* A contract attempts to get the coins */ function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { if (balanceOf[_from] < _value) throw; // Check if the sender has enough if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows if (_value > allowance[_from][msg.sender]) throw; // Check allowance balanceOf[_from] -= _value; // Subtract from the sender balanceOf[_to] += _value; // Add the same to the recipient allowance[_from][msg.sender] -= _value; Transfer(_from, _to, _value); return true; }
如果您是代幣的目前所有者,您可以致電
transfer(...)
將您的餘額轉移到另一個地址。但是,如果您想從另一個地址轉賬,您需要呼叫
transferFrom(...)
它將檢查allowance[...][...]
資料結構以確認此轉賬是否已被批准。因此,
approveAndCall(...)
請先致電批准您的轉讓,然後您應該可以致電transferFrom(...)
轉讓您的代幣。當您在
transferFrom(...)
沒有第一次呼叫的情況下呼叫approveAndCall(...)
時,會在該行中拋出錯誤if (_value > allowance[_from][msg.sender]) throw; // Check allowance
此錯誤將在乙太坊錢包中顯示為 Out Of Gas 錯誤。
如果您習慣使用
geth
,請參閱當 gas 與成功交易所用的 gas 完全相同時,如何檢測拋出錯誤的交易狀態?以下程式碼可用於檢查錯誤的確切原因:> var status = debug.traceTransaction("0xd23219e2ea10528b245deb9e47993cae2ffd3ffe9fc27aeb808e94fc4e75d37b") undefined > if (status.structLogs.length > 0) { console.log(status.structLogs[status.structLogs.length-1].error) } "invalid jump destination (PUSH1) 2"