Was ist ein ABI und warum wird es benötigt, um mit Verträgen zu interagieren?

Auf ABI wird an vielen Stellen verwiesen, einschließlich der offiziellen Ethereum-Website. Was ist ein ABI und warum muss es verwendet werden?

Die ABI eines Smart Contracts gibt einem Vertrag die Möglichkeit, mit externen Anwendungen und anderen Smart Contracts zu kommunizieren und zu interagieren. Wenn Sie Tools wie Hardhat / Truffle verwenden, wird die Vertrags-ABI automatisch für Sie generiert. Weitere Details bei Interesse: alchemy.com/overviews/…

Antworten (10)

ABI steht für Application Binary Interface .

Im Allgemeinen ist eine ABI die Schnittstelle zwischen zwei Programmmodulen, von denen eines oft auf der Ebene des Maschinencodes liegt. Die Schnittstelle ist die De-facto-Methode zum Codieren/Decodieren von Daten in den/aus dem Maschinencode.

In Ethereum geht es im Grunde darum, wie Sie Solidity-Vertragsaufrufe für die EVM codieren und umgekehrt die Daten aus Transaktionen auslesen können.

Mit dem ABI, Application Binary Interface, rufen Sie im Grunde Funktionen in einem Vertrag auf und erhalten Daten zurück .

Eine ABI legt unter anderem fest, wie Funktionen aufgerufen werden und in welchem ​​Binärformat Informationen von einer Programmkomponente zur nächsten weitergegeben werden sollen...

Ein Ethereum Smart Contract ist ein Bytecode, der auf der Ethereum-Blockchain bereitgestellt wird. Ein Vertrag kann mehrere Funktionen enthalten. Ein ABI ist erforderlich, damit Sie angeben können, welche Funktion im Vertrag aufgerufen werden soll, und um sicherzustellen, dass die Funktion Daten im erwarteten Format zurückgibt.

Ein Beispiel aus der ABI-Spezifikation von Ethereum :

contract Foo {
  function bar(real[2] xy) {}
  function baz(uint32 x, bool y) returns (bool r) { r = x > 32 || y; }
  function sam(bytes name, bool z, uint[] data) {}
}

Wenn wir baz mit den Parametern 69 und true aufrufen wollten, würden wir insgesamt 68 Bytes übergeben, die sich aufteilen lassen in:

0xcdcd77c0: der Funktionsselektor . Dies wird als die ersten 4 Bytes des Keccak-256-Hashes der ASCII-Form der Funktionssignatur baz(uint32,bool) abgeleitet. 0x000000000000000000000000000000000000000000000000000000000045: Der erste Parameter, A Uint32 Wert 69 auf 32 Bytes 0x00000000000000000000000000000000000000000000000000000000000001: Der zweite Parameter -Bogoolean -Richtig, der zweite Parameter -booolean wahr, padierte bis 322000000000001: Der zweite Parameter -booolean wahr, Paded zu 322.

Die 68 Bytes werden im dataFeld einer Transaktion angegeben, auch genannt : ein Sicherheitshinweis dazu ist hier . (Zusammenfassend, seien Sie vorsichtig, was Sie in das Datenfeld eingeben, da es unbeabsichtigte, möglicherweise böswillige Nebeneffekte haben kann, wenn es an den anrufenden Vertrag übergeben wird.)

Um einen häufigen Fallstrick beim Ableiten des Funktionsselektors zu vermeiden, müssen die kanonischen Typen verwendet werden, beispielsweise uint256anstelle vonuint .

Hier ist ein Beispiel in Solidity zur Berechnung eines Funktionsselektors für samoben:

