ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ!
Π
ΠΠ΅ΠΊΠ° ΡΠ΅Π³Π° ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΠΌΠ°Π»ΠΊΠΎ ΡΠ°Π·Π³Π»ΠΎΠ±Π΅Π½ΠΎΡΠΎ
ΠΡΠ°ΠΏ 3. Π’Π΅ΡΡΠ²Π°Π½Π΅ Π½Π° dApp Π°ΠΊΠ°ΡΠ½ΡΠ°
ΠΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ΅ Π²ΡΡΡΠ²Π°Ρ ΠΊΡΠΌ Π³Π»Π°ΡΠΎΠ²Π΅ΡΠ΅ Ρ ΠΠ»ΠΈΡ DAPP Π‘ΠΌΠ΅ΡΠΊΠ°?
ΠΠ° ΠΏΡΡΠ²ΠΎ ΠΌΡΡΡΠΎ:
Boob ΠΈ Cooper ΠΌΠΎΠ³Π°Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΡΡ ΡΡΠ΅Π΄ΡΡΠ²Π° Π½Π° Π°Π΄ΡΠ΅Ρ Π½Π° dApp, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π½ΠΎΡΠΌΠ°Π»Π΅Π½ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠ½Π΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΈ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π½ΡΠΌΠ° Π΄Π° ΠΈΠΌΠ°ΡΠ΅ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ.ΠΠ° Π²ΡΠΎΡΠΎ ΠΌΡΡΡΠΎ:
ΠΠΈΠ΅ ΠΏΠΎ Π½ΠΈΠΊΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½ Π½Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π°ΠΌΠ΅ Alice Π΄Π° ΡΠ΅Π³Π»ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π° Π±Π΅Π· ΡΡΠ³Π»Π°ΡΠΈΠ΅ΡΠΎ Π½Π° Boob ΠΈ/ΠΈΠ»ΠΈ Cooper. Π’ΡΠΉ ΠΊΠ°ΡΠΎ, ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ°, Π²ΡΠΈΡΠΊΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΎΡ Alice ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ.
ΠΠ΅ΠΊΠ° ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΌ 2, ΠΊΠ°ΡΠΎ Π·Π°Π±ΡΠ°Π½ΠΈΠΌ Alice ΠΏΡΠ΅Ρ
Π²ΡΡΠ»ΡΠ½Π΅ ΡΠ΄Π΅Π»ΠΊΠΈ. Π Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅ΡΠ΅ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡ:
οΏΌ
ΠΠΏΠΈΡΠ²Π°ΠΌΠ΅ ΡΠ΅ Π΄Π° ΡΠ΅Π³Π»ΠΈΠΌ ΠΌΠΎΠ½Π΅ΡΠΈ Ρ dApp Alice ΠΈ Π½Π΅ΠΉΠ½ΠΈΡ ΠΏΠΎΠ΄ΠΏΠΈΡ. ΠΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ Π³ΡΠ΅ΡΠΊΠ°:
ΠΠΏΠΈΡ Π·Π° ΡΠ΅Π³Π»Π΅Π½Π΅ ΡΡΠ΅Π· ΡΠ΅Π³Π»Π΅Π½Π΅:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 1000000}]}, payment: []}))
Π‘ΠΊΡΠΈΠΏΡΡΡ ΡΠ°Π±ΠΎΡΠΈ ΠΈ ΡΠ°Π·Π±ΡΠ°Ρ ΠΌΠ΅ 2-ΡΠ° ΡΠΎΡΠΊΠ°!
ΠΡΠ°ΠΏ 4. Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ DAO Ρ Π³Π»Π°ΡΡΠ²Π°Π½Π΅
ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, Π΅Π·ΠΈΠΊΡΡ RIDE Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠΎΠ»Π΅ΠΊΡΠΈΠΈ (ΡΠ΅ΡΠ½ΠΈΡΠΈ, ΡΠ΅ΡΠ½ΠΈΡΠΈ, ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΈ, ΡΠ΅Π΄ΡΠΊΡΠΎΡΠΈ ΠΈ Π΄Ρ.). ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π·Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΡΡΡ Ρ ΠΏΠ»ΠΎΡΠΊΠΈ ΠΊΠΎΠ»Π΅ΠΊΡΠΈΠΈ ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π½ΠΈΠ·ΠΎΠ²Π΅, ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ Ρ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΡΡΡ Π½ΠΎΡΠΎ Π΄Π΅ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅.
ΠΠΈΠ·ΠΎΠ²Π΅ΡΠ΅ ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅ΡΠ½ΠΈ Π·Π° ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΡ, Π½ΠΈΠ·ΠΎΠ²Π΅ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ ΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ.
ΠΠ΅ΠΊΠ° ΡΡΠ±Π΅ΡΠ΅ΠΌ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π½ΠΈΠ·Π° ΠΊΠ°ΡΠΎ ΡΠ΅ΡΡΠΎΠ² ΡΠ»ΡΡΠ°ΠΉ ΠΈ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΊΠ°ΠΊ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ΅ ΠΎΡΡΠ°Π·ΠΈ Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΎΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ°.
Π‘ΠΏΡΡΡ
ΠΌΠ΅ ΡΠ΅ Π½Π° ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΠ»ΠΈΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ° Π·Π° ΠΏΡΠ΅Ρ
Π²ΡΡΠ»ΡΠ½Π΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π±Π΅ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠ°Π½Π° Π² @verifier Π·Π° ΡΠΎΠ·ΠΈ ΡΠΈΠΏ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ.
ΠΠ΅ΠΊΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΡΠ²Π°ΠΌΠ΅ Ρ Π½ΠΈΠ·ΠΎΠ²Π΅ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ ΡΠΎΠ²Π°.
RIDE Π‘ΡΡΡΠ½ΠΈ
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ° ΠΎΡΠ½ΠΎΠ²ΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½Π°, Π·Π½Π°Π΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌ Ρ Π½ΠΈΠ·ΠΎΠ²Π΅.
οΏΌ
ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ»ΠΎΠΆΠ½Π° Π»ΠΎΠ³ΠΈΠΊΠ° DAO dApp.
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Ρ Π΄Π°Π½Π½ΠΈ
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Ρ Π΄Π°Π½Π½ΠΈ:
βΠΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΠΊΠ»ΡΡ Π΅ 100 Π·Π½Π°ΠΊΠ° ΠΈ ΠΊΠ»ΡΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ΄ΡΡΠΆΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Unicode ΠΊΠΎΠ΄ΠΎΠ²ΠΈ ΡΠΎΡΠΊΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ ΠΈ Π΄ΡΡΠ³ΠΈ Π½Π΅ΠΏΠ΅ΡΠ°ΡΠ°Π΅ΠΌΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ. Π‘ΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅ΡΠ΅ ΠΈΠΌΠ°Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΎΡ 32,768 100 Π±Π°ΠΉΡΠ° ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΈΡΡ Π±ΡΠΎΠΉ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Ρ Π΄Π°Π½Π½ΠΈ Π΅ 140. ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Ρ Π΄Π°Π½Π½ΠΈ Π΅ ΠΎΠΊΠΎΠ»ΠΎ XNUMX kb β Π·Π° ΡΠΏΡΠ°Π²ΠΊΠ°, ΠΏΠΎΡΡΠΈ ΡΠΎΡΠ½ΠΎ ΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° ΠΏΠΈΠ΅ΡΠ°ΡΠ° Π½Π° Π¨Π΅ΠΊΡΠΏΠΈΡ βΠ ΠΎΠΌΠ΅ΠΎ ΠΈ ΠΡΠ»ΠΈΠ΅ΡΠ°β '.
ΠΠΈΠ΅ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ DAO ΡΡΡ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ:
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΅Π΄ΠΈΠ½ ΡΡΠ°ΡΡΡΠΏ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈ ΡΠΈΠ½Π°Π½ΡΠΈΡΠ°Π½Π΅ ΡΡΠ΅Π· ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ getFunds() Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠ° Π΅ ΠΏΠΎΠ΄ΠΊΡΠ΅ΠΏΠ°ΡΠ° Π½Π° ΠΏΠΎΠ½Π΅ 2 ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ° - DAO ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΎΡΠΈ. Π’Π΅Π³Π»Π΅Π½Π΅ ΡΠ΅ Π±ΡΠ΄Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΠ½ΠΎ ΡΠΎΠ»ΠΊΠΎΠ²Π°, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π΅ ΡΡΠΌΠ°ΡΠ°, ΠΏΠΎΡΠΎΡΠ΅Π½Π° Π½Π° Π³Π»Π°ΡΡΠ²Π°Π½Π΅ Π‘ΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡΠΈ Π½Π° DAO.
ΠΠ΅ΠΊΠ° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ 3 Π²ΠΈΠ΄Π° ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π»ΠΎΠ³ΠΈΠΊΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π±Π°Π»Π°Π½ΡΠΈ Π² 2 Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ vote ΠΈ getFunds:
Ρ Ρ β¦Ρ Ρ _ia = ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΎΡΠΈ, Π½Π°Π»ΠΈΡΠ΅Π½ Π±Π°Π»Π°Π½Ρ (Π³Π»Π°ΡΡΠ²Π°Π½Π΅, Π΄Π΅ΠΏΠΎΠ·ΠΈΡ, ΡΠ΅Π³Π»Π΅Π½Π΅)
Ρ Ρ β¦Ρ Ρ _ΡΠ² = ΡΡΠ°ΡΡΠΈΡΠ°ΡΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, Π±ΡΠΎΠΉ Π³Π»Π°ΡΠΎΠ²Π΅ (Π³Π»Π°ΡΡΠ²Π°Π½Π΅, getFunds)
Ρ Ρ β¦Ρ Ρ _sf = ΡΡΠ°ΡΡΠΈΡΠ°ΡΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, Π±ΡΠΎΠΉ Π³Π»Π°ΡΠΎΠ²Π΅ (Π³Π»Π°ΡΡΠ²Π°Π½Π΅, getFunds)
xxβ¦xx = ΠΎΠ±ΡΠ΅ΡΡΠ²Π΅Π½ Π°Π΄ΡΠ΅Ρ (35 Π·Π½Π°ΠΊΠ°)
ΠΠ°Π±Π΅Π»Π΅ΠΆΠ΅ΡΠ΅ Π² Vote, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΠΎΠ»Π΅ΡΠ° Π½Π°Π²Π΅Π΄Π½ΡΠΆ:
WriteSet([DataEntry(key1, value1), DataEntry(key2, value2)]),
WriteSet Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΡΠ°Π²ΠΈΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π·Π°ΠΏΠΈΡΠ° Π½Π°Π²Π΅Π΄Π½ΡΠΆ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ invokeScript ΡΠ΄Π΅Π»ΠΊΠΈ.
ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π·Π° ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π° DAO dApp ΡΠ»Π΅Π΄ ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΠΎΠ± ΠΈ ΠΡΠΏΡΡ ia- Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠΈ:
ΠΠ°ΡΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π·Π° Π΄Π΅ΠΏΠΎΠ·ΠΈΡ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π»Π΅ΠΊΠΎ:
Π‘Π΅Π³Π° ΠΈΠ΄Π²Π° Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΈΡΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π² Π΄Π΅ΠΉΠ½ΠΎΡΡΡΠ° Π½Π° DAO - Π³Π»Π°ΡΡΠ²Π°ΠΉΡΠ΅ Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π·Π° ΡΠΈΠ½Π°Π½ΡΠΈΡΠ°Π½Π΅.
ΠΠΎΠ± Π³Π»Π°ΡΡΠ²Π° Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Neli Π½Π° 500000 XNUMX Π²ΡΠ»Π½ΠΈ:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))
Π Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π·Π° Π΄Π°Π½Π½ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π·Π°ΠΏΠΈΡΠΈ Π·Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° Neli:
ΠΡΠΏΡΡ ΡΡΡΠΎ Π³Π»Π°ΡΡΠ²Π° Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΠ΅Π»ΠΈ.
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡ ΠΊΠΎΠ΄ 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
}
}
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com