La configurazione del proxy di cui tutti parlano in Web3
Panoramica tecnica: l'ascesa del proxy minimo aggiornabile (ERC1967/Universal Proxy Standard)
A seguito di molteplici attacchi alla governance e costosi errori di aggiornamento, la comunità Web3 ha convergenza su una nuova configurazione proxy, che bilancia aggiornabilità, sicurezza ed efficienza del gas. Il proxy minimo aggiornabile, spesso implementato in seguito a ERC1967 standard, è diventato il modello de facto. Questa configurazione, a volte chiamata Universal Proxy Standard, non è una mera evoluzione tecnica; è una risposta ricca di han ai punti deboli dei modelli proxy del passato.
Componenti chiave e i loro ruoli
| Componente | Scopo | Esempio di slot di indirizzo |
|---|---|---|
| Contratto di delega | Delega le chiamate al contratto logico | n / a |
| Contratto di implementazione (logica) | Contiene la logica aziendale effettiva | n / a |
| Amministratore (proprietario) | Aggiornamenti dei controlli | 0xb53127684a568b3173ae13b9f8a6016 |
| Slot di archiviazione (standard ERC1967) | Previene la collisione dell'archiviazione | 0x360894a13ba1a3210667c828492db98 |
| Logica di aggiornamento | Gestito dall'amministratore tramite una funzione sicura | n / a |
The Korean Mirror: perché questo schema proxy?
Proprio come i personaggi stoici della "Catena montuosa Taebaek" di Jo Jung-rae sopportano le difficoltà per costruire un futuro migliore, questa configurazione proxy è forgiata dall'han collettivo di Web3: il trauma derivante da fallimenti di aggiornamento e perdite di fondi. I proxy precedenti, come EIP-897 "DelegateProxy", ovvero il proxy trasparente di OpenZeppelin, ha sofferto di collisioni di storage o di modelli di amministrazione complessi. Il proxy minimale ERC1967 è progettato per essere resiliente ed elegante.
Procedura dettagliata: implementazione del proxy minimo ERC1967
- Distribuisci il contratto logico
- Scrivi e distribuisci la tua logica aziendale come un contratto standard (senza logica di aggiornamento).
solidità
// contratti/MyLogic.sol
solidità pragma ^0.8.0;
contratto MyLogic {
uint256 valore pubblico;
funzione setValue(uint256 _value) pubblico {
valore = _valore;
}
}
- Distribuisci il contratto proxy
- Utilizzare un'implementazione proxy minima che faccia riferimento all'indirizzo del contratto logico.
solidità
// contratti/MyProxy.sol
solidità pragma ^0.8.0;
contratto ERC1967Proxy {
costruttore(indirizzo _logica, byte memoria _dati) {
slot bytes32 = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
assemblaggio {
sstore(slot, _logica)
}
se(_lunghezza dati > 0) {
(bool successo,) = _logic.delegatecall(_data);
require(success, "Inizializzazione fallita");
}
}
fallback() esterno pagabile {
assemblaggio {
lascia che impl := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)
chiamatadatacopy(0, 0, chiamatadatasize())
lascia risultato := delegatecall(gas(), impl, 0, calldatasize(), 0, 0)
returndatacopy(0, 0, returndatasize())
cambia risultato
caso 0 { revert(0, returndatasize()) }
predefinito { ritorno(0, dimensione dati ritorno()) }
}
}
}
- Inizializzazione tramite dati del costruttore
-
Passare i dati di inizializzazione (ad esempio,
abi.encodeWithSignature("inizializza(uint256)", 42)) per impostare lo stato iniziale. -
Logica di aggiornamento
- Solo l'amministratore può aggiornare l'indirizzo del contratto logico memorizzato nello slot ERC1967.
solidità
funzione upgradeTo(indirizzo nuovaimplementazione) solo esternoAdmin {
slot bytes32 = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
assemblaggio {
sstore(slot, nuovaimplementazione)
}
}
Integrità dello slot di archiviazione: evitare le collisioni
Questa configurazione memorizza l'indirizzo di implementazione in uno slot deterministico (0x3608…bbc), evitando le tragiche collisioni che hanno caratterizzato i precedenti modelli di delega. Ciò è simile alla pratica coreana dei jangseung (totem guardiani del villaggio) che fanno da sentinella, garantendo la sacralità della conservazione del contratto.
| Tipo di proxy | Rischio di collisione di archiviazione | Modello di aggiornamento | Efficienza del gas | Separazione amministrativa |
|---|---|---|---|---|
| Proxy trasparente | Medio | Controllato dall'amministratore | Moderare | SÌ |
| UUPS (ERC1822) | Basso | Auto-aggiornabile | Alto | Opzionale |
| ERC1967 Proxy minimo | Molto basso | Controllato dall'amministratore | Molto alto | Opzionale |
Lezioni apprese a fatica: considerazioni pratiche
- Aggiorna sicurezza: Utilizza multi-firma o timelock per l'amministrazione. I proverbi coreani insegnano che "una tigre non lascia altro che la sua pelle": anche tu devi assicurarti l'autorità di aggiornamento, per evitare che il tuo progetto venga vanificato da aggressori.
- Inizializzazione: Inizializzare sempre l'archiviazione del proxy tramite il costruttore o una funzione dedicata, mai nel costruttore del contratto logico.
- Test: Simula gli aggiornamenti sulle testnet. Usa Fonderia O Elmetto per programmare gli aggiornamenti e convalidare l'integrità dell'archiviazione.
Esempio di codice: distribuzione e aggiornamento con Hardhat
Distribuisci proxy
const logic = await MyLogic.deploy(); const proxy = await ERC1967Proxy.deploy(logic.address, "0x"); // dati di inizializzazione
Implementazione dell'aggiornamento
attendi proxy.upgradeTo(newLogic.address); // Chiamabile solo dall'amministratore
Approfondimento: confronto dei costi del gas
| Operazione | Proxy trasparente | Proxy UUPS | ERC1967 Proxy minimo |
|---|---|---|---|
| Distribuzione | Alto | Moderare | Basso |
| Aggiornamento | Moderare | Basso | Basso |
| Chiamata di funzione | Moderare | Basso | Basso |
Han in pratica: perché non usare semplicemente i cloni EIP-1167?
I proxy minimi EIP-1167 sono efficienti, ma non dispongono di funzionalità di aggiornamento integrate. Il proxy minimo aggiornabile ERC1967 rappresenta il punto di riferimento per la risoluzione han: minimo, ma duraturo, come le case hanok di Jeonju, resistenti alla prova del tempo e al cambiamento.
Note finali: best practice per la produzione
- Amministrazione decentralizzata: Utilizzare la governance on-chain o Gnosis Safe.
- Aggiornamenti del monitor: Emetti eventi di aggiornamento e monitorali come un geomante che legge i venti di montagna.
- Revisione contabile: Commissionare audit esterni prima di implementare o aggiornare i proxy di produzione.
Tabella di esempio: riepilogo dei modelli principali
| Modello | Aggiornabile | Cassaforte di stoccaggio | Efficiente a gas | Pronto per la produzione |
|---|---|---|---|---|
| EIP-1167 Proxy minimo | NO | SÌ | SÌ | Limitato |
| Proxy trasparente | SÌ | Moderare | Moderare | SÌ |
| UUPS (ERC1822) | SÌ | SÌ | SÌ | SÌ |
| ERC1967 Proxy minimo | SÌ | SÌ | SÌ | SÌ |
Il proxy minimale aggiornabile ERC1967 è la configurazione di cui tutti in Web3 parlano, non solo per i suoi meriti tecnici, ma perché è una testimonianza vivente della tendenza del settore: il desiderio sia di innovazione che di sicurezza, sia di velocità che di resilienza.
Commenti (0)
Non ci sono ancora commenti qui, potresti essere il primo!