Diamond-standarden (multifacet-proxies)
Udforsk Diamond-standarden (EIP-2535) til udvikling af meget modulære og skalerbare opgraderbare kontrakter med flere facets.
Diamond-standarden (multifacet-proxies) er en gratis Blockchain-smart contracts med Solidity-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Blockchain-smart contracts med Solidity, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Blockchain-smart contracts med Solidity-kurset indeholder 4 lektioner i alt.
Introduktion til Diamond Standard
Velkommen til den sidste lektion om opgraderbare kontrakter! Vi har udforsket UUPS, men hvad gør du, hvis din kontrakt bliver for stor eller kræver ekstrem modularitet?
Diamond Standard (EIP-2535) er et effektivt mønster, der gør det muligt for en enkelt proxykontrakt at videresende kald til flere implementeringskontrakter, som kaldes facetter.
Begrænsninger ved en enkelt proxy
Traditionelle proxymønstre som UUPS eller transparente proxyer videresender normalt alle kald til en enkelt implementeringskontrakt.
Selv om det fungerer effektivt, kan det føre til:
- Begrænsning på kontraktstørrelse: Ethereum-kontrakter har en grænse på 24 KB. En enkelt, monolitisk implementering kan hurtigt nå denne grænse.
- Kompleksitet: En enkelt kontrakt, der håndterer mange funktioner, bliver svær at vedligeholde og auditere.
- Opgraderingsomkostninger: En opgradering kræver, at hele den store implementeringskontrakt implementeres igen, selv hvis kun en lille del er ændret.
Facetter: Modulære kontrakter
Diamond Standard løser dette ved at opdele din kontrakts logik i mindre, uafhængige dele, der kaldes facetter.
Tænk på facetter som:
- Individuelle smarte kontrakter, der hver håndterer bestemte funktioner.
- 'Plugins' eller 'moduler' til din primære proxy.
- Facetter, der hver har deres eget sæt funktioner.
Diamond-proxyen afgør derefter, hvilken facet et kald skal videresendes til.
Sådan fungerer Diamond-proxyer
Grundlæggende fungerer en Diamond-proxy på samme måde som andre proxyer:
- En bruger kalder en funktion på Diamond-proxyen.
- Proxyen ser på funktionsvælgeren (de første 4 byte i kaldets data).
- Derefter afgør den, hvilken facet der indeholder funktionen.
- Til sidst videresender den kaldet (ved hjælp af
delegatecall) til den korrekte facet.
Det smarte er, at proxyen vedligeholder en mapping fra funktionsvælgere til facetadresser.
Diamond Storage: Delt tilstand
Et afgørende aspekt ved Diamond Standard er, hvordan tilstanden håndteres. Selv om logikken er opdelt på flere facetter, arbejder de alle på det samme lager i Diamond-proxykontrakten.
Det opnås ved at:
- Definere en delt lagerstruktur, f.eks.
AppStorage. - Lade hver facet tilgå dette delte lager ved hjælp af et bestemt Solidity-mønster, ofte via et bibliotek.
- Sikre konsistens og give facetter mulighed for at arbejde med de samme data.
Håndtering af facetter med `diamondCut`
Den centrale funktion til håndtering af din Diamond er diamondCut. Denne funktion giver dig mulighed for at:
- Tilføje nye facetter (ny funktionalitet).
- Erstatte eksisterende facetter (opgradere eller rette fejl).
- Fjerne facetter (udfase funktionalitet).
diamondCut kan normalt kun kaldes af kontraktens ejer, hvilket gør den til den sikre opgraderingsmekanisme for din kontrakt med flere facetter.
Et enkelt eksempel på en facet
Her er et eksempel på, hvordan en helt grundlæggende Solidity-facet kan se ud. Husk, at facetter blot er almindelige kontrakter, der implementerer specifik logik.
Prøv at kompilere dette enkle eksempel:
pragma solidity ^0.8.0;
contract MySimpleFacet {
// Facets interact with shared storage
// located in the Diamond proxy contract.
// They don't declare state variables directly
// in the way a standalone contract would.
function getFacetVersion() external pure returns (string memory) {
return "MySimpleFacet v1.0";
}
function greetUser(string memory _name) external pure returns (string memory) {
return string(abi.encodePacked("Hello, ", _name, " from MySimpleFacet!"));
}
}Selve Diamond-proxyen
Selve Diamond-proxykontrakten er bemærkelsesværdigt enkel. Dens primære opgaver er:
- At gemme mappingen fra funktionsvælgere til facetadresser.
- At implementere funktionen
diamondCuttil opgraderinger. - Fallback-funktionen, som håndterer videresendelse af kald til den korrekte facet.
Den fungerer som den centrale router for alle indgående kald og leder dem til det rette stykke logik.
Hvorfor vælge Diamond Standard?
Diamond Standard giver betydelige fordele for komplekse decentraliserede applikationer:
- Ubegrænset kontraktstørrelse: Omgå nemt grænsen på 24 KB ved at opdele logikken i mange små facetter.
- Ekstrem modularitet: Udvikl og implementer funktioner uafhængigt af hinanden.
- Gaseffektivitet: Opgrader (implementer) kun de specifikke facetter, der ændres, i stedet for hele kontrakten.
- Tydelig adskillelse af ansvarsområder: Forbedrer kodens læsbarhed, testning og sikkerhedsaudit.
- Trinvis udvikling: Tilføj nye funktioner over tid uden at påvirke de eksisterende.
Kontrol af Diamond Standard
Diamond Standard (EIP-2535) leverer et robust grundlag til at bygge meget modulære og opgraderbare smarte kontrakter. Hvilke af følgende udsagn beskriver præcist de vigtigste fordele eller egenskaber?
Opsummering: Proxyer med flere facetter
I denne lektion udforskede vi Diamond Standard (EIP-2535), et effektivt mønster til at bygge meget modulære og opgraderbare smarte kontrakter.
- Vi lærte om facetter, som er individuelle kontrakter med specifik logik.
- Diamond-proxyen videresender kald til disse flere facetter baseret på funktionsvælgere.
- Alle facetter deler Diamond-proxyens lager.
- Funktionen
diamondCutbruges til at tilføje, erstatte eller fjerne facetter. - De vigtigste fordele omfatter, at grænsen på 24 KB for kontraktstørrelse overskrides, ekstrem modularitet og effektive opgraderinger.
Du har nu den nødvendige viden om avancerede mønstre for opgraderbarhed!
Lær Blockchain-smart contracts med Solidity med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 12
- Lektioner
- 48
Ofte stillede spørgsmål
Er lektionen “Diamond-standarden (multifacet-proxies)” gratis?
Ja — hele teksten til “Diamond-standarden (multifacet-proxies)” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Blockchain-smart contracts med Solidity-kurset, skal du opgradere til CoddyKit PRO. Blockchain-smart contracts med Solidity-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Diamond-standarden (multifacet-proxies)”?
Udforsk Diamond-standarden (EIP-2535) til udvikling af meget modulære og skalerbare opgraderbare kontrakter med flere facets. Du øver dig i Blockchain-smart contracts med Solidity med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Blockchain-smart contracts med Solidity?
Der kræves ingen tidligere erfaring. Blockchain-smart contracts med Solidity på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Diamond-standarden (multifacet-proxies)”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Blockchain-smart contracts med Solidity-lektion?
Ja. Alle Blockchain-smart contracts med Solidity-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Hvorfor opgraderbare kontrakter?
- Implementering af UUPS-proxymønsteret
- Diamond-standarden (multifacet-proxies)
- Mønsteret Transparent Proxy og storage-layout