Ақылды келісімшарттар үшін блоктарды тестілеуге арналған қарапайым нұсқаулық

http://upstate.agency/smart-contracts

Жақсы қондырғыларды тестілеу контрактілерді саналы түрде дамыту үшін маңызды. Ақылды келісімшарттар өзгермейтін және көп мөлшерде ақшаны басқаруға жауап беретіндігін ескере отырып, ақылды келісімшарттар үшін модельдердің жақсы сынақтарын жасау дәстүрлі веб және мобильді қосымшаларға қарағанда маңызды деп айтуға болады.

Соңғы екі айда біз бағалы қағаздарды реттеуді токенизациялаудың инновациялық платформасын жасайтын қаржылық қызмет көрсету компаниясымен тығыз байланыста болдық. Олардың жақында шығарылатын платформасы миллиардтаған долларлық құнды қағаздарды блокчейнге аудару мүмкіндігін енгізеді.

Олардың іске қосылуына қолдау көрсету үшін біз олардың инженерлік тобымен тығыз жұмыс жасадық, тестілеудің кең көлемін өткіздік және қателіктерді анықтау процесіне қарсы орындалдық. Осы тәжірибеден біз ақылды келісімшарттар үшін блок тесттерін жасау кезінде қолдануға болатын бірнеше маңызды ойлар мен бірнеше кеңестер мен амалдардан аулақ болдық.

Бизнес логикасы туралы сау түсінік алыңыз

Алдымен, сіз таратылған қосымшаның (дапп) бизнес логикасын түсінгеніңізге көз жеткізіңіз. Сіздің бағдарламаңыз қандай мәселелерді шешетінін және оларды қалай шешетінін құжаттау пайдалы. Сондай-ақ, сіз бағдарламаңыздағы әртүрлі шектеулерді анықтағыңыз келеді. Мысалы, көптеген қосымшалар рөлге негізделген немесе келісімшарт негізінде қол жеткізуді басқаруды жүзеге асырады. Бұл шектеулерді және олардың қолдануға әсерін құжаттау маңызды.

Сондай-ақ, бағдарламаның жұмыс процесін транскрипциялағыңыз келеді. Кейбір келісімшарттар басқалардың алдында іске қосылуы керек пе? Белгілі бір тапсырманы орындау үшін белгілі бір келісімшарт жасалынуы немесе кідіртілуі керек пе? Бұл бизнес-логика және жұмыс үрдісіне байланысты талаптар, олар сіздің бөлімшелеріңіздің сынақтарын жасамас бұрын жақсы түсінілуі керек.

Құрылғыңыздың сынақтарын жоспарлаңыз

Бизнес-логика мен Dapp-тың жұмыс процесі туралы құжатталғаннан кейін, сіздің Dapp-тың сәйкес функционалдылығымен байланысты әрбір компонентті тексеруді тағайындауды ұсынамыз. Бұл сіздің келісім-шарттарыңыз бен ерекшеліктеріңіз бойынша бағдарламаны бұзуды, содан кейін әрбір ықтимал пайдалану жағдайлары үшін барлық тиісті компоненттерді көрсетуді талап етеді.

Біз өзіміздің сынақтарымызды келісімшарттардағы тиісті функцияларға сәйкес етіп топтастырамыз. Төменде келісімшарттағы buyTokens (_amount) функциясымен байланысты бір рет пайдалануға арналған үлгі сипаттамасы берілген:

// келісімшарт іске қосылған кезде
// егер келісім тоқтатылмаса
// ұсыныс кезеңі басталған кезде
// егер ұсыныс мерзімі әлі аяқталмаған болса
// ол ақиқатқа оралуы керек

Керісінше, міне, сатып алу кезеңі аяқталған кезде buyTokens (_amount) функциясымен байланысты тағы бір сипаттама:

// келісімшарт іске қосылған кезде
// егер келісім тоқтатылмаса
// ұсыныс кезеңі басталған кезде
// ұсыныс мерзімі аяқталған кезде
// оны қалпына келтіру керек

Барлық компоненттердің сынақтарын осылай қорытындылай отырып, сіз өзіңіздің мүдделі тараптарыңызбен және инженерлік топтың қалған мүшелерімен сөйлесе аласыз. Сондықтан сіздің даптың қажеттіліктері туралы сөйлескен кезде бәрі бірдей бетте екеніне көз жеткізіңіз. Бұл ғана емес, сонымен қатар сізге қауіпсіз және сенімді түрде дизайнды жасауға көмектеседі.

Алдымен модификаторларға хабарласыңыз, содан кейін қажет болған жағдайда бірінен соң бірі жұмыс жасаңыз

Құрылғының сынақтарын анықтағаннан кейін, алдымен функционалды модификаторлармен байланысты жағдайларға назар аудару керек. Одан кейін сіз функцияны бір-бірлеп іске асыра аласыз және сәйкес талаптарға байланысты және пайдаланылған жағдайларға қатысты барлық пайдалану жағдайларын қарастыру үшін блок сынақтарын жасай аласыз.

Мысалы, келесідей функция үшін, алдымен, келесі және басқа мәлімдемелермен жұмыс жасамас бұрын atStage (Stages.AuctionStarted) және validBid () модификаторларымен байланысты жағдайларды қарастырғымыз келеді:

/// @dev Ағымдағы бағамен бірінші болып бенефициардың NFT алады /// @dev Егер сауда-саттық жеңімпазы NFT-ден асып кетсе, ол аукционда жеңіп шығады және оның өтінімі қайтарылады
processBid () Жалпыға қол жетімді atStage (Stages.AuctionStarted) // Осы жерден бастаңыз validBid () // Осы пайдалану жағдайларын екінші қайтарым ретінде жіберіңіз (uint) // Содан кейін келесі «егер», «басқа» - және «талап етуді» сұраңыз. Нұсқаулар {bid = msg.value; өтінім беруші = msg.sender; getCurrentAskingPrice (); if (bid> currentAskingPrice) {шамадан тыс = bid.sub (currentAskingPrice); өтінім беруші.трансфер (артық); сұраныс = currentAskingPrice; кезең = Кезеңдер.AuctionEnded; payBенефициар (); sendToBidder (); } else if (bid == currentAskingPrice) {кезең = Кезеңдер.AuctionEnded; payBенефициар (); sendToBidder (); } else {reset («Сұраныс ағымдағыAskingPrice-тен төмен»); }}

OpenZeppelin-нің assertRevert көмекшісі сіздің келісім-шарттарыңыз қалпына келтірілген кезде тестілеуден өте пайдалы екенін анықтадық. Сіз оны келесідей пайдалана аласыз:

күту assertRevert (tokenInstance.buy ({бастап: инвестор, мәні: 500}));

Функцияның шамадан тыс жүктелуі және төмен деңгейдегі қоңыраулардың қажеттілігі

Құрылғының сынақтарын жасауды жалғастырған кезде сіз қолданатын әзірлеуші ​​құралдарына қатысты кемшіліктерге тап болуыңыз мүмкін. Себебі, ақылды келісім-шартты жасау аймағы әлі де жаңа, сондықтан әзірлеушілердің көптеген құралдары әлі жетілмеген.

Мысалы, трюфель тірегі - тамаша құрал және қазіргі Ethereum аймағындағы ең танымал рамка - функцияны шамадан тыс жүктеуді қолдамайды. Бұл бірдей функциямен, бірақ әр түрлі қасиеттері бар екі функцияны сынағыңыз келсе, төмен деңгейдегі қоңырауларды қолдана отырып, келісімшарттың ABI-де екінші функцияны сынап көру керек екенін білдіреді. Егер жоқ болса, сіз қате туралы хабар аласыз: қаттылық функциясы үшін дұрыс емес дәлелдер саны. Қысқа мысалды қарастырайық.

Егер сізде келісімде екі buyTokens функциясы болса, біреуі дәлелсіз және ABI-де бірінші, ал аргументті қабылдайтын (ABM) және ABI-де екінші болса, сізге қарапайым қоңырау шалу керек. buyTokens функциясын (_ көлем) encodeCall көмегімен тексеріңіз (төменде қараңыз).

деректер = encodeCall («buyTokens», [«uint»], [100]); // 100 - _amount аргументінің мәні
келісім-шартInstance.sendTransaction ({деректер: инвестор, мәні: 500})

Трюфельдер қауымдастығы бұл проблеманы біледі және оны алдағы басылымда қарастырады. Мұндай таңқаларлық сценарийлер сирек емес, дегенмен, егер сіз ақылды келісімшарттар жасасаңыз және қондырғылардың тиісті сынауларын жасасаңыз. Сіз мезгіл-мезгіл шақыратын шешімдерге абай болуыңыз керек (бірақ өте сақ болыңыз).

Ішкі функцияларды қалай тексеруге болады

