Ethereum-solidity的坑

以太坊合约的坑.

被意外更改的合约变量

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.sender0xca35b7d915458ef540ade6068dfe2f44e8fa733c,那么想象中的合约变量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)];

Comments