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.
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:
delegatecallsuorittaa 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.
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
- Miksi päivitettävät sopimukset?
- UUPS-proxy-mallin toteuttaminen
- Diamond-standardi (moniosaiset proxyt)
- Transparent Proxy -malli ja tallennusasettelu