Қаттылықтағы функциялар әр түрлі көріністерге ие болатындығын ескере отырып (яғни, жеке, ішкі, сыртқы), ішкі функцияларға арналған блоктарды әзірлеудің қоғамдық функцияларды жасаудан біршама ерекшеленетінін атап өткен жөн. Бұл ішкі функциялар құрастырылғаннан кейін ақылды келісімшарттың ABI тізімінде жоқ. Ішкі функцияларды тексерудің екі әдісі бар:

  1. Сіз ішкі функцияны тексеру үшін сынақтан өту үшін келісімшартқа ие болатын басқа келісімшарт жасай аласыз
  2. Немесе сіз ішкі функцияның логикасын келісімшарттағы басқа функциялардың ішінде сынай аласыз

Екі тәсіл де жұмысты аяқтайды, дегенмен кейбіреулер келісімшарттағы басқа функциялар ішіндегі ішкі функцияның логикасын тестілеу интуитивті деп санайды.

Практикалық ganache кеңестері мен амалдары

Жоғарыда айтылғандай, біз негізінен трюфельдер шеңберін өз клиенттерімізге арналған лақтырулар жасау үшін қолданамыз. Трюфель Ganache атты құралды қолданады, ол өз Ethereum блокчейнін жылдам бастауға, сынақтарды жүргізуге, командаларды орындауға және тізбектің қалай жұмыс істейтінін бақылау кезінде күйін тексеруге мүмкіндік береді. Бұл өте практикалық.

Ганачтың жағымды жағы - бұл сіздің даптың жеке қажеттіліктеріне оңай бейімделуі. Мәселен, біз телефондарға арналған қондырғыларды жасадық, онда ондаған және ондаған пайдаланушылар үшін қолдану жағдайларын тексеру керек. Қарапайым команданың көмегімен Ганача бізге қажетті шоттармен тестілеуді оңай етеді:

ganache-cli -a 40 // «а» жалаушасы Ганача 40 сынақ есептік жазбасынан басталғанын білдіреді

Сонымен қатар, біз бұл шоттардың қалдықтарын олар біздің сынақтарға қажетті ETH-ден бастайтындай етіп түзете аламыз. Әдетте, Трюфель балансты 100 ETH деңгейіне орнатады. Біз өз қажеттіліктерімізге байланысты бұл мәнді оңай көбейте немесе азайта аламыз:

ganache -e 10000 '// мұнда' e` жалаушасы әдепкі бойынша әр есептік жазбадан қанша ETH бастау керек екенін көрсетеді

Ganache - Ethereum үшін ақылды келісімшарттар жасау үшін өте пайдалы құрал. Бұл дамуды жеңілдетуге, қауіпті азайтуға және дамптардың сенімділігін арттыруға көмектеседі.

Барлығын бір-біріне байлаңыз

Ақылды келісім-шарттар саласындағы блоктар сынақтары ғаламтор мен мобильді қосымшалар әлеміндегі блок сынақтарына ұқсас. Ең басты айырмашылығы - ақылды келісімшарттар бүгінгі күні өзгермейді және әдетте уақыт өте келе оңай жолдарды ұсынбайды [1]. Сондықтан, ақылды келісімшарттардың өзгермейтіндігінде және олардың көп мөлшерде ақшаны басқаруға жауап беретіндігін ескере отырып, модельдердің жақсы сынақтарын жасау өте маңызды. Ақылды келісімшарттарыңыздың қауіпсіз және сенімді екендігіне сенімді болу үшін оларды мұқият тексеріп шығу керек.

Ақылды келісім-шарттарды жаппай қабылдау үшін, біздің қоғамдастықтың сақтау орнын кеңейту және бірлескен қосымшаларды қоғамдық блоктар арқылы жазуды жеңілдету үшін бірлесе жұмыс жасауы өте маңызды.

Біз қондырғыларды сынақтан өткізудегі тәжірибемізден алынған сабақтар пайдалы және сенімді және ақылды келісімшарттар жасаудағы сіздің күштеріңізді қолдайды деп үміттенеміз. Егер сізде біздің тобымызда талқылағыңыз келетін сұрақтарыңыз немесе ұсыныстарыңыз болса, [email protected] мекен-жайына хабарласыңыз.

Жақын күндері біз ақылды келісімшарттарды тестілеуден нені үйрендім деген мақаланы жариялаймыз.

[1] Zeppelin тобы жақында ZeppelinOS-ті іске қосты. ZeppelinOS ақылды келісімшарттарды прокси үлгілерін қолдана отырып жаңартуға болатын жаңартылатын бірнеше стандартты кітапханаларды ұсынады.

Smart Ақылды келісімшарт жасаумен не істеу керектігін білу үшін бізді Medium және Twitter арқылы бақылаңыз.