我正在尝试使用sendRawTransaction调用我的合同的方法。我的合同里有我的职责
updateReading(address consumerAddress,
uint32 consumerMeterId,
uint64 consumedReadingValue,
address producerAddress,
uint32 producerMeterId,
uint64 producedReadingValue)我想用sendRawTransaction来称呼它。updateReading函数更新合同的合同状态。如何使用sendRawTransaction调用此函数?
我使用块菌框架进行开发,我在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>)如何使用松露框架使js中的sendRawTransaction成为可能?
发布于 2018-02-12 12:20:26
正如错误消息所述,Tru显没有getData方法,但是从我对代码的阅读中,我相信您可以通过contract成员访问底层的web3.js契约对象。试一试:
setData=instance.contract.updateReading.getData (consumerAddress,consumerMeterId,consumedReadingValue,producerAddress,producerMeterId,producedReadingValue);发布于 2018-02-12 12:48:10
代码中的问题是这行中的instance.updateReading()。Web3js将作为基于原始abi的直接函数调用(sendTransation或call())来处理。也就是说,它不会创建bin或十六进制字符串。
对于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
复制相似问题