Solidity

如何在 Remix 或 web3 呼叫中將結構數據作為函式輸入發送?

  • May 9, 2019

我創建了一個函式,它獲取一個包含 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]]

您正在添加兩個結構。第一個包含1and 2,將分別分配給結構的aandb成員,第二個包含3and的內容相同4

現在,回到你的契約。

從邏輯上講,我們將updatePrices使用以下輸入進行呼叫[[5,[2,2]]]。它是一個長度數組15是結構的currencyInt成員和[2,2]相應的值Price

目前在 remix.ethereum.org 上是不可能的,它不會工作。

但是,它是在alpha remix上實現的,如果您使用上面的輸入,它將正常工作。

在此處輸入圖像描述

關於您的契約本身

我認為這條線上有錯誤

priceByCurrencyType[_array[0].currencyInt].price=_array[i].price;
                          ^

你可能打算這樣做_array[i]

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