Ultimate Guide til EOS Smart Contract Security

Ultimate Guide til EOS Smart Contract Security. Kryptomiljøet blev skeptisk, da verdens største ICO, EOS blev lanceret i juni 2018, og den blev fryset ud i 2 dage på grund af en softwarefejl. Men hurtig fremad 4 måneder, og EOS tegner sig i dag for mere end fordoble transaktionerne det gør Ethereum i dag. Gennem løftet om gratis og hurtigere transaktioner har den øverste Dapp af EOS cirka 13.000 daglige aktive brugere sammenlignet med kun 2.000 af Ethereums øverste Dapp.

EOS Smart kontrakt sikkerhed

Af Rohan Agarwal

Nogle generelle sårbarheder med smart kontrakt gælder for næsten alle platforme. Ligesom Ethereum skal smarte kontrakter, der er skrevet på EOS, revideres, før de går live på mainnet. Fatal bugs i kontrakten kan blive udnyttet, når kontrakterne ikke er tilstrækkeligt testet. I denne vejledning hjælper vi dig med at undgå de almindelige faldgruber på din vej til at lave den næste morder dApp på EOS.

Før du læser vejledningen, er det vigtigt at vide om nogle forudsætningsoplysninger om EOS-udvikling, der vil være nyttige, mens du læser guiden. Kendskab til C ++ er et must. Det bedste sted at starte med den smarte kontraktudvikling er EOSIOs egen dokumentation

Håndtering af ABI Dispatcher

ekstern "C" {

#Crypto ExchangeBenefits

1

Binance
Best exchange


VISIT SITE
  • ? The worlds biggest bitcoin exchange and altcoin crypto exchange in the world by volume.
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

2

Coinbase
Ideal for newbies


Visit SITE
  • Coinbase is the largest U.S.-based cryptocurrency exchange, trading more than 30 cryptocurrencies.
  • Very high liquidity
  • Extremely simple user interface

3

eToro
Crypto + Trading

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

ugyldigt anvendelse (uint64_t-modtager, uint64_t-kode, uint64_t-handling) {

klassenavn denne kontrakt (modtager);

hvis ((kode == N (eosio.token)) && (handling == N (overførsel))) {

execute_action (&denne kontrakt, &class_name :: transfer);

Vend tilbage;

#CRYPTO BROKERSBenefits

1

eToro
Best Crypto Broker

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

2

Binance
Cryptocurrency Trading


VISIT SITE
  • ? Your new Favorite App for Cryptocurrency Trading. Buy, sell and trade cryptocurrency on the go
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

#BITCOIN CASINOBenefits

1

Bitstarz
Best Crypto Casino

VISIT SITE
  • 2 BTC + 180 free spins First deposit bonus is 152% up to 2 BTC
  • Accepts both fiat currencies and cryptocurrencies

2

Bitcoincasino.io
Fast money transfers


VISIT SITE
  • Six supported cryptocurrencies.
  • 100% up to 0.1 BTC for the first
  • 50% up to 0.1 BTC for the second

}

hvis (kode! = modtager) returnerer;

switch (handling) {EOSIO_API (class_name, (action_1) (action_n))};

eosio_exit (0);

}

}

Ovenstående billede er en prøvekode for en modificeret ABI-afsender. En enklere ABI-afsender som vist nedenfor bruges til enklere handlingshåndtering af kontrakten.

EOSIO_ABI (klassenavn, (action_1) (action_n));

ABI-afsenderen / speditøren giver kontrakten mulighed for at lytte til indgående eosio.token-overførselshændelser såvel som normale interaktioner med den smarte kontrakt. Det er vigtigt at binde hver nøglehandling og kode for at opfylde kravene for at undgå unormale og ulovlige opkald.

Et eksempel ville være hacket, der skete med dApp EOSBet Casino på grund af en fejl i deres kildekode til videresendelse af ABI.

hvis (kode == selv || kode == N (eosio.token)) {

TYP denne kontrakt (selv);

switch (handling) {

EOSIO_API (TYPE, MEDLEMMER)

}

}

Ovenstående kontrol i den anvendte handlingshåndterer af ABI-videresendelseskildekoden tillod en hacker at omgå funktionen eosio.token :: transfer () fuldstændigt og direkte ringe til kontrakt :: transfer () -funktionen uden at overføre EOS til kontrakten, inden den placeres vædde. For tab blev han intet betalt, men mistede intet. For gevinster blev han dog udbetalt ægte EOS fra kontrakten.

