Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

Здравейте на всички!

Съвсем наскоро Waves Labs обяви обяви конкурс за разработчици, свързан с пускането на тестовата мрежа на разширението на езика за смарт-контракти RIDE за децентрализирани приложения Ride4Dapps!

Избрахме случая с DAO, тъй като Ventuary планира да разработва dApp с социални функции: гласуване, набиране на средства, доверително управление и др.
Започнахме с прост пример в Q&A сесии и в RIDE IDE — пример с общ портфейл.

Нека разгледаме този пример, проверим хипотезите и разгледаме някои странности:

Нека имаме Alice — собственик на dApp
Boob и Cooper — партньори на Alice, съоснователи на Alice-BC DAO
Neli — собственик на бизнес, който се нуждае от финансиране
Bank — банка, която раздава токени

Етап 1. Инициализиране на балансите

За да получим токени в тестовата мрежа waves, трябва да се обърнем към faucet и да посочим адреса, на който да изпратим токените.
Адресът може да бъде намерен в IDE, разкривайки данните на акаунта.
Отделяме 10 WAVES на Bank. След това проверяваме, че те са получили чрез блокчейн и транзакционен браузър: блокчейн браузър

Сега нека раздадем токените от банката на останалите участници. (Забележка: Всички транзакции в мрежата waves не са безплатни, затова е необходим минимален положителен баланс на всички участници, за да се извършват транзакции).

1 WAVES = 100000000 единици (wavelets), тъй като сумите могат да бъдат само цели числа
0.01 WAVES (такса за транзакция) = 1000000

Bank -> [3 WAVES] -> Alice, чрез TransferTransaction (Тип: 4).

Проверяваме, че env.SEED, от който се подписват транзакциите, съответства на нашата Bank:
Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

Ако нямате съвпадение на seed фразите, просто превключете на него в раздела Accounts и проверете отново.
След това създаваме, анонсираме и подписваме транзакцията за прехвърляне на 3 WAVES на Alice.
Можете да получите данните на Алиса също чрез променливата env.accounts. Номерацията започва от 0, следователно Алиса е env.accounts[1].
Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))

Резултатът може да бъде наблюдаван в браузъра, линкът към него ще ни бъде върнат веднага след изпълнението на транзакцията.

Убедете се, че балансът на Alice е увеличен с 3 WAVES, а на банковия баланс остава 10 — 3 — 0.01 = 0.699.
Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

Изпращаме по 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}))

След като попълним балансите на всички участници, виждаме:
Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

Етап 2. Създаване на dApp акаунт

Съгласихме се, че създателят и собственик на децентрализираното приложение ще бъде Алис.
В Accounts преминаваме и я установяваме като SEED и проверяваме дали env.SEED съвпада с Алис.

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

Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

Таксата за транзакцията setScript е 1400000/100000000 = 0.014 WAVES. На баланса на Алис остава 2.986 WAVES.

Сега опитваме да инсталираме на акаунта на Алис по-сложна логика на смарт-контракта, описана в примера

Ride4Dapps сега включва 2 нови типа анотации:

  1. @Callable(i) — приема i като параметър, данни за това кой акаунт е извикал/подписал транзакцията. Резултатът от тази функция определя промяната на състоянието на dApp акаунта. Други акаунти могат да създават транзакции и да изпълняват функции с тази анотация и да променят състоянието на dApp акаунта.
  2. @Verifier(tx) — Верификатор на транзакцията с параметър tx на транзакцията. Съответства на логиката на предикатите от RIDE. Именно в това изразяване може да се разреши или забрани по-нататъшната промяна на логиката на смарт-контрактите на dApp акаунта.

Нека направим dApp акаунт като общ портфейл за всички участници.
Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

За да проверим кой е активният контракт на акаунта, можем в блоковия браузър да копираме base64 кода на смарт-контракта и да го разпознаем чрез декомпилатор (например)
Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)
Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)
Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

Убедете се, че логиката на смарт-контракта отговаря на очакваното.
На баланса на Алис остава 2.972 WAVES.

Този dApp следи колко всеки от участниците внася в общия фонд чрез механизма data transaction — DataEntry(currentKey, newAmount), където currentKey е акаунтът, който извиква функцията deposit, а newAmount е стойността на попълнения баланс.

Бууб и Купър внасят депозитите си на dApp акаунта по 1 WAVES.
Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

Правим грешка и транзакцията не преминава. Понеже, въпреки че се уверихме, че правим транзакция от името на Боб, сбъркахме индекса и посочихме акаунт 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 }]}))

Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

При Bob останаха 1.99 WAVES. Тоест Bob плати 0.01 WAVES такса.

Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

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

Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

Може да се разбере колко WAVES принадлежи на всеки в общия портфейл в блоковия анализатор на раздела Data.

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

Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

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

Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

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

Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

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

Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

Обаче в смарт-контракта имаше проверка за такава ситуация.

Xena — мошеничка, опита се да изтегли 1 WAVES от общата сметка.

Учим се да пишем Waves смарт-контракти на RIDE и RIDE4DAPPS. Част 1 (Многопотребителски портфейл)

При нея също нищо не се получи.

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

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster