Wie rufe ich die Funktion meines Vertrags mit sendRawTransaction auf?

Ich versuche, die Methode meines Vertrags mit aufzurufen sendRawTransaction. Ich habe eine Funktion in meinem Vertrag

updateReading(address consumerAddress,
            uint32 consumerMeterId,
            uint64 consumedReadingValue,
            address producerAddress,
            uint32 producerMeterId,
            uint64 producedReadingValue)

die ich mit sendRawTransaction aufrufen möchte. Die updateReadingFunktion aktualisiert den Vertragsstatus des Vertrags. Wie kann ich diese Funktion mit aufrufen sendRawTransaction?

Ich verwende das Truffle-Framework für die Entwicklung. Ich habe den folgenden Code in mein js geschrieben, um die Funktion mit aufzurufen 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); 
              });

        })

Es gibt den folgenden Fehler in meiner Konsole zurück.

    (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>)

Ein weiteres Problem ist

   (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>)

Wie kann ich sendRawTransactionin meinem js das Trüffel-Framework ermöglichen?

Der Fehler ist ziemlich klar: Es gibt keine solche Funktion getData. Ich denke, Sie erwarten die Funktion von web3.js getData, aber Sie verwenden Truffle.
@smarx Ich habe diese Zeile aktualisiert, ohne getData, aber ein neues Problem wird generiert (node:23336) UnhandledPromiseRejectionWarning: Error: invalid type at Object.exports.toBuffer (/home/maria/Desktop/12-Energy/node_modules/ethereumjs-util /dist/index.js:177:13) bei Transaction.setter [als Daten] (/home/maria/Desktop/12-Energy/node_modules/ethereumjs-util/dist/index.js:625:19)
Auf was aktualisiert? Ich sehe keine Änderung an Ihrem Code.
@smarx Ich habe Code geändert ... Bitte weisen Sie auf die Fehler in meinem js-Code hin
Die Änderung, die Sie vorgenommen haben, ergibt für mich keinen Sinn. Ich bin mir nicht sicher, was Sie davon erwartet haben. Hoffentlich hilft meine Antwort.
@smarx Ich werde es mit Ihrer Aktualisierung versuchen und Sie wissen lassen
Warum fragst du? Funktioniert es nicht?

Antworten (2)

Wie die Fehlermeldung sagt, hat Truffle keine Methode, aber nach meiner Lektüre des Codes glaube ich, dass Sie über das Mitglied getDataauf das zugrunde liegende web3.js-Vertragsobjekt zugreifen können . contractVersuchen Sie stattdessen Folgendes:

setData=instance.contract.updateReading.getData (consumerAddress,consumerMeterId,consumedReadingValue,producerAddress,producerMeterId,producedReadingValue);

Problem in Ihrem Code ist instance.updateReading()in dieser Zeile. Web3js wird basierend auf Ihrem ursprünglichen abi als direkter Funktionsaufruf (sendTransation oder call()) behandelt. dh es wird kein Bin- oder Hex-String erstellt.

Bei der Methode getData() bin ich mir nicht sicher. Gemäß web3js können Sie encodeABI()diese Methode verwenden, um Bytecode zurückzugeben.

Sie können einfach Ihre anhängen

setData = instance.updateReading(consumerAddress,consumerMeterId,consumedReadingValue,producerAddress,producerMeterId,producedReadingValue).encodeABI();

Weitere Informationen finden Sie unter dem folgenden Link

https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-encodeabi

https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethsendrawtransaction

encodeABIist die web3.js 1.0.0-Version von web3.js 0.2xx's getData. Aber sie verwenden Truffle (das darunter web3.js 0.2xx verwendet), weshalb meine Antwort funktioniert.