După ce am observat schimbările semnificative care au fost introduse în Ethereum prin upgrade-ul Deneb, am început să ne uităm la ceea ce va introduce următorul hardfork, Pectra. Pentru a ajuta la modelarea discuțiilor care vor urma, căutăm să descriem peisajul actual al abstracției conturilor din jurul Ethereum și ecosistemul său de acumulare, pentru a putea mapa o cale clară înainte.
Acest raport oferă o privire de ansamblu asupra modelului de cont curent al Ethereum, în special asupra efectelor acestora asupra validității tranzacțiilor, a ceea ce presupune exact abstracția contului și un cadru de raționament în legătură cu acesta. Ne vom concentra apoi pe abordarea programabilității EOA prin evaluarea EIP-urilor 5086, 3074 și 7702 și vom concluziona cu modul în care toate acestea afectează probabil viitorul tranzacțiilor pe Ethereum.
Deși există multă confuzie cu privire la ceea ce este sau nu abstracția contului, încadrarea noastră de-a lungul acestei serii este că orice mecanism care permite unui cont să redefinească orice parte a regulilor sale de valabilitate este un mecanism pentru abstracția contului. În plus, oferim o clasificare a acestor mecanisme, deoarece majoritatea dintre ele sunt vag similare și se interpun.
Abstracția contului urmărește să îmbunătățească experiențele utilizatorilor și dezvoltatorilor în întregul ecosistem Ethereum. Pe lângă faptul că experiențele în lanț sunt mai accesibile și mai plăcute pentru utilizatori, le permite dezvoltatorilor să poată face lucruri mai puternice pe Ethereum și să servească utilizatorii în moduri și mai semnificative.
Clasificarea noastră a abordărilor privind abstractizarea conturilor este următoarea:
1. Îmbunătățirea/programabilitatea EOA : Aceasta include modificări la nivel de protocol care permit EOA (Conturi deținute din exterior) să redefiniască porțiunea logică de execuție a regulilor lor de valabilitate. După cum sunt binecunoscute în comunitatea de dezvoltare, EOA-urile sunt conturi asociate de obicei cu utilizatorii finali. Prin urmare, soluțiile care se încadrează în această abordare vor oferi conturilor utilizatorilor finali mai mult control asupra tipului de acțiuni pe care le pot autoriza, în comparație cu modul în care acestea pot fi gestionate astăzi.
2. Conversia/migrarea EOA : Această abordare include propuneri care urmăresc conversia completă a EOA în CA (conturi contractuale). Ideea integrală a acestei abordări este că conturile contractuale oferă deja cele mai multe dintre beneficiile oferite de conturile inteligente, așa că nu ar trebui să mai fie nevoie să complicăm lucrurile; toată lumea ar trebui să folosească pur și simplu un cont de contract ca cont principal (prin portofele de contracte inteligente).
Această abordare prezintă mecanisme care permit unei EOA să treacă la o CA, fără a fi nevoie să-și mute activele, cum ar fi EIP 7377 și EIP 5003 (când sunt luate în considerare împreună cu EIP 3074).
3. Conturi inteligente : acest grup de propuneri include modele care permit atât EOA, cât și CA-urilor să se comporte ca „conturi inteligente”, permițându-le să-și redefinească complet regulile de valabilitate.
Au fost făcute anterior diferite propuneri pentru crearea de conturi inteligente și consacrarea abstracției conturilor la nivel de protocol; EIP-86 și EIP-2938 sunt unele dintre cele mai citate. Cu toate acestea, au existat multe respingeri din cauza complexității percepute introduse de acest design și a părerii oarecum majoritare că Ethereum nu este pregătit pentru o asemenea complexitate.
După renașterea subiectului de către Vitalik după Merge, ERC-4337 a fost propus ca o versiune opt-in a standardului de cont inteligent, similar infrastructurii PBS (Proposer-Builder Separation) pentru MEV (Maximal Extractable Value). Astfel, utilizatorii care doresc să acceseze beneficiile conturilor inteligente ar putea pur și simplu să folosească conducta ERC-4337 pentru a redefini logica contului lor și regulile de valabilitate a tranzacțiilor în structuri denumite UserOperation (sau UserOps pe scurt).
ERC 4337 aduce beneficiile conturilor inteligente în Ethereum actual, fără a consacra nicio complexitate, funcționând ca o alternativă în afara protocolului la conturile inteligente consacrate. Cu toate acestea, acest lucru nu înseamnă că infrastructura este optimă în starea ei actuală, deoarece propria sa complexitate este încă un punct de eșec considerabil.
Pentru a aborda această complexitate, RIP 7560 a fost elaborat ca o versiune consacrată a infrastructurii ERC 4337 în Ethereum și L2-urile sale, astfel încât să moștenească schemele de rezistență la sibil ale rețelei, în loc să fie nevoit să definească o nouă suită de reguli (cum face ERC 4337 cu ERC 7562 ).
În acest raport, ne vom concentra pe explorarea programabilității EOA, evaluarea diferitelor EIP-uri care descriu soluții pe această linie și discută meritele și dezavantajele acestora. În părțile 2 și 3 ale acestei serii, vom acoperi celelalte două clase de abordare a abstracției conturilor care sunt explorate în Ethereum.
Pentru a găsi ceea ce poate fi abstractizat, avem nevoie de o imagine (oarecum) completă a designului contului curent. Această secțiune va servi în principal ca o revizuire a conturilor de pe Ethereum și a modului în care tranzacțiile lor sunt validate și executate.
Conturile Ethereum sunt entități cu un sold ether (ETH) și capacitatea de a trimite tranzacții pe blockchain-ul Ethereum. Ele sunt reprezentate ca o „adresă” hexazecimală de 42 de caractere, care servește ca un indicator unic către deținerile și tranzacțiile contului.
O adresă acționează ca o cheie în încercarea de stare a blockchain-ului. Nodurile frunză ale acestui trie sunt structuri de date de cont care pot fi descompuse în patru câmpuri:
nonce
: un contor liniar folosit pentru a indica numărul de tranzacții de ieșire inițiate de un cont. De asemenea, este crucial în prevenirea atacurilor de reluare.balance
: cantitatea de eter (ETH) denominată în wei deținută de un cont.codeHash
: un hash al codului executabil EVM conținut într-un cont. EVM (Ethereum Virtual Machine) este mediul de execuție personalizat al Ethereum responsabil pentru gestionarea tranzițiilor complexe de stare dincolo de simplele tranzacții de „trimitere”. Conținutul de cod al unui cont este programat imuabil pentru a efectua forme specifice de tranziție de stat pe blockchain-ul Ethereum, prin EVM.storageHash
: un hash al rădăcinii de stocare a unui cont, folosit pentru a reprezenta conținutul de stocare al unui cont ca un hash de 256 de biți al nodului rădăcină al unui merkle patricia trie. Pur și simplu, este un hash al datelor variabile de stat legate de conținutul codului unui cont.
Conținutul acestor patru câmpuri este folosit pentru a defini tipul unui cont și, în cele din urmă, continuă să definească amploarea funcționalităților acestuia. Astfel, cele două tipuri de conturi Ethereum sunt:
EOA au câmpuri codeHash și storageHash goale și pot fi controlate numai de oricine deține cheile private. Adresele lor pot fi obținute de la cheia publică corespunzătoare prefixând „0x” la ultimele douăzeci de caractere ale hash-ului keccak-256 al cheii publice a contului.
2. Conturi contractuale (CA) care pot fi create numai printr-un EOA preexistent. Acestea sunt inițializate datorită unui EOA care implementează conținut de cod executabil pe EVM. Acest conținut de cod (stocat ca codeHash) este consacrat în EVM și este responsabil pentru controlul contului prin definirea logicii și interacțiunilor acestuia.
Tranzacțiile din contul de contract sunt în întregime bazate pe pull bazate pe logica codului lor implementat. Deoarece aceste conturi pot fi controlate numai de conținutul codului lor, nu au nevoie de o cheie privată și au doar o cheie publică. Astfel, orice agent care are capacitatea de a actualiza/modifica conținutul codului unui cont contractual ar putea accesa soldul acestuia. Adresa unui cont de contract este derivată din adresa creatorului său și nu a acestuia până la momentul implementării contractului.
Am descris recent conturile ca fiind entități care au capacitatea de a trimite tranzacții pe Ethereum. Prin urmare, putem înțelege că un scop principal al unui cont este acela de a trimite și primi tranzacții, în timp ce blockchain-ul acționează ca un registru înregistrând istoricul tranzacțiilor, precum și descriind modul în care tranzacțiile modifică câmpurile contului pe baza regulilor descrise în specificația protocolului blockchain.
Deci, care sunt aceste „tranzacții”?
Tranzacțiile sunt operațiuni trimise dintr-un cont, care provoacă o schimbare în „starea” rețelei. Sunt instrucțiuni semnate criptografic din conturi, care au ca rezultat o actualizare a stării la nivel de rețea atunci când sunt executate.
Lipsa permisiunii vine cu costul stimulentelor perverse, pentru a face față acestora, trebuie definite linii directoare stricte (sau reguli de valabilitate) pentru interacțiunile în astfel de medii. În acest context, tranzacțiile trebuie să respecte anumite reguli de valabilitate pentru a fi considerate valide și executate. Majoritatea acestor reguli de valabilitate sunt implementate prin constrângeri impuse contului care trimite tranzacția și variază în funcție de tipul de cont.
Pe Ethereum, EOA-urile sunt optimizate pentru utilizare, deoarece sunt orientate spre utilizatorul final. Au capacitatea de a trimite tranzacții într-un mod specific și funcționează perfect autonom. Ele pot fi create și local, metoda mai comună fiind utilizarea furnizorilor de portofel precum MetaMask, Rainbow, Rabby etc.
Pe de altă parte, conturile contractuale pot trimite doar tranzacții permise de logica lor, ca răspuns la „ chemarea ”. De asemenea, acestea pot fi create doar de un EOA care are un sold suficient pentru a plăti stocarea de stat.
O descriere la nivel mai înalt ar fi aceea că EOA poate păstra doar un sold, în timp ce CA pot deține atât un sold, cât și o logică care dictează modul în care acest sold poate fi cheltuit. Aceste proprietăți se datorează următorilor parametri logici care definesc regulile pe care trebuie să le respecte tranzacțiile unui cont:
Acești parametri sunt proiectați pentru a fi rigizi pentru EOA, astfel:
În general, logica de execuție a EOA le constrânge la o singură tranzacție per semnătură validă.
Pe de altă parte, CA au mai multă flexibilitate în ceea ce privește acești parametri:
În majoritatea cazurilor practice, logica utilizată în acest caz este o schemă cu mai multe semnături care stipulează că un M din N semnături valide (unde M < N) este necesar din conturi specifice (de obicei EOA) pentru o schimbare a logicii CA. a fi valabil.
Evaluând aceste caracteristici, observăm că fiecare tip de cont este conceput pentru a avea un compromis între autonomie și programabilitate.
EOA au autonomie deplină, dar programabilitate limitată; pot autoriza și trimite tranzacții oricând doresc, dar aceste tranzacții trebuie să urmeze un format rigid pentru a fi considerate valide. Conturile contractuale au programabilitate deplină (limitată doar de designul EVM) dar autonomie limitată: tranzacțiile lor nu trebuie să urmeze niciun format rigid, ci pot fi trimise doar datorită logicii lor fiind apelate prima.
În următoarea subsecțiune, vom studia acum implicațiile acestor alegeri de proiectare, pentru a înțelege pe deplin propunerea fiecărui EIP discutat de-a lungul acestei serii.
Acum că avem o cunoaștere oarecum succintă a funcționalităților diferitelor conturi, putem identifica cu ușurință punctele de vânzare ale acestora, precum și problemele pe care le prezintă atât experienței utilizatorilor, cât și dezvoltatorilor pe Ethereum. După cum am menționat anterior, EOA sunt concepute ca conturi de primă clasă care vizează utilizatorii finali. Aplicațiile sunt concepute pentru a interacționa cu ușurință cu ele, nu există aproape nicio complexitate pentru ele și, desigur, nu există niciun cost pentru crearea uneia. Cu toate acestea, simplitatea sa vine cu o pierdere semnificativă de noutate, deoarece sunt concepute pentru a fi strict deterministe.
Unele dintre preocupările din jurul lor sunt:
Nu toată lumea vrea (sau ar putea) să dețină întotdeauna ETH (adică uitați-vă la acțiunea prețului), așa că soluțiile viabile ar fi fie să permită mai multe monede ale gazului (prea greu, rupe prea multe invariante așa cum este descris în „Moneda ” aici ), sau pentru a permite plățile de gaz să fie decontate printr-un alt cont care nu este originea tranzacției.
La celălalt capăt al spectrului de conturi, CA vizează dezvoltatorii și o bază de utilizatori mai tehnică. Ele servesc ca vehicule pentru contractele inteligente (adică considerăm contractele inteligente ca fiind logica sau conținutul lor de cod) și, prin urmare, pot implementa formate noi de tranzacții, astfel cum sunt activate de EVM.
Cu toate acestea, pentru toate aceste caracteristici, sunt conturi glorificate de clasa a doua, deoarece nu au autonomie. Unele dintre dezavantajele lor sunt următoarele:
După ce am analizat alegerile de proiectare care au condus la problemele definite în această subsecțiune, putem trece acum la evaluarea soluțiilor propuse.
Pentru a găsi ceea ce poate fi abstractizat, avem nevoie de o imagine (oarecum) completă a designului contului curent. Această secțiune va servi în principal ca o revizuire a conturilor de pe Ethereum și a modului în care tranzacțiile lor sunt validate și executate.
Conceptul de abstractizare a contului (cel puțin prin conturi inteligente) a fost întotdeauna o parte integrantă a foii de parcurs a Ethereum. Știrea este că complexitatea din jurul implementării sale a amenințat să întârzie și mai mult lansarea Ethereum, așa că a fost abandonat pentru designul actual, cu diferite conturi care oferă diferite funcționalități. A fost amânat din nou de concentrarea Ethereum pe The Merge, iar acum reapare ca parte principală a următoarei upgrade majore a rețelei – Pectra. Cu toate acestea, complexitatea sa este încă considerată un dezavantaj semnificativ care împiedică consacrarea sa, mai ales că Ethereum a trecut la o foaie de parcurs centrată pe rollup.
Cerințele sunt acum duble:
În mod intuitiv, acest concept joacă un rol mai important în contextul abstracției în lanț și al interoperabilității. Cu toate acestea, domeniul nostru de aplicare de-a lungul acestui raport este limitat la inițiativele tehnice luate pentru a realiza abstractizarea în sine.
Abstracția contului își propune să combine cele mai bune caracteristici ale EOA și CA într-un nou standard de cont – conturi inteligente , care permit separarea totală sau parțială a regulilor de valabilitate ale oricărui cont într-o logică de validare și una de execuție; astfel încât conturile să își poată defini propriile reguli de valabilitate – așa cum sunt permise de EVM – la fel ca conturile contractuale, rămânând în același timp complet autonome la fel ca conturile deținute din exterior.
Există adesea confuzie în ceea ce privește diferențele dintre conturile inteligente și portofelele cu contracte inteligente , așa că haideți să descriem în mod explicit care sunt aceste diferențe mai jos:
Comercializarea portofelelor cu contracte inteligente a ușurat adoptarea CA de către o piață mai largă, permițând utilizatorilor mai puțin tehnici să profite de funcțiile pe care le oferă. Cu toate acestea, ei încă se confruntă cu capcanele asociate CA.
Înapoi la conversație; Am discutat anterior despre parametrii care sunt utilizați pentru a defini regulile de valabilitate a tranzacțiilor conturilor:
Valorile primilor patru parametri pot fi denumite în mod colectiv logica de validare a unui cont, care sunt verificări care au loc înainte de începerea execuției unei tranzacții. Ultimul parametru definește modul în care va decurge execuția tranzacției.
În introducere, am oferit o imagine de ansamblu la nivel înalt a peisajului actual AA sub forma unei clasificări pentru diferitele modele propuse. Acum ne vom concentra pe prima clasă de soluții la dilema contului Ethereum - programabilitatea EOA.
Cea mai mare atracție a Ethereum este ecosistemul său DeFi tânăr, dar vibrant, care prezintă o varietate de aplicații descentralizate care sunt principalele sale chiuvete de lichiditate. Cele mai multe dintre aceste DApp-uri sunt optimizate pentru a servi EOA, astfel încât sunt greu de interfațat cu conturile contractuale și, eventual, cu conturile inteligente. În timp ce portofelele inteligente cu contracte ajută conturile contractuale în acest caz, ele vin cu propriile lor limitări și cu un UX complet diferit.
O soluție intermediară care este explorată în timp ce atât DApps, cât și furnizorii de portofel se obișnuiesc cu standardul contului inteligent, este de a oferi îmbunătățiri temporare EOA care să le permită să depășească majoritatea restricțiilor impuse, fie că este vorba de validarea sau logica lor de execuție. Mai jos, trecem peste specificațiile a trei EIP-uri majore care oferă rute acționabile către programabilitatea EOA; de la mai puțin cunoscut EIP 5806 , la ambițiosul EIP 3074 și apoi în cele din urmă la victorios EIP 7702 .
Această propunere urmărește să aducă mai multe funcționalități standardului EOA, permițându-i să efectueze apeluri delegate către logica unui cont de contract (contractul său inteligent). Acest lucru face ca contractul inteligent să fie executat în contextul EOA apelantului, adică EOA rămâne în controlul logicii sale de validare, în timp ce logica sa de execuție este gestionată de logica contului de contract corespunzător.
Înainte de a continua, haideți să facem o călătorie pe banda de memorie a evoluției Ethereum până la EIP-7 . EIP-7 a propus crearea codului operațional 0xf4/DELEGATECALL
, care este folosit pentru a trimite apeluri de mesaje într-un cont principal cu logica unui cont secundar, menținând în același timp valorile câmpurilor [exmițător] și [valoare] ale contului principal. Cu alte cuvinte, contul primar „moștenește” (sau împrumută dacă preferați) logica contului secundar pentru o anumită durată, așa cum este specificată în apelul de mesaj, astfel încât logica celui din urmă să fie executată în contextul celui dintâi.
Acest opcode a permis dezvoltatorilor dapp să-și împartă logica aplicației în mai multe contracte inteligente, menținând în același timp interdependența, astfel încât să poată ocoli cu ușurință barierele de dimensiunea codului și barierele de gaz. EIP-5806 găsește o nouă utilizare pentru codul operațional DELEGATECALL dincolo de a permite conturilor contractuale să fie interdependente. Mai exact, EIP-5806 folosește EIP-7 ca sursă de inspirație pentru a propune extinderea funcționalității de apel de delegat și la EOA; adică, să permitem EOA să fie, de asemenea, interdependente cu conturile contractuale, pentru că de ce nu.
EIP 5806 introduce un nou tip de tranzacție compatibil EIP-2718, care este împachetat după cum urmează:
rlp([chainID, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, data, access_list, signature_y_parity, signature_r, signature_s]).
Aceste tranzacții sunt concepute astfel încât câmpul [către] – care reprezintă adresa destinatarului – să poată accepta adrese doar ca intrări de 20 de octeți, dezactivând expeditorul să folosească opcode-ul CREATE
.
Motivația din spatele fiecărei componente a schemei RLP sunt următoarele:
keccak256 (TX_TYPE || rlp ([chainID, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, data, access_list])).
În timp ce împachetarea tranzacțiilor EIP-5806 în plicurile EIP-2718 le permite să fie foarte compatibile cu retroactiv, EOA-urile nu sunt echivalente cu conturile contractuale. Așadar, anumite restricții trebuie definite în modul în care un EOA utilizează apelurile delegate pentru a preveni ruperea invariabilă.
Aceste restricții vizează următoarele coduri operaționale:
SSTORE/0x55
: Acest cod operațional permite unui cont să salveze o valoare în stocare. Este restricționat în tranzacțiile EIP-5806 pentru a împiedica EOA să seteze/acceseze spațiul de stocare folosind apelurile delegate, prevenind astfel potențialele probleme care pot apărea în viitor din cauza migrării contului.CREATE/0xF0
, CREATE2/0xF5
și SELFDESTRUCT/0xFF
: Aceste coduri operaționale permit în mod extensiv apelantului să creeze un cont nou. Accesul la acestea este restricționat pentru a preveni alterarea nonce-ului unui EOA într-un cadru de execuție diferit (crearea/distrugerea contractului în acest caz) în timp ce acesta efectuează o tranzacție EIP-5806, pentru a preveni invalidarea așteptării că tranzacțiile poartă nonce consecutive.Aplicabilitatea principală a EIP-5806 este abstractizarea execuției pentru EOA. Permițând EOA să interacționeze fără încredere cu contractele inteligente, dincolo de simple apeluri la logica lor, le oferă caracteristici precum:
Modificările propuse de EIP-5806, deși permit funcțiile necesare, nu sunt deosebit de noi; existența sa se bazează în mare parte pe un EIP-7 deja funcțional. Acest lucru îi permite să ocolească multe obstacole potențiale în calea acceptării.
Una dintre preocupările majore exprimate la începuturile sale a fost riscul potențial de a permite EOA să acceseze spațiul de stocare și să îl schimbe, la fel cum fac în prezent CA-urile. Acest lucru înlătură o mulțime de invarianți consacrate în rețea cu privire la modul în care trebuie să tranzacționeze EOA, și astfel a fost rezolvat prin introducerea restricțiilor menționate în subsecțiunea anterioară.
O a doua critică (care este un pic o sabie cu două tăișuri) este simplitatea EIP-5806; există un sentiment că recompensele datorate acceptării EIP-5806 ar putea să nu merite costul, deoarece permite doar abstractizarea execuției și nu multe altele. Orice altă restricție de valabilitate rămâne definită de rețea pentru EOA care optează pentru EIP-5806, spre deosebire de alte EIP oarecum similare pe care le discutăm în următoarele subsecțiuni.
EIP-3074 propune să permită EOA să delege cea mai mare parte a logicii lor de validare conturilor contractuale specializate, denumite invocatori, prin suprapunerea logicii de autorizare a acestora din urmă peste a lor pentru forme specifice de tranzacții. Acesta realizează acest lucru prin semnarea politicii lor de acces la un contract invocator, care apoi devine responsabil pentru definirea politicii de acces a EOA.
Acest EIP propune adăugarea a două coduri operaționale noi la EVM:
[AUTH]
care setează un cont [autorizat] cu variabile de context să acționeze în numele unui al doilea cont [de autoritate], pe baza semnăturii ECDSA a acestuia din urmă.[AUTHCALL]
care trimite/implementează apeluri pentru contul [autoritate] din/ca cont [autorizat].
Aceste două coduri operaționale permit unui EOA să delege controlul unui CA prestabilit și, astfel, să acționeze ca unul singur prin intermediul acestuia, fără a fi nevoie să implementeze un contract și să suporte costurile și externalitățile asociate cu acesta.
EIP-3074 permite tranzacțiilor să utilizeze un format de semnare [MAGIC]
pentru a preveni coliziunile cu alte formate de semnare a tranzacțiilor. Contul activ la care sunt transmise instrucțiunile [AUTHCALL]
este definit ca un câmp variabil de context numit [autorizat], care persistă doar printr-o singură tranzacție și trebuie redefinit pentru fiecare nou [AUTHCALL]
.
Înainte de a aborda complexitățile fiecărui cod operațional, acestea sunt entitățile implicate într-o tranzacție EIP-3074:
[AUTHCALL]
pentru execuție. Cu alte cuvinte, este contul în care logica unui [AUTHCALL]
este executată, în numele [autorității], folosind constrângerile definite de un [invocator].[AUTHCALL]
, mai ales în cazurile în care logica principală a codului de contract al acestuia din urmă este sponsorizarea gazelor.
Contractele invocatoare primesc mesaje [AUTH]
cu o valoare [COMMIT] de la [autoritate]; această valoare definește restricțiile pe care contul dorește să le pună asupra execuției de către [autorizat] a instrucțiunilor [AUTHCALL]
. Astfel, invocatorii sunt responsabili pentru a se asigura că [ contract_code
] definit într-un cont [autorizat] nu este rău intenționat și are capacitatea de a satisface invarianții plasați de contul de semnare principal într-o valoare [COMMIT].
Codul operațional [AUTH]
are trei intrări pentru elemente de stivă; sau mai simplu - este definit de trei intrări care calculează o singură ieșire. Aceste intrări sunt:
Ultimele două intrări sunt folosite pentru a descrie un interval de memorie modificabilă de la 0 la 97, unde:
[memory(offset : offset+1)] – [yParity]
[memory(offset+1 : offset+33] – [r]
[memory(offset+33 : offset+65)] – [s]
[memory(offset+65 : offset+97)] – [COMMIT]
Variabilele [yParity], [r] și [s] sunt interpretate colectiv ca o semnătură ECDSA, [magic], pe curba secp256k1 peste mesaj:
[keccak256 (MAGIC || chainID || nonce || invoker address || COMMIT)]
unde:
[AUTH]
.
Dacă semnătura calculată este validă și adresa semnatarului este egală cu [autoritate], câmpul [autorizat] este actualizat la valoarea furnizată de [autoritate]. Dacă oricare dintre aceste cerințe nu este îndeplinită, câmpul [autorizat] rămâne neschimbat în starea anterioară sau ca valoare nesetată.
Costul gazului pentru acest opcode este calculat ca suma:
O taxă fixă pentru precompilarea [ecrecover] și suplimentar pentru un hash keccak256 și ceva logică suplimentară, evaluată la 3100 de unități
O taxă de extindere a memoriei care este calculată în mod similar cu codul operațional [RETURN] și aplicată atunci când memoria este extinsă peste intervalul specificat al alocării curente (97 de unități)
Un cost fix de 100 de unități suportate pentru o [autoritate] caldă și 2600 de unități pentru una rece pentru a preveni atacurile din cauza prețurilor greșite ale codurilor operaționale care accesează de stat.
( AUTH
este implementat pentru a nu modifica memoria și ia valoarea [authority] ca argument, astfel încât este trivial să verifici valoarea acesteia din semnătura furnizată.)
Codul operațional [AUTHCALL]
are șapte intrări de elemente de stivă care sunt utilizate pentru a calcula o ieșire a unui singur element de stivă.
Are aceeași logică ca și opcode-ul [CALL]
, adică; este folosit pentru a trimite mesaje-apeluri într-un cont și pentru a declanșa o logică specifică în contractele sale. Singura abatere în logica lor este că [AUTHCALL]
este conceput pentru a seta valoarea [CALLER] înainte de a continua cu execuția.
Astfel, [AUTHCALL]
este utilizat de către [autoritate] pentru a declanșa un comportament specific contextului în [autorizat], verificările logice procedând după cum urmează:
Costul gazului pentru [AUTHCALL]
este calculat ca suma:
[warm_storage_read]
[memory_expansion_fee]
, care este calculat în mod similar costului de gaz pentru codul operațional [CALL]
[dynamic_gas]
[subcall_gas]
Datele returnate de la o [AUTHCALL]
sunt accesate prin:
[RETURNDATASIZE]
– care împinge dimensiunea buffer-ului de date returnate în stiva de ieșire[RETURNDATACOPY]
– care copiază datele din bufferul de date returnate în memorie.
Pentru a aduce totul împreună cu mult mai puțin vorbire tehnologică; Tranzacțiile Ethereum specifică de obicei două valori:
tx.origin
– care oferă autorizarea tranzacției.msg.sender
– în care tranzacția are loc efectiv.
În EOA, așa cum sa menționat anterior, autorizarea este strâns cuplată cu execuția, adică ( tx.origin
== msg.sender
). Acest simplu invariant dă naștere la majoritatea problemelor pe care le-am explicat în subsecțiunea „Conturi și Valabilitatea tranzacțiilor” a acestui raport.
Mesajele [AUTH]
de la [authority] îi permit să compenseze funcția tx.origin la [authorized], rămânând în același timp msg.sender. De asemenea, îi permite să definească restricții la acest privilegiu folosind o valoare [COMMIT]. [AUTHCALL]
permite apoi [autorizat] să acceseze logica unui contract, folosind un [invocator] ca intermediar pentru a se asigura că contractul pe care dorește să îl acceseze este inofensiv. Adică, pentru fiecare [AUTHCALL]
, [autorizat] trebuie să specifice un anumit [invocator] pentru [COMMIT].
EIP 3074 este în primul rând responsabil pentru a permite EOA să-și delege logica de autorizare către un cont diferit, cu toate acestea, designul său deschis permite mult mai multe în contexte diferite. Întreaga logică de validare a unui EOA poate fi abstractizată prin aplicarea diferitelor constrângeri/inovații la invocator, după cum este necesar, unele dintre modelele posibile bazate pe logica țintă includ:
[AUTH]
, în timp ce nonce pentru fiecare [AUTHCALL]
depinde de invocatorul cu care interacționează. În acest fel, permite paralelismul nonce pentru EOA, astfel încât acestea să poată trimite mai multe [AUTHCALL]
care nu se suprapun după cum doresc.Citând unul dintre autorii săi: „ Nu m-aș aștepta ca portofelele să expună funcționalitatea de a semna invocatori arbitrari... ”. Poate cea mai mare problemă pusă la cale de inițiativa 3074 este că inovația de deasupra va tinde foarte ușor către fluxuri de tranzacții autorizate și proprietare; la fel ca iterațiile actuale ale piețelor Ethereum MEV (valoare maximă extractabilă) și PBS (separarea propunere-constructor).
În mod implicit, contractele invocatoare trebuie să fie auditate în mare măsură pentru a preveni atacuri și mai grave decât sunt posibile în prezent. Acest lucru va tinde inevitabil către un ecosistem în care doar o mână de contracte invocatoare dezvoltate de figuri influente vor fi adoptate ca standard pentru dezvoltatorii de portofel. Astfel, se rezumă la un compromis între:
Un alt aspect al acestui punct este funcția de cost asociată cu proiectarea, auditarea și comercializarea unui invocator funcțional și sigur. Echipele mai mici vor fi aproape întotdeauna depășite de organizațiile mai mari – în special pe frontul de marketing – care au deja o reputație consolidată, chiar dacă produsul lor este mai bun.
EIP-3074 consolidează schema de semnătură ECDSA, deoarece este încă considerată mai valabilă decât schema de autorizare introdusă prin intermediul invocatorului. Deși există argumente că rezistența cuantică nu este în prezent o problemă definitivă (și că este mult mai rău în joc într-un viitor în care ECDSA este coruptibil), scopul oarecum nedeclarat al Ethereum este să fie mereu în fața unor astfel de probleme. Sacrificiul potențial al rezistenței cuantice și la cenzură pentru îmbunătățiri marginale în UX ar putea să nu fie cea mai bună alegere în viitorul apropiat.
Un alt punct al argumentului compatibilității înainte este că, în timp ce beneficiile lui 3074 erau încă evaluate, ERC-4337 (care nu necesită nicio modificare a protocolului) are acum o piață grozavă, așa că trebuie să fii compatibil și cu el pentru a evita compartimentarea ecosistemelor. Chiar și cu foaia de parcurs de abstracție a contului nativ, codurile operaționale [AUTH]
și [AUTHCALL]
ar deveni în cele din urmă învechite în EVM, introducând o mare cantitate de datorii tehnice către Ethereum pentru a oferi o cantitate marginală de îmbunătățire a UX.
După trimiterea unui mesaj [AUTH]
și delegarea controlului, se așteaptă ca EOA să evite schema obișnuită de autorizare a cheii private, deoarece trimiterea unei tranzacții „normale” face ca autorizația pe care a delegat-o fiecărui invocator să fie revocată. Astfel, schema ECDSA rămâne strict superioară oricărei alte scheme de autorizare pe care contractele asociate o pot permite, ceea ce înseamnă că o pierdere a cheilor private ar duce la o pierdere totală a activelor contului.
Această propunere a fost inițial o variantă oarecum minimalistă a EIP 3074 și chiar a fost menită să fie o actualizare a acestuia. A fost născut pentru a aborda presupusele ineficiențe ale EIP 3074, în special preocupările legate de incompatibilitatea acestuia cu ecosistemul deja înfloritor 4337 și propunerea de abstracție a contului nativ – RIP 7560.
Abordarea sa este adăugarea unui nou tip de tranzacție compatibil EIP 2718 – [SET_CODE_TX_TYPE]
– care permite unui EOA să se comporte ca un cont inteligent pentru tranzacții specificate. Acest design permite aceleași caracteristici ca EIP 5806 și altele, rămânând în același timp compatibil cu foaia de parcurs de abstractizare a contului nativ și inițiativele existente.
EIP-7702 permite unui EOA să „importe” conținutul codului unui contract printr-o tranzacție conformă cu [SET_CODE_TX_TYPE]
2718 în formatul:
rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, value, data, access_list, authorization_list, signature_y_parity, signature_r, signature_s])
Această sarcină utilă este complet similară cu cea a EIP 5806, cu excepția faptului că introduce o „listă de autorizare”. Această listă este o secvență ordonată de valori de format:
[[chain_id, address, nonce, y_parity, r, s], ...]
unde fiecare tuplu definește valoarea [adresei].
Înainte de a continua, părțile implicate într-un SET_CODE_TX_TYPE
sunt:
Când [autoritatea] semnează un SET_CODE_TX_TYPE
care specifică [adresă], este creat un desemnator de delegare. Acesta este un „program pointer” care face ca toate cererile de recuperare de cod datorate acțiunilor [autorității] în orice moment să fie canalizate către codul observabil al [adresei].
Pentru fiecare tuplu [chain_id, address, nonce, y_parity, r, s]
, fluxul logic al unei tranzacții de tip 7702 este următorul:
authority = ecrecover(keccak(MAGIC || rlp([chain_id, address, nonce])), y_parity, r, s]
SET_CODE_TX_TYPE
a [autorității], se percepe o taxă PER_EMPTY_ACCOUNT_COST
. În cazul în care soldul acestuia este mai mic decât valoarea acestei taxe, operațiunea este abandonată.
Pf! Pentru a lega totul înapoi; acest EIP permite EOA să trimită tranzacții care setează un pointer către codul unui contract, permițându-le să implementeze această logică ca proprie în tranzacțiile ulterioare. În acest fel, este strict mai puternic decât EIP 5806, deoarece permite EOA-urilor să aibă de fapt conținut de cod atâta timp cât doresc (spre deosebire de EIP 5806 care permite pur și simplu EOA-urilor să trimită apeluri de delegat).
Deși s-ar putea argumenta că nu mai este o abstractizare, deoarece EOA preia în mod activ logica pe care dorește să o execute, totuși nu este „proprietarul principal” al logicii menționate. De asemenea, nu conține direct logică, pur și simplu specifică un pointer către logică (pentru a reduce complexitatea de calcul). Deci mergem cu abstractizarea execuției!
În timp ce invariantul require(msg.sender == tx.origin)
este întrerupt pentru a permite auto-sponsorizarea, EIP permite în continuare integrările de relee de tranzacții sponsorizate. Cu toate acestea, avertismentul este că astfel de relee au nevoie de un sistem bazat pe reputație sau miză pentru a preveni atacurile de doliu.
EOA pot indica doar o anumită porțiune a codului contului, astfel încât doar logica acelei porțiuni să fie executabilă în contextul lor.
Acest lucru permite, de asemenea, existența unor subchei care continuă să permită „de-escaladarea privilegiilor”, astfel încât anumite dapps să aibă acces la soldul unui cont doar în condiții specifice. De exemplu, vă puteți imagina o permisiune de a cheltui jetoane ERC-20, dar nu ETH, sau de a cheltui până la 1% din soldul total pe zi sau de a interacționa doar cu o anumită aplicație.
Datorită naturii sale nerestrictive, o tranzacție EIP-7702 ar putea permite unui utilizator să acceseze codul operațional CREATE2 și să-l folosească pentru a implementa codul octet către o adresă fără alți parametri restrictivi, cum ar fi logica pieței de taxe (de exemplu, EIP-1559 și EIP-4844). ). Acest lucru permite ca adresa să fie recuperată și utilizată pe mai multe mașini de stat, cu același bytecode, unde contul său de pe fiecare lanț este apoi responsabil pentru definirea celorlalți parametri variabili de context.
Deși EIP-7702 este încă foarte recent, au existat deja multe prototipuri și teste pentru dependențele și potențialele dezavantaje, dar modelul său minimalist îi garantează multă flexibilitate și, prin urmare, utilitate, în diferite contexte. Cu toate acestea, rupe mult prea multe invariante și nu este imediat compatibil cu înapoi. Unele dintre logica EIP-7702 includ:
CREATE
, CREATE2
și SSTORE
în timp ce execută o tranzacție EIP-7702, permițând creșterea nonce-ului într-un context diferit.codeHash
diferită de zero să fie inițiatoare de tranzacții: EIP-3607 a fost implementat pentru a reduce potențiala consecință a unei „coliziune de adrese” între EOA și CA. O coliziune de adrese are loc atunci când valoarea de 160 de biți a adresei unui EOA este complet echivalentă cu cea a adresei unui CA.
Majoritatea utilizatorilor nu cunosc conținutul propriu-zis al unui cont (sau chiar diferența dintre un cont și o adresă!), așa că permiterea coliziunilor de adrese înseamnă că un EOA s-ar putea masca ca un cont contractual și ar putea atrage fonduri ale utilizatorilor într-un mod lung. puțin pentru a le fura în cele din urmă pe toate. EIP-3607 a abordat acest lucru stipulând că conturile care conțin cod nu ar trebui să își poată cheltui soldul folosind propria logică de autorizare. Cu toate acestea, EIP 7702 întrerupe acest invariant pentru a permite EOA-urilor să rămână autonome chiar și după ce au câștigat o anumită programabilitate.
Semnarea adresei unui cont în loc de conținutul codului acestuia este practic la fel ca schema lui 3074 cu invocatori. Nu oferă garanții stricte în ceea ce privește consistența conținutului codului încrucișat, deoarece o adresă poate prelua un conținut de cod diferit pe lanțuri diferite. Aceasta înseamnă că o adresă al cărei conținut de cod conține aceeași logică pe un lanț ar putea fi de pradă sau complet rău intenționată pe un alt lanț, iar acest lucru ar putea duce la pierderea fondurilor utilizatorilor.
EOA în forma lor actuală sunt foarte limitate, deoarece nu permit utilizatorilor să profite de caracteristicile de programabilitate oferite de EVM. Deși există diverse căi de actualizare a conturilor, așa cum am subliniat la începutul acestui raport, soluția aleasă trebuie să mențină principiile auto-custoderii în siguranță. În plus, upgrade-urile EOA pot avea un impact semnificativ atât asupra experienței utilizatorului, cât și asupra dezvoltatorilor de aplicații, astfel încât toate vocile părților interesate trebuie luate în considerare.
Permiterea EOA-urilor să execute cod în orice mod extinde enorm funcționalitatea conturilor, dar această nouă expresibilitate vine cu riscuri semnificative și posibile abateri. Rezolvarea acestor compromisuri este esențială pentru a oferi un upgrade cu beneficii UX de necontestat pentru utilizatorii Ethereum.
Cultura Ethereum a discuțiilor deschise îl face un teren de testare excelent pentru astfel de inovații, deoarece aproape fiecare implicație a fiecărui design este complet deconstruită de experții în domeniu. Această considerație cuprinzătoare ar trebui să contribuie la atenuarea riscurilor de abuz din partea adversarilor.
EIP-7702 este în prezent modelul pentru mecanismele care încearcă să aducă programabilitate EVM la EOA, fiind marcat ca înlocuitor pentru slotul EIP 3074 în upgrade-ul Pectra. Moștenește designul deschis al mecanismului lui 3074 în timp ce scade foarte mult suprafața/riscurile de atac. De asemenea, permite mult mai mult prin evitarea restricțiilor 3074 la anumite clase de coduri operaționale.
Deși există încă unele îmbunătățiri în ceea ce privește designul propunerii, aceasta a strâns deja multă bunăvoință și sprijin din partea dezvoltatorilor, mai ales că îl sprijină direct Vitalik. În cadrul comunității, există pretenții că această abordare a abstracției conturilor ar putea fi chiar mai bună decât conturile inteligente. Acest comentariu subliniază că această cale necesită mai puține modificări și nu este la fel de complexă și că EOA sunt deja consacrate.
Cu toate acestea, trebuie să ne amintim viitorul reper de securitate al rezistenței cuantice la fiecare nivel al rețelei Ethereum. Această siguranță cuantică este imposibilă cu nucleul modelului de cont curent din cauza utilizării schemelor de semnătură bazate pe ECDSA pentru autorizarea EOA.
Astfel, programabilitatea EOA trebuie văzută ca un pas pe calea către conturile inteligente și nu ca destinație. Supraalimentează EOA și permite o experiență mai bună pentru utilizatori și dezvoltatori, rămânând în același timp compatibil cu obiectivul final de abstracție a contului al conturilor inteligente.
În următorul nostru raport, ne vom scufunda în schemele de migrare EOA pentru a vedea cât de bine se încadrează în foaia de parcurs de abstracție a contului, rămâneți pe fază!
Nota autorului: O versiune a acestui articol a fost publicată pentru prima dată aici .