Oriģinālais teksts: Foobar "Vanity Addresses".
Kompilācija: Nakts putra, DeFi ceļš
160 miljoni ASV dolāru pazuda, un Wintermute zaudēja līdzekļus. Wintermute ir viens no visgudrākajiem tirgus veidošanas fondiem nozarē. Kādu rītu septembrī, kad par Wintermute atbildīgā persona pamodās, viņš atklāja, ka viens no viņu svarīgajiem makiem bija zaudējis 9 skaitļus.līdzekļi. Tātad, kas noveda pie Wintermute nozagšanas? To izraisa slikta nejaušība iedomības adrešu ģeneratorā. Melno cepuru hakeri brutāli piespiež privātās atslēgas un publiskās adreses pāri no nulles, un pēc tam tiek pārsūtīts liels daudzums kriptovalūtu.
Ir arī stāsts par Indexed Finance uzlaušanu, kur viņiem 2021. gada oktobrī tika nozagti 16 miljoni USD, un nozagtie līdzekļi pēc tam tika pārvietoti uz adresēm, kas sākas ar 0xba5ed… . Viņi nezināja, ka iedomības adresi ietekmēja arī sliktā nejaušības ievainojamība, kas skāra Vintermutu, un 2022. gada septembrī visa nauda tika atkal nozagta, aizvedot uz citu uzlauztu maka adresi. Zagļi ir nežēlīgi.
Tātad, ar kādām problēmām saskārās šie talantīgie izstrādātāji, un ko mēs no viņiem varam mācīties?
Kreisajā pusē ir parastā adrese, ko izmanto WETH līgumam. Labajā pusē ir skaista adrese ar 14 nullēm priekšgalā MEV robota optimizācijai. Visizplatītākais iedomības adreses veids ir ar daudzām nullēm sākumā.
Pirmkārt, kas ir iedomības adrese (pazīstama arī kā iedomības adrese)? Iedomības adrese attiecas uz publisku adresi, ko lietotājs apzināti izveido, lai saistītu ar savu maku vai viedo līgumu. Varbūt tā sākas ar 0x0000000, varbūt tā sākas ar 0xdeadbeef, varbūt tā ir kāda cita parasta adrese. To popularitātei ir vairāki iemesli:
1. Gāzes optimizācija: Wintermute ietaupīja 15 000 USD, izmantojot EOA adresi ar vairākām nullēm sākumā. Izklausās muļķīgi, ka daudzi cilvēki piekrīt, bet šādi darbojas EVM, ja jūsu adresē ir daudz nulles, maksa par gāzi var samazināties. Tātad, ja izmantojat viedo līguma adresi ar daudzām nullēm sākumā, lietotāji būs priecīgi, kad ar to mijiedarbosies, jo tas ietaupa naudu.
Ethereum Yellow Paper ir aprakstīts, kā vadošās nulles adreses var nodrošināt lētāku gāzi
2. Līguma zīmols. Vai zināt, ka 1 collas marķiera līgums sākas ar 0x111111111...?
1 collas marķiera līgums
3. Vairāku virkņu atkārtojamība. Manuprāt, tā ir galvenā prioritāte, un kāpēc katram protokolam to izvietošanai ir jāizmanto iedomības adrese. Jūsu lietojumprogramma var darboties 15 dažādās EVM ķēdēs, un tai visur ir viena un tā pati adrese! Vai tas nebūtu vieglāk izstrādātājiem un lietotājiem?
Tātad, kad skaista adrese ir droša?
Ir divu veidu Ethereum adreses: ārējie konti (EOA) un viedie līgumu konti. Ja esat izmantojis maku, piemēram, MetaMask, katra adrese tajā ir EOA, ko izmanto ziņojumu parakstīšanai un darījumu apstrādei. Salīdziniet to ar viedā līguma kontu, piemēram, Uniswap līgumu, ar kuru cilvēki var mijiedarboties, taču tas nevar veikt savas darbības bez iedarbināšanas. Rezumējot, laba numura adreses nav drošas EOA kontiem, taču tās ir drošas viedajiem līgumu kontiem.
Kāpēc tas tā ir? Tālāk mēs to paskaidrosim sīkāk, taču tas ir atkarīgs no tā, kā tiek ģenerēta iedomības adrese. EOA kontos jūs pārskatāt miljoniem privāto atslēgu, līdz atrodat to, kas atbilst skaistai publiskai adresei. Tomēr privātā atslēga kontrolē līdzekļus EOA kontā, tādēļ, ja tiek apdraudēta nejaušība, ko izmantojat privātās atslēgas šķērsošanai, viss jūsu konts tiek izpostīts. No otras puses, lai izveidotu viedā līguma iedomības adreses, ir jāpārvieto tikai publiskās sēklas, kas viedajam līgumam nepiešķir nekādas administratīvās tiesības.
Tāpēc Wintermute neizdodas un OpenSea gūst panākumus — privāto atslēgu ģenerēšana nedrošā atmiņā ar nedrošu programmatūru ir slikti. Taču šādā veidā ģenerēt sabiedrības sēklas ir diezgan jauki! Tāpēc laba EOA adrese ir ceļš uz bankrotu, savukārt gudra līguma laba adrese ir ceļš uz panākumiem.
Kāpēc protokolam ir nepieciešama skaista adrese?
Vienkāršāka dokumentācija! Jūs varat norādīt uz līguma adresi visās ķēdēs;
Lietotājs pārbaudāms! Tāda pati līguma adrese parādīsies tikai tad un tikai tad, ja baita kods tiks saskaņots baits pa baitam;
Izstrādātāji var pārbaudīt! Tā kā identiskas līguma adreses rodas tikai precīzas atbilstības gadījumā, varat tvert sarežģītas nelielas izmaiņas savā izvietošanas skriptā;
Vieglāka integrācija! Citi protokoli var iekodēt jūsu līguma adresi savā vairāku ķēžu kodā, neizmantojot ķēdes ID balstītus if paziņojumus.
PIEZĪME. Mēs grasāmies iedziļināties detalizētā lietošanas pamācībā. Pirmo reizi apvienojot visus elementus, mēs iedziļināmies tehniskajā telpā un vēršamies pie viedo līgumu izstrādātājiem, kuriem ir pieredze viedo līgumu izvietošanā ķēdē. Ja jūs interesē, turpiniet lasīt, bet, ja tas nav domāts jums, neuztraucieties par to, ka sekojat līdzi. Beigās ir papildu tehnisks izaicinājums (ar atlīdzību).
Gudra līguma skaista adrese
Ir veids, kā ģenerēt viedās līguma īstās adreses, kas ir 100% drošas, neatkarīgi no tā, kādu programmatūru izmantojat, nav nozīmes tam, vai iteratīvā tehnoloģija tiek publiski nopludināta. To sauc par “CREATE2 rūpnīcas metodi”, un tā ne tikai nodrošina skaistu adresi, bet arī ir drošs veids, kā nodrošināt, ka jums ir viena un tā pati līguma izvietošanas adrese vairākās ķēdēs. Tas arī ļauj citiem neuzticami izvietot kodu jūsu vārdā bez privātās atslēgas koplietošanas vai nepieņēmumiem.
Pirmkārt, īss pārskats par to, kā izvēlēties viedā līguma adresi. Ir divas izvietošanas iespējas: CREATE un CREATE2. Izvietojot viedo līgumu tieši no EOA, noklusējuma process ir CREATE. Adrese tiek noteikta, sajaucot līguma izveidotāja adresi ar līguma veidotāju nonce. Šis notikums attiecas uz to, cik darījumu no adreses ir nosūtījis, tāpēc jauna seifa izveide sākas ar 0 un tiek palielināta par 1 katru reizi, kad tiek nosūtīts jauns darījums. Šeit ir burvju formula viedā līguma adresei, ko izvieto CREATE:
jaunā_adrese = hash(sūtītājs, nonce)
Mazāk izplatīta, bet interesantāka ir viedā līguma adrese, kas tiek izvietota, izmantojot CREATE2, un šeit ir tās formula:
jaunā_adrese = hash(0xFF, sūtītājs, sāls, baitu kods)
Pirmais šķiet vienkāršāks, vai ne? Tomēr sniegsim piemēru, kur šī vienkāršība var kaitēt salīdzinājumā ar spēcīgāko CREATE2 procesu.
Gaisīgā Alise: Ir problēma ar vairāku ķēdi
Iedomājieties, ka kriptovalūtu izstrādātājs vārdā Alise izveido divus viedos līgumus: Uniswap dakšiņu ar nosaukumu GriddleSwap un NFT projektu ar nosaukumu ph00ts. Tie visi ir nemainīgi neatkarīgi primitīvi, kas nozīmē, ka nav ārēju atkarību vai šķērsķēžu tilta risku. Alise izvieto GriddleSwap uz Ethereum, izmantojot nonce 0, un pēc tam izvieto ph00ts Ethereum, izmantojot nonce 1. Diemžēl Alisei ir īss uzmanības līmenis, un viņa dažas minūtes tika novērsta kriptovalūtā Twitter, pirms izvietoja savu darbu Binance Smart Chain (BSC), otrajā lielākajā viedo līgumu platformā.
Hmm, sajaukts izvietošanas pasūtījums!
Bet pagaidiet, viņa izjauca izvietošanas pasūtījumu un izvietoja ph00ts pirms GriddleSwap. Tā kā viedā līguma adrese ir atkarīga tikai no izveidotāja adreses un izvietotajā blokķēdē, Ethereum gridleswap ir tieši tāda pati kā BSC ph00ts. Lai padarītu situāciju vēl ļaunāku, Ethereum ph00ts adrese ir tāda pati kā BSC GriddleSwap adrese. Domāt, ka galalietotāji būs apmulsuši, ir nepietiekams apgalvojums. Ļaunprātīgi izplatītāji to var izmantot ļaunprātīgi, lai mānītu cilvēkus, liekot tiem domāt, ka līguma darbības ķēdē ir vienādas — tas ir taisnīgs pieņēmums, ņemot vērā to pašu adresi!
Uzmanīgā Alise: Problēmas joprojām būs
Pat ja Alise izvietošanas laikā ir piesardzīga un nekad nesajauc savu nekrietnību secību, pastāv arī citas problēmas. Ja Alise pareizi izvieto Ethereum un BSC, bet pēc tam veic nesaistītu darījumu daudzstūrī, nonce 0 ir izlietots. Viņa nekad nevar tur izvietot GriddleSwap, jo viņas nonce ir palielināta. Tāpēc izvietotāja privātās atslēgas ir jāaizsargā par katru cenu. Ja Alise to nopludinās, ļaunprātīgs diversants var veikt nesaistītus darījumus. Ja Alise to pazaudēs, viņa zaudēs arī spēju atkal izvietot uz šo adresi jaunā ķēdē. Šī ir pastāvīga ievainojamība, kuras privātās atslēgas aizsardzība ir atkarīga no godīgas personas. Ja pat Bitcoin galvenie izstrādātāji to nevar izdarīt, kā mēs pārējie to varam izdarīt?
Risinājums: CREATE2
Par laimi, ir labāks veids, kā iegūt konsekventas adreses visās ķēdēs — tāds, kas nepaļaujas uz slepenām privātajām atslēgām, nepaļaujas uz vienu izvietotāju un ir izturīgs pret izvietotāja kļūdām. Atcerieties formulu viedā līguma adreses atrašanai, kas izvietots, izmantojot CREATE2:
jaunā_adrese = hash(0xFF, sūtītājs, sāls, baitu kods)
Pirmais parametrs 0xFF ir nemainīga vērtība, kuru var ignorēt. Otro parametru (sūtītāja adresi) var padarīt konsekventu, lielākajā daļā EVM ķēžu atlasot z0age CREATE2Factory izvietošanu 0x0000000000FFe8B47B3e2130213B802212439497. Trešais parametrs ir lietotāja izvēlēts sāls, ko mēs varam izmantot, lai atrastu labu adresi un pēc tam saglabātu to nemainīgu ķēdē. Ceturtais ir līguma baitkods, kas kalpo kā noderīga saprāta pārbaude, lai pārliecinātos, ka ķēdē izvietojam tieši tādu pašu funkcionalitāti. Visi četri parametri var palikt nemainīgi neatkarīgi no tā, ko dara kāds atsevišķs izvietotājs.
Kāpēc tas ir labāks, izvietotāja izvēlēto sāli var padarīt publiski pieejamu, taču jums nav nekādas kontroles pār līguma līdzekļiem vai funkcionalitāti. Tā kā tas nesaista nekādu slepenu informāciju, ikviens var izvietot līgumu jaunajā ķēdē, neatklājot vai nekopīgojot privāto atslēgu. Baitkoda parametrs arī nodrošina, ka šiem jaunajiem bezatļaujas izvietojumiem būs viena un tā pati adrese tad un tikai tad, ja baitkods ir vienāds. Tāpēc galalietotāji saņem stingrākas garantijas, neveicot detalizētas koda atšķirības.
Lai iegūtu padziļinātu pārskatu, skatiet OpenZeppelin populārzinātnisko rakstu.
Izveidojiet savu skaisto adresi
Vai domājat, ka darba pierādījums (PoW) būs bezjēdzīgs pēc Ethereum apvienošanās? Padomā vēlreiz! Tās pašas GPU iespējas, kas palīdz atrast jaucējattēlus ar lielu skaitu sākuma nullēm Bitcoin blokiem, lieliski palīdz arī atrast jauktās priekšattēlus ar lielu skaitu sākuma nulles EVM viedajiem līgumiem. z0age no OpenSea (pateicoties viņa paskaidrojumam par šo ziņu) atrada vienkāršu iestatījumu, lai izveidotu savu iedomības adresi.
1. Izmantojiet vast.ai, lai palaistu GPU piemēru, kas mēģina aptuveni 2 miljardus reižu sekundē un maksā apmēram 25 centus stundā.
Attēls: nvidia / opencl
GPU: 1x RTX 3090
Nepieciešamā vieta diskā: 1,83 GB
2. SSH un instalējiet rūsu + create2crunch
sudo apt install build-essential -y; curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y; avots "$HOME/.cargo/env"; git klons https://github.com/0age/create2crunch && cd create2crunch; sed -i 's/0x4/0x40/g' src/lib.rs
3. Palaidiet sēklu meklēšanu. Vides mainīgajiem INIT_CODE_HASH ir līguma izveides koda keccak256. Lietuves testa parauga izdruka atrodama šeit – pirms liela apjoma skaitļošanas resursu izmantošanas noteikti pārbaudiet to! LEADING ir jābūt vēlamajam sākuma nulles baitu skaitam, un TOTAL ir jābūt kopējam nulles baitu skaitam, ko vēlaties norādīt līguma adresē.
eksportēt FACTORY="0x0000000000ffe8b47b3e2130213b802212439497"; eksportēt CALLER = "0x0000000000000000000000000000000000000000"; eksportēt INIT_CODE_HASH="0xabc...def"; eksports LADING=5; eksportēt KOPĀ=7; kravas nobraukums -- laidiens $FACTORY $CALLER $INIT_CODE_HASH 0 $LEADING $TOTAL
Kad z0age pirmo reizi izlaida savu repo, tas spēja veikt 1,9 miljardus mēģinājumu sekundē ar iepriekšminēto vastAI aparatūru. Kopš tā laika vektorizācija dažos OpenGL kodolos ir kļuvusi traka, un esmu novērojis 2,15 miljardus mēģinājumu sekundē. Tas nozīmē, ka adreses ar 5 sākuma nulles baitiem atrašana aizņems 256^5/(2150000000 * 60) ~= 8 minūtes, bet adreses ar 6 sākuma nulles baitiem atrašana aizņems 256^6/(2150000000 * 3600) ~ = 36 stundas. 7 sākuma nulles baitu adrese aizņem 256^7/(2150000000 * 86400) ~= 387 dienas. Ņemiet vērā, ka viens baits ir vienāds ar divām heksadecimālajām rakstzīmēm, tāpēc 5 baitu adresē būs 10 nulles. Protams, šo meklēšanu var pilnībā paralēli veikt, un faktiskā panākumu iespējamība laika gaitā sekos Puasona sadalījumam.
Izvietojiet CREATE2 rūpnīcu
Uzmanīgi lasītāji, iespējams, ir pamanījuši, ka CREATE2 rūpnīca jau pastāv visās ķēdēs ar 0x0000000000FFe8B47B3e2130213B802212439497. Tā ir nedaudz vistas un olu problēma. Kā konsekventa adreses izvietošana ir atkarīga no konsekventas adreses izvietošanas?
Kad es pirmo reizi uzzināju par šo pieeju, es domāju, ka tā ir tikai privāta atslēga, kuru tur kāds gudrāks par mani (iepriekš minētais "vērīgās Alises" scenārijs). Bet patiesībā tas ir daudz izturīgāks par to, ka ENS dibinātāja Nika Džonsona "bez atslēgas transakciju" pieeja izmanto faktu, ka jūs varat atgūt publisko adresi no jebkura darījuma paraksta, nezinot atbilstošo privāto atslēgu, kas to parakstīja. Tāpēc ir iespējams izveidot transakciju ("izvietot create2 rūpnīcu") un pēc tam izgudrot tam viltotu parakstu, piemēram, tādu, kas sastāv tikai no 2. Šī viltotā paraksta privātā atslēga pastāv, taču neviens nezina, kas tā ir. Bet mēs varam atgūt publisko adresi, kas atbilst "bez atslēgas parakstam", nosūtīt tai kādu ETH un pēc tam iesniegt parakstīto darījumu mempool. Neskatoties uz šīs metodes neskaidrību, tas ir derīgs darījums un faktiski vienīgais derīgais darījums, ko var nosūtīt no šīs publiskās adreses.
Rezultāts: Ikviens var izvietot rūpnīcu jaunā ķēdē bez jebkādas patentētas informācijas, vienlaikus neļaujot ļaunprātīgiem dalībniekiem nodarīt kaitējumu. Viena mērķa EOA izveide, kas var izvietot tikai vienu darījumu, ir ļoti gudrs paņēmiens.
Konkrētas adreses un līgumi, kas izveidoti bezatslēgas darījumu laikā
To var paveikt ar trim vienkāršām komandām "kalt cast". Baitkods ir pārāk garš, lai kopētu šeit, taču varat izpildīt norādījumus vietnē https://github.com/ProjectOpenSea/seaport/blob/main/docs/Deployment.md bez atļaujas jebkurā jūsu izvēlētā ķēdē. Viegli izvietojiet CREATE2 Factory!
Protams, ja tas jau ir izvietots, nav nepieciešams to izvietot vēlreiz.
Sānu piezīme: EIP-155 prasības ir briesmīgas
Īss mēģinājums atbalstīt manus L1 pārvaldības piedzīvojumus. Nekautrējieties izlaist. EIP-155 ir Vitalik 2016. gadā izvirzītais priekšlikums, kas ievieš "ķēdes ID" jēdzienu, lai novērstu atkārtotu uzbrukumu uzbrukumus. Katrai ķēdei ir savs unikāls identifikators — 1 Ethereum, 56 BSC un 137 Polygon — tas tiks iekļauts parakstītajos darījumos, lai novērstu atkārtošanas uzbrukumus, ko ātri pieņēma Ethereum, un visas pārējās EVM ķēdes ir ievērojušas šo priekšlikumu. Tas ir lieliski, taču problēma rodas, kad tiek atlasītas dažas ķēdes, piemēram, Evmos, kas nesen nolēma nepārprotami aizliegt darījumus pirms EIP-155 , kas dīvainu iemeslu dēļ novērš darbības kļūdu, kad Optimism nosūtīja 20 miljonus OP Tokenu multisig (jā, viņi atkal) adrese, ka Wintermute neeksistē, apgalvo, ka tai pieder, bet nekad netika inicializēta. Tomēr, atspējojot darījumus pirms 155 gadiem, ievērojami tiktu pārtraukta vesela starpķēžu izvietojumu kopa, piemēram, CREATE2 rūpnīca un vadošie projekti, piemēram, Seaport. Šie pārvaldības priekšlikumi ir nekavējoties jāatceļ, un šādai aizsardzības informācijai ir jānāk no maka, nevis no vienprātības slāņa. Ja nākotne ir vairāku ķēžu izmantošana, tad šie nevajadzīgie ierobežojumi būs milzīgs šķērslis labāko projektu izvietošanai jūsu blokķēdē.
Jautras lietas: prēmiju izvietošana
Šodien https://delegate.cash ir izvietots 7 dažādās EVM ķēdēs (Ethereum, Polygon, Optimism, Celo, Avalanche, Fantom un Arbitrum) un 7 testtīklos, kas atbilst šīm ķēdēm. Līguma adrese visiem tiem ir vienāda: 0x00000000000076A84feF008CDAbe6409d2FE638B.
Vai ar to pietiek? Nē, mums vajag vairāk ķēžu. Tā kā delegatecash ir neatkarīgs primitīvs ar nulles atkarību, tas nozīmē, ka vairāku ķēžu risks faktiski ir nulle. Tas ir tīrs labums! Tāpēc pirmajiem 5 personām, kas izvietos un verificēs delegatecash viedo līgumu jaunajā ķēdē un atbilstošajā testtīklā, es piešķiršu 100 USDC bonusu!
Šeit ir jāizmanto izvietošanas skripts no atvērtā pirmkoda repozitorija. Lai to izdarītu, var būt nepieciešams izvietot CREATE2 Factory, ja tā neeksistē, un neaizmirstiet par Etherscan verifikāciju! Laimīgu izvietošanu un izbaudiet pieredzes mācīšanos!
