
ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ!
Π ΡΠ°ΡΡΠΈ Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΈ ΡΠ°Π±ΠΎΡΠΈΠΌ Ρ dApp (Π΄Π΅ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅) Π² .
ΠΠ΅ΠΊΠ° ΡΠ΅Π³Π° ΠΌΠ°Π»ΠΊΠΎ ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½ΠΎΡΠΎ .
ΠΡΠ°ΠΏ 3. Π’Π΅ΡΡΠΈΡΠ°Π½Π΅ Π½Π° dApp Π°ΠΊΠ°ΡΠ½ΡΠ°

ΠΠΎΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ΅ Π½Π°Π±ΠΈΠ²Π°Ρ Π½Π° ΠΎΡΠΈ Ρ Alice dApp ΠΠΊΠ°ΡΠ½Ρ?
ΠΠ° ΠΏΡΡΠ²ΠΎ ΠΌΡΡΡΠΎ:
Boob ΠΈ Cooper ΠΌΠΎΠ³Π°Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΡΡ ΡΡΠ΅Π΄ΡΡΠ²Π° Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° dApp, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΏΡΠ΅Π²ΠΎΠ΄ ΠΈ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π½ΡΠΌΠ° Π΄Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Ρ Π΄ΠΎΡΡΡΠΏ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π΄ΠΎ ΡΡΡ .ΠΠ° Π²ΡΠΎΡΠΎ ΠΌΡΡΡΠΎ:
ΠΠΈΠ΅ ΠΏΠΎ Π½ΠΈΠΊΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½ Π½Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π°ΠΌΠ΅ Alice Π² ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ΡΠΎ Π½Π° ΡΡΠ΅Π΄ΡΡΠ²Π° Π±Π΅Π· ΡΡΠ³Π»Π°ΡΠΈΠ΅ Ρ Boob ΠΈΠ»ΠΈ(ΠΈ) Cooper. ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΎΡ Alice ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ.
ΠΠ΅ΠΊΠ° ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΌ Π²ΡΠΎΡΠΈΡ, ΠΊΠ°ΡΠΎ Π·Π°Π±ΡΠ°Π½ΠΈΠΌ Π½Π° Alice ΠΏΡΠ΅Π²ΠΎΠ΄ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. Π Π°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅ Ρ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡ:

οΏΌ
ΠΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈΠΌ ΠΌΠΎΠ½Π΅ΡΠΈ ΠΎΡ dApp Π½Π° Alice Ρ Π½Π΅ΠΉΠ½ΠΈΡ ΠΏΠΎΠ΄ΠΏΠΈΡ. ΠΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ Π³ΡΠ΅ΡΠΊΠ°:

ΠΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈΠΌ ΡΡΠ΅Π· ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 1000000}]}, payment: []}))Π‘ΠΊΡΠΈΠΏΡΡΡ ΡΠ°Π±ΠΎΡΠΈ ΠΈ Ρ Π²ΡΠΎΡΠΈΡ ΠΏΡΠ½ΠΊΡ ΡΠ°Π·Π±ΡΠ°Ρ ΠΌΠ΅!
ΠΡΠ°ΠΏ 4. Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ DAO Ρ Π³Π»Π°ΡΡΠ²Π°Π½Π΅
ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, Π² Π΅Π·ΠΈΠΊΠ° RIDE Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠΎΠ»Π΅ΠΊΡΠΈΠΈ (ΡΠ»ΠΎΠ²Π°ΡΠΈ-ΡΠ»ΠΎΠ²Π°ΡΠΈ, ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΈ, ΡΠ΅Π΄ΡΡΠ΅ΡΠΈ ΠΈ Π΄Ρ.). ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π·Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΏΠ»ΠΎΡΠΊΠΈ ΠΊΠΎΠ»Π΅ΠΊΡΠΈΠΈ ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π½ΠΈΠ·ΠΎΠ²Π΅, ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ Ρ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΡΡΡ Π½ΠΎΡΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅.
ΠΠΈΠ·ΠΎΠ²Π΅ΡΠ΅ ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅ΡΠ½ΠΎ Π·Π° ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½ΡΠΈΡ, Π½ΠΈΠ·ΠΎΠ²Π΅ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΡ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ.
ΠΠ΅ΠΊΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠ΅ΡΡΠΎΠ² ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ±Π΅ΡΠ΅ΠΌ ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΠΈΠ· ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΊΠ°ΠΊ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΠ²Π»ΠΈΡΠ΅ Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΎΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ°.
Π‘ΠΏΠΈΡΠ°ΠΌΠ΅ Π½Π° ΡΠΎΠ²Π°, ΡΠ΅ Alice Π½Π΅ Π΅ ΠΌΠΎΠ³Π»Π° Π΄Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Transfer, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΅ Π±ΠΈΠ»Π° Π±Π»ΠΎΠΊΠΈΡΠ°Π½Π° Π² @verifier Π·Π° ΡΠ°ΠΊΡΠ² ΡΠΈΠΏ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ.
ΠΠ΅ΠΊΠ° Π΄Π° ΠΏΠΎΡΠΏΡΠ°ΠΆΠ½ΡΠ²Π°ΠΌΠ΅ Π½ΠΈΠ·ΠΎΠ²Π΅ΡΠ΅, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ ΡΠΎΠ²Π°.
RIDE ΠΠΈΠ·ΠΎΠ²Π΅
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ° ΠΎΡΠ½ΠΎΠ²ΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½Π°, Π·Π½Π°Π΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌ Ρ Π½ΠΈΠ·ΠΎΠ²Π΅.