De rettede fejlen ovenfor ved at tilføje en kontrol af eosio.token kontraktoverførselshandling før de indgående handlinger anmoder om kontrakten.

hvis (kode == selv || kode == N (eosio.token)) {

hvis (handling == N (overførsel)) {

eosio_assert (kode == N (eosio.token), "Skal overføre EOS");

}

TYP denne kontrakt (selv);

switch (handling) {

EOSIO_API (TYPE, MEDLEMMER)

}

}

Det er vigtigt at bruge udsagnet require_auth (konto); til handlinger, som du kun vil have den autoriserede konto til at udføre. kræve_auth (_ selv); bruges til kun at godkende ejeren af ​​kontrakten til at underskrive transaktionen

Autorisation i handlinger

ugyldigt token :: overførsel (kontonavn fra, kontonavn til, aktivmængde)

{

auto sym = antal.symbol.navn ();

kræver_modtager (fra);

kræve_modtager (til);

auto betaler = has_auth (til)? til fra;

underbalance (fra, mængde);

add_balance (til, mængde, betaler);

}

Ovenstående eksempelkode tillader enhver at kalde handlingen. For at løse det skal du bruge require_auth (fra); erklæring om at give betaleren tilladelse til at indkalde handlingen.

Prøv at undgå at ændre eosio.token-kontrakten

En nylig hvid hathacker formåede at kræve 1 milliard tokens af en dapp på grund af et dårligt testet metodeopkald i deres eosio.token-kontrakt. Dapp Se7ens (nu inaktiv) erklærede en ny metode inden for eosio.token-kontrakten til luftdropping af deres tokens til brugerkonti. Kontrakten kaldte ikke spørgsmålet eller overførselshandlingen af ​​eosio.token-kontrakten for at afspejle ændringerne, og dermed blev midlerne magisk vist på brugernes konti. For det andet glemte de at kontrollere beløbet i metoden før overførslen, som gjorde det muligt for hacker at kræve 1 milliard af deres tokens i processen.

Bortset fra at ændre den maksimale forsyning og tokensymbolet, anbefales det at undgå at ændre det til brugerdefinerede funktioner, da fejlene i eosio.token-kontrakten kan være fatale. For at lette en airdrop sikkert skal du overføre airdrop-tokens til en separat konto og distribuere den derfra.

Ændring af multiindeks-tabelegenskaber

EOS gemmer i øjeblikket data i en delt hukommelsesdatabase til deling på tværs af handlinger.

struct [[eosio :: tabel]] person {

kontonavn-nøgle;

std :: streng fornavn;

std :: streng efternavn;

std :: streng gade;

std :: strengby;

std :: strengtilstand;

uint64_t primærnøgle () const {returnøgle; }

};

typedef eosio :: multi_index<N (mennesker), person> adresse_index;

Eksempelkoden ovenfor opretter en multi_index-tabel med navnet People, der er baseret på datastrukturen i en enkelt række i den tabel ved hjælp af struct-personen. EOS i øjeblikket tillader ikke ændringer af tabelegenskaberne, når den bliver implementeret. Fejl ved påstand om eosio_assert_message er den fejl, der vil blive kastet. Derfor skal egenskaber overvejes fuldstændigt inden implementering af tabellen. Ellers skal der oprettes en ny tabel med et andet navn, og der skal udvises ekstrem forsigtighed ved migrering fra gammel tabel til den nye. Manglende overholdelse kan medføre tab af data.

Numerisk overløbskontrol

Når du udfører aritmetiske operationer, kan værdierne løbe over, hvis randbetingelserne ikke kontrolleres ansvarligt nok, hvilket medfører tab af brugerens aktiver.

ugyldig overførsel (symbol_name symbol, account_name from, account_names to, uint64_t balance) {

require_auth (fra);

konto fra konto

eosio_assert (is_balance_within_range (balance), "ugyldig saldo");

eosio_assert (balance > 0, "skal overføre positiv balance"); uint64_t beløb = balance * 4; // Multiplikationsoverløb

}

I eksempelkoden ovenfor ved hjælp af uint64_t at betegne brugerbalance kan forårsage overløb, når værdien multipliceres. Undgå derfor at bruge det uint64_t at betegne balancer og udføre aritmetiske operationer på det så vidt muligt. Brug aktivstrukturen defineret i eosiolib til operationer snarere end den nøjagtige saldo, der tager sig af overløbsbetingelserne.

At tage sig af forudsætningerne i kontrakten

Der vil være antagelser, som vil kræve påstande under udførelsen af ​​kontrakten. Brug af eosio_assert tager sig af betingelserne på forhånd og stopper udførelsen af ​​den specifikke handling, hvis påstandene mislykkes. Som et eksempel –

ugyldigt assert_roll_under (const uint8_t& roll_under) {

eosio_assert (roll_under >= 2 && roll_under <= 96,

"rulle under overløb, skal være større end 2 og mindre end 96");

}

Påstanden ovenfor hævder, at roll_under heltal er større end 2 & mindre end 96. Men hvis det ikke gør det, skal du smide ovenstående meddelelse og stoppe udførelsen. Undladelse af at opdage hjørnesager som ovenstående kan blive katastrofalt for huset, der sætter reglerne.

Genererer ægte tilfældige tal

Generering af ægte tilfældige tal på EOS Blockchain er stadig en risiko, hvis det ikke gøres nøjagtigt. Hvis man ikke gør det korrekt, vil en modstander forudsige resultaterne og spille hele systemet i processen. Tjenester som Oracalize.it eksisterer for at give tilfældige tal fra en ekstern kilde, men de er dyre og et enkelt fejlpunkt. Folk har tidligere brugt Blockchains kontekstuelle variabler (bloknummer, blokstempel osv.) Til at generere tilfældigt tal i Ethereum smart kontrakt, men det har været spillede før. For at udføre generationen korrekt skal programmet give en slags kombineret tilfældighed, som ingen enkelt part kunne kontrollere alene. En af de bedst mulige måder i øjeblikket er en metode, der er foreslået af Dan Larimar selv, når han genererer et tilfældigt tal mellem to parter.

BountyOne-blog: EOS Smart Contract Security

streng sha256_to_hex (const kontrolsum256& sha256) {

vende tilbage til_hex ((char *) sha256.hash, sizeof (sha256.hash));

}

streng sha1_to_hex (const kontrolsum160& sha1) {

vende tilbage til_hex ((char *) sha1.hash, sizeof (sha1.hash));

}

skabelon <klasse T>

Indbygget ugyldigt hash_combine (std :: size_t& frø, konst T& v) {

std :: hash<T> hasher;

frø ^ = hasher (v) + 0x9e3779b9 + (frø << 6) + (frø >> 2);

}

Eksempelkoden ovenfor giver et optimeret tilfældigt talgenerering mellem 1 og 100. frø1 er husets frø, og frø2 er brugerfrøet ovenfor. Til reference, Dappub og EOSBetCasino har åbent indkøbt deres komplette kontrakter med tilfældig talgenerator implementering af et fair terningespil mellem spilleren og huset (udvikler).

uint8_t compute_random_roll (const checksum256& seed1, const kontrolsum160& frø2) {

størrelse_t hash = 0;

hash_combine (hash, sha256_to_hex (seed1));

hash_combine (hash, sha1_to_hex (seed2));

return hash% 100 + 1;

}

EOSBet fik for nylig hacket igen på 65.000 EOS, da en modstand narret deres eosio.token-kontrakt om at sende EOS til sin tegnebog, hver gang han handlede mellem sine egne tegnebøger. Kontraktkoden for eosio.token giver besked både afsenderen og modtageren af ​​EOS-tokens, at der er indgående tokens. At efterligne adfærd & lette hacket, modstanderen oprettede to konti, lad os antage A & B. A havde en smart kontrakt med en handling, der havde en erklæring, som kræver_modtager (N (eosbetdice11)). Da A lettede transaktionen fra A til B gennem handlingsopkaldet, underrettede den overføringsfunktion i kontrakten, som om opkaldet kom fra eosio.token-kontrakt. Da der ikke var nogen reel overførsel af EOS til kontrakten, mistede han intet hver gang hackeren mistede et væddemål, men han blev belønnet, da han vandt væddemålet. Derfor er det ikke tilstrækkeligt at kontrollere kontraktsnavnet og handlingsnavnet.

Kontrol af meddelelser fra kontrakter

For at afbøde problemet skal funktionen kontrollere, om kontrakten faktisk er modtager af tokens eller ej.

eosio_assert (transfer_data.from == _self || transfer_data.to == _self, "Skal være indgående eller udgående overførsel");

Hvad er de bedste fremgangsmåder, man skal følge, når man udvikler en smart kontrakt på EOS?

Fejl er uundgåelig en del af enhver software. Dets konsekvenser forstærkes i et decentralt miljø, især hvis det involverer værditransaktion. Bortset fra de EOS-specifikke beskyttelsesforanstaltninger, der er diskuteret ovenfor, er her nogle af de generelle forholdsregler og bedste praksis, som nye smarte kontraktudviklere skal huske på –

  1. Altid revidere kontrakten uafhængigt af tredjeparts intelligente kontraktsrevisionsfirmaer, inden de frigives på mainnet.
  2. Udfør den nødvendige Caveman-fejlfinding (eneste måde at fejle kontrakten i øjeblikket) på kontrakten inden du frigiver til testnet. EOSIO-dokumentation har en god guide for det.
  3. Indstil grænseoverførselshastighed ved udbetalinger for at undgå for store tab de første dage efter mainnet-lanceringen. Har bug bounty-program til ansvarlig afsløring af hackere med hvide hatte.
  4. Få en dræberomskifter til at fryse kontrakten, når der opdages en fejl.

For at implementere det vedvarer vi et flag i multi_index-tabellen. Vi sætter flaget ved hjælp af en handling, der kun kan kaldes af ejeren af ​​kontrakten. Og så kontrollerer vi enhver offentlig handling, om flaget er indstillet til at være frossent eller ej. Nedenfor gives en prøveimplementering af funktionen.

struct st_frozen {

uint64_t frossen;

};

typedef singleton<N (fryse), st_frozen> tb_frozen;

tb_frozen _frozen;

uint64_t getFreezeFlag () {

st_frozen frossen_st {.frozen = 0};

returner _frozen.get_or_create (_self, frozen_st);

}

ugyldigt setFreezeFlag (con uint64_t& pFrozen) {

st_frozen frozen_st = getFreezeFlag ();

frosne_st.frozen = pFrozen;

_frozen.set (frozen_st, _self);

}

// offentlig handling

ugyldig fryse () {

kræve_auth (_ selv);

setFreezeFlag (1);

}

// offentlig handling

ugyldig frigøre () {

kræve_auth (_ selv);

setFreezeFlag (0);

}

// enhver offentlig handling

ugyldig handling (…) {

eosio_assert (getFreezeFlag (). frossen == 1, "Kontrakten er frossen!");

}

  1. Hold dig opdateret om sikkerhedsforbedringer i biblioteker eller oplysninger om sårbarheder på platformen. Opdater dine biblioteker, når det er nødvendigt, med det samme.
  2. Åben kildekode i det mindste kontraktkoden, så fairness opretholdes i spillet, og indieudviklere kan hjælpe med at få øje på bugs meget hurtigere.

EOS Smart Contract Security: Konklusion

Det har kun været 5 måneder siden EOS-lanceringen, men det er vokset langt forbi forventningen. De kompromiser, det har foretaget – DPOS, ændrede smarte kontrakter, 21 minenoder osv. Har bestemt været udsat for hård kritik fra decentraliseringsmaksimalister. Ikke desto mindre har det ikke stoppet dApps baseret på Ethereum for at skifte til EOS i betragtning af den skalerbarhed, som platformen tilbyder dem i dag. Uanset om det er EOS eller Ethereum, der vinder krigen, skal der endnu ikke afgøres, men EOS har bestemt vundet kampen. Og det vil forblive det samme, indtil Ethereum formår at nå den skalerbarhed, som verden har brug for til at køre “The World Computer”.

_________________________________________________________________________________________

Denne artikel blev skrevet af Rohan Agarwal

Bio – #Android Dev # Iværksætter # Blockchain Dev & Forsker Medstifter @ Cypherock.com – En sikker hardware-tegnebog til smartphones.

Linkedin – https://www.linkedin.com/in/rohanagarwal94/

Github – https://github.com/rohanagarwal94

Twitter – https://twitter.com/rohanagarwal94

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