Lohkoketjun älysopimukset Soliditylla · Oppitunti

Transparent Proxy -malli ja tallennusasettelu

Oppikaa Transparent Proxy -malli, miten delegatecall erottaa logiikan tallennuksesta ja mitä tallennusasettelun sääntöjä on noudatettava sopimusten turvalliseen päivittämiseen.

Oppitunti 4/413 vaihetta

Transparent Proxy -malli ja tallennusasettelu on ilmainen Lohkoketjun älysopimukset Soliditylla-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Lohkoketjun älysopimukset Soliditylla-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lohkoketjun älysopimukset Soliditylla-kurssilla on yhteensä 4 oppituntia.

Kertaus: miksi proxyt ovat tärkeitä

Olette tutustuneet UUPS- ja Diamond-standardeihin. Molemmat perustuvat keskeiseen ideaan: proxy säilyttää tallennustilan ja välittää kutsut erilliselle logic- eli toteutussopimukselle. Päivittäminen tarkoittaa, että proxy ohjataan uuteen logiikkaan.

Miten delegatecall toimii

Proxyjen taustalla toimii delegatecall. Se suorittaa logiikkasopimuksen koodin, mutta proxyn tallennustilan kontekstissa käyttäen proxyn msg.sender-arvoa ja saldoa.

Tallennustila on siis proxyssä, kun taas toiminnallisuus on toteutuksessa.

Minimaalinen proxyn fallback

Proxy välittää jokaisen tuntemattoman kutsun toteutukselle käyttämällä assemblyn delegatecall-kutsua fallback-funktiossaan.

fallback() external payable {
    address impl = _implementation();
    assembly {
        calldatacopy(0, 0, calldatasize())
        let ok := delegatecall(gas(), impl, 0, calldatasize(), 0, 0)
        returndatacopy(0, 0, returndatasize())
        switch ok
        case 0 { revert(0, returndatasize()) }
        default { return(0, returndatasize()) }
    }
}

Funktioiden törmäysongelma

Jos proxyllä itsellään on upgradeTo-funktio ja myös logiikassa on saman selectorin käyttävä funktio, kutsuista tulee epäselviä. Transparent Proxy -malli ratkaisee tämän reitittämällä kutsut kutsujan perusteella.

Ylläpitäjän ja käyttäjän reititys

Transparent Proxyssä admin-osoite voi kutsua ylläpitäjän funktioita, kuten päivitystä, mutta ei pääse toteutukseen. Kaikki muut kutsujat välitetään aina toteutukselle. Näin törmäykset poistuvat.

modifier ifAdmin() {
    if (msg.sender == _admin()) {
        _;
    } else {
        _fallback();
    }
}

Tallennustilan slotien törmäykset

Sekä proxy että logiikka kirjoittavat samaan tallennustilaan. Jos ne käyttäisivät slottia 0 eri muuttujille, ne korruptoisivat toistensa tiedot. Proxyt tallentavat ylläpitäjän ja toteutuksen kiinteisiin näennäissatunnaisiin slotteihin (EIP-1967) törmäysten välttämiseksi.

// EIP-1967 implementation slot
bytes32 internal constant _IMPL_SLOT =
    0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

Toteutusslotin lukeminen

Proxy lukee ja kirjoittaa kyseistä kiinteää slottia suoraan assemblylla, joten se ei koskaan törmää logiikan muuttujiin.

function _implementation() internal view returns (address impl) {
    bytes32 slot = _IMPL_SLOT;
    assembly { impl := sload(slot) }
}

Tallennustilan rakenteen säännöt

Kun päivitätte logiikkaa, teidän on säilytettävä olemassa olevien tallennustilan muuttujien järjestys ja tyypit. Uudet muuttujat lisätään loppuun.

  • Älkää koskaan järjestäkö olemassa olevia muuttujia uudelleen
  • Älkää koskaan vaihtako muuttujan tyyppiä
  • Älkää koskaan lisätkö uutta muuttujaa vanhojen eteen

Tallennustilan aukot

Perittävät kantasopimukset varaavat tilaa tuleville muuttujille __gap-taulukolla, jotta lapsisopimukset eivät törmää toisiinsa, kun kantaan lisätään päivityksen yhteydessä uusia kenttiä.

contract Base {
    uint256 public value;
    // reserve 50 slots for future use
    uint256[50] private __gap;
}

Initializers-funktiot eivät ole konstruktoreita

Konstruktorit suoritetaan vain logiikkasopimuksen omassa käyttöönotossa, ei proxyn kautta. Päivitettävissä sopimuksissa käytetään initialize-funktiota, joka on suojattu siten, että se suoritetaan täsmälleen kerran.

bool private _initialized;

function initialize(uint256 v) external {
    require(!_initialized, 'already init');
    _initialized = true;
    value = v;
}

Transparent vastaan UUPS

Transparent-proxyt sisältävät päivityslogiikan proxyssä (enemmän deployment-gasia, yksinkertaisempi logiikka). UUPS sijoittaa sen toteutukseen (halvempi proxy, mutta päivityskoodi on sisällytettävä jokaiseen versioon). Valitkaa ratkaisu kustannusten ja tiimin kurinalaisuuden perusteella.

Pikatesti

Testatkaa, miten hyvin ymmärrätte proxyn tallennustilan.

Kertaus

Opitte Transparent Proxy -mallin:

  • delegatecall suorittaa logiikan proxyn tallennustilassa
  • Ylläpitäjän ja käyttäjän erillinen reititys estää funktioiden törmäykset
  • EIP-1967:n kiinteät slotit ja __gap-taulukot estävät törmäyksiä
  • Käyttäkää initialize-funktiota, säilyttäkää tallennustilan rakenne ja lisätkää uudet muuttujat loppuun

Noudattamalla näitä sääntöjä päivitykset pysyvät turvallisina.

Aloita maksutta

Opi Lohkoketjun älysopimukset Soliditylla tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”Transparent Proxy -malli ja tallennusasettelu” ilmainen?

Kyllä – oppitunnin ”Transparent Proxy -malli ja tallennusasettelu” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Lohkoketjun älysopimukset Soliditylla-kurssin, päivitä CoddyKit PROhon. Lohkoketjun älysopimukset Soliditylla-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Transparent Proxy -malli ja tallennusasettelu”?

Oppikaa Transparent Proxy -malli, miten delegatecall erottaa logiikan tallennuksesta ja mitä tallennusasettelun sääntöjä on noudatettava sopimusten turvalliseen päivittämiseen. Harjoittelet Lohkoketjun älysopimukset Soliditylla-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lohkoketjun älysopimukset Soliditylla-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lohkoketjun älysopimukset Soliditylla-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Transparent Proxy -malli ja tallennusasettelu”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lohkoketjun älysopimukset Soliditylla-oppitunnilla?

Kyllä. Jokainen Lohkoketjun älysopimukset Soliditylla-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Miksi päivitettävät sopimukset?
  2. UUPS-proxy-mallin toteuttaminen
  3. Diamond-standardi (moniosaiset proxyt)
  4. Transparent Proxy -malli ja tallennusasettelu
← Takaisin: Lohkoketjun älysopimukset Soliditylla