Dateneingabe der Rohtransaktion codieren, um eine Vertragsfunktion zu aktualisieren? [Duplikat]

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)

??

Warum können Sie web3.js nicht verwenden? Sie werden am Ende erhebliche Teile davon umschreiben, wenn Sie Transaktionen in Javascript senden möchten.

Antworten (2)

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!

danke, es hat funktioniert :) Aber jetzt stehe ich vor einem anderen Problem: Der Raw-TX funktioniert auf dem Ether Scan ropsten.etherscan.io/pushTx, jedoch auf web3.js: Fehler: ungültiges Argument 0: Nicht-String kann nicht als Hex-Daten entpackt werden
Sie müssen die Daten wahrscheinlich nur in einfache Anführungszeichen setzen, aber es ist schwierig, diese Informationen genau zu bestimmen.
Meine Funktionsdaten 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 :/
Ich denke, die Funktionssignatur von test(uint256)ist 0x29e99f07, also versuchen Sie das anstelle Ihrer ersten vier Bytes. Dh0x29e99f070000000000000000000000000000000000000000000000000‌​000000000003039
Großartig! Gut zu wissen.