1 dienoraštisNewsDevelopersEnterpriseBlockchain ExplainedEvents and ConferencesPressNaujienlaiškiai

Contents

Užsiprenumeruokite mūsų naujienlaiškį.

Elektroninio pašto adresas

Mes gerbiame jūsų privatumą

Pagrindinis dienoraštisBlokavimo grandinės plėtra

Patikimumo geriausia pažangių sutarčių saugumo praktika

Nuo stebėjimo iki laiko žymos, pateikiame keletą patarimų, kaip užtikrinti, kad jūsų „Ethereum“ išmaniosios sutartys būtų sustiprintos. pateikė ConsenSys 2020 m. rugpjūčio 21 d. Paskelbta 2020 m. rugpjūčio 21 d

solidumo geriausios praktikos herojus

„ConsenSys Diligence“, mūsų „blockchain“ saugumo ekspertų komanda.

Jei į širdį paėmėte išmaniojo sutarčių saugumo mąstyseną ir susidūrėte su EVM savitumu, atėjo laikas apsvarstyti keletą saugumo modelių, būdingų „Solidity“ programavimo kalbai. Šiame apibendrinime daugiausia dėmesio skirsime saugioms „Solidity“ plėtros rekomendacijoms, kurios taip pat gali būti naudingos kuriant pažangias sutartis kitomis kalbomis.. 

Gerai, pašokime.

Tinkamai naudokite „assert“ (), reikalauti (), grįžkite ()

Patogumo funkcijos tvirtinti ir reikalauti gali būti naudojamas patikrinti sąlygas ir išmesti išimtį, jei sąlyga neįvykdyta.

 tvirtinti Funkcija turėtų būti naudojama tik norint patikrinti vidines klaidas ir patikrinti invariantus.

 reikalauti funkcija turėtų būti naudojama siekiant užtikrinti, kad būtų laikomasi galiojančių sąlygų, pvz., įvesties ar sutarties būsenos kintamųjų, arba patvirtinti grąžinimo vertes iš kvietimų į išorės sutartis. 

Vadovaujantis šia paradigma, formalios analizės priemonės leidžia patikrinti, ar negalima pasiekti netinkamo kodo: tai reiškia, kad kode nėra pažeidžiami invariantai ir kad kodas yra oficialiai patikrintas.

