Mist

代幣轉移:內在氣體太低

  • April 19, 2017

我通過這個連結創建了一種加密貨幣。我已經在 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"

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