Contract-Invocation
通過合約呼叫提供參數的正確方法?
我正在嘗試使用一些參數進行契約呼叫。我使用 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。