Solidity

為什麼我不能在 Solidity 中使用多個動態大小的變數?

  • December 2, 2017

以下程式碼段不起作用。

pragma solidity ^0.4.11;

contract Test1 {
   uint[] public a;
   uint[] public b;

   function putX(uint x) public {
       a.push(x);
       b.push(block.number);
   }

   function getA() public view returns (uint[]) {
       return a;
   }

   function getB() public view returns (uint[]) {
       return b;
   }
}

輸出:

> test1.putX.sendTransaction(11, {from: eth.accounts[0]})
> test1.getA()
[]
> test1.getB()
[]

相比之下,以下程式碼片段有效。

pragma solidity ^0.4.11;

contract Test2 {
   uint[2][] public a;

   function putX(uint x) public {
       a.push([x, block.number]);
   }

   function getA() public view returns (uint[2][]) {
       return a;
   }
}

輸出:

> test2.putX.sendTransaction(12, {from: eth.accounts[0]})
> test2.getA()
[[12, 1151]]

我想知道為什麼…我正在使用最新的穩定 geth (1.7)

我還嘗試使用動態大小的數組 + 映射,但它也不起作用。

我什至懷疑官方文件中的程式碼是否可以工作,因為它使用了多個動態大小的變數:

https://solidity.readthedocs.io/en/develop/solidity-by-example.html

有誰知道為什麼會這樣?

我已經用 remix、geth v1.7.2 和 v1.7.3 嘗試了你的程式碼,它都按預期工作。

也許您的問題是在交易被探勘之前進行查詢。這將導致合約返回之前的狀態。

引用自:https://ethereum.stackexchange.com/questions/32035