Truffle
在 Truffle 控制台中獲取數組值
有沒有辦法將我的契約中的數組值列印到控制台(例如使用 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