Solidity
如何在 Remix 或 web3 呼叫中將結構數據作為函式輸入發送?
我創建了一個函式,它獲取一個包含 int+struct 的結構。現在當我想測試它時,我應該發送什麼數據,例如在 Remix 上:
這是程式碼,來自另一個 SO 問題 -如何將結構數組作為參數發送
pragma solidity ^0.4.24; pragma experimental ABIEncoderV2; contract ExchangeContract { enum CurrencyType { USD, TWOKEY, BTC, ETH, DAI, USDT, TUSD, EUR, JPY, GBP} mapping(uint256 => CurrencyPrice) public priceByCurrencyType; struct Price{ uint price; uint decimals; } struct CurrencyPrice{ uint currencyInt; Price price; } function updatePrices(CurrencyPrice[] memory _array) public { for(uint i=0; i<_array.length; i++){ priceByCurrencyType[_array[0].currencyInt].price=_array[i].price; } } }
現在,我想與 Remix 中的那個功能進行互動——這可能嗎?
在你的參數類型中使用的結構
updatePrices
有一個特殊性,它包含一個類型是另一個結構的成員。我們稍後會回到這個問題,現在讓我們看看它如何與“簡單”結構一起使用。contract Contract { struct Simple { int a; int b; } Simple[] public array; function add(Simple[] memory _array) public { for(uint i=0; i<_array.length; i++){ array.push(_array[i]); } } }
你可以看到它相當簡單。在 Remix 上,如果你想打電話
add
,也很簡單。您只需創建一個數組,就像創建任何其他類型一樣,然後添加代表每個結構的“子數組”。這是一個例子:
[[1,2],[3,4]]
您正在添加兩個結構。第一個包含
1
and2
,將分別分配給結構的a
andb
成員,第二個包含3
and的內容相同4
。現在,回到你的契約。
從邏輯上講,我們將
updatePrices
使用以下輸入進行呼叫[[5,[2,2]]]
。它是一個長度數組1
,5
是結構的currencyInt
成員和[2,2]
相應的值Price
。目前在 remix.ethereum.org 上是不可能的,它不會工作。
但是,它是在alpha remix上實現的,如果您使用上面的輸入,它將正常工作。
關於您的契約本身
我認為這條線上有錯誤
priceByCurrencyType[_array[0].currencyInt].price=_array[i].price; ^
你可能打算這樣做
_array[i]
。