Solidity

斷言依賴於餘額

  • November 28, 2019

乙太坊區塊鏈中是否有可能同時發生兩個或多個事件?

關於以下可靠性程式碼:

   function _transfer(address _from, address _to, uint _value) internal {
   // Prevent transfer to 0x0 address. Use burn() instead
   require(_to != 0x0);
   // Check if the sender has enough
   require(balanceOf[_from] >= _value);
   // Check for overflows
   require(balanceOf[_to] + _value > balanceOf[_to]);
   // Save this for an assertion in the future
   uint previousBalances = balanceOf[_from] + balanceOf[_to];
   // Subtract from the sender
   balanceOf[_from] -= _value;
   // Add the same to the recipient
   balanceOf[_to] += _value;
   Transfer(_from, _to, _value);
   // Asserts are used to use static analysis to find bugs in your code. They should never fail
   assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
}

如果發生了一些銷毀或鑄造操作並在餘額更新之後但在斷言之前更改了 _to 或 _from 的餘額怎麼辦。

例如: (_from) 的餘額 = 10 ,(_to) 的餘額 = 0 uint previousBalances = 10

函式 _transfered 觸發並且 _value = 5 所以在更新余額後我們將有 Balance of (_from) = 5 , Balance of (_to) = 5 uint previousBalances = 10

如果在餘額更新之後但在斷言之前 3 個代幣被鑄造到 (_to) 餘額的 (_from) = 5 的地址,(_to) 的餘額 = 5+3 因此斷言將失敗 uint previousBalances = 5 + 5 + 3 = 13

這個斷言是控制更新余額的正確方法嗎?

並發是不可能的。

在開采之前不接受交易。挖出的區塊是有序的交易列表。每個事務在其之前的事務之後的狀態上下文中執行。

您對assert外觀的使用合適。

希望能幫助到你。

請記住,uint previousBalances = balanceOf[_from] + balanceOf[_to];稍後檢查斷言時可能已經溢出。因此,即使正確,傳輸也會失敗。但這不太可能,因為它要求發件人和收件人一起擁有超過 uint256 個令牌/eth。只有這樣它才會失敗。

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