RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (DAO - āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻž)

RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (DAO - āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻž)

āĻšā§āϝāĻžāϞ⧋ āϏāĻŦāĻžāχ!

В āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ⧇, āφāĻŽāϰāĻž āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤāĻ­āĻžāĻŦ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧇āĻ›āĻŋ āϝ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ dApp (āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ•ā§ƒāϤ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ) āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āĻāĻŦāĻ‚ āĻāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āϤāϰāĻ™ā§āĻ— āϰāĻžāχāĻĄ IDE.

āĻāϰ āĻāĻ–āύ āĻāĻ•āϟ⧁ disassembled āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āϝāĻžāĻ• āωāĻĻāĻžāĻšāϰāĻŖ.

āĻĒāĻ°ā§āϝāĻžāϝāĻŧ 3. dApp āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž

RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (DAO - āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻž)

āϕ⧀ āϏāĻŽāĻ¸ā§āϝāĻž āĻ…āĻŦāĻŋāϞāĻŽā§āĻŦ⧇ āĻ…ā§āϝāĻžāϞāĻŋāϏ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻŖā§āϠ⧇ āϛ⧁āĻŸā§‡ āφāϏ⧇ āĻĄāĻŋāĻāĻĒāĻŋ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āύ⧇āχ?
āĻĒā§āϰāĻĨāĻŽā§‡:
Boob āĻāĻŦāĻ‚ Cooper āϘāϟāύāĻžāĻ•ā§āϰāĻŽā§‡ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ dApp āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āϤāĻšāĻŦāĻŋāϞ āĻĒāĻžāĻ āĻžāϤ⧇ āĻĒāĻžāϰ⧇ āĻšāĻ¸ā§āϤāĻžāĻ¨ā§āϤāϰ āϞ⧇āύāĻĻ⧇āύ āĻāĻŦāĻ‚ āĻāχāĻ­āĻžāĻŦ⧇ āϤāĻžāĻĻ⧇āϰ āĻĢāĻŋāϰ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāĻŦ⧇ āύāĻž.

āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧāϤ:
āĻŦ⧁āĻŦ āĻāĻŦāĻ‚/āĻ…āĻĨāĻŦāĻž āϕ⧁āĻĒāĻžāϰ⧇āϰ āϏāĻŽā§āĻŽāϤāĻŋ āĻŦā§āϝāϤ⧀āϤ āφāĻŽāϰāĻž āĻ…ā§āϝāĻžāϞāĻŋāϏāϕ⧇ āϤāĻšāĻŦāĻŋāϞ āωāĻ¤ā§āϤ⧋āϞāύ āĻĨ⧇āϕ⧇ āϕ⧋āύ⧋āĻ­āĻžāĻŦ⧇āχ āϏ⧀āĻŽāĻžāĻŦāĻĻā§āϧ āĻ•āϰāĻŋ āύāĻžāĨ¤ āϝ⧇āĻšā§‡āϤ⧁, āϝāĻžāϚāĻžāχ āĻ•āϰāĻžāϰ āĻĻāĻŋāϕ⧇ āĻŽāύ⧋āϝ⧋āĻ— āĻĻāĻŋāύ, āĻāϞāĻŋāϏ āĻĨ⧇āϕ⧇ āϏāĻŽāĻ¸ā§āϤ āϞ⧇āύāĻĻ⧇āύ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤

āĻāϞāĻŋāϏ āύāĻŋāώāĻŋāĻĻā§āϧ āĻ•āϰ⧇ 2 āĻ āĻŋāĻ• āĻ•āϰāĻž āϝāĻžāĻ• āĻšāĻ¸ā§āϤāĻžāĻ¨ā§āϤāϰ āϞ⧇āύāĻĻ⧇āύ āϏāĻ‚āĻļā§‹āϧāύ āĻ•āϰāĻž āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ:
RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (DAO - āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻž)
īŋŧ
āφāĻŽāϰāĻž dApp āĻ…ā§āϝāĻžāϞāĻŋāϏ āĻāĻŦāĻ‚ āϤāĻžāϰ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āϏāĻš āĻ•āϝāĻŧ⧇āύ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻ›āĻŋāĨ¤ āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āĻĒ⧇āϝāĻŧ⧇āĻ›āĻŋ:
RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (DAO - āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻž)