pragmos tvirtumas ^ 0,5,0; sutartis Dalyvis {funkcija sendHalf (mokėtinas adresas addr) viešai mokėtinos grąžos (uint likutis) {reikalauti (msg.value% 2 == 0, "Reikalinga net vertė."); // Require () gali turėti pasirinktinę pranešimų eilutę uint balanceBeforeTransfer = address (this) .balance; („Bool“ sėkmė) = addr.call.value (msg.value / 2) (""); reikalauti (sėkmės); // Kadangi mes sugrįžome, jei nepavyko pervesti, neturėtume // turėti galimybės vis tiek turėti pusės pinigų. tvirtinti (adresas (šis). balansas == balanceBeforeTransfer – msg.value / 2); // naudojamas vidinėms klaidoms tikrinti grąžinimo adresą (tai) .balance; }} Kodo kalba: „JavaScript“ („javascript“)

Matyti SWC-110 & SWC-123

Modifikatorius naudokite tik patikrinimams

Kodas modifikatoriaus viduje paprastai vykdomas prieš funkcijos turinį, todėl bet kokie būsenos pokyčiai ar išoriniai skambučiai pažeis Patikrinimai-poveikis-sąveika raštas. Be to, šių teiginių kūrėjas taip pat gali nepastebėti, nes modifikatoriaus kodas gali būti toli nuo funkcijos deklaracijos. Pavyzdžiui, išorinis modifikatoriaus skambutis gali sukelti pakartotinio užpuolimo ataką:

sutarties registras {adreso savininkas; funkcija isVoter (address _addr) išorinė grąža (Bool) {// Code}} sutartis Rinkimai {Registry register; modifikatorius isEligible (adresas _addr) {reikalauti (register.isVoter (_addr)); _; } funkcija balsas () yra tinkama (msg.sender) public {// Code}} kodo kalba: „JavaScript“ (javascript)

Tokiu atveju registro sutartis gali atlikti pakartotinę ataką paskambinusi ElV.vote () viduje isVoter ().

Pastaba: Naudokite modifikatoriai Jei norite pakeisti pasikartojančius kelių funkcijų patikrinimus, pvz., „isOwner“ (), kitu atveju naudokite funkciją „reikėti“ arba grąžinkite ją atgal. Tai leidžia jūsų išmaniojo sutarties kodą lengviau įskaityti ir lengviau patikrinti.

Saugokitės apvalinimo su sveikojo skaičiaus dalijimu

Visi sveikųjų skaičių dalijimai suapvalinami iki artimiausio sveiko skaičiaus. Jei jums reikia tikslumo, apsvarstykite galimybę naudoti daugiklį arba saugokite tiek skaitiklį, tiek vardiklį.

(Ateityje „Solidity“ turės fiksuoto taško tipo, kuris tai palengvins.)

// blogas uint x = 5/2; // Rezultatas yra 2, visi sveiki skaičiai padalijami į apačią iki artimiausio sveiko skaičiaus Kodo kalba: „JavaScript“ („javascript“)

Naudojant daugiklį išvengiama apvalinimo žemyn, į šį daugiklį reikia atsižvelgti ateityje dirbant su x:

// geras uint daugiklis = 10; uint x = (5 * daugiklis) / 2; Kodo kalba: „JavaScript“ (javascript)

Skaitiklio ir vardiklio laikymas reiškia, kad galite apskaičiuoti skaitiklio / vardiklio grandinės rezultatą:

// geras uint skaitiklis = 5; uint vardiklis = 2; Kodo kalba: „JavaScript“ (javascript)

Žinokite apie kompromisus tarp abstrakčios sutartys ir sąsajos

Tiek sąsajos, tiek abstrakčios sutartys suteikia galimybę pritaikyti ir pakartotinai naudoti pažangias sutartis. Sąsajos, kurios buvo pristatytos „Solidity 0.4.11“, yra panašios į abstrakčias sutartis, tačiau jose negali būti įgyvendintos jokios funkcijos. Sąsajos taip pat turi tam tikrų apribojimų, pavyzdžiui, negalėjimas pasiekti saugyklos ar paveldėti iš kitų sąsajų, o tai abstrakčias sutartis paprastai daro praktiškesnes. Nors sąsajos yra tikrai naudingos kuriant sutartis prieš jas įgyvendinant. Be to, svarbu nepamiršti, kad jei sutartis paveldima iš abstrakčios sutarties, ji turi įgyvendinti visas neįgyvendintas funkcijas per svarbiau, kitaip ji bus ir abstrakti.

Atsarginės funkcijos

Palikite atsargines funkcijas paprastas

Atsarginės funkcijos yra iškviečiami, kai sutarčiai siunčiamas pranešimas be jokių argumentų (arba kai nesutampa nė viena funkcija) ir prieiga prie 2300 dujų yra prieinama tik tada, kai paskambinama iš .send () arba .transfer (). Jei norite gauti eterį iš .send () arba .transfer (), daugiausiai galite atlikti atsarginę funkciją užregistruodami įvykį. Jei reikia apskaičiuoti daugiau dujų, naudokite tinkamą funkciją.

// bloga funkcija () mokėtinas {likučiai [msg.sender] + = msg.value; } // geros funkcijos indėlis () mokėtinas išorinis {likučiai [msg.sender] + = msg.value; } funkcija () mokėtina {reikalauti (msg.data.length == 0); skleisti „LogDepositReceived“ (pranešimo siuntėjas); } Kodo kalba: „JavaScript“ (javascript)

Patikrinkite duomenų trukmę atsarginėse funkcijose

Kadangi atsarginės funkcijos yra reikalingas ne tik paprastam eterio perdavimui (be duomenų), bet ir tada, kai neatitinka jokios kitos funkcijos, turėtumėte patikrinti, ar duomenys tušti, jei atsarginę funkciją ketinama naudoti tik gaunamo eterio registravimui. Priešingu atveju skambinantieji nepastebės, jei neteisingai naudojama jūsų sutartis ir iškviečiamos neegzistuojančios funkcijos.

// bloga funkcija () mokama {emit LogDepositReceived (msg.sender); } // gera funkcija () mokama {reikalauti (msg.data.length == 0); skleisti „LogDepositReceived“ (pranešimo siuntėjas); } Kodo kalba: „JavaScript“ (javascript)

Aiškiai pažymėkite mokamas funkcijas ir būsenos kintamuosius

Pradedant nuo „Solidity 0.4.0“, kiekviena funkcija, gaunanti eterį, turi naudoti mokėtiną modifikatorių, kitaip, jei operacija turi msg.value > 0 grįš (išskyrus priverstinius).

Pastaba: Tai, kas gali būti neaišku: mokamas modifikatorius taikomas tik skambučiams iš išorinių sutarčių. Jei toje pačioje sutartyje iškviečiu nemokamą funkciją mokėtinoje funkcijoje, nemokama funkcija nepavyks, nors vis tiek nustatyta msg.value.

Aiškiai pažymėkite funkcijų ir būsenos kintamųjų matomumą

Aiškiai pažymėkite funkcijų ir būsenos kintamųjų matomumą. Funkcijos gali būti nurodytos kaip išorinės, viešos, vidinės ar privačios. Prašau suprasti jų skirtumus, pavyzdžiui, gali pakakti išorinių, o ne viešų. Būsenos kintamiesiems išorinis negalimas. Jei matomumas bus aiškiai pažymėtas, bus lengviau sugauti neteisingas prielaidas apie tai, kas gali iškviesti funkciją ar pasiekti kintamąjį.

  • Išorinės funkcijos yra sutarties sąsajos dalis. Išorinės funkcijos f negalima vadinti viduje (t. Y. F () neveikia, bet tai.f () veikia). Išorinės funkcijos kartais būna efektyvesnės, kai gauna didelius duomenų masyvus.
  • Viešosios funkcijos yra sutarties sąsajos dalis ir gali būti iškviečiamos viduje arba žinutėmis. Viešosios būsenos kintamiesiems sukuriama automatinė getter funkcija (žr. Toliau).
  • Prie vidinių funkcijų ir būsenos kintamųjų galima naudotis tik viduje, to nenaudojant.
  • Privačios funkcijos ir valstybės kintamieji matomi tik sutartyje, kurioje jie yra apibrėžti, o ne išvestinėse sutartyse. Pastaba: Viskas, kas yra sutartyje, yra matoma visiems stebėtojams, nepriklausantiems „blockchain“, net privatiems kintamiesiems.

// blogas uint x; // numatytasis vidinis būsenos kintamiesiems, tačiau tai turėtų būti aiški funkcija buy () {// numatytasis yra viešas // viešasis kodas} // good uint private y; function buy () external {// tik išoriškai iškviečiamas arba naudojant this.buy ()} function utility () public {// iškviečiamas išoriškai, taip pat ir viduje: norint pakeisti šį kodą reikia galvoti apie abu atvejus. } function internalAction () internal {// internal code} Kodo kalba: PHP (php)

Matyti SWC-100 ir SWC-108

Užrakinkite pragmas konkrečioje kompiliatoriaus versijoje

Sutartys turėtų būti diegiamos naudojant tą pačią kompiliatoriaus versiją ir žymes, su kuriomis jie buvo išbandyti labiausiai. Pragmos užrakinimas padeda užtikrinti, kad sutartys nebūtų netyčia diegiamos naudojant, pavyzdžiui, naujausią kompiliatorių, kuriam gali kilti didesnė neatrastų klaidų rizika. Sutartis taip pat gali naudoti kiti, o pragma nurodo originalių autorių numatytą kompiliatoriaus versiją.

// blogas pragmos tvirtumas ^ 0,4.4; // geras pragmos tvirtumas 0.4.4; Kodo kalba: „JavaScript“ (javascript)

Pastaba: plūduriuojanti pragmos versija (ty. ^ 0.4.25) sukurs puikų režimą su 0.4.26-nightly.2018.9.25, tačiau naktiniai kūriniai niekada neturėtų būti naudojami gaminant kodą..

Įspėjimas: „Pragma“ teiginiams gali būti suteikta galimybė sklandyti, kai sutartį ketina vartoti kiti kūrėjai, kaip tai yra bibliotekos ar „EthPM“ paketo sutarčių atveju. Priešingu atveju kūrėjui reikės rankiniu būdu atnaujinti pragmą, kad būtų galima kompiliuoti vietoje.

Matyti SWC-103

Naudokite įvykius sutarties veiklai stebėti

Gali būti naudinga turėti būdą stebėti sutarties veiklą po jos panaudojimo. Vienas iš būdų tai pasiekti yra pažvelgti į visus sutarties sandorius, tačiau to gali nepakakti, nes pranešimų skambučiai tarp sutarčių nėra įrašomi į blokų grandinę. Be to, jis rodo tik įvesties parametrus, o ne faktinius būsenos pakeitimus. Taip pat įvykiai gali būti naudojami suaktyvinti funkcijas vartotojo sąsajoje.

sutartis Labdara {kartografija (adresas => uint) likučiai; funkcija donate () mokėtinas public {balances [msg.sender] + = msg.value; }} sutartis Žaidimas {funkcija buyCoins () mokėtinas viešas {// 5% skiriama labdarai charity.donate.value (msg.value / 20) (); }} Kodo kalba: „JavaScript“ (javascript)

Čia žaidimo sutartis paskambins į „Charity.donate“ (). Ši operacija nebus rodoma „Charity“ išorinių operacijų sąraše, bet bus matoma tik vidinėse operacijose.

Renginys yra patogus būdas užregistruoti tai, kas nutiko sutartyje. Išskleisti įvykiai lieka blokų grandinėje kartu su kitais sutarties duomenimis ir jie yra prieinami būsimam auditui. Štai patobulintas aukščiau pateiktas pavyzdys, kai renginiai naudojami labdaros aukų istorijai pateikti.

sutartis Labdara {// apibrėžti įvykio įvykį „LogDonate“ (uint _amount); kartografavimas (adresas => uint) likučiai; funkcija donate () mokėtinas public {balances [msg.sender] + = msg.value; // emit event emit LogDonate (msg.value); }} sutartis Žaidimas {funkcija buyCoins () mokėtinas viešas {// 5% skiriama labdarai charity.donate.value (msg.value / 20) (); }} Kodo kalba: „JavaScript“ (javascript)

Čia visi sandoriai, kurie tiesiogiai vykdomi pagal labdaros sutartį, bus rodomi tos sutarties įvykių sąraše kartu su paaukota pinigų suma..

Pastaba: teikite pirmenybę naujesniems „Solidity“ konstruktams. Duokite pirmenybę tokioms konstrukcijoms / slapyvardžiams, kaip savęs sunaikinimas (prieš savižudybę) ir keccak256 (virš ša3). Šablonus, pavyzdžiui, reikalauti (msg.sender.send (1 eteris)), taip pat galima supaprastinti naudojant transfer (), kaip ir msg.sender.transfer (1 eteris). Patikrinkite „Solidity Change“ žurnalas daugiau panašių pokyčių.

Atminkite, kad „įmontuotieji“ gali būti šešėliai

Šiuo metu tai įmanoma šešėlis įmontuoti „Solidity“ pasauliai. Tai leidžia sutartims nepaisyti įtaisytų funkcijų, tokių kaip „msg“ ir „grįžti“ (), funkcionalumo. Nors tai yra skirtas, tai gali klaidinti sutarties vartotojus dėl tikro sutarties elgesio.

sutartis PretendingToRevert {funkcija revert () vidinė konstanta {}} sutartis ExampleContract yra PretendingToRevert {funkcija somethingBad () public {revert (); }}

Sutarties vartotojai (ir auditoriai) turėtų žinoti visą pažangių sutarčių šaltinio kodą visose programose, kurias ketina naudoti.

Venkite naudoti tx.origin

Niekada nenaudokite „tx.origin“ autorizuodami, kitoje sutartyje gali būti metodas, kuris paskambins jūsų sutarčiai (kur, pavyzdžiui, vartotojas turi šiek tiek lėšų), o jūsų sutartis leis tą operaciją, nes jūsų adresas yra „tx.origin“..

sutartis „MyContract“ {adreso savininkas; funkcija MyContract () public {owner = msg.sender; } funkcija sendTo (adreso imtuvas, uint suma) public {reikalauti (tx.origin == savininkas); („Bool“ sėkmė) = imtuvas. skambučio vertė (suma) {""); reikalauti (sėkmės); }} sutartis „AttackingContract“ {MyContract myContract; adreso užpuolikas; funkcija AttackingContract (adresas myContractAddress) public {myContract = MyContract (myContractAddress); užpuolikas = pranešimo siuntėjas; } function () public {myContract.sendTo (užpuolikas, msg.sender.balance); }} Kodo kalba: „JavaScript“ („javascript“)

Turėtumėte naudoti autorizaciją „msg.sender“ (jei jūsų sutartis skambina kita sutartis, „msg.sender“ bus sutarties adresas, o ne vartotojo, kuris paskambino į sutartį, adresas).

Daugiau apie tai galite perskaityti čia: Solidumo dokumentai

Įspėjimas: Be leidimo suteikimo, yra tikimybė, kad tx.origin ateityje bus pašalinta iš „Ethereum“ protokolo, todėl kodas, kuris naudoja „tx.origin“, nebus suderinamas su būsimais leidimais. Vitalikas: „NEGALIMA manyti, kad tx.origin ir toliau bus naudingas ar reikšmingas.“

Taip pat verta paminėti, kad naudodami „tx.origin“ jūs ribojate sutarčių sąveiką, nes sutartis, kurioje naudojama „tx.origin“, negali būti naudojama kitoje sutartyje, nes sutartis negali būti „tx.origin“..

Matyti SWC-115

Laiko žymės priklausomybė

Yra trys pagrindiniai aspektai, kai reikia naudoti laiko žymą vykdant kritinę sutarties funkciją, ypač kai veiksmai susiję su lėšų pervedimu.

Manipuliavimas laiko žyma

Turėkite omenyje, kad kalnakasis gali manipuliuoti bloko laiko žyma. Apsvarstykite tai sutartis:

uint256 pastovi privati ​​druska = block.timestamp; funkcija random (uint Max) pastovi privati ​​grąža (uint256 rezultatas) {// gauti geriausią sėklą atsitiktinumui uint256 x = druska * 100 / Max; uint256 y = druska * blokuoti. skaičius / (druska% 5); uint256 sėkla = blokuoti.numeris / 3 + (druskos% 300) + Paskutinis_mokėjimas + y; uint256 h = uint256 (block.blockhash (sėkla)); grįžti uint256 ((h / x))% Max + 1; // atsitiktinis skaičius nuo 1 iki Maks.} Kodo kalba: PHP (php)

Kai sutartis naudoja laiko žymą atsitiktiniam skaičiui susidėti, kalnakasis iš tikrųjų gali paskelbti laiko žymą per 15 sekundžių nuo bloko patvirtinimo, kad faktiškai leistų kalnakasiui iš anksto apskaičiuoti pasirinkimą, palankesnį jų šansams loterijoje. Laiko antspaudai nėra atsitiktiniai ir neturėtų būti naudojami šiame kontekste.

15 sekundžių taisyklė

The Geltona knyga (Ethereum referencinė specifikacija) nenurodo apribojimo, kiek blokų gali nutolti laike, bet jame nurodoma kad kiekviena laiko žymė turėtų būti didesnė už jos tėvų laiko žymę. Populiarus „Ethereum“ protokolo įgyvendinimas Getas ir Paritetas abu atmeta blokus su laiko žyma daugiau nei 15 sekundžių ateityje. Todėl vertinant laiko žymos naudojimą yra gera taisyklė: jei nuo laiko priklausančio įvykio skalė gali skirtis 15 sekundžių ir išlaikyti vientisumą, saugu naudoti „block.timestamp“..

Venkite naudoti laiko žymę „block.number“

Įvertinti laiko delta galima naudojant ypatybę block.number ir vidutinis blokavimo laikas, tačiau tai nėra ateities įrodymas, nes blokų laikai gali keistis (pvz., šakių pertvarkymai ir sunkumų bomba). Parduodant per 15 sekundžių taisyklę galima pasiekti patikimesnį laiko įvertinimą.

Matyti SWC-116

Daugelio paveldėjimo atsargumas

Naudojant „Solidity“ daugkartinį paveldėjimą, svarbu suprasti, kaip kompiliatorius sudaro paveldėjimo grafiką.

sutartis Galutinis {uint public a; funkcija Galutinė (uint f) public {a = f; }} sutartis B yra galutinis {viešasis mokestis; funkcija B (uint f) Galutinis (f) public {} funkcija setFee () public {mokestis = 3; }} sutartis C yra galutinis {viešasis mokestis; funkcija C (uint f) Galutinis (f) public {} function setFee () public {mokestis = 5; }} sutartis A yra B, C {funkcija A () public B (3) C (5) {setFee (); }} Kodo kalba: PHP (php)

Kai sudaroma sutartis, kompiliatorius suskaidys paveldėjimą iš dešinės į kairę (po to, kai raktinis žodis yra tėvai, jie pateikiami nuo labiausiai panašių iki labiausiai išvestų). Štai A sutarties linearizacija:

Galutinis <- B <- C <- A

Linearizacijos pasekmė bus 5 mokesčio vertė, nes C yra labiausiai išvestinė sutartis. Tai gali atrodyti akivaizdu, tačiau įsivaizduokite scenarijus, kai C sugeba uždengti svarbiausias funkcijas, pertvarkyti logines išlygas ir priversti kūrėją parašyti išnaudojamas sutartis. Statinė analizė šiuo metu nekelia problemų dėl užtemdytų funkcijų, todėl ją reikia tikrinti rankiniu būdu.

Norėdami prisidėti, „Solidity’s Github“ turi a projektą sprendžiant visus su paveldėjimu susijusius klausimus.

Matyti SWC-125

Tipo saugumui vietoj adreso naudoti sąsajos tipą

Kai funkcija argumentu laiko sutarties adresą, geriau perduoti sąsają ar sutarties tipą, o ne neapdorotą adresą. Jei funkcija iškviečiama kitur šaltinio kode, kompiliatorius suteiks papildomas tipo saugos garantijas.

Čia matome dvi alternatyvas:

sutartis „Validator“ {funkcija patvirtina (uint) išorines grąžas (talpa); } contract TypeSafeAuction {// gera funkcija validateBet („Validator _validator“, „uint _value“) vidinis grąžinimas („Bool“) {„Bool valid“ = „_validator.validate“ („_value“); grąža galioja; }} contract TypeUnsafeAuction {// bloga funkcija validateBet (adresas _addr, uint _value) vidinis grąžinimas (talpa) {Validator validator = Validator (_addr); Bool valid = validator.validate (_value); grąža galioja; }} Kodo kalba: „JavaScript“ (javascript)

Aukščiau nurodytos „TypeSafeAuction“ sutarties naudą galima pamatyti iš šio pavyzdžio. Jei „validateBet“ () iškviečiamas su adreso argumentu arba kitokiu nei „Validator“ sutarties tipu, kompiliatorius išmes šią klaidą:

sutarties „NonValidator“ {} sutarties aukcionas yra „TypeSafeAuction“ {NonValidator nonValidator; function bet (uint _value) {bool valid = validateBet (nonValidator, _value); // TypeError: netinkamas argumento tipas funkcijos iškvietime. // Neteisingas numanomas konvertavimas iš sutarties „NonValidator“ // prašoma sutarties „Validator“. }} Kodo kalba: „JavaScript“ (javascript)

Venkite ekstoduoti dydį, kad patikrintumėte išorinių sąskaitų turinį

Šis modifikatorius (arba panašus patikrinimas) dažnai naudojamas norint patikrinti, ar skambinta iš išorinės sąskaitos (EOA), ar iš sutarties sąskaitos:

// blogas modifikatorius isNotContract (adresas _a) {uint size; surinkimas {dydis: = extcodesize (_a)} reikalauti (dydis == 0); _; } Kodo kalba: „JavaScript“ (javascript)

Idėja yra paprasta: jei adrese yra kodas, tai ne EOA, o sutarties sąskaita. Tačiau, sutartyje nėra šaltinio kodo, kurį būtų galima statyti. Tai reiškia, kad kol konstruktorius veikia, jis gali skambinti į kitas sutartis, tačiau ekstkoduodamas savo adresą, jis grąžina nulį. Žemiau pateikiamas minimalus pavyzdys, parodantis, kaip galima apeiti šį patikrinimą:

sutartis tikFOREOA {uint public flag; // blogas modifikatorius isNotContract (adresas _a) {uint len; surinkimas {len: = extcodesize (_a)} reikalauti (len == 0); _; } funkcija setFlag (uint i) public isNotContract (msg.sender) {flag = i; }} sutartis „FakeEOA“ {konstruktorius (adresas _a) public {OnlyForEOA c = OnlyForEOA (_a); c.setFlag (1); }} Kodo kalba: „JavaScript“ (javascript)

Kadangi sutarties adresus galima iš anksto apskaičiuoti, šis patikrinimas taip pat gali nepavykti, jei jis patikrina adresą, kuris n laukelyje yra tuščias, bet kuriame sutartyje yra dislokuota didesnio nei n bloko sutartis..

Įspėjimas: Šis klausimas yra niuansuotas. Jei jūsų tikslas yra užkirsti kelią kitoms sutartims paskambinti jūsų sutarčiai, tikriausiai pakanka extcodesize patikrinimo. Alternatyvus būdas yra patikrinti (tx.origin == msg.sender) vertę, nors tai taip pat turi trūkumų.

Gali būti ir kitų situacijų, kai ekstoduojamo tikrinimo funkcija atitinka jūsų tikslą. Čia jų visų apibūdinimas nepatenka į taikymo sritį. Supraskite pagrindinį EVM elgesį ir naudokitės savo sprendimu.

Ar jūsų „Blockchain“ kodas yra saugus?

Užsisakykite vienos dienos patikrinimą vietoje pas mūsų saugumo ekspertus. Užsisakykite šiandien savo kruopštumą „Saugumas“ „Smart“ sutartys „Solidity“ naujienlaiškis Prenumeruokite mūsų naujienlaiškį, kuriame rasite naujausias „Ethereum“ naujienas, įmonės sprendimus, kūrėjų išteklius ir dar daugiau. El. Pašto adresas Išskirtinis turinysKaip sukurti sėkmingą „Blockchain“ produktąInternetinis seminaras

Kaip sukurti sėkmingą „Blockchain“ produktą

Kaip nustatyti ir paleisti „Ethereum“ mazgąInternetinis seminaras

Kaip nustatyti ir paleisti „Ethereum“ mazgą

Kaip susikurti savo „Ethereum“ APIInternetinis seminaras

Kaip susikurti savo „Ethereum“ API

Kaip sukurti socialinį ženkląInternetinis seminaras

Kaip sukurti socialinį ženklą

Saugumo priemonių naudojimas kuriant išmanųjį kontraktąInternetinis seminaras

Saugumo priemonių naudojimas kuriant išmanųjį kontraktą

Finansų ateitis Skaitmeninis turtas ir „DeFi“Internetinis seminaras

Finansų ateitis: skaitmeninis turtas ir „DeFi“

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me