Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)

Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ Π½Π° всички!

Π’ ΠΏΡŠΡ€Π²Π°Ρ‚Π° части Π½ΠΈΠ΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°Π·Π³Π»Π΅Π΄Π°Ρ…ΠΌΠ΅ ΠΊΠ°ΠΊ Π΄Π° създавамС ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌ с dApp (Π΄Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅) Π² Waves RIDE IDE.

НСка сСга ΠΌΠ°Π»ΠΊΠΎ тСствамС Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π½ΠΎΡ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Π•Ρ‚Π°ΠΏ 3. ВСстиранС Π½Π° dApp Π°ΠΊΠ°ΡƒΠ½Ρ‚Π°

Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)

Кои ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π²Π΅Π΄Π½Π°Π³Π° сС Π½Π°Π±ΠΈΠ²Π°Ρ‚ Π½Π° ΠΎΡ‡ΠΈ с Alice dApp Акаунт?
На ΠΏΡŠΡ€Π²ΠΎ място:
Boob ΠΈ Cooper ΠΌΠΎΠ³Π°Ρ‚ случайно Π΄Π° изпратят срСдства Π½Π° адрСса Π½Π° dApp, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΏΡ€Π΅Π²ΠΎΠ΄ ΠΈ ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ няма Π΄Π° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ Π΄ΠΎΡΡ‚ΡŠΠΏ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π΄ΠΎ тях.

На Π²Ρ‚ΠΎΡ€ΠΎ място:
НиС ΠΏΠΎ никакъв Π½Π°Ρ‡ΠΈΠ½ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π°ΠΌΠ΅ Alice Π² изтСглянСто Π½Π° срСдства Π±Π΅Π· съгласиС с Boob ΠΈΠ»ΠΈ(ΠΈ) Cooper. ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Π΅ всички Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ Alice Ρ‰Π΅ сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚.

НСка ΠΏΠΎΠΏΡ€Π°Π²ΠΈΠΌ втория, ΠΊΠ°Ρ‚ΠΎ Π·Π°Π±Ρ€Π°Π½ΠΈΠΌ Π½Π° Alice ΠΏΡ€Π΅Π²ΠΎΠ΄ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Π Π°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅ с коригирания скрипт:
Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)
οΏΌ
ΠžΠΏΠΈΡ‚Π²Π°ΠΌΠ΅ Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈΠΌ ΠΌΠΎΠ½Π΅Ρ‚ΠΈ ΠΎΡ‚ dApp Π½Π° Alice с нСйния подпис. ΠŸΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Π³Ρ€Π΅ΡˆΠΊΠ°:
Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)

ΠžΠΏΠΈΡ‚Π²Π°ΠΌΠ΅ Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈΠΌ Ρ‡Ρ€Π΅Π· изтСглянС:

broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 1000000}]}, payment: []}))

Π‘ΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ с втория ΠΏΡƒΠ½ΠΊΡ‚ Ρ€Π°Π·Π±Ρ€Π°Ρ…ΠΌΠ΅!

Π•Ρ‚Π°ΠΏ 4. БъздавамС DAO с гласуванС

Π—Π° съТалСниС, Π² Π΅Π·ΠΈΠΊΠ° RIDE всС ΠΎΡ‰Π΅ Π½Π΅ са ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с ΠΊΠΎΠ»Π΅ΠΊΡ†ΠΈΠΈ (словари-словари, ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ, Ρ€Π΅Π΄ΡŽΡΠ΅Ρ€ΠΈ ΠΈ Π΄Ρ€.). Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π·Π° всякакви ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с плоски ΠΊΠΎΠ»Π΅ΠΊΡ†ΠΈΠΈ ΠΊΠ»ΡŽΡ‡-стойност ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°ΠΌΠ΅ систСма Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Π½ΠΈΠ·ΠΎΠ²Π΅, ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ с ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ ΠΈ тяхното Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅.

