Contract-Invocation

通過合約呼叫提供參數的正確方法?

  • March 15, 2018

我正在嘗試使用一些參數進行契約呼叫。我使用 NodeJS Express API 來做到這一點。

程式碼如下所示:

var array = JSON.parse(req.body.arguments);
               getContractFromABIAndAddress(req.body.abi, req.body.contractAddress, function(contract) {
                   contract.methods[req.body.method](array).send({from: config.publickey}).on('receipt', function(receipt) {
                       res.json({
                           txHash: receipt.transactionHash,
                           contractAddress: receipt.contractAddress,
                           txURL: config.etherscantransaction + receipt.transactionHash,
                           contractURL: config.etherscanaddress + receipt.contractAddress
                       })
                   });
               })

req.body.arguments包含所需的參數,並包含req.body.method呼叫合約的正確方法。

我可以用郵遞員測試程式碼,正文如下圖所示。

與郵遞員一起發帖的圖片

現在你可以在這裡看到:Web3 Contract docs,我使用的是第二個選項。myContract.methods['myMethod(uint256)'](123)

問題是我不能發送多個參數,合約需要這樣的參數:myContract.methods['myMethod(uint256,uint256)'](2,2)但我給它們是這樣myContract.methods['myMethod(uint256,uint256)']([2,2])的。

這導致以下結果:在此處輸入圖像描述

這意味著合約呼叫僅根據錯誤日誌和 web3-eth-contract 庫獲取一個參數。這可以通過執行以下操作來解決:在此處輸入圖像描述

這將我的參數轉換回正確的格式:在此處輸入圖像描述

如果 Web3 庫現在得到更新,我的 NodeJS API 將不再工作,因為我一直在搞亂這個庫。我找不到任何其他方式通過合約呼叫或合約發送來提供參數,因為那裡也存在問題。

有人可以幫我嗎?

我相信這應該有效:

contract.methods[req.body.method].apply(contract, array)

請參閱https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

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