以太坊合约的坑.
被意外更改的合约变量
1
2
3
4
5
6
7
8
9
10
11
12
13
| pragma solidity ^0.4.11;
contract Test{
address public a;
address public b;
function Test() public{
a=msg.sender;
b=msg.sender;
uint256[2] g=[uint256(0),uint256(0)];
g[0]=uint256(-1);
}
}
|
如果msg.sender是 0xca35b7d915458ef540ade6068dfe2f44e8fa733c,那么想象中的合约变量a,b都应该是这个值,但是结果却是:
1
2
| // a: address: 0xffffffffffffffffffffffffffffffffffffffff
// b: address: 0xca35b7d915458ef540ade6068dfe2f44e8fa733c
|
可以看出a变成了 g[0]的值。 这是因为solidity对于这个未初始化的数组时,把它指向了合约变量地址,所以修改 g[0]就相当于修改了 a,读者可以试试修改 g[1]实际是修改了 b.
解决办法是将数组改成memory,防止他变成storage
1
| uint256[2] memory g = [uint256(-1),uint256(-1)];
|