НизовСтС са ΠΌΠ½ΠΎΠ³ΠΎ лСсно Π·Π° конкатСнция, Π½ΠΈΠ·ΠΎΠ²Π΅Ρ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС раздСлят ΠΏΠΎ индСкси.
НСка Π² качСството Π½Π° тСстов ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡΡŠΠ±Π΅Ρ€Π΅ΠΌ ΠΈ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΠΈΠ· ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ повлияС Π½Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° ΠΎΡ‚ транзакцията.
Π‘ΠΏΠΈΡ€Π°ΠΌΠ΅ Π½Π° Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ Alice Π½Π΅ Π΅ ΠΌΠΎΠ³Π»Π° Π΄Π° подпишС транзакция Transfer, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π°Π·ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΅ Π±ΠΈΠ»Π° Π±Π»ΠΎΠΊΠΈΡ€Π°Π½Π° Π² @verifier Π·Π° Ρ‚Π°ΠΊΡŠΠ² Ρ‚ΠΈΠΏ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

НСка Π΄Π° поупраТнявамС Π½ΠΈΠ·ΠΎΠ²Π΅Ρ‚Π΅, Π° слСд Ρ‚ΠΎΠ²Π° Π΄Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌ Ρ‚ΠΎΠ²Π°.

RIDE НизовС

Вранзакцията ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π΅ възмоТна, Π·Π½Π°Π΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌ с Π½ΠΈΠ·ΠΎΠ²Π΅.
Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)

οΏΌ
Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, ΠΈΠΌΠ°ΠΌΠ΅ всичко Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° написванС Π½Π° слоТна Π»ΠΎΠ³ΠΈΠΊΠ° DAO dApp.

Π”Π°Π½Π½ΠΈ Π·Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

Π”Π°Π½Π½ΠΈ Π·Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ:
β€œΠœΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΈΡΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π° ΠΊΠ»ΡŽΡ‡ Π΅ 100 символа, Π° ΠΊΠ»ΡŽΡ‡ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ символи Π½Π° Unicode, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Π½Π΅ΠΏΡ€ΠΈΠ½Ρ‚ΠΈΡ€Π°Ρ‰ΠΈ символи. БтойноститС Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅Ρ‚Π΅ ΠΈΠΌΠ°Ρ‚ Π»ΠΈΠΌΠΈΡ‚ ΠΎΡ‚ 32,768 Π±Π°ΠΉΡ‚Π° ΠΈ максималният Π±Ρ€ΠΎΠΉ възмоТни записи Π² Π΄Π°Π½ΡŠΡ‡Π½Π°Ρ‚Π° транзакция Π΅ 100. ΠžΠ±Ρ‰ΠΈΡΡ‚ максималСн Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° Π΄Π°Π½ΡŠΡ‡Π½Π°Ρ‚Π° транзакция Π΅ ΠΎΠΊΠΎΠ»ΠΎ 140kb β€” Π·Π° справка, ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Π΄ΡŠΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° пиСсата Π½Π° ШСкспир 'Π ΠΎΠΌΠ΅ΠΎ ΠΈ Π–ΡƒΠ»ΠΈΠ΅Ρ‚Π°'.”

БъздавамС DAO ΠΏΡ€ΠΈ слСднитС условия:
Π—Π° Π΄Π° ΠΌΠΎΠΆΠ΅ стартиращото прСдприятиС Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈ финансиранС, ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΉΠΊΠΈ getFunds() Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π΅ ΠΏΠΎΠ΄ΠΊΡ€Π΅ΠΏΠ°Ρ‚Π° Π½Π° ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 2 участници β€” инвСститори Π² DAO. ИзвСТданС Π½Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π°, ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΎΠ±Ρ‰ΠΎ са посочили Π½Π° гласуванСто собствСницитС Π½Π° DAO.

