Contract-Development

如何使用 sendRawTransaction 呼叫我的合約函式?

  • July 24, 2019

我正在嘗試使用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

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