1. 程式人生 > >solidity智慧合約[54]-安全—取反

solidity智慧合約[54]-安全—取反

相反數

有符號的solidity整數型別如果有N位。那麼其值的範圍是-2^(N-1) to 2^(N-1)-1。 這意味著該型別負數的最大值取相反數之後不能夠被接收。

相反數陷阱

如下的Negation合約說明了負數在面臨取相反數操作時可能遇到的問題。由於對於負數取相反數。實則是取負數的補碼操作。因此、當某int型別最大的負數取相反數的時候,會是其本身。如當int8的最大值-128傳遞到negate8執行取反操作的時候,會返回128。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
contract Negation {

   function
negate8(int8 _i) public pure returns(int8)
{

       return -_i;
   }

   function negate16(int16 _i) public pure returns(int16) {
       return -_i;
   }

   int8 public d = negate8(127); // -127
   int8 public a = negate8(-128
); // -128

   int16 public b = negate16(-128); // 128
   int16 public c = negate16(-32768); // -32768
}

解決辦法

1、使用更大的型別來接收可以避免出現問題。
2、檢查是否達到了該型別的最大負數。

image.png