НСка създадСм 3 Ρ‚ΠΈΠΏΠ° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π»ΠΎΠ³ΠΈΠΊΠ° Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с баланситС Π² 2 Π½ΠΎΠ²ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ vote ΠΈ getFunds:
xx…xx_ia = инвСститори, Π½Π°Π»ΠΈΡ‡Π΅Π½ баланс (vote, deposit, withdrawal)
xx…xx_sv = стартиращи ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, Π±Ρ€ΠΎΠΉ гласовС (vote, getFunds)
xx…xx_sf = стартиращи ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, Π±Ρ€ΠΎΠΉ гласовС (vote, getFunds)
xx…xx = ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ адрСс (35 символа)

ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Π΅ Π² Vote Π½ΠΈ сС Π½Π°Π»ΠΎΠΆΠΈ Π΄Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Π²Π΅Π΄Π½Π°Π³Π° няколко ΠΏΠΎΠ»Π΅Ρ‚Π°:

WriteSet([DataEntry(key1, value1), DataEntry(key2, value2)]),

WriteSet Π½ΠΈ позволява Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ няколко записа Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Π΅Π΄Π½Π° invokeScript транзакция.

Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° ΠΊΠ»ΡŽΡ‡-стойност DAO dApp, слСд ΠΊΠ°Ρ‚ΠΎ Π‘ΠΎΠ± ΠΈ ΠšΡƒΠΏΡŠΡ€ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…Π° вноскитС си ia-вноски:
Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)

Ѐункцията Π·Π° Π΄Π΅ΠΏΠΎΠ·ΠΈΡ‚ ΠΌΠ°Π»ΠΊΠΎ сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ:
Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)

Π‘Π΅Π³Π° Π½Π°ΡΡ‚ΡŠΠΏΠ²Π° Π½Π°ΠΉ-ваТният ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² дСйността Π½Π° DAO β€” гласуванСто Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π·Π° финансиранС.

Π‘ΠΎΠ± гласува Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ НСли Π½Π° 500000 wavelets:

broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))

Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)

Π’ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ всички Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ записи Π·Π° адрСса Π½Π° НСли:
Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)
ΠšΡƒΠΏΡŠΡ€ ΡΡŠΡ‰ΠΎ гласува Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ НСли.
Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)

НСка ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ ΠΊΠΎΠ΄Π° Π½Π° функцията getFunds. НСли трябва Π΄Π° ΡΡŠΠ±Π΅Ρ€Π΅ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 2 гласа, Π·Π° Π΄Π° ΠΈΠΌΠ° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈ срСдства ΠΎΡ‚ DAO.
Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)

НСли ΠΏΠ»Π°Π½ΠΈΡ€Π° Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°Ρ‚Π° ΠΎΡ‚ ΠΏΠΎΠ²Π΅Ρ€Π΅Π½Π°Ρ‚Π° ѝ сума:

broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"getFunds",args:[{type:"integer", value: 500000}]}, payment: []}))

Π£Ρ‡ΠΈΠΌ сС Π΄Π° пишСм смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈ Π·Π° Waves Π½Π° RIDE ΠΈ RIDE4DAPPS. Част 2 (DAO β€” Π”Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π° организация)

Вя успява, Ρ‚.Π΅. DAO Ρ€Π°Π±ΠΎΡ‚ΠΈ!

Π Π°Π·Π³Π»Π΅Π΄Π°Ρ…ΠΌΠ΅ процСса Π½Π° създаванС Π½Π° DAO Π½Π° Π΅Π·ΠΈΠΊΠ° RIDE4DAPPS.
Π’ слСдващитС части Ρ‰Π΅ сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ с Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ΄Π° ΠΈ тСстванСто Π½Π° случаи.

ΠŸΡŠΠ»Π½Π°Ρ‚Π° вСрсия Π½Π° ΠΊΠΎΠ΄Π° Π² Waves RIDE IDE:

# In this example multiple accounts can deposit their funds to DAO and safely take them back, no one can interfere with this.
# DAO participants can also vote for particular addresses and let them withdraw invested funds then quorum has reached.
# An inner state is maintained as mapping `address=>waves`.
# https://medium.com/waves-lab/waves-announces-funding-for-ride-for-dapps-developers-f724095fdbe1

# You can try this contract by following commands in the IDE (ide.wavesplatform.com)
# Run commands as listed below
# From account #0:
#      deploy()
# From account #1: deposit funds
#      broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
# From account #2: deposit funds
#      broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
# From account #1: vote for startup
#      broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))
# From account #2: vote for startup
#      broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))
# From account #3: get invested funds
#      broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"getFunds",args:[{type:"integer", value: 500000}]}, payment: []}))

