Kurz erklärt:
Create2 ist ein Opcode der Ethereum Virtual Machine, mit dem sich die Adresse eines Smart Contracts bereits vor dessen Bereitstellung deterministisch berechnen lässt. Er wurde 2019 mit der Constantinople-Aktualisierung eingeführt.
Herkunft und Einordnung
Create2 wurde in EIP-1014 beschrieben, das auf Vitalik Buterin zurückgeht, und mit der Constantinople-Aktualisierung des Ethereum-Netzwerks im Februar 2019 aktiviert. Der Opcode ergänzt den bereits vorhandenen CREATE-Opcode, der Verträge ebenfalls bereitstellt, deren Adresse jedoch von einem laufenden Zähler (Nonce) abhängt.
Funktionsweise
Beim herkömmlichen CREATE-Opcode ergibt sich die Vertragsadresse aus der Adresse des Erstellers und dessen Nonce. Dadurch ist die Adresse erst nach der Bereitstellung eindeutig bestimmbar. Create2 berechnet die Adresse hingegen aus vier Bestandteilen: einem konstanten Präfix, der Adresse des bereitstellenden Vertrags, einem frei wählbaren Wert (dem sogenannten Salt) sowie dem Hash des Initialisierungscodes.
Da keiner dieser Bestandteile von einer Nonce abhängt, kann die endgültige Adresse eines Vertrags berechnet werden, bevor er überhaupt bereitgestellt wird. Ändert sich der Salt oder der Initialisierungscode, ergibt sich eine andere Adresse.
Anwendungsfälle
Deterministische Adressen ermöglichen es, dass Verträge miteinander interagieren, bevor sie tatsächlich existieren. Dies wird unter anderem in Zahlungskanälen und Layer-2-Konstruktionen genutzt, bei denen ein Vertrag erst dann bereitgestellt wird, wenn er benötigt wird (Counterfactual Deployment). Auch im Bereich der Kontoabstraktion werden Nutzerkonten häufig an vorab berechneten Adressen angelegt.
Create2 wird zudem oft mit Delegatecall-basierten Proxy-Mustern kombiniert, um aktualisierbare Verträge an vorhersehbaren Adressen zu platzieren.
Besonderheiten und Diskussion
Ein Aspekt von Create2 ist, dass unter bestimmten Bedingungen an derselben Adresse nacheinander unterschiedlicher Code bereitgestellt werden kann, sofern ein zuvor an dieser Adresse befindlicher Vertrag zwischenzeitlich entfernt wurde. Dieser Umstand wurde in der Fachöffentlichkeit hinsichtlich möglicher Auswirkungen auf die Nachvollziehbarkeit von Vertragscode diskutiert und ist Gegenstand von Sicherheitsbetrachtungen.
Häufige Fragen
Was unterscheidet Create2 von Create?
Create leitet die Vertragsadresse aus Erstelleradresse und Nonce ab. Create2 berechnet sie aus Präfix, Erstelleradresse, einem frei wählbaren Salt und dem Hash des Initialisierungscodes und ist dadurch bereits vor der Bereitstellung bekannt.
Wann wurde Create2 eingeführt?
Der Opcode wurde in EIP-1014 spezifiziert und im Februar 2019 mit der Constantinople-Aktualisierung des Ethereum-Netzwerks aktiviert.
Was ist ein Salt bei Create2?
Der Salt ist ein frei wählbarer Wert, der in die Adressberechnung einfließt. Unterschiedliche Salt-Werte führen bei gleichem Initialisierungscode zu unterschiedlichen Adressen.
Wofür sind deterministische Adressen nützlich?
Sie erlauben es, mit einem Vertrag zu interagieren oder ihn zu referenzieren, bevor er bereitgestellt wurde. Das wird etwa bei Zahlungskanälen, Layer-2-Lösungen und Kontoabstraktion genutzt.
Kann an einer Create2-Adresse unterschiedlicher Code stehen?
Unter bestimmten Bedingungen ja, wenn ein zuvor dort befindlicher Vertrag entfernt und mit anderem Initialisierungscode neu bereitgestellt wurde. Dieser Umstand ist Gegenstand von Sicherheitsbetrachtungen.
Zusammenfassung
Create2 ist ein 2019 mit Constantinople eingeführter EVM-Opcode, der Vertragsadressen aus Erstelleradresse, Salt und Code-Hash deterministisch berechnet. Dadurch ist die Adresse bereits vor der Bereitstellung bekannt, was Counterfactual Deployment, Layer-2-Konstruktionen und Kontoabstraktion ermöglicht.
Weiterführende Quellen
- EIP-1014: Skinny CREATE2: eips.ethereum.org
- Solidity Documentation – Salted contract creations / create2: docs.soliditylang.org