Konvertieren Sie Vertragsargumente von JSON in das ABI-codierte Format

Ich möchte einen Vertragscode auf Etherscan überprüfen, weiß aber nicht, wie ich die Argumente im ABI-codierten Format erhalten kann. Ich habe den Quellcode und die Schnittstelle in JSON. Gibt es ein Tool, das ich verwenden kann, oder eine einfache Möglichkeit, JSON in das ABI-Format zu bringen?

Hinweis: Ich habe nur den "Deploy Contract" von Ethereum Wallet (Mist) verwendet, keinen ausgefallenen Compiler oder ähnliches.

Der Quellcode: https://gist.github.com/crutor0x/45cd845349345190458df7f7412654e8

JSON-ABI: https://gist.github.com/crutor0x/dd97e9593ffb696bfb583481dccb86d9

Vertragsadresse: 0x3c75226555fc496168d48b88df83b95f16771f37

Antworten (3)

Die Seite „Verify Contract“ fragt nach „Constructor Arguments ABI-encoded“.

In Ihrem Fall hat der Konstruktor keine Parameter, daher können Sie dieses Feld leer lassen.

Im allgemeinen Fall, wenn Ihr Konstruktor Parameter hat, können Sie wie folgt vorgehen:

Sie können ethereumjs-abi verwenden , um die Parameter für Transaktionsaufrufe zu codieren/decodieren.

Nehmen wir an, Ihr Konstruktor ist MyToken(address _to, uint256 _value, bool _enabled). Die Parametertypen sind ["Adresse", "uint256", "bool"].

Wenn Sie den Vertrag MyToken("0x1234567812345678", 0x314159268, true) erstellt haben. Dann sind die Parameterwerte ["0x1234567812345678", "0x314159268", true].

Dann können Sie die Werte mit codieren rawEncode(parameterTypes, parameterValues).

var abi = require('ethereumjs-abi')

var parameterTypes = ["address", "uint256", "bool"];
var parameterValues = ["0x1234567812345678", "0x314159268", true];

var encoded = abi.rawEncode(parameterTypes, parameterValues);

console.log(encoded.toString('hex'));

Bei der Ausführung wird es ausgegeben

000000000000000000000000000000000000000000000000123456781234567800000000000000000000000000000000000000000000000000000003141592680000000000000000000000000000000000000000000000000000000000000001

Ich habe das auch versucht, aber aus irgendeinem Grund bekomme ich diesen Fehler: "Error: Cannot find module 'ethereumjs-abi'" github.com/ethereumjs/ethereumjs-abi/issues/51
@NineCattoRules Hast du ethereumjs-abi in deinem npm-Projekt installiert?
Ich habe es lokal und global versucht. Ich habe es auch versucht npm cache verify, bekomme aber immer wieder den gleichen Fehler. Und der Pfad auf Win zu node.js ist korrekt eingestellt.
@NineCattoRules Ich habe mein Beispiel ausprobiert und es funktioniert ohne Probleme (Windows 7 x64). Erstellen Sie in einem leeren Verzeichnis das Projekt npm init -y, fügen Sie ethereumjs-abi hinzu npm i --save ethereumjs-abi, speichern Sie den Code als index.js und führen Sie dann aus npm index.js. Es zeigt die gleiche Ausgabe. Ich würde vorschlagen, es auf einem anderen Computer oder in einer virtuellen Maschine zu versuchen. Aber das ist außerhalb des Rahmens dieses Forums, fragen Sie besser im Javascript-Bereich von Stackoverflow.
Ja es funktioniert! Letzter Befehl istnode index.js
Wie können Sie den MyToken-Methodennamen codieren und mit anderen codierten Parametern verwenden?
nvm, gefunden, verwendenmethodid
@Ismael Wie kann ich die oben codierte Zeichenfolge in Solidity Smart Contract decodieren? Ist es möglich?
@PinankLakhani Es ist besser, wenn Sie eine neue Frage erstellen. Aber es sollte möglich sein, es wird bereits für öffentliche und externe Funktionen getan.

Falls Sie ein einfaches Online-Tool zum Codieren von Parametern verwenden möchten, können Sie https://abi.hashex.org verwenden

Sie können abi eingeben, um Parametertypen automatisch zu analysieren, oder sie einfach manuell eingeben. In Funktionstyp sollte der Selektorkonstruktor ausgewählt werden.

Hier ist ein Beispiel für die Verwendung dieses Dienstes. Unten befinden sich abi-codierte Parameter, die Sie in das Parameterfeld des etherscan.io-Konstruktors eingeben.Parameter

Die Seite https://abi.hashex.org funktioniert bei mir nicht und beschwert sich immer "Geben Sie das richtige JSON ein".

Sie können diese Seite ausprobieren .