āĻĒā§āϰāĻ¤ā§āϝāĻžāĻšāĻžāϰ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻž:

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

āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟāϟāĻŋ āĻ•āĻžāϜ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āφāĻŽāϰāĻž ⧍āϝāĻŧ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻŦ⧇āϰ āĻ•āϰ⧇āĻ›āĻŋ!

āĻĒāĻ°ā§āϝāĻžāϝāĻŧ 4. āĻ­ā§‹āϟ āĻĻāĻŋāϝāĻŧ⧇ āĻāĻ•āϟāĻŋ DAO āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

āĻĻ⧁āĻ°ā§āĻ­āĻžāĻ—ā§āϝāĻŦāĻļāϤ, RIDE āĻ­āĻžāώāĻž āĻāĻ–āύāĻ“ āϏāĻ‚āĻ—ā§āϰāĻšā§‡āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āĻ•ā§āώāĻŽāϤāĻž āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇ āύāĻž (āĻ…āĻ­āĻŋāϧāĻžāύ, āĻ…āĻ­āĻŋāϧāĻžāύ, āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋāĻ•āĻžāϰ⧀, āĻšā§āϰāĻžāϏāĻ•āĻžāϰ⧀, āχāĻ¤ā§āϝāĻžāĻĻāĻŋ)āĨ¤ āϝāĻžāχāĻšā§‹āĻ•, āĻĢā§āĻ˛ā§āϝāĻžāϟ āϏāĻ‚āĻ—ā§āϰāĻšā§‡āϰ āωāĻĒāϰ āϕ⧋āύ āĻ…āĻĒāĻžāϰ⧇āĻļāύ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻ•ā§ƒāϤ āĻŽā§‚āĻ˛ā§āϝ āφāĻŽāϰāĻž āϝāĻĨāĻžāĻ•ā§āϰāĻŽā§‡ āϕ⧀ āĻāĻŦāĻ‚ āϤāĻžāĻĻ⧇āϰ āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒāĻļāύ āϏāĻš āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚āϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĄāĻŋāϜāĻžāχāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤

āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚āϗ⧁āϞāĻŋ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž āϖ⧁āĻŦ āϏāĻšāϜ, āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚āϗ⧁āϞāĻŋāϕ⧇ āϏ⧂āĻšā§€ āĻĻā§āĻŦāĻžāϰāĻž āĻĒ⧃āĻĨāĻ• āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤
āφāϏ⧁āύ āĻŸā§‡āĻ¸ā§āϟ āϕ⧇āϏ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚āϟāĻŋāϕ⧇ āϏāĻ‚āĻ—ā§āϰāĻš āĻāĻŦāĻ‚ āĻĒāĻžāĻ°ā§āϏ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻāϟāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āϞ⧇āύāĻĻ⧇āύ⧇āϰ āĻĢāϞāĻžāĻĢāϞāϕ⧇ āĻĒā§āϰāĻ­āĻžāĻŦāĻŋāϤ āĻ•āϰāĻŦ⧇ āϤāĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧇ āĻĻ⧇āĻ–āĻŋāĨ¤
āφāĻŽāϰāĻž āĻāχ āĻŦāĻŋāώāϝāĻŧāϟāĻŋāϤ⧇ āĻŽā§€āĻŽāĻžāĻ‚āϏāĻž āĻ•āϰ⧇āĻ›āĻŋ āϝ⧇ āĻ…ā§āϝāĻžāϞāĻŋāϏ āĻŸā§āϰāĻžāĻ¨ā§āϏāĻĢāĻžāϰ āϞ⧇āύāĻĻ⧇āύ⧇ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĻŋ, āϝ⧇āĻšā§‡āϤ⧁ āĻāχ āϧāϰāύ⧇āϰ āϞ⧇āύāĻĻ⧇āύ⧇āϰ āϜāĻ¨ā§āϝ @verifier-āĻ āĻāχ āϏāĻŽā§āĻ­āĻžāĻŦāύāĻžāϟāĻŋ āĻŦā§āϞāĻ• āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ⧎

āĻāϰ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āϏāĻ™ā§āϗ⧇ āĻ…āύ⧁āĻļā§€āϞāύ āĻ•āϰāĻž āϝāĻžāĻ• āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ āĻāϟāĻŋ āϏāĻŽāĻžāϧāĻžāύ.

āϰāĻžāχāĻĄ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚āϏ

āϞ⧇āύāĻĻ⧇āύ āφāĻŦāĻžāϰ āϏāĻŽā§āĻ­āĻŦ, āφāĻŽāϰāĻž āϜāĻžāύāĻŋ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻĻāĻŋāϝāĻŧ⧇ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āĻšāϝāĻŧāĨ¤
RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (DAO - āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻž)

īŋŧ
āĻŽā§‹āϟ, āϜāϟāĻŋāϞ āϝ⧁āĻ•ā§āϤāĻŋ āϞāĻŋāĻ–āϤ⧇ āφāĻĒāύāĻžāϰ āϝāĻž āĻĻāϰāĻ•āĻžāϰ āϤāĻž āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āĻžāϛ⧇ āϰāϝāĻŧ⧇āϛ⧇ DAO dApp.

āĻĄā§‡āϟāĻž āϞ⧇āύāĻĻ⧇āύ

āĻĄā§‡āϟāĻž āϞ⧇āύāĻĻ⧇āύ:
“āĻāĻ•āϟāĻŋ āϕ⧀āϰ āϏāĻ°ā§āĻŦā§‹āĻšā§āϚ āφāĻ•āĻžāϰ āĻšāϞ 100āϟāĻŋ āĻ…āĻ•ā§āώāϰ, āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āϕ⧀ āĻ¸ā§āĻĒ⧇āϏ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ…-āĻŽā§āĻĻā§āϰāĻŖāϝ⧋āĻ—ā§āϝ āϚāĻŋāĻšā§āύ āϏāĻš āύāĻŋāĻ°ā§āĻŦāĻŋāϚāĻžāϰ⧇ āχāωāύāĻŋāϕ⧋āĻĄ āϕ⧋āĻĄ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻŽāĻžāύāϗ⧁āϞāĻŋāϰ āϏ⧀āĻŽāĻž 32,768 āĻŦāĻžāχāϟ āĻāĻŦāĻ‚ āĻĄā§‡āϟāĻž āϞ⧇āύāĻĻ⧇āύ⧇ āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āĻāĻ¨ā§āĻŸā§āϰāĻŋāϰ āϏāĻ°ā§āĻŦāĻžāϧāĻŋāĻ• āϏāĻ‚āĻ–ā§āϝāĻž 100⧎ āϏāĻžāĻŽāĻ—ā§āϰāĻŋāĻ•āĻ­āĻžāĻŦ⧇, āĻāĻ•āϟāĻŋ āĻĄā§‡āϟāĻž āϞ⧇āύāĻĻ⧇āύ⧇āϰ āϏāĻ°ā§āĻŦāĻžāϧāĻŋāĻ• āφāĻ•āĻžāϰ āĻĒā§āϰāĻžāϝāĻŧ 140kb - āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ⧇āϰ āϜāĻ¨ā§āϝ, āĻĒā§āϰāĻžāϝāĻŧ āĻ āĻŋāĻ• āĻļ⧇āĻ•ā§āϏāĻĒāĻŋāϝāĻŧāϰ⧇āϰ āύāĻžāϟāĻ• 'āϰ⧋āĻŽāĻŋāĻ“ āĻ…ā§āϝāĻžāĻ¨ā§āĻĄ āϜ⧁āϞāĻŋāϝāĻŧ⧇āϟ'-āĻāϰ āĻĻ⧈āĻ°ā§āĻ˜ā§āϝāĨ¤ 'āĨ¤

āφāĻŽāϰāĻž āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻļāĻ°ā§āϤāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ DAO āϤ⧈āϰāĻŋ āĻ•āϰāĻŋ:
āϝāĻžāϤ⧇ āĻāĻ•āϟāĻŋ āĻ¸ā§āϟāĻžāĻ°ā§āϟāφāĻĒ āĻ•āϞ āĻ•āϰ⧇ āϤāĻšāĻŦāĻŋāϞ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇ āϤāĻšāĻŦāĻŋāϞ āĻĒāĻžāύ() āĻ•āĻŽāĻĒāĻ•ā§āώ⧇ 2 āϜāύ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀āϰ āϏāĻŽāĻ°ā§āĻĨāύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ - DAO āĻŦāĻŋāύāĻŋāϝāĻŧā§‹āĻ—āĻ•āĻžāϰ⧀āĻĻ⧇āϰāĨ¤ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻšāĻžāϰ āĻāϟāĻž āĻ āĻŋāĻ• āϤāϤāϟāĻž āϏāĻŽā§āĻ­āĻŦ āĻšāĻŦ⧇ āϝāϤāϟāĻž āϝ⧋āĻ—āĻĢāϞ⧇āϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻ­ā§‹āϟ āĻĄāĻŋāĻāĻ“ āĻŽāĻžāϞāĻŋāĻ•āϰāĻžāĨ¤

āφāϏ⧁āύ 3 āϧāϰāύ⧇āϰ āϕ⧀ āϤ⧈āϰāĻŋ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ 2āϟāĻŋ āύāϤ⧁āύ āĻĢāĻžāĻ‚āĻļāύ āĻ­ā§‹āĻŸā§‡ āĻŦā§āϝāĻžāϞ⧇āĻ¨ā§āϏ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϝ⧁āĻ•ā§āϤāĻŋ āϝ⧋āĻ— āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻĢāĻžāĻ¨ā§āĻĄ āϞāĻžāĻ­ āĻ•āϰāĻŋ:
xxâ€Ļxx_āφāĻŽāĻŋ āĻāĻ•āϟāĻŋ = āĻŦāĻŋāύāĻŋāϝāĻŧā§‹āĻ—āĻ•āĻžāϰ⧀, āωāĻĒāϞāĻŦā§āϧ āĻŦā§āϝāĻžāϞ⧇āĻ¨ā§āϏ (āĻ­ā§‹āϟ, āϜāĻŽāĻž, āĻĒā§āϰāĻ¤ā§āϝāĻžāĻšāĻžāϰ)
xxâ€Ļxx_sv = āĻ¸ā§āϟāĻžāĻ°ā§āϟāφāĻĒ, āĻ­ā§‹āĻŸā§‡āϰ āϏāĻ‚āĻ–ā§āϝāĻž (āĻ­ā§‹āϟ, āĻĢāĻžāĻ¨ā§āĻĄ āĻĒāĻžāύ)
xxâ€Ļxx_sf = āĻ¸ā§āϟāĻžāĻ°ā§āϟāφāĻĒ, āĻ­ā§‹āĻŸā§‡āϰ āϏāĻ‚āĻ–ā§āϝāĻž (āĻ­ā§‹āϟ, āĻĢāĻžāĻ¨ā§āĻĄ āĻĒāĻžāύ)
xxâ€Ļxx = āϏāĻ°ā§āĻŦāϜāύ⧀āύ āĻ āĻŋāĻ•āĻžāύāĻž (ā§Šā§Ģ āĻ…āĻ•ā§āώāϰ)

āĻ­ā§‹āĻŸā§‡ āύ⧋āϟāĻŋāĻļ āφāĻŽāĻžāĻĻ⧇āϰ āĻāĻ•āϏāĻžāĻĨ⧇ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻ•ā§āώ⧇āĻ¤ā§āϰ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇:

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

WriteSet āφāĻŽāĻžāĻĻ⧇āϰāϕ⧇ āĻāĻ• āϏāĻžāĻĨ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧ āχāύāĻ­ā§‹āĻ•āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϞ⧇āύāĻĻ⧇āύ

