Ruka hadi kwenye maudhui makuu

Miongozo ya usalama wa mkataba mahiri

Solidity
mikataba mahiri
usalama
Kati
Trailofbits
6 Septemba 2020
5 dakika za kusoma

Fuata mapendekezo haya ya kiwango cha juu ili kuunda mikataba mahiri iliyo salama zaidi.

Miongozo ya muundo

Muundo wa mkataba unapaswa kujadiliwa mapema, kabla ya kuandika mstari wowote wa msimbo.

Nyaraka na vipimo

Nyaraka zinaweza kuandikwa katika viwango tofauti, na zinapaswa kusasishwa wakati wa kutekeleza mikataba:

  • Maelezo ya mfumo kwa lugha rahisi, yakielezea kile ambacho mikataba inafanya na mawazo yoyote kwenye msingi wa msimbo.
  • Michoro ya mpangilio na usanifu, ikijumuisha mwingiliano wa mkataba na mashine ya hali ya mfumo. Printa za Slither (opens in a new tab) zinaweza kusaidia kuzalisha mipangilio hii.
  • Nyaraka za kina za msimbo, umbizo la NatSpec (opens in a new tab) linaweza kutumika kwa Solidity.

Ukokotoaji wa mnyororoni dhidi ya nje ya mnyororo

  • Weka msimbo mwingi uwezavyo nje ya mnyororo. Weka safu ya mnyororoni iwe ndogo. Chakata data mapema kwa msimbo nje ya mnyororo kwa njia ambayo uthibitishaji mnyororoni unakuwa rahisi. Je, unahitaji orodha iliyopangwa? Panga orodha nje ya mnyororo, kisha uangalie tu mpangilio wake mnyororoni.

Uwezo wa kuboreshwa

Tulijadili suluhu tofauti za uwezo wa kuboreshwa katika chapisho letu la blogu (opens in a new tab). Fanya uamuzi wa makusudi wa kusaidia uwezo wa kuboreshwa au la kabla ya kuandika msimbo wowote. Uamuzi huo utaathiri jinsi unavyounda msimbo wako. Kwa ujumla, tunapendekeza:

  • Kupendelea uhamishaji wa mkataba (opens in a new tab) badala ya uwezo wa kuboreshwa. Mifumo ya uhamishaji ina faida nyingi sawa na zile zinazoweza kuboreshwa, bila mapungufu yake.
  • Kutumia muundo wa utenganishaji wa data badala ya ule wa delegatecallproxy. Ikiwa mradi wako una utenganishaji wazi wa dhana, uwezo wa kuboreshwa kwa kutumia utenganishaji wa data utahitaji marekebisho machache tu. Delegatecallproxy inahitaji utaalamu wa EVM na ina uwezekano mkubwa wa makosa.
  • Andika utaratibu wa uhamishaji/uboreshaji kabla ya usambazaji. Ikiwa itabidi uchukue hatua chini ya shinikizo bila miongozo yoyote, utafanya makosa. Andika utaratibu wa kufuata mapema. Unapaswa kujumuisha:
    • Miito inayoanzisha mikataba mipya
    • Mahali ambapo funguo zimehifadhiwa na jinsi ya kuzifikia
    • Jinsi ya kuangalia usambazaji! Tengeneza na ujaribu hati ya baada ya usambazaji.

Miongozo ya utekelezaji

Jitahidi kuwa na urahisi. Kila wakati tumia suluhisho rahisi zaidi linalofaa dhumuni lako. Mwanachama yeyote wa timu yako anapaswa kuwa na uwezo wa kuelewa suluhisho lako.

Muundo wa utendakazi

Usanifu wa msingi wako wa msimbo unapaswa kufanya msimbo wako uwe rahisi kukaguliwa. Epuka chaguzi za usanifu zinazopunguza uwezo wa kufikiri juu ya usahihi wake.

  • Gawanya mantiki ya mfumo wako, iwe kupitia mikataba mingi au kwa kupanga utendakazi unaofanana pamoja (kwa mfano, uthibitishaji, hesabu, ...).
  • Andika utendakazi mdogo, wenye dhumuni wazi. Hii itarahisisha ukaguzi na kuruhusu majaribio ya vipengele vya kibinafsi.

Urithi

  • Weka urithi uweze kudhibitiwa. Urithi unapaswa kutumika kugawanya mantiki, hata hivyo, mradi wako unapaswa kulenga kupunguza kina na upana wa mti wa urithi.
  • Tumia printa ya urithi (opens in a new tab) ya Slither kuangalia mpangilio wa mikataba. Printa ya urithi itakusaidia kukagua ukubwa wa mpangilio.

Matukio

  • Weka logi ya shughuli zote muhimu. Matukio yatasaidia kutatua mkataba wakati wa uundaji, na kuufuatilia baada ya usambazaji.

Epuka mitego inayojulikana

Vitegemezi

  • Tumia maktaba zilizojaribiwa vizuri. Kuleta msimbo kutoka kwa maktaba zilizojaribiwa vizuri kutapunguza uwezekano wa wewe kuandika msimbo wenye hitilafu. Ikiwa unataka kuandika mkataba wa ERC-20, tumia OpenZeppelin (opens in a new tab).
  • Tumia kidhibiti cha vitegemezi; epuka kunakili na kubandika msimbo. Ikiwa unategemea chanzo cha nje, basi lazima ukisasishe na chanzo asili.

Majaribio na uthibitishaji

Solidity

  • Pendelea Solidity 0.5 badala ya 0.4 na 0.6. Kwa maoni yetu, Solidity 0.5 ni salama zaidi na ina mbinu bora zilizojengewa ndani kuliko 0.4. Solidity 0.6 imethibitika kutokuwa thabiti sana kwa uzalishaji na inahitaji muda ili kukomaa.
  • Tumia toleo thabiti kukusanya; tumia toleo la hivi punde kuangalia maonyo. Hakikisha kuwa msimbo wako hauna masuala yaliyoripotiwa na toleo la hivi punde la kikusanyaji. Hata hivyo, Solidity ina mzunguko wa haraka wa matoleo na ina historia ya hitilafu za kikusanyaji, kwa hivyo hatupendekezi toleo la hivi punde kwa usambazaji (tazama pendekezo la toleo la solc (opens in a new tab) la Slither).
  • Usitumie assembly ya ndani. Assembly inahitaji utaalamu wa EVM. Usiandike msimbo wa EVM ikiwa hujabobea kwenye waraka wa manjano.

Miongozo ya usambazaji

Pindi mkataba utakapoundwa na kusambazwa:

  • Fuatilia mikataba yako. Tazama logi, na uwe tayari kuchukua hatua endapo mkataba au mkoba utaingiliwa.
  • Ongeza maelezo yako ya mawasiliano kwenye blockchain-security-contacts (opens in a new tab). Orodha hii inasaidia wahusika wengine kuwasiliana nawe ikiwa dosari ya usalama itagunduliwa.
  • Linda mikoba ya watumiaji wenye mapendeleo. Fuata mbinu zetu bora (opens in a new tab) ikiwa unahifadhi funguo kwenye mikoba ya maunzi.
  • Kuwa na mpango wa kukabiliana na matukio. Zingatia kwamba mikataba yako mahiri inaweza kuingiliwa. Hata kama mikataba yako haina hitilafu, mshambuliaji anaweza kuchukua udhibiti wa funguo za mmiliki wa mkataba.