Kujaribu mikataba mahiri
Minyororo ya vitalu ya umma kama Ethereum ni isiyobadilika, na kufanya iwe vigumu kubadilisha msimbo wa mikataba mahiri baada ya usambazaji. Miundo ya kuboresha mkataba kwa ajili ya kufanya "maboresho ya mtandaoni" ipo, lakini ni vigumu kuitekeleza na inahitaji mwafaka wa kijamii. Zaidi ya hayo, uboreshaji unaweza tu kurekebisha kosa baada ya kugunduliwa—ikiwa mshambuliaji atagundua udhaifu kwanza, mkataba wako mahiri uko katika hatari ya kutumiwa vibaya.
Kwa sababu hizi, kujaribu mikataba mahiri kabla ya kusambaza kwenye Mtandao Mkuu ni hitaji la chini kabisa kwa usalama. Kuna mbinu nyingi za kujaribu mikataba na kutathmini usahihi wa msimbo; unachochagua kinategemea mahitaji yako. Hata hivyo, mkusanyiko wa majaribio unaoundwa na zana na mbinu tofauti ni bora kwa kunasa dosari ndogo na kubwa za usalama katika msimbo wa mkataba.
Mahitaji ya awali
Ukurasa huu unaeleza jinsi ya kujaribu mikataba mahiri kabla ya kusambaza kwenye mtandao wa Ethereum. Inachukulia kuwa unafahamu mikataba mahiri.
Kujaribu mkataba mahiri ni nini?
Kujaribu mkataba mahiri ni mchakato wa kuthibitisha kuwa msimbo wa mkataba mahiri unafanya kazi kama inavyotarajiwa. Kujaribu ni muhimu kwa kuangalia ikiwa mkataba mahiri fulani unakidhi mahitaji ya kutegemewa, utumiaji, na usalama.
Ingawa mbinu zinatofautiana, mbinu nyingi za majaribio zinahitaji kutekeleza mkataba mahiri na sampuli ndogo ya data inayotarajiwa kushughulikia. Ikiwa mkataba unatoa matokeo sahihi kwa data ya sampuli, inachukuliwa kuwa inafanya kazi vizuri. Zana nyingi za majaribio hutoa rasilimali za kuandika na kutekeleza matukio ya majaribio (opens in a new tab) ili kuangalia ikiwa utekelezaji wa mkataba unalingana na matokeo yanayotarajiwa.
Kwa nini ni muhimu kujaribu mikataba mahiri?
Kwa kuwa mikataba mahiri mara nyingi husimamia mali za kifedha zenye thamani kubwa, makosa madogo ya upangaji programu yanaweza na mara nyingi husababisha hasara kubwa kwa watumiaji (opens in a new tab). Majaribio makali yanaweza, hata hivyo, kukusaidia kugundua kasoro na masuala katika msimbo wa mkataba mahiri mapema na kuyarekebisha kabla ya kuzindua kwenye Mtandao Mkuu.
Ingawa inawezekana kuboresha mkataba ikiwa hitilafu itagunduliwa, maboresho ni magumu na yanaweza kusababisha makosa (opens in a new tab) yakishughulikiwa isivyofaa. Kuboresha mkataba kunapingana zaidi na kanuni ya kutobadilika na kuwapa watumiaji mzigo wa dhana za uaminifu za ziada. Kinyume chake, mpango wa kina wa kujaribu mkataba wako unapunguza hatari za usalama za mkataba mahiri na kupunguza hitaji la kufanya maboresho magumu ya kimantiki baada ya kusambaza.
Mbinu za kujaribu mikataba mahiri
Mbinu za kujaribu mikataba mahiri ya Ethereum ziko chini ya makundi mawili mapana: majaribio ya kiotomatiki na majaribio ya mikono. Majaribio ya kiotomatiki na majaribio ya mikono hutoa faida na hasara za kipekee, lakini unaweza kuchanganya zote mbili ili kuunda mpango thabiti wa kuchanganua mikataba yako.
Majaribio ya kiotomatiki
Majaribio ya kiotomatiki hutumia zana ambazo huangalia kiotomatiki msimbo wa mkataba mahiri kwa makosa katika utekelezaji. Faida ya majaribio ya kiotomatiki inatokana na kutumia hati (opens in a new tab) kuongoza tathmini ya utendaji wa mkataba. Majaribio yaliyoandikwa yanaweza kupangwa kufanya kazi mara kwa mara kwa uingiliaji mdogo wa binadamu, na kufanya majaribio ya kiotomatiki kuwa na ufanisi zaidi kuliko mbinu za majaribio za mikono.
Majaribio ya kiotomatiki ni muhimu sana wakati majaribio yanajirudia na kuchukua muda mwingi; ni magumu kufanya kwa mikono; yanaweza kuwa na makosa ya kibinadamu; au yanahusisha kutathmini utendaji muhimu wa mkataba. Lakini zana za majaribio za kiotomatiki zinaweza kuwa na mapungufu—zinaweza kukosa hitilafu fulani na kutoa chanya za uongo (opens in a new tab) nyingi. Kwa hivyo, kuoanisha majaribio ya kiotomatiki na majaribio ya mikono kwa mikataba mahiri ni bora.
Majaribio ya mikono
Majaribio ya mikono yanasaidiwa na binadamu na yanahusisha kutekeleza kila tukio la jaribio katika mkusanyiko wako wa majaribio moja baada ya jingine wakati wa kuchanganua usahihi wa mkataba mahiri. Hii ni tofauti na majaribio ya kiotomatiki ambapo unaweza kuendesha majaribio mengi yaliyotengwa kwa wakati mmoja kwenye mkataba na kupata ripoti inayoonyesha majaribio yote yaliyofeli na kufaulu.
Majaribio ya mikono yanaweza kufanywa na mtu mmoja kufuatia mpango wa majaribio ulioandikwa ambao unashughulikia matukio tofauti ya majaribio. Unaweza pia kuwa na watu au vikundi vingi vinavyoingiliana na mkataba mahiri kwa kipindi maalum kama sehemu ya majaribio ya mikono. Wajaribu watalinganisha tabia halisi ya mkataba dhidi ya tabia inayotarajiwa, na kuashiria tofauti yoyote kama hitilafu.
Majaribio ya mikono yenye ufanisi yanahitaji rasilimali nyingi (ujuzi, muda, pesa, na juhudi), na inawezekana—kwa sababu ya makosa ya kibinadamu—kukosa makosa fulani wakati wa kutekeleza majaribio. Lakini majaribio ya mikono yanaweza pia kuwa na faida—kwa mfano, mjaribu wa kibinadamu (k.m., mkaguzi) anaweza kutumia angalizo kugundua matukio ya ukingoni ambayo zana ya majaribio ya kiotomatiki ingekosa.
Majaribio ya kiotomatiki kwa mikataba mahiri
Majaribio ya kitengo
Majaribio ya kitengo hutathmini utendaji wa mkataba kando na kuangalia kuwa kila kijenzi kinafanya kazi kwa usahihi. Majaribio mazuri ya kitengo yanapaswa kuwa rahisi, ya haraka kuendesha na kutoa wazo wazi la nini kilienda vibaya ikiwa majaribio yatafeli.
Majaribio ya kitengo ni muhimu kwa kuangalia kuwa utendaji unarudisha thamani zinazotarajiwa na kwamba hifadhi ya mkataba inasasishwa vizuri baada ya utekelezaji wa utendaji. Zaidi ya hayo, kuendesha majaribio ya kitengo baada ya kufanya mabadiliko kwenye msimbo wa mkataba kunahakikisha kuongeza mantiki mpya hakuleti makosa. Hapa chini kuna baadhi ya miongozo ya kuendesha majaribio ya kitengo yenye ufanisi:
Miongozo ya majaribio ya kitengo ya mikataba mahiri
1. Elewa mantiki ya biashara ya mkataba wako na mtiririko wa kazi
Kabla ya kuandika majaribio ya kitengo, inasaidia kujua ni utendaji gani mkataba mahiri unatoa na jinsi watumiaji watafikia na kutumia utendaji huo. Hii ni muhimu sana kwa kuendesha majaribio ya njia yenye furaha (opens in a new tab) ambayo huamua ikiwa utendaji katika mkataba unarudisha matokeo sahihi kwa ingizo halali la mtumiaji. Tutaelezea dhana hii kwa kutumia mfano huu (uliofupishwa) wa mkataba wa mnada (opens in a new tab)
constructor(
uint biddingTime,
address payable beneficiaryAddress
) {
beneficiary = beneficiaryAddress;
auctionEndTime = block.timestamp + biddingTime;
}
function bid() external payable {
if (block.timestamp > auctionEndTime)
revert AuctionAlreadyEnded();
if (msg.value <= highestBid)
revert BidNotHighEnough(highestBid);
if (highestBid != 0) {
pendingReturns[highestBidder] += highestBid;
}
highestBidder = msg.sender;
highestBid = msg.value;
emit HighestBidIncreased(msg.sender, msg.value);
}
function withdraw() external returns (bool) {
uint amount = pendingReturns[msg.sender];
if (amount > 0) {
pendingReturns[msg.sender] = 0;
if (!payable(msg.sender).send(amount)) {
pendingReturns[msg.sender] = amount;
return false;
}
}
return true;
}
function auctionEnd() external {
if (block.timestamp < auctionEndTime)
revert AuctionNotYetEnded();
if (ended)
revert AuctionEndAlreadyCalled();
ended = true;
emit AuctionEnded(highestBidder, highestBid);
beneficiary.transfer(highestBid);
}
}
Huu ni mkataba rahisi wa mnada ulioundwa kupokea zabuni wakati wa kipindi cha zabuni. Ikiwa highestBid itaongezeka, mzabuni wa juu zaidi wa awali anapokea pesa zake; mara tu kipindi cha zabuni kinapoisha, beneficiary huita mkataba ili kupata pesa zao.
Majaribio ya kitengo kwa mkataba kama huu yatashughulikia utendaji tofauti ambao mtumiaji anaweza kuita wakati wa kuingiliana na mkataba. Mfano utakuwa jaribio la kitengo ambalo huangalia ikiwa mtumiaji anaweza kuweka zabuni wakati mnada unaendelea (yaani, wito kwa bid() unafanikiwa) au lile linaloangalia ikiwa mtumiaji anaweza kuweka zabuni ya juu kuliko highestBid ya sasa.
Kuelewa mtiririko wa kazi wa uendeshaji wa mkataba pia husaidia katika kuandika majaribio ya kitengo ambayo huangalia ikiwa utekelezaji unakidhi mahitaji. Kwa mfano, mkataba wa mnada unabainisha kuwa watumiaji hawawezi kuweka zabuni wakati mnada umekwisha (yaani, wakati auctionEndTime iko chini ya block.timestamp). Kwa hivyo, msanidi programu anaweza kuendesha jaribio la kitengo ambalo huangalia ikiwa wito kwa utendaji wa bid() unafanikiwa au kufeli wakati mnada umekwisha (yaani, wakati auctionEndTime > block.timestamp).
2. Tathmini dhana zote zinazohusiana na utekelezaji wa mkataba
Ni muhimu kuandika dhana zozote kuhusu utekelezaji wa mkataba na kuandika majaribio ya kitengo ili kuthibitisha uhalali wa dhana hizo. Mbali na kutoa ulinzi dhidi ya utekelezaji usiotarajiwa, kujaribu madai kunakulazimisha kufikiria kuhusu shughuli zinazoweza kuvunja muundo wa usalama wa mkataba mahiri. Kidokezo muhimu ni kwenda zaidi ya "majaribio ya mtumiaji mwenye furaha" na kuandika majaribio hasi ambayo huangalia ikiwa utendaji unafeli kwa ingizo zisizo sahihi.
Mifumo mingi ya majaribio ya kitengo inakuruhusu kuunda madai—kauli rahisi zinazoeleza kile mkataba unaweza na hauwezi kufanya—na kuendesha majaribio ili kuona ikiwa madai hayo yanashikilia chini ya utekelezaji. Msanidi programu anayefanya kazi kwenye mkataba wa mnada ulioelezwa hapo awali anaweza kutoa madai yafuatayo kuhusu tabia yake kabla ya kuendesha majaribio hasi:
-
Watumiaji hawawezi kuweka zabuni wakati mnada umekwisha au haujaanza.
-
Mkataba wa mnada unarudi nyuma ikiwa zabuni iko chini ya kiwango kinachokubalika.
-
Watumiaji wanaoshindwa kushinda zabuni wanawekewa fedha zao
Kumbuka: Njia nyingine ya kujaribu dhana ni kuandika majaribio ambayo huchochea virekebishaji vya utendaji (opens in a new tab) katika mkataba, hasa kauli za require, assert, na if…else.
3. Pima ufunikaji wa msimbo
Ufunikaji wa msimbo (opens in a new tab) ni kipimo cha majaribio ambacho hufuatilia idadi ya matawi, mistari, na kauli katika msimbo wako zilizotekelezwa wakati wa majaribio. Majaribio yanapaswa kuwa na ufunikaji mzuri wa msimbo ili kupunguza hatari ya udhaifu ambao haujajaribiwa. Bila ufunikaji wa kutosha, unaweza kudhani kimakosa kuwa mkataba wako uko salama kwa sababu majaribio yote yanafaulu, wakati udhaifu bado upo katika njia za msimbo ambazo hazijajaribiwa. Kurekodi ufunikaji wa juu wa msimbo, hata hivyo, kunatoa hakikisho kuwa kauli/utendaji wote katika mkataba mahiri ulijaribiwa vya kutosha kwa usahihi.
4. Tumia mifumo ya majaribio iliyotengenezwa vizuri
Ubora wa zana zinazotumiwa katika kuendesha majaribio ya kitengo kwa mikataba yako mahiri ni muhimu. Mfumo bora wa majaribio ni ule unaodumishwa mara kwa mara; hutoa vipengele muhimu (k.m., uwezo wa kuweka kumbukumbu na kuripoti); na lazima uwe umetumiwa sana na kuhakikiwa na wasanidi programu wengine.
Mifumo ya majaribio ya kitengo kwa mikataba mahiri ya Solidity inakuja katika lugha tofauti (hasa JavaScript, Python, na Rust). Tazama baadhi ya miongozo hapa chini kwa maelezo kuhusu jinsi ya kuanza kuendesha majaribio ya kitengo na mifumo tofauti ya majaribio:
- Kuendesha majaribio ya kitengo na Brownie (opens in a new tab)
- Kuendesha majaribio ya kitengo na Foundry (opens in a new tab)
- Kuendesha majaribio ya kitengo na Waffle (opens in a new tab)
- Kuendesha majaribio ya kitengo na Remix (opens in a new tab)
- Kuendesha majaribio ya kitengo na Ape (opens in a new tab)
- Kuendesha majaribio ya kitengo na Hardhat (opens in a new tab)
- Kuendesha majaribio ya kitengo na Wake (opens in a new tab)
Majaribio ya ujumuishaji
Wakati majaribio ya kitengo yanatatua utendaji wa mkataba kwa kutengwa, majaribio ya ujumuishaji hutathmini vijenzi vya mkataba mahiri kwa ujumla. Majaribio ya ujumuishaji yanaweza kugundua masuala yanayotokana na wito wa mikataba tofauti au mwingiliano kati ya utendaji tofauti katika mkataba mahiri huo huo. Kwa mfano, majaribio ya ujumuishaji yanaweza kusaidia kuangalia ikiwa mambo kama urithi (opens in a new tab) na uingizaji wa utegemezi yanafanya kazi vizuri.
Majaribio ya ujumuishaji ni muhimu ikiwa mkataba wako unachukua usanifu wa kawaida au unaingiliana na mikataba mingine mnyororoni wakati wa utekelezaji. Njia moja ya kuendesha majaribio ya ujumuishaji ni kwa urefu maalum (kwa kutumia zana kama Forge (opens in a new tab) au Hardhat (opens in a new tab) na kuiga mwingiliano kati ya mkataba wako na mikataba iliyosambazwa.
Mnyororo wa vitalu uliochepushwa utafanya kazi sawa na Mtandao Mkuu na kuwa na akaunti zilizo na hali na salio zinazohusiana. Lakini inafanya kazi tu kama mazingira ya maendeleo ya ndani yaliyotengwa, ikimaanisha hutahitaji ETH halisi kwa miamala, kwa mfano, wala mabadiliko yako hayataathiri itifaki halisi ya Ethereum.
Majaribio kulingana na sifa
Majaribio kulingana na sifa ni mchakato wa kuangalia kuwa mkataba mahiri unakidhi sifa fulani iliyofafanuliwa. Sifa zinathibitisha ukweli kuhusu tabia ya mkataba ambayo inatarajiwa kubaki kweli katika matukio tofauti—mfano wa sifa ya mkataba mahiri inaweza kuwa "Shughuli za hesabu katika mkataba hazipati mzidio au upungufu kamwe."
Uchanganuzi tuli na uchanganuzi thabiti ni mbinu mbili za kawaida za kutekeleza majaribio kulingana na sifa, na zote mbili zinaweza kuthibitisha kuwa msimbo wa programu (mkataba mahiri katika kesi hii) unakidhi sifa fulani iliyofafanuliwa awali. Baadhi ya zana za majaribio kulingana na sifa huja na sheria zilizofafanuliwa awali kuhusu sifa zinazotarajiwa za mkataba na kuangalia msimbo dhidi ya sheria hizo, wakati zingine zinakuruhusu kuunda sifa maalum kwa mkataba mahiri.
Uchanganuzi tuli
Kichanganuzi tuli huchukua kama ingizo msimbo wa chanzo wa mkataba mahiri na kutoa matokeo yanayotangaza ikiwa mkataba unakidhi sifa au la. Tofauti na uchanganuzi thabiti, uchanganuzi tuli hauhusishi kutekeleza mkataba ili kuuchanganua kwa usahihi. Badala yake, uchanganuzi tuli hufikiri kuhusu njia zote zinazowezekana ambazo mkataba mahiri unaweza kuchukua wakati wa utekelezaji (yaani, kwa kuchunguza muundo wa msimbo wa chanzo ili kubaini itamaanisha nini kwa uendeshaji wa mkataba wakati wa utekelezaji).
Linting (opens in a new tab) na majaribio tuli (opens in a new tab) ni mbinu za kawaida za kuendesha uchanganuzi tuli kwenye mikataba. Zote mbili zinahitaji kuchanganua uwakilishi wa kiwango cha chini wa utekelezaji wa mkataba kama vile miti ya sintaksia dhahania (opens in a new tab) na grafu za mtiririko wa udhibiti (opens in a new tab) zinazotolewa na kikusanyaji.
Katika hali nyingi, uchanganuzi tuli ni muhimu kwa kugundua masuala ya usalama kama vile matumizi ya miundo isiyo salama, makosa ya sintaksia, au ukiukaji wa viwango vya usimbaji katika msimbo wa mkataba. Hata hivyo, vichanganuzi tuli vinajulikana kuwa kwa ujumla si thabiti katika kugundua udhaifu wa kina, na vinaweza kutoa chanya za uongo nyingi kupita kiasi.
Uchanganuzi thabiti
Uchanganuzi thabiti huzalisha ingizo za kiishara (k.m., katika utekelezaji wa kiishara (opens in a new tab)) au ingizo halisi (k.m., katika fuzzing (opens in a new tab)) kwa utendaji wa mkataba mahiri ili kuona ikiwa ufuatiliaji wowote wa utekelezaji unakiuka sifa maalum. Aina hii ya majaribio kulingana na sifa inatofautiana na majaribio ya kitengo kwa kuwa matukio ya majaribio yanashughulikia matukio mengi na programu inashughulikia uzalishaji wa matukio ya majaribio.
Fuzzing (opens in a new tab) ni mfano wa mbinu ya uchanganuzi thabiti ya kuthibitisha sifa za kiholela katika mikataba mahiri. Fuzzer huita utendaji katika mkataba lengwa na tofauti za nasibu au zilizoharibika za thamani ya ingizo iliyofafanuliwa. Ikiwa mkataba mahiri unaingia katika hali ya kosa (k.m., ambapo dai linafeli), tatizo linaashiriwa na ingizo zinazoendesha utekelezaji kuelekea njia dhaifu zinatolewa katika ripoti.
Fuzzing ni muhimu kwa kutathmini utaratibu wa uthibitishaji wa ingizo wa mkataba mahiri kwa kuwa ushughulikiaji usiofaa wa ingizo zisizotarajiwa unaweza kusababisha utekelezaji usiotarajiwa na kutoa athari hatari. Aina hii ya majaribio kulingana na sifa inaweza kuwa bora kwa sababu nyingi:
-
Kuandika matukio ya majaribio ili kushughulikia matukio mengi ni vigumu. Jaribio la sifa linahitaji tu ufafanue tabia na anuwai ya data ya kujaribu tabia hiyo—programu huzalisha kiotomatiki matukio ya majaribio kulingana na sifa iliyofafanuliwa.
-
Mkusanyiko wako wa majaribio unaweza usishughulikie vya kutosha njia zote zinazowezekana ndani ya programu. Hata kwa ufunikaji wa 100%, inawezekana kukosa matukio ya ukingoni.
-
Majaribio ya kitengo yanathibitisha mkataba unatekelezwa kwa usahihi kwa data ya sampuli, lakini ikiwa mkataba unatekelezwa kwa usahihi kwa ingizo nje ya sampuli bado haijulikani. Majaribio ya sifa hutekeleza mkataba lengwa na tofauti nyingi za thamani fulani ya ingizo ili kupata ufuatiliaji wa utekelezaji unaosababisha kufeli kwa madai. Kwa hivyo, jaribio la sifa hutoa dhamana zaidi kwamba mkataba unatekelezwa kwa usahihi kwa kundi pana la data ya ingizo.
Miongozo ya kuendesha majaribio kulingana na sifa kwa mikataba mahiri
Kuendesha majaribio kulingana na sifa kwa kawaida huanza na kufafanua sifa (k.m., kutokuwepo kwa mizidio ya nambari kamili (opens in a new tab)) au mkusanyiko wa sifa unazotaka kuthibitisha katika mkataba mahiri. Unaweza pia kuhitaji kufafanua anuwai ya thamani ambazo programu inaweza kuzalisha data kwa ingizo za muamala wakati wa kuandika majaribio ya sifa.
Ikisanidiwa vizuri, zana ya majaribio ya sifa itatekeleza utendaji wa mikataba yako mahiri na ingizo zilizozalishwa kwa nasibu. Ikiwa kuna ukiukaji wowote wa madai, unapaswa kupata ripoti iliyo na data halisi ya ingizo inayokiuka sifa inayotathminiwa. Tazama baadhi ya miongozo hapa chini ili kuanza kuendesha majaribio kulingana na sifa na zana tofauti:
- Uchanganuzi tuli wa mikataba mahiri na Slither (opens in a new tab)
- Uchanganuzi tuli wa mikataba mahiri na Wake (opens in a new tab)
- Majaribio kulingana na sifa na Brownie (opens in a new tab)
- Fuzzing ya mikataba na Foundry (opens in a new tab)
- Fuzzing ya mikataba na Echidna (opens in a new tab)
- Fuzzing ya mikataba na Wake (opens in a new tab)
- Utekelezaji wa kiishara wa mikataba mahiri na Manticore (opens in a new tab)
- Utekelezaji wa kiishara wa mikataba mahiri na Mythril (opens in a new tab)
Majaribio ya mikono kwa mikataba mahiri
Majaribio ya mikono ya mikataba mahiri mara nyingi huja baadaye katika mzunguko wa maendeleo baada ya kuendesha majaribio ya kiotomatiki. Aina hii ya majaribio hutathmini mkataba mahiri kama bidhaa moja iliyojumuishwa kikamilifu ili kuona ikiwa inafanya kazi kama ilivyobainishwa katika mahitaji ya kiufundi.
Kujaribu mikataba kwenye mnyororo wa vitalu wa ndani
Wakati majaribio ya kiotomatiki yanayofanywa katika mazingira ya maendeleo ya ndani yanaweza kutoa maelezo muhimu ya utatuzi, utataka kujua jinsi mkataba wako mahiri unavyofanya kazi katika mazingira ya uzalishaji. Hata hivyo, kusambaza kwenye mnyororo mkuu wa Ethereum kunagharimu ada za gesi—bila kusahau kwamba wewe au watumiaji wako mnaweza kupoteza pesa halisi ikiwa mkataba wako mahiri bado una hitilafu.
Kujaribu mkataba wako kwenye mnyororo wa vitalu wa ndani (pia unajulikana kama mtandao wa maendeleo) ni mbadala unaopendekezwa kwa kujaribu kwenye Mtandao Mkuu. Mnyororo wa vitalu wa ndani ni nakala ya mnyororo wa vitalu wa Ethereum inayoendeshwa ndani ya kompyuta yako ambayo inaiga tabia ya tabaka la utekelezaji la Ethereum. Kwa hivyo, unaweza kupanga miamala ili kuingiliana na mkataba bila kupata gharama kubwa.
Kuendesha mikataba kwenye mnyororo wa vitalu wa ndani kunaweza kuwa muhimu kama aina ya majaribio ya ujumuishaji ya mikono. Mikataba mahiri inakubalika sana kuunganishwa, ikikuruhusu kuunganisha na itifaki zilizopo—lakini bado utahitaji kuhakikisha kuwa mwingiliano huo mgumu mnyororoni unatoa matokeo sahihi.
Zaidi kuhusu mitandao ya maendeleo.
Kujaribu mikataba kwenye mitandao ya majaribio
Mtandao wa majaribio unafanya kazi sawa na Mtandao Mkuu wa Ethereum, isipokuwa kwamba unatumia Etha (ETH) isiyo na thamani ya ulimwengu halisi. Kusambaza mkataba wako kwenye mtandao wa majaribio inamaanisha mtu yeyote anaweza kuingiliana nao (k.m., kupitia sehemu ya mbele ya programu tumizi iliyogatuliwa (dapp)) bila kuweka fedha hatarini.
Aina hii ya majaribio ya mikono ni muhimu kwa kutathmini mtiririko wa mwisho hadi mwisho wa programu yako kutoka kwa mtazamo wa mtumiaji. Hapa, wajaribu wa beta wanaweza pia kufanya majaribio na kuripoti masuala yoyote na mantiki ya biashara ya mkataba na utendaji wa jumla.
Kusambaza kwenye mtandao wa majaribio baada ya kujaribu kwenye mnyororo wa vitalu wa ndani ni bora kwa kuwa ya kwanza iko karibu na tabia ya Mashine ya Mtandaoni ya Ethereum. Kwa hivyo, ni kawaida kwa miradi mingi ya asili ya Ethereum kusambaza dapps kwenye mitandao ya majaribio ili kutathmini uendeshaji wa mikataba mahiri chini ya hali halisi ya ulimwengu.
Zaidi kuhusu mitandao ya majaribio ya Ethereum.
Majaribio dhidi ya uthibitishaji rasmi
Wakati majaribio yanasaidia kuthibitisha kuwa mkataba unarudisha matokeo yanayotarajiwa kwa baadhi ya ingizo za data, hayawezi kuthibitisha kwa uhakika sawa kwa ingizo ambazo hazikutumika wakati wa majaribio. Kujaribu mkataba mahiri, kwa hivyo, hakuwezi kuhakikisha "usahihi wa utendaji" (yaani, hakuwezi kuonyesha kuwa programu inafanya kazi kama inavyotakiwa kwa seti zote za thamani za ingizo).
Uthibitishaji rasmi ni mbinu ya kutathmini usahihi wa programu kwa kuangalia ikiwa muundo rasmi wa programu unalingana na vipimo rasmi. Muundo rasmi ni uwakilishi dhahania wa hisabati wa programu, wakati vipimo rasmi vinafafanua sifa za programu (yaani, madai ya kimantiki kuhusu utekelezaji wa programu).
Kwa sababu sifa zimeandikwa kwa maneno ya hisabati, inakuwa rahisi kuthibitisha kuwa muundo rasmi (wa hisabati) wa mfumo unakidhi vipimo kwa kutumia sheria za kimantiki za uelekezaji. Kwa hivyo, zana za uthibitishaji rasmi zinasemekana kutoa 'uthibitisho wa hisabati' wa usahihi wa mfumo.
Tofauti na majaribio, uthibitishaji rasmi unaweza kutumika kuthibitisha utekelezaji wa mkataba mahiri unakidhi vipimo rasmi kwa utekelezaji wote (yaani, hauna hitilafu) bila kuhitaji kuutekeleza na data ya sampuli. Sio tu kwamba hii inapunguza muda unaotumika kuendesha makumi ya majaribio ya kitengo, lakini pia ina ufanisi zaidi katika kunasa udhaifu uliofichwa. Hiyo inasemwa, mbinu za uthibitishaji rasmi ziko kwenye wigo kulingana na ugumu wao wa utekelezaji na manufaa.
Zaidi kuhusu uthibitishaji rasmi kwa mikataba mahiri.
Majaribio dhidi ya ukaguzi na zawadi za hitilafu
Kama ilivyotajwa, majaribio makali mara chache yanaweza kuhakikisha kutokuwepo kwa hitilafu katika mkataba; mbinu za uthibitishaji rasmi zinaweza kutoa hakikisho lenye nguvu zaidi la usahihi lakini kwa sasa ni ngumu kutumia na zinagharimu sana.
Bado, unaweza kuongeza zaidi uwezekano wa kunasa udhaifu wa mkataba kwa kupata ukaguzi huru wa msimbo. Ukaguzi wa mkataba mahiri (opens in a new tab) na zawadi za hitilafu (opens in a new tab) ni njia mbili za kupata wengine kuchanganua mikataba yako.
Ukaguzi unafanywa by wakaguzi wenye uzoefu katika kutafuta matukio ya dosari za usalama na mazoea duni ya maendeleo katika mikataba mahiri. Ukaguzi kwa kawaida utajumuisha majaribio (na ikiwezekana uthibitishaji rasmi) pamoja na ukaguzi wa mikono wa msimbo mzima.
Kinyume chake, programu ya zawadi ya hitilafu kwa kawaida inahusisha kutoa tuzo ya kifedha kwa mtu (kawaida huelezewa kama wadukuzi wema (opens in a new tab)) anayegundua udhaifu katika mkataba mahiri na kuufichua kwa wasanidi programu. Zawadi za hitilafu ni sawa na ukaguzi kwa kuwa inahusisha kuwauliza wengine kusaidia kupata kasoro katika mikataba mahiri.
Tofauti kubwa ni kwamba programu za zawadi za hitilafu ziko wazi kwa jamii pana ya wasanidi programu/wadukuzi na huvutia kundi pana la wadukuzi wa kimaadili na wataalamu huru wa usalama wenye ujuzi na uzoefu wa kipekee. Hii inaweza kuwa faida juu ya ukaguzi wa mkataba mahiri ambao unategemea zaidi timu ambazo zinaweza kuwa na utaalamu mdogo au finyu.
Zana za majaribio na maktaba
Zana za majaribio ya kitengo
-
solidity-coverage (opens in a new tab) - Zana ya ufunikaji wa msimbo kwa mikataba mahiri iliyoandikwa katika Solidity.
-
Waffle (opens in a new tab) - Mfumo wa maendeleo na majaribio ya hali ya juu ya mkataba mahiri (kulingana na Ethers.js).
-
Majaribio ya Remix (opens in a new tab) - Zana ya kujaribu mikataba mahiri ya Solidity. Inafanya kazi chini ya programu-jalizi ya Remix IDE "Solidity Unit Testing" ambayo inatumika kuandika na kuendesha matukio ya majaribio kwa mkataba.
-
Wasaidizi wa Majaribio wa OpenZeppelin (opens in a new tab) - Maktaba ya madai kwa majaribio ya mkataba mahiri wa Ethereum. Hakikisha mikataba yako inafanya kazi kama inavyotarajiwa!
-
Mfumo wa majaribio ya kitengo wa Brownie (opens in a new tab) - Brownie hutumia Pytest, mfumo wa majaribio wenye vipengele vingi unaokuruhusu kuandika majaribio madogo na msimbo mdogo, unakua vizuri kwa miradi mikubwa, na unaweza kupanuliwa sana.
-
Majaribio ya Foundry (opens in a new tab) - Foundry inatoa Forge, mfumo wa majaribio wa Ethereum wa haraka na unaobadilika wenye uwezo wa kutekeleza majaribio rahisi ya kitengo, ukaguzi wa matumizi bora ya gesi, na fuzzing ya mkataba.
-
Majaribio ya Hardhat (opens in a new tab) - Mfumo wa kujaribu mikataba mahiri kulingana na Ethers.js, Mocha, na Chai.
-
ApeWorx (opens in a new tab) - Mfumo wa maendeleo na majaribio kulingana na Python kwa mikataba mahiri inayolenga Mashine ya Mtandaoni ya Ethereum.
-
Wake (opens in a new tab) - Mfumo kulingana na Python kwa majaribio ya kitengo na fuzzing wenye uwezo mkubwa wa utatuzi na usaidizi wa majaribio ya mtambuko-mnyororo, ukitumia pytest na Anvil kwa uzoefu bora wa mtumiaji na utendaji.
Zana za majaribio kulingana na sifa
Zana za uchanganuzi tuli
-
Slither (opens in a new tab) - Mfumo wa uchanganuzi tuli wa Solidity kulingana na Python kwa kupata udhaifu, kuimarisha uelewa wa msimbo, na kuandika uchanganuzi maalum kwa mikataba mahiri.
-
Ethlint (opens in a new tab) - Linter kwa kutekeleza mtindo na mbinu bora za usalama kwa lugha ya upangaji programu ya mkataba mahiri ya Solidity.
-
Cyfrin Aderyn (opens in a new tab) - Kichanganuzi tuli kulingana na Rust kilichoundwa mahususi kwa usalama na maendeleo ya mkataba mahiri wa Web3.
-
Wake (opens in a new tab) - Mfumo wa uchanganuzi tuli kulingana na Python wenye vigunduzi vya udhaifu na ubora wa msimbo, vichapishaji vya kutoa taarifa muhimu kutoka kwa msimbo na usaidizi wa kuandika moduli ndogo maalum.
-
Slippy (opens in a new tab) - Linter rahisi na yenye nguvu kwa Solidity.
Zana za uchanganuzi thabiti
-
Echidna (opens in a new tab) - Fuzzer ya mkataba ya haraka kwa kugundua udhaifu katika mikataba mahiri kupitia majaribio kulingana na sifa.
-
Diligence Fuzzing (opens in a new tab) - Zana ya fuzzing ya kiotomatiki muhimu kwa kugundua ukiukaji wa sifa katika msimbo wa mkataba mahiri.
-
Manticore (opens in a new tab) - Mfumo wa utekelezaji wa kiishara thabiti kwa kuchanganua msimbo wa baiti wa EVM.
-
Mythril (opens in a new tab) - Zana ya tathmini ya msimbo wa baiti wa EVM kwa kugundua udhaifu wa mkataba kwa kutumia uchanganuzi wa taint, uchanganuzi wa concolic, na ukaguzi wa mtiririko wa udhibiti.
-
Diligence Scribble (opens in a new tab) - Scribble ni lugha ya vipimo na zana ya uthibitishaji wa wakati wa utekelezaji inayokuruhusu kufafanua mikataba mahiri na sifa zinazokuruhusu kujaribu kiotomatiki mikataba na zana kama vile Diligence Fuzzing au MythX.
Mafunzo yanayohusiana
- Muhtasari na ulinganisho wa bidhaa tofauti za majaribio _
- Jinsi ya kutumia Echidna kujaribu mikataba mahiri
- Jinsi ya kutumia Manticore kupata hitilafu za mkataba mahiri
- Jinsi ya kutumia Slither kupata hitilafu za mkataba mahiri
- Jinsi ya kuiga mikataba ya Solidity kwa majaribio
- Jinsi ya kuendesha majaribio ya kitengo katika Solidity kwa kutumia Foundry (opens in a new tab)
Usomaji zaidi
- Mwongozo wa kina wa kujaribu mikataba mahiri ya Ethereum (opens in a new tab)
- Jinsi ya kujaribu mikataba mahiri ya Ethereum (opens in a new tab)
- Mwongozo wa majaribio ya kitengo wa MolochDAO kwa wasanidi programu (opens in a new tab)
- Jinsi ya kujaribu mikataba mahiri kama nyota (opens in a new tab)
Mafunzo: Kujaribu mkataba mahiri kwenye Ethereum
- Jinsi ya kuendeleza na kujaribu dApp kwenye mtandao wa majaribio wa ndani, wa wateja wengi – Mwongozo wa kusambaza mkataba mahiri kwenye mtandao wa majaribio wa ndani na kufanya majaribio.
- Jinsi ya kuiga mikataba mahiri ya Solidity kwa majaribio – Mafunzo ya kati kuhusu jinsi ya kutumia data ya kuiga na kutekeleza majaribio ya kitengo.
- Jinsi ya kutumia Echidna kujaribu mikataba mahiri – Mbinu za hali ya juu za fuzzing na majaribio ya mkataba mahiri.