¿Cómo llamar a la función de mi contrato usando sendRawTransaction?

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 updateReadingfunció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 sendRawTransactionposible en mi js usando truffle framework?

El error es bastante claro: no existe tal función getData. Creo que esperas la getDatafunción de web3.js, pero estás usando Truffle.
@smarx He actualizado esa línea sin usar 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)
¿Actualizado a qué? No veo ninguna edición en su código.
@smarx He modificado el código... Señale los errores en mi código js
El cambio que hiciste no tiene sentido para mí. No estoy seguro de lo que esperabas que hiciera. Espero que mi respuesta ayude.
@smarx intentaré con tu actualización y te lo haré saber
¿Por qué lo preguntas? ¿No está funcionando?

Respuestas (2)

Como dice el mensaje de error, Truffle no tiene un getDatamétodo, pero según mi lectura del código, creo que puede acceder al objeto de contrato web3.js subyacente a través del contractmiembro. 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

encodeABIes 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.