{-# STDLIB_VERSION 3 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}

@Callable(i)
func deposit() = {
   let pmt = extract(i.payment)
   if (isDefined(pmt.assetId)) then throw("can hodl waves only at the moment")
   else {
        let currentKey = toBase58String(i.caller.bytes)
        let xxxInvestorBalance = currentKey + "_" + "ib"
        let currentAmount = match getInteger(this, xxxInvestorBalance) {
            case a:Int => a
            case _ => 0
        }
        let newAmount = currentAmount + pmt.amount
        WriteSet([DataEntry(xxxInvestorBalance, newAmount)])
   }
}
@Callable(i)
func withdraw(amount: Int) = {
        let currentKey = toBase58String(i.caller.bytes)
        let xxxInvestorBalance = currentKey + "_" + "ib"
        let currentAmount = match getInteger(this, xxxInvestorBalance) {
            case a:Int => a
            case _ => 0
        }
        let newAmount = currentAmount - amount
     if (amount < 0)
            then throw("Can't withdraw negative amount")
    else if (newAmount < 0)
            then throw("Not enough balance")
            else ScriptResult(
                    WriteSet([DataEntry(xxxInvestorBalance, newAmount)]),
                    TransferSet([ScriptTransfer(i.caller, amount, unit)])
                )
    }
@Callable(i)
func getFunds(amount: Int) = {
        let quorum = 2
        let currentKey = toBase58String(i.caller.bytes)
        let xxxStartupFund = currentKey + "_" + "sf"
        let xxxStartupVotes = currentKey + "_" + "sv"
        let currentAmount = match getInteger(this, xxxStartupFund) {
            case a:Int => a
            case _ => 0
        }
        let totalVotes = match getInteger(this, xxxStartupVotes) {
            case a:Int => a
            case _ => 0
        }
        let newAmount = currentAmount - amount
    if (amount < 0)
            then throw("Can't withdraw negative amount")
    else if (newAmount < 0)
            then throw("Not enough balance")
    else if (totalVotes < quorum)
            then throw("Not enough votes. At least 2 votes required!")
    else ScriptResult(
                    WriteSet([
                        DataEntry(xxxStartupFund, newAmount)
                        ]),
                    TransferSet([ScriptTransfer(i.caller, amount, unit)])
                )
    }
@Callable(i)
func vote(amount: Int, address: String) = {
        let currentKey = toBase58String(i.caller.bytes)
        let xxxInvestorBalance = currentKey + "_" + "ib"
        let xxxStartupFund = address + "_" + "sf"
        let xxxStartupVotes = address + "_" + "sv"
        let currentAmount = match getInteger(this, xxxInvestorBalance) {
            case a:Int => a
            case _ => 0
        }
        let currentVotes = match getInteger(this, xxxStartupVotes) {
            case a:Int => a
            case _ => 0
        }
        let currentFund = match getInteger(this, xxxStartupFund) {
            case a:Int => a
            case _ => 0
        }
    if (amount <= 0)
            then throw("Can't withdraw negative amount")
    else if (amount > currentAmount)
            then throw("Not enough balance")
    else ScriptResult(
                    WriteSet([
                        DataEntry(xxxInvestorBalance, currentAmount - amount),
                        DataEntry(xxxStartupVotes, currentVotes + 1),
                        DataEntry(xxxStartupFund, currentFund + amount)
                        ]),
                    TransferSet([ScriptTransfer(i.caller, amount, unit)])
            )
    }
@Verifier(tx)
func verify() = {
    match tx {
        case t: TransferTransaction =>false
        case _ => true
    }
}

ΠŸΡŠΡ€Π²Π° част
ΠšΠΎΠ΄ΡŠΡ‚ Π² GitHub
Waves RIDE IDE
Анонс Π½Π° Π³Ρ€Π°Π½Ρ‚ΠΎΠ²Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster