Contract-Development
如何使用 sendRawTransaction 呼叫我的合約函式?
我正在嘗試使用
sendRawTransaction
. 我的契約中有一個功能updateReading(address consumerAddress, uint32 consumerMeterId, uint64 consumedReadingValue, address producerAddress, uint32 producerMeterId, uint64 producedReadingValue)
我想使用 sendRawTransaction 呼叫它。該
updateReading
函式更新合約的合約狀態。如何使用 呼叫此函式sendRawTransaction
?我正在使用 truffle 框架進行開發。我在我的 js 中編寫了以下程式碼來使用
sendRawTransaction
.var privateKey = new Buffer(password,'hex') var setData; var contractAddress; EnergyTrade.deployed().then(function (instance) { contractAddress=instance.address; setData=instance.updateReading(consumerAddress,consumerMeterId,consumedReadingValue,producerAddress,producerMeterId,producedReadingValue); var rawTx = { to:contractAddress, from:consumerAddress, data: setData } var tx = new Tx(rawTx); tx.sign(privateKey); var serializedTx = tx.serialize(); web3.eth.sendRawTransaction(serializedTx.toString('hex'), function(err, hash) { if (!err) console.log(hash); }); })
它在我的控制台中返回以下錯誤。
(node:23336) UnhandledPromiseRejectionWarning: Error: invalid type at Object.exports.toBuffer (/home/maria/Desktop/12-Energy/node_modules/ethereumjs-util/dist/index.js:177:13) at Transaction.setter [as data] (/home/maria/Desktop/12-Energy/node_modules/ethereumjs-util/dist/index.js:625:19) at /home/maria/Desktop/12-Energy/node_modules/ethereumjs-util/dist/index.js:685:63 at Array.forEach (<anonymous>)
另一個問題是
(node:23336) UnhandledPromiseRejectionWarning: Error: invalid address at inputAddressFormatter (/home/maria/Desktop/12-Energy/node_modules/truffle-contract/node_modules/web3/lib/web3/formatters.js:271:11) at inputTransactionFormatter (/home/maria/Desktop/12-Energy/node_modules/truffle-contract/node_modules/web3/lib/web3/formatters.js:97:20) at /home/maria/Desktop/12-Energy/node_modules/truffle-contract/node_modules/web3/lib/web3/method.js:89:28 at Array.map (<anonymous>)
如何
sendRawTransaction
使用 truffle 框架在我的 js 中實現?
正如錯誤消息所說,Truffle 沒有
getData
方法,但從我閱讀程式碼,我相信您可以通過contract
成員訪問底層的 web3.js 合約對象。試試這個:setData=instance.contract.updateReading.getData (consumerAddress,consumerMeterId,consumedReadingValue,producerAddress,producerMeterId,producedReadingValue);
您的程式碼中的問題出
instance.updateReading()
在這一行。Web3js 將根據您的原始 abi 將其視為直接函式呼叫(sendTransation 或 call())。即它不會創建 bin 或 hex 字元串。我不太確定 getData() 方法。根據 web3js,您可以使用**
encodeABI()
**此方法將返回字節碼。只需您可以附加您的
setData = instance.updateReading(consumerAddress,consumerMeterId,consumedReadingValue,producerAddress,producerMeterId,producedReadingValue).encodeABI();
更多詳情請參考以下連結
https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-encodeabi
https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethsendrawtransaction