Estoy tratando de llamar al método de mi contrato usando sendRawTransaction
. Tengo una función en mi contrato.
updateReading(address consumerAddress,
uint32 consumerMeterId,
uint64 consumedReadingValue,
address producerAddress,
uint32 producerMeterId,
uint64 producedReadingValue)
que quiero llamar usando sendRawTransaction. La updateReading
función actualiza el estado del contrato del contrato. ¿Cómo puedo hacer una llamada a esta función usando sendRawTransaction
?
Estoy usando truffle framework para el desarrollo. He escrito el siguiente código en mi js para llamar a la función usando 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);
});
})
Devuelve el siguiente error en mi consola.
(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>)
Otro problema es
(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>)
¿Cómo puedo hacer sendRawTransaction
posible en mi js usando truffle framework?
Como dice el mensaje de error, Truffle no tiene un getData
método, pero según mi lectura del código, creo que puede acceder al objeto de contrato web3.js subyacente a través del contract
miembro. Prueba esto en su lugar:
setData=instance.contract.updateReading.getData (consumerAddress,consumerMeterId,consumedReadingValue,producerAddress,producerMeterId,producedReadingValue);
El problema en su código está instance.updateReading()
en esta línea. Web3js se tratará como una llamada de función directa (sendTransation o call()) basada en su abi original. es decir, no creará bin o cadena hexadecimal.
No estoy muy seguro acerca del método getData(). Según web3js, puede usar encodeABI()
este método para devolver el código de bytes.
Simplemente puede agregar su
setData = instance.updateReading(consumerAddress,consumerMeterId,consumedReadingValue,producerAddress,producerMeterId,producedReadingValue).encodeABI();
Para obtener más detalles, consulte el siguiente enlace
https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-encodeabi
https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethsendrawtransaction
encodeABI
es la versión web3.js 1.0.0 de web3.js 0.2xx's getData
. Pero están usando Truffle (que usa web3.js 0.2xx debajo), por eso mi respuesta funciona.
usuario19510
getData
. Creo que esperas lagetData
función de web3.js, pero estás usando Truffle.crissi mariam robert
getData
, pero se genera un nuevo problema (nodo: 23336) UnhandledPromiseRejectionWarning: Error: tipo no válido en Object.exports.toBuffer (/home/maria/Desktop/12-Energy/node_modules/ethereumjs-util /dist/index.js:177:13) en Transaction.setter [como datos] (/home/maria/Desktop/12-Energy/node_modules/ethereumjs-util/dist/index.js:625:19)usuario19510
crissi mariam robert
usuario19510
crissi mariam robert
usuario19510