bytes4(keccak256("sam(bytes,bool,uint256[])")

Durch die Verwendung einer übergeordneten Bibliothek wie web3.js werden die meisten dieser Details abstrahiert, aber die ABI im JSON-Format muss immer noch für web3.js bereitgestellt werden.

Hinweis: Die ABI ist eine Abstraktion, die nicht Teil des Ethereum-Kernprotokolls ist . Jeder kann seinen eigenen ABI für seine Verträge definieren ( Ausgangsbeispiel ), und alle Aufrufer solcher Verträge müssten diesen ABI einhalten, um aussagekräftige Ergebnisse zu erhalten. Für alle Entwickler ist es jedoch einfacher, aktuelle Compiler (Beispiel Solidity) und Bibliotheken (Beispiel web3.js, ethers.js) zu verwenden, die alle der oben genannten ABI entsprechen.

was ist der sam-Befehlsteil von bytes4(sha3("sam(bytes,bool,uint256[])")
@FightFireWithFire Ihr Kommentar ist unklar.
Der Punkt, dass "diese" ABI nicht Teil des Gelbbuchs ist und jeder "eine" ABI definieren kann, ist wirklich interessant/wichtig (und irgendwie schockierend für jemanden wie mich, der aus der Welt der CPU/OS-ABIs kommt). Es wäre dann schön, eine Referenz / Geschichte darüber zu haben, woher dieser ABI stammt und warum jeder darauf standardisiert. Ist vielleicht alles so eindeutig, dass es keinen Grund gibt, unterschiedliche ABIs zu haben?
@hmijail github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI/… ist das erste Commit auf Github. Frühere Dokumentationen befanden sich möglicherweise auf einem Etherpad. Um die Dinge zum Laufen zu bringen, brauchten die frühen Entwickler eine ABI. Die Geschichte ähnelt wahrscheinlich der ersten Entwicklung von en.wikipedia.org/wiki/Comparison_of_executable_file_formats .
Was meinen Sie damit, Solidity, Serpent und Web3.js erfüllen die oben genannte ABI? Sind ABIs sprachspezifisch?
@KennethWorden Ich habe den letzten Satz bearbeitet und ist er klarer? Hier ist ein weiterer Versuch: Jemand könnte denken, dass ein Funktionsselektor länger als 4 Bytes sein sollte: Er kann seinen Vertrag so schreiben, wäre aber nicht in der Lage, vorhandene Compiler zu verwenden (ohne sie zu ändern), und Benutzer dieses Vertrags müssten dazu in der Lage sein vorhandene Bibliotheken so zu verwenden, wie sie sind.

Vertragsdefinition : Formale Definition in High-Level-Code (z. B. Solidität).

Kompilierter Vertrag : Der Vertrag, der in Bytecode umgewandelt wurde, um auf der Ethereum Virtual Machine (EVM) ausgeführt zu werden, wobei die Spezifikation eingehalten wird . Beachten Sie, dass die Funktionsnamen und Eingabeparameter während der Kompilierung gehasht werden. Damit ein anderes Konto eine Funktion aufrufen kann, müssen ihm daher zuerst der Funktionsname und die Argumente gegeben werden - daher die ABI.

Application Binary Interface – ABI: Eine Liste der Funktionen und Argumente des Vertrags (im JSON 1 -Format). Ein Konto, das die Funktion eines Smart Contracts verwenden möchte, verwendet die ABI, um die Funktionsdefinition zu hashen, damit es den EVM-Bytecode erstellen kann, der zum Aufrufen der Funktion erforderlich ist. Dies wird dann in das Datenfeld T d einer Transaktion aufgenommen und von der EVM mit dem Code des Zielkontos (der Vertragsadresse) interpretiert.


1 Die Verwendung von JSON ist ein De-facto- Standard; Es ist nicht in der formalen Spezifikation enthalten, aber eine Änderung würde dazu führen, dass viele der Tools geändert werden müssen.

Stellen Sie sich "ABI" als "API" auf niedriger Ebene vor.

Betrachten Sie es als die kompilierte Version einer API (oder als eine API auf niedriger Ebene). Wie Sie wissen, werden die Verträge als Bytecodes in einem binären Format in der Blockchain unter einer bestimmten Adresse gespeichert. Niemand versteht binär, also definiert die ABI die Strukturen und Methoden, die Sie verwenden werden, um mit diesem binären Vertrag zu interagieren (genau wie die API), nur auf einer niedrigeren Ebene. Die ABI zeigt dem Aufrufer die erforderlichen Informationen (Funktionssignaturen und Variablendeklarationen) an, um einen sinnvollen (von der VM verstandenen) Aufruf an den Bytecode (Vertrag) zu codieren.

Zusatzinfo "aus dem offiziellen Dokument"

Eine Application Binary Interface (ABI) soll als De-facto-Methode zum Codieren und Decodieren von Daten in und aus Transaktionen dienen

.

Wir versichern, dass für alle Verträge die Schnittstellendefinitionen aller Verträge, die sie aufrufen, zur Kompilierzeit verfügbar sein werden.

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

Sie fügen den abi-Code ein, um Parametertypen automatisch zu analysieren, oder geben sie einfach manuell ein. In Funktionstyp-Selektorkonstruktor sollte ausgewählt werden.

Hier ist ein Beispiel, unten sind abi-codierte Parameter, die Sie in das Eingabefeld für etherscan.io-Konstruktorparameter eingeben.

Beispiel

Es fiel mir furchtbar schwer, den Warum - Teil dieser Frage selbst zu verstehen, daher möchte ich dank dieser hervorragenden Antwort eine Sache hinzufügen :

„Wie diese Bytes in strukturierte Daten interpretiert werden, ist Sache des Programms und damit der verwendeten Programmiersprache. Damit zwei in unterschiedlichen Programmiersprachen geschriebene Programme sich gegenseitig aufrufen können, sollten die Compiler solcher Sprachen das implementieren Serialisierung und Deserialisierung von Daten in gleicher Weise, dh sie sollen die ABI-Spezifikation implementieren, müssen es aber nicht."

tl;dr ein in Solidity geschriebener Vertrag kann mit einem in Viper oder Bamboo geschriebenen Vertrag interagieren, da sie alle die ABI-Spezifikation implementieren und einhalten.

Kopieren Sie einfach diesen JSON. Das ist Vertrag ABIGeben Sie hier die Bildbeschreibung ein

ABI (Application Binary Interface) ist im Kontext der Informatik eine Schnittstelle zwischen zwei Programmmodulen, häufig zwischen Betriebssystemen und Anwenderprogrammen.

EVM (Ethereum Virtual Machine) ist die Kernkomponente des Ethereum-Netzwerks, und Smart Contracts sind Codeteile, die in der Ethereum-Blockchain gespeichert sind und auf EVM ausgeführt werden. Intelligente Verträge, die in Hochsprachen wie Solidity oder Vyper geschrieben sind, müssen in ausführbarem EVM-Bytecode kompiliert werden; Wenn ein Smart Contract bereitgestellt wird, wird dieser Bytecode in der Blockchain gespeichert und mit einer Adresse verknüpft. Für Ethereum und EVM ist ein Smart Contract nur diese Folge von Bytecode. Um auf Funktionen zuzugreifen, die in Hochsprachen definiert sind, müssen Benutzer Namen und Argumente in Bytedarstellungen übersetzen, damit Bytecode damit arbeiten kann. Um die als Antwort gesendeten Bytes zu interpretieren, müssen Benutzer zurück in das Tupel von Rückgabewerten konvertieren, die in höheren Sprachen definiert sind. Sprachen, die für die EVM kompiliert werden, halten strenge Konventionen für diese Konvertierungen ein. aber um sie auszuführen, muss man die genauen Namen und Typen kennen, die mit den Operationen verbunden sind. Die ABI dokumentiert diese Namen und Typen in einem präzisen, leicht zu analysierenden Format und führt Übersetzungen zwischen von Menschen beabsichtigten Methodenaufrufen und Smart-Contract-Operationen auffindbar und zuverlässig durch.

Es ist API (Application Program Interface) sehr ähnlich, einer für Menschen lesbaren Darstellung der Schnittstelle eines Codes. ABI definiert die Methoden und Strukturen, die verwendet werden, um mit dem binären Vertrag zu interagieren, genau wie die API, aber auf einer niedrigeren Ebene. Die ABI weist den Aufrufer der Funktion an, die erforderlichen Informationen wie Funktionssignaturen und Variablendeklarationen in einem Format zu codieren, das die EVM verstehen kann, um diese Funktion im Bytecode aufzurufen; Dies wird als ABI-Codierung bezeichnet. Die ABI-Codierung ist größtenteils automatisiert und wird von Compilern wie REMIX oder Wallets erledigt, die mit der Blockchain interagieren. Contract ABI wird im JSON-Format dargestellt. Es gibt klare Vorgaben, wie eine Vertrags-ABI zu codieren und zu decodieren ist.

Quelle

Ein ABI ist, wie andere sagten, das Application Binary Interface - es ist eine Schnittstelle auf niedrigerer Ebene, muss aber für Programmierer nicht unzugänglich sein, beispielsweise unter Linux: /sys/bus/usb/devices/.../power/persist
ist ein Beispiel für ein ABI. Sie können auf viele andere Linux-ABIs zugreifen über/sys/bus/

Siehe: https://www.kernel.org/doc/Documentation/ABI/

Einführung Die Application Binary Interface (ABI) eines Smart Contracts gibt einem Vertrag die Möglichkeit, mit externen Anwendungen und anderen Smart Contracts zu kommunizieren und zu interagieren. Der Empfang von Daten aus externen Quellen kann entscheidend sein, um die Ziele der Anwendung und des Benutzers zu erreichen.

In der traditionellen Webentwicklung finden Gespräche über Daten zwischen Anwendungen und Servern über APIs (Application Program Interface) statt. Server fungieren als zentralisierte Informationsquellen, die Daten auf Anfrage an Anwendungen weitergeben.

Auf einer Blockchain existiert keine solche Zentralisierung von Daten. Nodes fungieren im Wesentlichen als Server und Smart Contracts sind auf Ketten „gehostete“ Funktionen. Anwendungen außerhalb der Blockchain (und anderer Smart Contracts) benötigen eine Möglichkeit, mit Smart Contracts zu kommunizieren, die sich in der Kette befinden. Hier kommt ABI ins Spiel.

Warum ABI? Bevor wir näher darauf eingehen, was ABI ist, ist es gut zu verstehen, warum wir es haben.

Smart Contracts sind die Kernanwendungen der EVM (Ethereum Virtual Machine). Der Zweck von Smart Contracts besteht darin, Transaktionen auszuführen, wenn bestimmte im Vertrag definierte Bedingungen erfüllt sind. Diese Bedingungen können sowohl On- als auch Off-Chain-Ereignisse sein. Intelligente Verträge werden in Hochsprachen wie Solidity geschrieben, aber sie werden auf der EVM als ausführbarer Bytecode gespeichert, der im Binärformat vorliegt.

Quelle: https://hackernoon.com/hn-images/1*Sz1a7G2pQ62UnkHoieve4w.jpeg

Da dieser Bytecode nicht von Menschen lesbar ist, muss er interpretiert werden, um verstanden zu werden. ABI ermöglicht jedem, der einen Smart Contract schreibt, die Kommunikation zwischen einer Webanwendung, die in einer Hochsprache wie Javascript geschrieben ist, und dem Bytecode, den die EVM versteht. ‍

Was ist ein ABI? Wie sein Web2-Cousin, die API, fungiert ABI als Funktionsselektor und definiert die spezifischen Methoden, die für einen Smart Contract zur Ausführung aufgerufen werden können. Diese spezifischen Methoden und ihre verbundenen Datentypen werden in einer generierten JSON-RPC-Datei aufgelistet.

Quelle: https://static.packt-cdn.com/products/9781789954111/graphics/assets/fe0f2ffc-2f3c-4615-9cb5-43c8e036239b.png

Im Gegensatz zu einer API können wir nicht einfach eine Anfrage direkt im JSON-Format an einen Smart Contract senden und eine Antwort erwarten, da ein Vertrag nur in Bytecode kommuniziert. Um dies in etwas zu übersetzen, das die EVM versteht, werden diese Informationen über ABI-Codierung codiert. Diese Codierungen umfassen Funktionssignaturen und Variablendeklarationen, sodass die EVM genau weiß, welche Funktion innerhalb des Smart Contracts auszuführen ist.

Die Antworten befinden sich ebenfalls im Bytecode, sodass eine Interpretation erforderlich ist, bevor sie von einer Webanwendung verarbeitet werden. Der Vorteil der Verwendung von Bytecode in der Antwort besteht darin, dass wir auch erwarten können, dass nach dem Aufruf einer Vertragsfunktion eine bestimmte Struktur zurückgegeben wird.

Wie verwende ich ABI?

Generierung Wenn Sie Tools wie Hardhart/Truffle oder eine IDE wie Remix verwenden, wird die Vertrags-ABI automatisch für Sie generiert. Sie können die ABI auch manuell erstellen, indem Sie das Solidity Compiler NPM-Paket verwenden. Nach der Installation des Pakets können Sie den Befehl „solcjs vertragsname.sol --abi“ in einem Terminal ausführen. Bei erfolgreicher Ausführung wird eine .abi-Datei generiert.

Nachdem Sie nun eine generierte ABI haben, schauen wir uns einige der Elemente in dieser Datei an:

Ausführen Da ABI als Interpreter zwischen dem EVM-Bytecode und Javascript einer Website fungiert, wird es benötigt, wenn Sie Funktionen eines Smart Contracts ausführen möchten. Neben dem ABI wird die Vertragsadresse auf der Blockchain benötigt. Hier ist ein kleines Javascript-Code-Snippet, um zu zeigen, wie das gemacht wird:

Wenn Sie daran interessiert sind, die ABI eines bereits bereitgestellten Vertrags zu finden, können Sie diese finden, indem Sie auf Etherscan mit der Adresse des Vertrags suchen. Zum Beispiel hier:

Codierung Da die gesamte Kommunikation im Bytecode erfolgt, wäre es schwierig, von den Entwicklern zu erwarten, dass sie diese Nachrichten selbst codieren. Glücklicherweise können beliebte Compiler wie Remix auch die Codierung für Sie übernehmen. Diese Codierungen folgen einem bestimmten Muster, sodass man sich eine bessere Vorstellung davon machen kann, was vor sich geht, indem man die ABI-Spezifikation überprüft.

Die ersten vier Bytes sind die Funktionssignatur, die angibt, welche Art von Funktion im Smart Contract ausgeführt wird. Eine beliebte Funktionskennung ist a9059cbb, die anzeigt, dass es sich um eine ERC20-Übertragung handelt. Hier finden Sie ein Datenbankverzeichnis mit Funktionssignaturen, in dem Sie mehr erkunden können.

Quelle: https://miro.medium.com/max/1400/1*YDi7sDUmAc3wjN8TcIBrog.png

Ab dem fünften Byte werden die Argumente codiert. Antworten folgen dieser ähnlichen Struktur, jedoch ohne die enthaltene Funktionssignatur.

Fazit ABI kann oft ein übersehener Aspekt bei der Arbeit mit Smart Contracts sein, spielt aber eine wichtige Rolle bei der Benutzerfreundlichkeit dieser Technologie. Aufbauend auf Smart-Contract-Tutorials ist eine großartige Möglichkeit, die Leistungsfähigkeit dieses stillen Arbeitspferds zu verstehen, und eine großartige Möglichkeit, Ihr Wissen anzuwenden.

Quelle dieses Artikels – https://www.alchemy.com/overviews/what-is-an-abi-of-a-smart-contract-examples-and-usage