Web3js

如何使用數組或字典向 Solidity 函式發送多個參數?

  • December 5, 2017

提前對不起我的英語我是法國人:)

我嘗試創建一個簡單的乙太坊錢包。這個想法是允許使用者創建契約並與之互動。我正在使用meteor、web3 和一個testRPC 節點。

基本上對於與契約的互動,對於我在瀏覽器上列印其功能列表的每個契約。使用者只需點擊他想要的函式,然後列印一個彈出視窗以檢索函式的參數。然後我使用 web3 將請求發送到 testRPC 節點並使用回調為使用者列印結果。

問題是基本上我事先並不明顯知道函式和arg是什麼。所以我用一個特殊的數字索引我的每個 html 文件,並結合數據庫,我檢索契約的地址,以及關於函式的所有資訊(使用 ABI)。然後我創建三個變數:

  1. 一個變數contract
  2. 一個變數functionPrototype = abi of my function
  3. args = {nameArg1 : arg1, nameArg2 : arg2 etc...} 一本包含我的論點的字典。

然後我有契約,函式的名稱和參數。

如果原始的 Solidity 函式是:

  • function whatever(type nameArg1, type nameArg2) public{}

我想使用以下 web3 函式發送我的請求:

  • contract[functionPrototype.name](args, {from: account, gas: 350000}, function(err, result){})

但是這個請求不起作用。當我編寫所有參數時,以下請求有效:

  • contract[functionPrototype.name](arg1, arg2, {from: account, gas: 350000}, function(err, result){})

所以人們可以說:你為什麼不使用第二個請求?

因為有無數個函式,我無法為每個函式編寫所有參數。我需要自動化所有過程,所以基本上檢索 arg 和函式的名稱,並使用字典或數組作為輸入。

我嘗試使用帶有數組apply的函式,但它也不起作用。我一直都有一個WebSocket is closed due to suspension.

那麼你知道我如何使用字典或數組將我的參數發送到solidity函式嗎?

非常感謝!!!

祝你工作順利

你的apply函式程式碼是什麼?它應該是

contract[funcName].apply(contract, paramsArray)

如果您的框架支持 ES2015,您可以在函式呼叫中使用 spread

contract[funcName](...paramsArray)

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