Truffle

在 Truffle 控制台中獲取數組值

  • August 2, 2018

有沒有辦法將我的契約中的數組值列印到控制台(例如使用 truffle 或 geth)?

假設這是我的契約:

contract MetaCoin {

   uint256[] public someNumbers;

   function writeNumber(uint256 num) public {
     someNumbers.push(num);
   }
...

現在,我設法獲得了 的一個值someNumbers,但不是全部通過

> meta.someNumbers.call(0)
> BigNumber { s: 1, e: 2, c: [ 123 ] }

請注意,我首先創建了 MetaCoin 合約的實例MetaCoin.deployed().then(a => {meta = a})

我看到您想要一種方法來獲取每個添加的數字,並且可以通過將變數指定為 來完成public,自動創建一個 getter。

但是您還需要知道那裡有多少項目,必須定義一個新方法。

讓我們考慮一下這份契約

pragma solidity ^0.4.24;

contract MetaCoin {

   uint256[] public someNumbers;

   function writeNumber(uint256 num) public {
       someNumbers.push(num);
   }


   function getSomeNumbers() public view returns(uint256[]) {
       return someNumbers;
   }

   function getSomeNumbersLength() public view returns(uint256) {
       return someNumbers.length;
   }
}

您可以呼叫writeNumber(item)以將數字添加到您的數組中。

getSomeNumbers() public view returns(uint256[])

為了檢索它們,您可以使用getSomeNumbers()將返回完整項目數組的方法。然而,這不是一個好的做法,因為n項目將被添加到您的數組中並且您將返回n項目。項目的數量可以無限大,因此您的節點將無法返回完整的數組。

另一種方法更具可擴展性

getSomeNumbersLength() 公共視圖返回(uint256)

您可以檢索項目的數量並一一獲取。呼叫getSomeNumbersLength()將返回數組的長度,您可以通過呼叫一一檢索項目someNumbers(uint256 index)

Web3

回到你如何在 web3 中執行此操作,您需要分兩部分呼叫它

length = await meta.getSomeNumbersLength.call()

for (i = 0; i < length; i++) {
   item = await meta.someNumbers.call(i)
   // Do things with the `item`
}

在混音 ide 上進行實驗 https://gist.github.com/cleanunicorn/0025a060e7a5657a5e19855d11d36507

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