āĻšā§āĻ¯āĻžāĻ˛ā§ āĻ¸āĻŦāĻžāĻ!
Đ
āĻāĻ° āĻāĻāĻ¨ āĻāĻāĻā§ disassembled āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻž āĻ¯āĻžāĻ
āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧ 3. dApp āĻ ā§āĻ¯āĻžāĻāĻžāĻāĻ¨ā§āĻ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻž
āĻā§ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§ āĻ ā§āĻ¯āĻžāĻ˛āĻŋāĻ¸ā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻŖā§āĻ ā§ āĻā§āĻā§ āĻāĻ¸ā§ āĻĄāĻŋāĻāĻĒāĻŋ āĻ ā§āĻ¯āĻžāĻāĻžāĻāĻ¨ā§āĻ āĻ¨ā§āĻ?
āĻĒā§āĻ°āĻĨāĻŽā§:
Boob āĻāĻŦāĻ Cooper āĻāĻāĻ¨āĻžāĻā§āĻ°āĻŽā§ āĻāĻāĻāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻāĻāĻŋ dApp āĻ āĻŋāĻāĻžāĻ¨āĻžāĻ¯āĻŧ āĻ¤āĻšāĻŦāĻŋāĻ˛ āĻĒāĻžāĻ āĻžāĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻšāĻ¸ā§āĻ¤āĻžāĻ¨ā§āĻ¤āĻ° āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻāĻŦāĻ āĻāĻāĻāĻžāĻŦā§ āĻ¤āĻžāĻĻā§āĻ° āĻĢāĻŋāĻ°ā§ āĻ ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸ āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻŦā§ āĻ¨āĻž.āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧāĻ¤:
āĻŦā§āĻŦ āĻāĻŦāĻ/āĻ āĻĨāĻŦāĻž āĻā§āĻĒāĻžāĻ°ā§āĻ° āĻ¸āĻŽā§āĻŽāĻ¤āĻŋ āĻŦā§āĻ¯āĻ¤ā§āĻ¤ āĻāĻŽāĻ°āĻž āĻ ā§āĻ¯āĻžāĻ˛āĻŋāĻ¸āĻā§ āĻ¤āĻšāĻŦāĻŋāĻ˛ āĻāĻ¤ā§āĻ¤ā§āĻ˛āĻ¨ āĻĨā§āĻā§ āĻā§āĻ¨ā§āĻāĻžāĻŦā§āĻ āĻ¸ā§āĻŽāĻžāĻŦāĻĻā§āĻ§ āĻāĻ°āĻŋ āĻ¨āĻžāĨ¤ āĻ¯ā§āĻšā§āĻ¤ā§, āĻ¯āĻžāĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻĻāĻŋāĻā§ āĻŽāĻ¨ā§āĻ¯ā§āĻ āĻĻāĻŋāĻ¨, āĻāĻ˛āĻŋāĻ¸ āĻĨā§āĻā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻāĻžāĻ°ā§āĻ¯āĻāĻ° āĻāĻ°āĻž āĻšāĻŦā§āĨ¤
āĻāĻ˛āĻŋāĻ¸ āĻ¨āĻŋāĻˇāĻŋāĻĻā§āĻ§ āĻāĻ°ā§ 2 āĻ āĻŋāĻ āĻāĻ°āĻž āĻ¯āĻžāĻ āĻšāĻ¸ā§āĻ¤āĻžāĻ¨ā§āĻ¤āĻ° āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻ¸āĻāĻļā§āĻ§āĻ¨ āĻāĻ°āĻž āĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°ā§āĻ¨:
īŋŧ
āĻāĻŽāĻ°āĻž dApp āĻ
ā§āĻ¯āĻžāĻ˛āĻŋāĻ¸ āĻāĻŦāĻ āĻ¤āĻžāĻ° āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ° āĻ¸āĻš āĻāĻ¯āĻŧā§āĻ¨ āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻāĻŋāĨ¤ āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻ¤ā§āĻ°ā§āĻāĻŋ āĻĒā§āĻ¯āĻŧā§āĻāĻŋ:
āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻšāĻžāĻ°ā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻž:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 1000000}]}, payment: []}))
āĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻāĻāĻŋ āĻāĻžāĻ āĻāĻ°ā§ āĻāĻŦāĻ āĻāĻŽāĻ°āĻž ā§¨āĻ¯āĻŧ āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻ āĻŦā§āĻ° āĻāĻ°ā§āĻāĻŋ!
āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧ 4. āĻā§āĻ āĻĻāĻŋāĻ¯āĻŧā§ āĻāĻāĻāĻŋ DAO āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻ¨
āĻĻā§āĻ°ā§āĻāĻžāĻā§āĻ¯āĻŦāĻļāĻ¤, RIDE āĻāĻžāĻˇāĻž āĻāĻāĻ¨āĻ āĻ¸āĻāĻā§āĻ°āĻšā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻā§āĻˇāĻŽāĻ¤āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§ āĻ¨āĻž (āĻ āĻāĻŋāĻ§āĻžāĻ¨, āĻ āĻāĻŋāĻ§āĻžāĻ¨, āĻĒā§āĻ¨āĻ°āĻžāĻŦā§āĻ¤ā§āĻ¤āĻŋāĻāĻžāĻ°ā§, āĻšā§āĻ°āĻžāĻ¸āĻāĻžāĻ°ā§, āĻāĻ¤ā§āĻ¯āĻžāĻĻāĻŋ)āĨ¤ āĻ¯āĻžāĻāĻšā§āĻ, āĻĢā§āĻ˛ā§āĻ¯āĻžāĻ āĻ¸āĻāĻā§āĻ°āĻšā§āĻ° āĻāĻĒāĻ° āĻā§āĻ¨ āĻ āĻĒāĻžāĻ°ā§āĻļāĻ¨ āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻā§āĻ¤ āĻŽā§āĻ˛ā§āĻ¯ āĻāĻŽāĻ°āĻž āĻ¯āĻĨāĻžāĻā§āĻ°āĻŽā§ āĻā§ āĻāĻŦāĻ āĻ¤āĻžāĻĻā§āĻ° āĻĄāĻŋāĻā§āĻ°āĻŋāĻĒāĻļāĻ¨ āĻ¸āĻš āĻ¸ā§āĻā§āĻ°āĻŋāĻāĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻĄāĻŋāĻāĻžāĻāĻ¨ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋāĨ¤
āĻ¸ā§āĻā§āĻ°āĻŋāĻāĻā§āĻ˛āĻŋ āĻ¸āĻāĻ¯ā§āĻā§āĻ¤ āĻāĻ°āĻž āĻā§āĻŦ āĻ¸āĻšāĻ, āĻ¸ā§āĻā§āĻ°āĻŋāĻāĻā§āĻ˛āĻŋāĻā§ āĻ¸ā§āĻā§ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻĨāĻ āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
āĻāĻ¸ā§āĻ¨ āĻā§āĻ¸ā§āĻ āĻā§āĻ¸ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻ¸ā§āĻā§āĻ°āĻŋāĻāĻāĻŋāĻā§ āĻ¸āĻāĻā§āĻ°āĻš āĻāĻŦāĻ āĻĒāĻžāĻ°ā§āĻ¸ āĻāĻ°āĻŋ āĻāĻŦāĻ āĻāĻāĻŋ āĻā§āĻāĻžāĻŦā§ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ā§āĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛āĻā§ āĻĒā§āĻ°āĻāĻžāĻŦāĻŋāĻ¤ āĻāĻ°āĻŦā§ āĻ¤āĻž āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°ā§ āĻĻā§āĻāĻŋāĨ¤
āĻāĻŽāĻ°āĻž āĻāĻ āĻŦāĻŋāĻˇāĻ¯āĻŧāĻāĻŋāĻ¤ā§ āĻŽā§āĻŽāĻžāĻāĻ¸āĻž āĻāĻ°ā§āĻāĻŋ āĻ¯ā§ āĻ
ā§āĻ¯āĻžāĻ˛āĻŋāĻ¸ āĻā§āĻ°āĻžāĻ¨ā§āĻ¸āĻĢāĻžāĻ° āĻ˛ā§āĻ¨āĻĻā§āĻ¨ā§ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨āĻŋ, āĻ¯ā§āĻšā§āĻ¤ā§ āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻ˛ā§āĻ¨āĻĻā§āĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ @verifier-āĻ āĻāĻ āĻ¸āĻŽā§āĻāĻžāĻŦāĻ¨āĻžāĻāĻŋ āĻŦā§āĻ˛āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛ā§ˇ
āĻāĻ° āĻ¸ā§āĻā§āĻ°āĻŋāĻ āĻ¸āĻā§āĻā§ āĻ āĻ¨ā§āĻļā§āĻ˛āĻ¨ āĻāĻ°āĻž āĻ¯āĻžāĻ āĻāĻŦāĻ āĻ¤āĻžāĻ°āĻĒāĻ° āĻāĻāĻŋ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨.
āĻ°āĻžāĻāĻĄ āĻ¸ā§āĻā§āĻ°āĻŋāĻāĻ¸
āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻāĻŦāĻžāĻ° āĻ¸āĻŽā§āĻāĻŦ, āĻāĻŽāĻ°āĻž āĻāĻžāĻ¨āĻŋ āĻāĻŋāĻāĻžāĻŦā§ āĻ¸ā§āĻā§āĻ°āĻŋāĻ āĻĻāĻŋāĻ¯āĻŧā§ āĻāĻžāĻ āĻāĻ°āĻ¤ā§ āĻšāĻ¯āĻŧāĨ¤
īŋŧ
āĻŽā§āĻ, āĻāĻāĻŋāĻ˛ āĻ¯ā§āĻā§āĻ¤āĻŋ āĻ˛āĻŋāĻāĻ¤ā§ āĻāĻĒāĻ¨āĻžāĻ° āĻ¯āĻž āĻĻāĻ°āĻāĻžāĻ° āĻ¤āĻž āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻžāĻā§ āĻ°āĻ¯āĻŧā§āĻā§ 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- āĻāĻŽāĻžāĻ¨āĻ¤:
āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻŽāĻž āĻĢāĻžāĻāĻļāĻ¨ āĻ¸āĻžāĻŽāĻžāĻ¨ā§āĻ¯ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻšāĻ¯āĻŧā§āĻā§:
āĻāĻāĻ¨ DAO āĻāĻ° āĻāĻžāĻ°ā§āĻ¯āĻā§āĻ°āĻŽā§āĻ° āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖ āĻŽā§āĻšā§āĻ°ā§āĻ¤āĻāĻŋ āĻāĻ¸ā§ - āĻā§āĻ āĻ¤āĻšāĻŦāĻŋāĻ˛ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻāĻ˛ā§āĻĒā§āĻ° āĻāĻ¨ā§āĻ¯āĨ¤
āĻŦāĻŦ āĻ¨ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻāĻ˛ā§āĻĒā§āĻ° āĻāĻ¨ā§āĻ¯ 500000 āĻ¤āĻ°āĻā§āĻā§āĻ° āĻāĻĒāĻ° āĻā§āĻ āĻĻāĻŋāĻ¯āĻŧā§āĻā§āĻ¨:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))
āĻĄā§āĻāĻž āĻ¸ā§āĻā§āĻ°ā§, āĻāĻŽāĻ°āĻž āĻ¨ā§āĻ˛āĻŋ āĻ āĻŋāĻāĻžāĻ¨āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻ¨ā§āĻā§āĻ°āĻŋ āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻ:
āĻā§āĻĒāĻžāĻ°āĻ āĻ¨ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻāĻ˛ā§āĻĒā§āĻ° āĻĒāĻā§āĻˇā§ āĻā§āĻ āĻĻāĻŋāĻ¯āĻŧā§āĻā§āĻ¨āĨ¤
āĻāĻ˛ā§āĻ¨ āĻĢāĻžāĻāĻļāĻ¨ āĻā§āĻĄ āĻāĻāĻžāĻā§āĻˇāĻĒāĻžāĻ¤ āĻāĻ°āĻž āĻ¯āĻžāĻ āĻ¤āĻšāĻŦāĻŋāĻ˛ āĻĒāĻžāĻ¨. DAO āĻĨā§āĻā§ āĻ¤āĻšāĻŦāĻŋāĻ˛ āĻāĻ¤ā§āĻ¤ā§āĻ˛āĻ¨ āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻ¤ā§ āĻ¨ā§āĻ˛āĻŋāĻā§ āĻāĻŽāĻĒāĻā§āĻˇā§ 2āĻāĻŋ āĻā§āĻ āĻ¸āĻāĻā§āĻ°āĻš āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤
āĻ¨ā§āĻ˛āĻŋ āĻ¤āĻžāĻ° āĻāĻĒāĻ° āĻ āĻ°ā§āĻĒāĻŋāĻ¤ āĻ āĻ°ā§āĻĨā§āĻ° āĻ āĻ°ā§āĻ§ā§āĻ āĻ¤ā§āĻ˛ā§ āĻ¨āĻŋāĻ¤ā§ āĻāĻ˛ā§āĻā§:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"getFunds",args:[{type:"integer", value: 500000}]}, payment: []}))
āĻ¸ā§ āĻ¸āĻĢāĻ˛ āĻšāĻ¯āĻŧ, āĻ āĻ°ā§āĻĨāĻžā§ āĻĄāĻŋāĻāĻ āĻāĻžāĻ āĻāĻ°ā§!
āĻāĻŽāĻ°āĻž āĻāĻžāĻˇāĻžāĻ¯āĻŧ āĻāĻāĻāĻŋ 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