οΏΌ
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, ΠΈΠΌΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΡΠ»ΠΎΠΆΠ½Π° Π»ΠΎΠ³ΠΈΠΊΠ° 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-Π²Π½ΠΎΡΠΊΠΈ:

Π€ΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° Π΄Π΅ΠΏΠΎΠ·ΠΈΡ ΠΌΠ°Π»ΠΊΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:

Π‘Π΅Π³Π° Π½Π°ΡΡΡΠΏΠ²Π° Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΈΡΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π² Π΄Π΅ΠΉΠ½ΠΎΡΡΡΠ° Π½Π° DAO β Π³Π»Π°ΡΡΠ²Π°Π½Π΅ΡΠΎ Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π·Π° ΡΠΈΠ½Π°Π½ΡΠΈΡΠ°Π½Π΅.
ΠΠΎΠ± Π³Π»Π°ΡΡΠ²Π° Π·Π° ΠΏΡΠΎΠ΅ΠΊΡ ΠΠ΅Π»ΠΈ Π½Π° 500000 wavelets:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))
Π Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π·Π°ΠΏΠΈΡΠΈ Π·Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΠ΅Π»ΠΈ:

ΠΡΠΏΡΡ ΡΡΡΠΎ Π³Π»Π°ΡΡΠ²Π° Π·Π° ΠΏΡΠΎΠ΅ΠΊΡ ΠΠ΅Π»ΠΈ.

ΠΠ΅ΠΊΠ° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ ΠΊΠΎΠ΄Π° Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° getFunds. ΠΠ΅Π»ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ±Π΅ΡΠ΅ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 2 Π³Π»Π°ΡΠ°, Π·Π° Π΄Π° ΠΈΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π° ΠΎΡ DAO.

ΠΠ΅Π»ΠΈ ΠΏΠ»Π°Π½ΠΈΡΠ° Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°ΡΠ° ΠΎΡ ΠΏΠΎΠ²Π΅ΡΠ΅Π½Π°ΡΠ° Ρ ΡΡΠΌΠ°:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"getFunds",args:[{type:"integer", value: 500000}]}, payment: []}))
Π’Ρ ΡΡΠΏΡΠ²Π°, Ρ.Π΅. DAO ΡΠ°Π±ΠΎΡΠΈ!
Π Π°Π·Π³Π»Π΅Π΄Π°Ρ
ΠΌΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° DAO Π½Π° Π΅Π·ΠΈΠΊΠ° RIDE4DAPPS.
Π ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΡΠ°ΡΡΠΈ ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Ρ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄Π° ΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ»ΡΡΠ°ΠΈ.
ΠΡΠ»Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΊΠΎΠ΄Π° Π²
# 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
}
}
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
