
Здравейте на всички!
Съвсем наскоро Waves Labs обяви конкурс за разработчици, свързан с пускането на тестовата мрежа на разширението на езика за смарт-контракти RIDE за децентрализирани приложения Ride4Dapps!
Избрахме случая с DAO, тъй като планира да разработва dApp с социални функции: гласуване, набиране на средства, доверително управление и др.
Започнахме с прост пример в и в — пример с .
Нека разгледаме този пример, проверим хипотезите и разгледаме някои странности:
Нека имаме Alice — собственик на dApp
Boob и Cooper — партньори на Alice, съоснователи на Alice-BC DAO
Neli — собственик на бизнес, който се нуждае от финансиране
Bank — банка, която раздава токени
Етап 1. Инициализиране на балансите
За да получим токени в тестовата мрежа waves, трябва да се обърнем към и да посочим адреса, на който да изпратим токените.
Адресът може да бъде намерен в IDE, разкривайки данните на акаунта.
Отделяме 10 WAVES на Bank. След това проверяваме, че те са получили чрез блокчейн и транзакционен браузър:
Сега нека раздадем токените от банката на останалите участници. (Забележка: Всички транзакции в мрежата waves не са безплатни, затова е необходим минимален положителен баланс на всички участници, за да се извършват транзакции).
1 WAVES = 100000000 единици (wavelets), тъй като сумите могат да бъдат само цели числа
0.01 WAVES (такса за транзакция) = 1000000
Bank -> [3 WAVES] -> Alice, чрез TransferTransaction (Тип: 4).
Проверяваме, че env.SEED, от който се подписват транзакциите, съответства на нашата Bank:


Ако нямате съвпадение на seed фразите, просто превключете на него в раздела Accounts и проверете отново.
След това създаваме, анонсираме и подписваме транзакцията за прехвърляне на 3 WAVES на Alice.
Можете да получите данните на Алиса също чрез променливата env.accounts. Номерацията започва от 0, следователно Алиса е env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))Резултатът може да бъде наблюдаван в браузъра, линкът към него ще ни бъде върнат веднага след изпълнението на .
Убедете се, че балансът на Alice е увеличен с 3 WAVES, а на банковия баланс остава 10 — 3 — 0.01 = 0.699.


Изпращаме по 3 WAVES на Boob и Cooper, а на Neli, Xena и Mark по 0.2 WAVES по същия начин.
(Забележка: Направихме грешка с един знак и изпратихме на Neli 0.02 WAVES. Бъдете внимателни!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))След като попълним балансите на всички участници, виждаме:

Етап 2. Създаване на dApp акаунт
Съгласихме се, че създателят и собственик на децентрализираното приложение ще бъде Алис.
В Accounts преминаваме и я установяваме като SEED и проверяваме дали env.SEED съвпада с Алис.
Нека опитаме да инсталираме на акаунта на Алис най-простия скрипт (контракт), който е възможен.
Смарт-контрактите в Waves са предикати, които забраняват или разрешават изпълнението на определен тип изходяща транзакция при определени условия. В този случай условието е — ALWAYS. Кодът на контракта е true. Извикваме deploy().

Таксата за транзакцията setScript е 1400000/100000000 = 0.014 WAVES. На баланса на Алис остава 2.986 WAVES.
Сега опитваме да инсталираме на акаунта на Алис по-сложна логика на смарт-контракта, описана в
Ride4Dapps сега включва 2 нови типа анотации:
- @Callable(i) — приема i като параметър, данни за това кой акаунт е извикал/подписал транзакцията. Резултатът от тази функция определя промяната на състоянието на dApp акаунта. Други акаунти могат да създават транзакции и да изпълняват функции с тази анотация и да променят състоянието на dApp акаунта.
- @Verifier(tx) — Верификатор на транзакцията с параметър tx на транзакцията. Съответства на логиката на предикатите от RIDE. Именно в това изразяване може да се разреши или забрани по-нататъшната промяна на логиката на смарт-контрактите на dApp акаунта.
Нека направим dApp акаунт като общ портфейл за всички участници.

За да проверим кой е активният контракт на акаунта, можем в блоковия браузър да копираме base64 кода на смарт-контракта и да го разпознаем чрез декомпилатор ()



Убедете се, че логиката на смарт-контракта отговаря на очакваното.
На баланса на Алис остава 2.972 WAVES.
Този dApp следи колко всеки от участниците внася в общия фонд чрез механизма data transaction — DataEntry(currentKey, newAmount), където currentKey е акаунтът, който извиква функцията deposit, а newAmount е стойността на попълнения баланс.
Бууб и Купър внасят депозитите си на dApp акаунта по 1 WAVES.

Правим грешка и транзакцията не преминава. Понеже, въпреки че се уверихме, че правим транзакция от името на Боб, сбъркахме индекса и посочихме акаунт Bank, на който няма смарт-контракт. Тук е важно да се отбележи, че за неуспешни опити за иницииране на транзакции се начислява такса. не се сваля! При Алиса останаха 2.972 WAVES. При Bob 3 WAVES.
Bob изпрати 1 WAVES на dApp акаунт.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
При Bob останаха 1.99 WAVES. Тоест Bob плати 0.01 WAVES такса.

При Алиса на баланса беше 2.972 WAVES, стана 3.972. На акаунт Alice също е регистрирана транзакция, но от dApp акаунт (Alice) не беше удържана такса.
След като Cooper също презареди сметката, при Алиса на баланса стана 4.972 WAVES.

Може да се разбере колко WAVES принадлежи на всеки в общия портфейл в блоковия анализатор на раздела Data.
Cooper се отказа да остави сумата от 1 WAVES в общия портфейл и реши да изтегли половината средства. За това трябва да извика функцията withdraw.

Обаче, отново сбъркахме, тъй като функцията withdraw има съвсем различни параметри, друга сигнатура. Когато проектирате смарт-контрактите на RIDE4DAPPS, следва да обърнете внимание на този момент.

При Cooper на баланса стана 2.48 WAVES. Съответно 3 WAVES — 1 — 0.01, а после + 0.5 — 0.01. Съответно всяко извикване на deposit и withdraw струва 0.01 WAVES. В крайна сметка, в таблицата на собствениците на dApps записите се промениха по следния начин.

Bob също реши да изтегли известна сума от общия портфейл, но сгреши и се опита да извлече 1.5 WAVES.

Обаче в смарт-контракта имаше проверка за такава ситуация.
Xena — мошеничка, опита се да изтегли 1 WAVES от общата сметка.

При нея също нищо не се получи.
В следващата част ще разгледаме по-сложни моменти, свързани с несъвършенството на Alice dApp акаунт.
Източник: habr.com