āĻŦāĻŦ āĻāĻŦāĻ‚ āϕ⧁āĻĒāĻžāϰ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒā§‚āϰāĻŖ āĻ•āϰāĻžāϰ āĻĒāϰ⧇ DAO dApp-āĻāϰ āĻŽā§‚āϞ-āĻŽā§‚āĻ˛ā§āϝ⧇āϰ āĻĻā§‹āĻ•āĻžāύ⧇ āĻāϟāĻŋ āĻāχāϰāĻ•āĻŽ āĻĻ⧇āĻ–āĻžāϝāĻŧ ia- āφāĻŽāĻžāύāϤ:
RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (DAO - āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻž)

āφāĻŽāĻžāĻĻ⧇āϰ āϜāĻŽāĻž āĻĢāĻžāĻ‚āĻļāύ āϏāĻžāĻŽāĻžāĻ¨ā§āϝ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āĻšāϝāĻŧ⧇āϛ⧇:
RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (DAO - āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻž)

āĻāĻ–āύ DAO āĻāϰ āĻ•āĻžāĻ°ā§āϝāĻ•ā§āϰāĻŽā§‡āϰ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻŽā§āĻšā§‚āĻ°ā§āϤāϟāĻŋ āφāϏ⧇ - āĻ­ā§‹āϟ āϤāĻšāĻŦāĻŋāϞ⧇āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝāĨ¤

āĻŦāĻŦ āύ⧇āϞāĻŋ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ 500000 āϤāϰāĻ™ā§āϗ⧇āϰ āωāĻĒāϰ āĻ­ā§‹āϟ āĻĻāĻŋāϝāĻŧ⧇āϛ⧇āύ:

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

RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (DAO - āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻž)

āĻĄā§‡āϟāĻž āĻ¸ā§āĻŸā§‹āϰ⧇, āφāĻŽāϰāĻž āύ⧇āϞāĻŋ āĻ āĻŋāĻ•āĻžāύāĻžāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āϏāĻŽāĻ¸ā§āϤ āĻāĻ¨ā§āĻŸā§āϰāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāχ:
RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (DAO - āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻž)
āϕ⧁āĻĒāĻžāϰāĻ“ āύ⧇āϞāĻŋ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻĒāĻ•ā§āώ⧇ āĻ­ā§‹āϟ āĻĻāĻŋāϝāĻŧ⧇āϛ⧇āύāĨ¤
RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (DAO - āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻž)

āϚāϞ⧁āύ āĻĢāĻžāĻ‚āĻļāύ āϕ⧋āĻĄ āĻ•āϟāĻžāĻ•ā§āώāĻĒāĻžāϤ āĻ•āϰāĻž āϝāĻžāĻ• āϤāĻšāĻŦāĻŋāϞ āĻĒāĻžāύ. DAO āĻĨ⧇āϕ⧇ āϤāĻšāĻŦāĻŋāϞ āωāĻ¤ā§āϤ⧋āϞāύ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϤ⧇ āύ⧇āϞāĻŋāϕ⧇ āĻ•āĻŽāĻĒāĻ•ā§āώ⧇ 2āϟāĻŋ āĻ­ā§‹āϟ āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤
RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (DAO - āĻŦāĻŋāϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻž)

āύ⧇āϞāĻŋ āϤāĻžāϰ āωāĻĒāϰ āĻ…āĻ°ā§āĻĒāĻŋāϤ āĻ…āĻ°ā§āĻĨ⧇āϰ āĻ…āĻ°ā§āϧ⧇āĻ• āϤ⧁āϞ⧇ āύāĻŋāϤ⧇ āϚāϞ⧇āϛ⧇:

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

RIDE āĻāĻŦāĻ‚ RIDE4DAPPS-āĻ āĻ“āϝāĻŧ⧇āĻ­āϏ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻļ⧇āĻ–āĻžāĨ¤ āĻĒāĻžāĻ°ā§āϟ 2 (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
    }
}

āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ
āĻ—āĻŋāĻĨ⧁āĻŦ⧇ āϕ⧋āĻĄ
āϤāϰāĻ™ā§āĻ— āϰāĻžāχāĻĄ IDE
āĻ…āύ⧁āĻĻāĻžāύ āĻ•āĻ°ā§āĻŽāϏ⧂āϚāĻŋāϰ āĻ˜ā§‹āώāĻŖāĻž

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster