Solidity

在 remix 中 revert() 時找不到記錄的方法

  • April 16, 2018

這是我第一次使用 Solidity,很快就遇到了問題。

當地址沒有足夠的餘額或無權添加硬幣時,我想記錄一個錯誤,當這些異常發生時,腳本會執行它應該做的事情,即return. 問題是我似乎無法在任何地方找到我的日誌。

這是程式碼:

pragma solidity ^0.4.0;

contract Testcoin {
   address public creator;
   mapping (address => uint) public balances;

   event Delivered(address from, address to, uint amount);
   event StringLogger(string message);

   function TestCoin() {
       creator = msg.sender;
   }

   function create(address receiver, uint amount) {
       if (msg.sender != creator){ 
           emit StringLogger('This Account is not allowed too create tokens.');
           revert();
       }
       balances[receiver] += amount;
   }

   function transfer(address receiver, uint amount) {
       if (balances[msg.sender] < amount){         
           emit StringLogger('Not enough balance');
           revert();
       }
       balances[msg.sender] -= amount;
       balances[receiver] += amount;
       emit Delivered(msg.sender, receiver, amount);
   }

}

例如,當發件人有 3000 餘額並嘗試將 4000 發送到 x 地址時,我收到一條日誌,表明交易已被探勘但失敗但輸出和日誌為空。

我怎樣才能看到日誌,這樣我才能確切地看到發生了什麼?

分兩部分回答。

首先,我們應該嘗試做什麼。不用擔心擷取錯誤。這與其他平台和風格相反,其他平台和風格被認為是糟糕的形式,允許硬停止冒泡而不被抓住。

在這裡,不可變軟體意味著消除不必要的複雜性。溝通原因總是會引入不必要的複雜性。最佳實踐是儘早失敗。努力失敗。

本節

if (msg.sender != creator){ emit StringLogger(‘此帳戶不允許創建令牌。’); 恢復(); }

revert()將引發一個錯誤,該錯誤會冒泡到呼叫合約函式並最終到達簽署交易的 EOA。他們得到一個失敗的交易,這意味著狀態沒有改變(除了沒收的氣體)。該事件是一個狀態變化,但是,由於後來emit發生的事情,它沒有發生。revert()

這不是你想打的。

require(msg.sender == creator);

完畢。沒有對使用者的解釋。

和這裡:

if (balances[msg.sender] < amount){         
 emit StringLogger('Not enough balance');
 revert();
}

這將做:

require(balances[msg.sender] >= amount)

有一個擴展的計劃revert(),包括一個原因,這將是一個可喜的改進。同時,我建議客戶應該完全發現合約狀態,並且不可接受的交易應該在沒有解釋的情況下硬停止。

希望能幫助到你。

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