Ich muss einen Vertrag aktualisieren, indem ich eine ihrer Funktionen aufrufe, aber ich kann web3.js nicht verwenden, also muss ich eine Rohtransaktion senden.
Beispiel für eine Funktion, die auf dem Vertrag aufgerufen werden soll:
test(address buyer, uint256 amount)
mein Code in Javascript:
var rawTx = {
nonce: 'CX350',
gasPrice: 'C350',
gasLimit: '0x09184e72a000',
to: 'myAddress',
value: 'CX350',
data: .....
}
Wie kann ich diesen Aufruf und Parameter codieren:
test('0xc5622be5861b7200cbace14e28b98c4ab77bd9b4', 10000)
??
Nun, der obige Ansatz funktioniert, aber warum nicht die web3.js-Bibliothek verwenden, die dabei hilft, dasselbe zu tun. Laden Sie einfach web3.js mit NPM (oder woanders) herunter und erhalten Sie die für die Aufgabe erforderlichen Module, indem Sie:
const_ = require('lodash');
const SolidityFunction = require('web3/lib/web3/function');
Sie können die web3.js-Bibliothek zusammen mit Ihrer ABI verwenden, um die Funktionsdefinition zu finden, indem Sie den folgenden Code verwenden:
var ABI = JSON.parse(<your_ABI>);
var functionDef = new SolidityFunction('', _.find(ABI, { name: '<your_function_name>' }), '');
Danach können Sie die Methode toPayload aufrufen , die Ihnen hilft, die Werte, die Sie an Ihre Funktion übergeben möchten, in HEX-Daten umzuwandeln.
var payloadData = functionDef.toPayload([<value_for_var_1>, <value_for_var_2>, <value_for_var_3>, <value_for_var_4>]).data;
payloadData kann als Wert für die Eigenschaft DATA verwendet werden. Beispiel:
var rawTx = {
to: <to_address>,
data: payloadData,
value: '0x0',
from: <from_address>,
nonce: nonce,
gasLimit: gasLimit,
gasPrice: gasPrice
}
Sie können diesen Ansatz verwenden und vergessen, wie viele Nullen Sie auffüllen müssen. Da die toPayload- Funktion alles erledigt.
Dies ist gemäß der ABI-Spezifikation ziemlich einfach
Zuerst brauchen Sie den Funktionsselektor, für test(address,uint256)
den die ersten vier Bytes des Keccak-256-Hashes dieser Zeichenfolge stehen, nämlich 0xba14d606
.
Dann benötigen Sie die Adresse als 32-Byte-Wort: 0x000000000000000000000000c5622be5861b7200cbace14e28b98c4ab77bd9b4
.
Schließlich benötigen Sie 10000 als 32-Byte-Wort:0x0000000000000000000000000000000000000000000000000000000000002710
Die letzte Datenzeichenfolge, die Sie benötigen, lautet also:
0xba14d606000000000000000000000000c5622be5861b7200cbace14e28b98c4ab77bd9b40000000000000000000000000000000000000000000000000000000000002710
Und das ist es!
test(uint256)
: '0xb3f4d2350000000000000000000000000000000000000000000000000000000000003039'
` const txParams = { nonce: nonce, gasPrice: '0x09184e72a000', gasLimit: web3.toHex(47189), to: contractAddress, value: '0x00', data: data, chainId: 3 } ` immer noch die Fehler :/test(uint256)
ist 0x29e99f07, also versuchen Sie das anstelle Ihrer ersten vier Bytes. Dh0x29e99f070000000000000000000000000000000000000000000000000000000000003039
Schnitzer