Здраво на сите!
Во поново време, Waves Labs
Го избравме случајот DAO затоа што
Започнавме со едноставен пример во
Да го погледнеме овој пример, да ги тестираме хипотезите и да погледнеме некои необичности:
Дозволете ни да ја имаме Алис - Сопственик на dApp
Буб и Купер се партнери на Алис, ко-основачи на Алис-БЦ ДАО
Нели е сопственик на бизнис кој има потреба од финансирање
Банка - банка која дистрибуира токени
Фаза 1. Иницијализирање на салда
За да примате токени на мрежата за тестирање бранови, треба да контактирате
Можете да ја најдете адресата во IDE со отворање на деталите за вашата сметка.
Ја истакнуваме банката 10 бранови. Потоа проверуваме дали пристигнале преку прелистувачот за блокирање и трансакции:
Сега ајде да дистрибуираме токени од банката до останатите учесници. (Забелешки: Сите трансакции на мрежата waves не се бесплатни, затоа е потребен минимален позитивен биланс за сите учесници да вршат трансакции).
1 БРАНОВИ = 100000000 единици (бранови), бидејќи износите можат да бидат само цел број
0.01 WAVES (надоместок за трансакција) = 1000000
Банка -> [3 БРАНОВИ] -> Алиса, преку Трансфер трансакција (Тип: 4).
Проверуваме дали env.SEED од која се потпишуваат трансакциите се совпаѓа со нашата банка:

Ако немате соодветна фраза за семе, само префрлете се на неа во картичката Сметки и проверете повторно.
По ова, создаваме, објавуваме и потпишуваме трансакција за пренос на 3 БРАНОВИ Алиса.
Податоците на Алис може да ги дознаете и преку променливата env.accounts. Нумерирањето започнува од 0, така што Алис е env.accounts[1].
broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))
Резултатот може да се забележи и во прелистувачот, врската до него ќе ни биде вратена веднаш по извршувањето
Уверуваме дека билансот на Алиса е надополнет со 3 БРАНОВИ, а салдото на банката останува на 10 - 3 - 0.01 = 0.699.
На Буб и Купер им испраќаме по 3 БРАНОВИ, а на Нели, Ксена и Марк по 0.2 БРАНОВИ на ист начин.
(Забелешки: Направивме грешка со еден знак и испративме на Neli 0.02 WAVES. Бидете внимателни!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))
По надополнувањето на билансите на сите учесници, гледаме:
Фаза 2. Создадете dApp сметка
Се договоривме Алис да биде креаторот и сопственикот на децентрализираната апликација.
Одете во Accounts, поставете го како SEED и проверете env.SEED одговара на Alice.
Ајде да се обидеме да ја инсталираме наједноставната можна скрипта (договор) на сметката на Алис.
Паметните контакти во Waves се предикати кои забрануваат или дозволуваат било каков вид на појдовна трансакција да се случи под одредени услови. Во овој случај, оваа состојба е СЕКОГАШ. Кодот на договорот е вистинит. Повик deploy().
Надомест по трансакција setScript 1400000/100000000 = 0.014 БРАНОВИ. На Алис и останале 2.986 БРАНОВИ на салдото.
Ајде сега да се обидеме да инсталираме посложена логика на паметни договори на сметката на Алис, опишана во
Ride4Dapps сега вклучува 2 нови типа на прибелешки:
- @Callable(i) — ги зема како параметар i, податоци за тоа која сметка ја повикала/потпишала трансакцијата. Тоа е резултат на оваа функција што ја одредува промената во состојбата на сметката dApp. Другите сметки можат да креираат трансакции и да извршуваат функции со оваа прибелешка и да ја менуваат состојбата на сметката dApp.
- @Verifier(tx) — Проверувач на трансакции со параметарот трансакција tx. Одговара на логиката на предикатот од RIDE. Токму во овој израз можете да дозволите или забраните понатамошни промени во логиката на паметните договори на сметката dApp.
Ајде dApp сметка како заеднички паричник за сите учесници.
За да проверите кој договор е моментално активен на вашата сметка, можете да го копирате кодот base64 на паметниот договор во block explorer и да го препознаете со помош на декомпајлер (
Се грижиме логиката на паметниот договор да одговара на она што го очекуваме.
На Алис и останале 2.972 БРАНОВИ на салдото.
Оваа dApp следи колку секој учесник придонесува во заедничкиот фонд преку механизам трансакција на податоци - Внес на податоци (тековен клуч, нова количина), каде што currentKey е сметката што ја повикува функцијата за депозит, а newAmount е вредноста на пополнетото салдо.
Буб и Купер ги вложуваат своите депозити на сметката dApp со 1 БРАН.
Ние грешиме и трансакцијата не оди. Бидејќи, и покрај тоа што бевме убедени дека правиме трансакција во име на Боб, направивме грешка во индексот и посочивме банкарска сметка која нема паметен договор. Вреди да се забележи важна точка овде - има надомест за неуспешни обиди за иницирање трансакции не може да се отстрани! На Алис и останале 2.972 БРАНОВИ на салдото. Боб има 3 БРАНОВИ.
Боб испрати 1 WAVES на сметката dApp.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
На Боб му преостануваат уште 1.99 БРАНОВИ. Односно, Боб платил 0.01 WAVES провизија
Алис имаше 2.972 БРАНОВИ на нејзиното салдо, сега е 3.972. Регистрирана е трансакција и на сметката на Alice, но не се наплатува провизија од сметката dApp (Alice).
Откако Купер ја надополни сметката, салдото на Алис стана 4.972 WAVES.
Можете да дознаете кој поседува колку БРАНОВИ во заедничкиот паричник во блок-истражувачот во табулаторот Податоци.
Купер се предомислил да остави износ од 1 WAVES на општиот паричник и решил да повлече половина од афинитетот. За да го направите ова, тој мора да ја повика функцијата за повлекување.
Сепак, повторно згрешивме, бидејќи функцијата за повлекување има сосема различни параметри и различен потпис. Кога дизајнирате паметни договори на RIDE4DAPPS, треба да обрнете внимание на оваа точка
Купер сега има 2.48 БРАНОВИ на билансот на состојба. Соодветно на тоа, 3 БРАНОВИ - 1 - 0.01, а потоа + 0.5 - 0.01. Според тоа, секој повик за депонирање и повлекување чини 0.01 WAVES. Како резултат на тоа, записите во табелата со сопственици на dApps се променија на следниов начин.
Боб, исто така, решил да повлече пари од заедничкиот паричник, но направил грешка и се обидел да повлече 1.5 БРАН.
Сепак, паметниот договор имаше проверка за оваа ситуација.
Зена е измамник, таа се обиде да повлече 1 БРАН од вкупната сметка.
Ниту не и појде од рака.
Во следниот дел, ќе разгледаме посложени прашања поврзани со несовршеноста на сметката Alice dApp.
Извор: www.habr.com