Was ist der Unterschied zwischen dem Bin-Bytecode von Solc und der Bin-Laufzeit?

Laut Solc bin-runtimeist das der Laufzeitteil der Verträge . Was genau ist der runtimeBytecode-Teil und wie unterscheidet er sich von der binBytecode-Ausgabe?

Antworten (1)

TL;DR

bin-runtimeist der Code, der tatsächlich auf der Blockchain platziert wird. Die reguläre binAusgabe ist der in der Blockchain platzierte Code plus der Code, der benötigt wird, um diesen Code in der Blockchain zu platzieren, der Code des Konstruktors.

Längere Antwort

Die Grundlagen der Ethereum Virtual Machine sind in Abschnitt 9.1 des Ethereum Yellow Paper definiert .

Um diese Frage vollständig beantworten zu können, müssen Sie zunächst wissen, wie ein Smart Contract erstellt wird. Ein Smart Contract wird erstellt, indem eine Transaktion mit einem leeren „to“-Feld gesendet wird. Wenn dies erledigt ist, führt die Ethereum Virtual Machine (EVM) den Bytecode aus, der im Init -Byte-Array[1] festgelegt ist, einem Feld, das den EVM-Bytecode enthalten kann – den Binärcode zum Ausführen der Logik auf Ethereum. Der EVM-Bytecode, der dann in der Blockchain gespeichert wird, ist der Wert, der zurückgegeben wird, wenn der Inhalt von init auf der EVM ausgeführt wird. Der Bytecode kann über den Opcode auf sich selbst verweisen CODECOPY. Dadurch wird der aktuell laufende Bytecode in den EVM-Speicher übertragen. DasCODECOPYopcode liest drei Werte auf dem Stack, wobei zwei dieser Werte Zeiger auf den Bytecode sind, einer markiert den Anfang und einer das Ende dessen, was in den Speicher kopiert werden soll. Der RETURNOpcode wird dann zusammen mit den korrekten Werten, die auf dem Stack abgelegt werden, verwendet, um den Bytecode von der anfänglichen Ausführung des EVM-Codes zurückzugeben. RETURNliest und entfernt zwei Zeiger aus dem Stack. Diese Zeiger definieren den Teil des Speichers, der ein Rückgabewert ist. Der Rückgabewert des anfänglichen Vertragserstellungslaufs des Bytecodes definiert den Bytecode, der in der Blockchain gespeichert und der Adresse zugeordnet ist, an der Sie den Smart Contract erstellt haben.

Der Code, der kompiliert, aber nicht auf der Blockchain gespeichert wird, ist somit der Code, der benötigt wird, um den richtigen Code auf der Blockchain zu speichern, aber auch jede Logik, die in einem (potenziellen) Konstruktor des Vertrags enthalten ist.

Das bin-runtime-Argument kann verwendet werden, um zu überprüfen, ob ein bestimmter Solidity-Quellcode an einer bestimmten Adresse abgelegt wird. Das Kompilieren des Quellcodes, von dem eine Person behauptet, dass er den Smart Contract auf einer Adresse in der Blockchain darstellt, und der Vergleich mit dem Binärcode, der tatsächlich auf der Adresse gespeichert ist, eth.getCode(contractaddress)bedeutet, dass Sie sicher sein können, was der Quellcode für den Vertrag ist.

Siehe Ethereum Yellow Paper, Abschnitt 4.3, um zu erfahren, wie Smart Contracts erstellt werden.