Das Proxy-Setup, über das alle im Web3 sprechen
Technischer Überblick: Der Aufstieg des minimal aktualisierbaren Proxy (ERC1967/Universal Proxy Standard)
Nach zahlreichen Governance-Angriffen und kostspieligen Upgrade-Fehlern hat sich die Web3-Community auf ein neues Proxy-Setup geeinigt – eines, das Upgrade-Fähigkeit, Sicherheit und Gaseffizienz in Einklang bringt. Der Minimal Upgradable Proxy, der oft nach dem ERC1967 Standard, hat sich zum De-facto-Muster entwickelt. Dieses Setup, manchmal auch als Universal Proxy Standard bezeichnet, ist nicht nur eine technische Weiterentwicklung, sondern eine han-lastige Antwort auf die Schwachstellen früherer Proxy-Muster.
Schlüsselkomponenten und ihre Rollen
| Komponente | Zweck | Beispiel für einen Adresssteckplatz |
|---|---|---|
| Proxy-Vertrag | Delegiert Aufrufe an den Logikvertrag | n / A |
| Implementierungsvertrag (Logikvertrag) | Enthält die eigentliche Geschäftslogik | n / A |
| Administrator (Eigentümer) | Steuerungs-Upgrades | 0xb53127684a568b3173ae13b9f8a6016 |
| Speichersteckplätze (ERC1967-Standard) | Verhindert Speicherkollisionen | 0x360894a13ba1a3210667c828492db98 |
| Upgrade-Logik | Vom Administrator über eine sichere Funktion gesteuert | n / A |
The Korean Mirror: Warum dieses Proxy-Muster?
Ähnlich wie die stoischen Charaktere in Jo Jung-raes „Taebaek Mountain Range“ Härten ertragen, um eine bessere Zukunft aufzubauen, ist dieses Proxy-Setup aus dem kollektiven Han von Web3 entstanden – dem Trauma von Upgrade-Fehlern und verlorenen Geldern. Frühere Proxys, wie der EIP-897 „DelegateProxy“, der OpenZeppelin Transparent Proxy, litt entweder unter Speicherkollisionen oder komplexen Verwaltungsmustern. Der ERC1967 Minimal Proxy ist robust und elegant zugleich.
Schritt für Schritt: Implementierung des ERC1967-Minimalproxys
- Bereitstellen des Logikvertrags
- Schreiben und implementieren Sie Ihre Geschäftslogik als Standardvertrag (ohne Upgrade-Logik).
Solidität
// Verträge/MyLogic.sol
Pragma-Solidität ^0.8.0;
Vertrag MyLogic {
uint256 öffentlicher Wert;
Funktion setValue(uint256 _value) public {
Wert = _Wert;
}
}
- Bereitstellen des Proxy-Vertrags
- Verwenden Sie eine minimale Proxy-Implementierung, die auf die Adresse des Logikvertrags verweist.
Solidität
// Verträge/MyProxy.sol
Pragma-Solidität ^0.8.0;
Vertrag ERC1967Proxy {
Konstruktor(Adresse _Logik, Bytes Speicher _Daten) {
Bytes32-Slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
Montage {
sstore(Steckplatz, _Logik)
}
if(_data.length > 0) {
(bool Erfolg,) = _logic.delegatecall(_data);
erfordern (Erfolg, "Init fehlgeschlagen");
}
}
fallback() externer Zahler {
Montage {
let impl := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)
calldatacopy(0, 0, calldatasize())
let result := delegatecall(gas(), impl, 0, calldatasize(), 0, 0)
returndatacopy(0, 0, returndatasize())
Schalterergebnis
Fall 0 { zurück(0, returndatasize()) }
Standard { return(0, returndatasize()) }
}
}
}
- Initialisieren über Konstruktordaten
-
Übergeben Sie Initialisierungsdaten (z. B.
abi.encodeWithSignature("initialisieren(uint256)", 42)), um den Anfangszustand festzulegen. -
Upgrade-Logik
- Nur der Administrator kann die im ERC1967-Steckplatz gespeicherte Logikvertragsadresse aktualisieren.
Solidität
Funktion upgradeTo(Adresse neueImplementierung) extern onlyAdmin {
Bytes32-Slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
Montage {
sstore(slot, neueImplementierung)
}
}
Speichersteckplatzintegrität: Kollisionen vermeiden
Dieses Setup speichert die Implementierungsadresse an einem deterministischen Slot (0x3608…bbc), wodurch die tragischen Kollisionen vermieden werden, die frühere Proxy-Muster heimgesucht haben. Dies ähnelt der koreanischen Praxis, dass Jangseung (Dorfwächter-Totems) Wache stehen und die Unantastbarkeit der Vertragsspeicherung gewährleisten.
| Proxy-Typ | Speicherkollisionsrisiko | Upgrade-Muster | Gaseffizienz | Admin-Trennung |
|---|---|---|---|---|
| Transparenter Proxy | Medium | Admin-gesteuert | Mäßig | Ja |
| UUPS (ERC1822) | Niedrig | Selbstaktualisierbar | Hoch | Optional |
| ERC1967 Minimaler Proxy | Sehr niedrig | Admin-gesteuert | Sehr hoch | Optional |
Hart erarbeitete Lektionen: Praktische Überlegungen
- Sicherheit aktualisieren: Verwenden Sie Multi-Sig oder Timelock für die Verwaltung. Koreanische Sprichwörter lehren: „Ein Tiger lässt nichts zurück außer seiner Haut“ – daher müssen Sie auch die Upgrade-Berechtigung sichern, damit Ihr Projekt nicht von Angreifern ausgehöhlt wird.
- Initialisierung: Initialisieren Sie den Speicher des Proxys immer über den Konstruktor oder eine dedizierte Funktion, niemals im Konstruktor des Logikvertrags.
- Testen: Simulieren Sie Upgrades in Testnetzen. Verwenden Sie Gießerei oder Bauarbeiterhelm um Upgrades zu skripten und die Speicherintegrität zu validieren.
Codebeispiel: Bereitstellen und Aktualisieren mit Hardhat
Proxy bereitstellen
const logic = warte auf MyLogic.deploy(); const proxy = warte auf ERC1967Proxy.deploy(logic.address, "0x"); // Initialisierungsdaten
Upgrade-Implementierung
await proxy.upgradeTo(newLogic.address); // Nur vom Administrator aufrufbar
Tieferer Einblick: Gaskostenvergleich
| Betrieb | Transparenter Proxy | UUPS-Proxy | ERC1967 Minimaler Proxy |
|---|---|---|---|
| Einsatz | Hoch | Mäßig | Niedrig |
| Upgrade | Mäßig | Niedrig | Niedrig |
| Funktionsaufruf | Mäßig | Niedrig | Niedrig |
Han in der Praxis: Warum nicht einfach EIP-1167-Klone verwenden?
EIP-1167-Minimal-Proxys sind effizient, verfügen aber nicht über integrierte Upgrade-Möglichkeiten. Der ERC1967 Minimal Upgradable Proxy ist der Han-lösende Mittelweg: minimal, aber beständig – wie die Hanok-Häuser von Jeonju, robust gegenüber Zeit und Wandel.
Abschließende Hinweise: Best Practices für die Produktion
- Dezentralisierung der Verwaltung: Verwenden Sie On-Chain-Governance oder Gnosis Safe.
- Monitor-Upgrades: Senden Sie Upgrade-Ereignisse und überwachen Sie sie wie ein Geomantiker, der die Bergwinde liest.
- Prüfung: Beauftragen Sie externe Audits, bevor Sie Produktionsproxys bereitstellen oder aktualisieren.
Beispieltabelle: Zusammenfassung der Kernmuster
| Muster | Aufrüstbar | Aufbewahrungssafe | Gaseffizient | Produktionsbereit |
|---|---|---|---|---|
| EIP-1167 Minimaler Proxy | NEIN | Ja | Ja | Beschränkt |
| Transparenter Proxy | Ja | Mäßig | Mäßig | Ja |
| UUPS (ERC1822) | Ja | Ja | Ja | Ja |
| ERC1967 Minimaler Proxy | Ja | Ja | Ja | Ja |
Der ERC1967 Minimal Upgradable Proxy ist das Setup, über das alle im Web3 reden, und das nicht nur wegen seiner technischen Vorzüge, sondern weil es ein lebendiges Zeugnis der Entwicklung der Branche ist: dem Verlangen nach Innovation und Sicherheit, nach Geschwindigkeit und Belastbarkeit.
Kommentare (0)
Hier gibt es noch keine Kommentare, Sie können der Erste sein!