RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!

╨Т рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдордиреЗ рдбреАрдПрдкреА (рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди) рдмрдирд╛рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦрд╛ рд▓рд╣рд░реЗрдВ рдЖрдИрдбреАрдИ рдХреА рд╕рд╡рд╛рд░реА рдХрд░рддреА рд╣реИрдВ.

рдЖрдЗрдП рдЕрдм рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдХреЛ рдереЛрдбрд╝рд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдЙрджрд╛рд╣рд░рдг.

рдЪрд░рдг 3. рдбреАрдПрдкреА рдЦрд╛рддреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг

RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдРрд▓рд┐рд╕ рдХреЗ рд╕рд╛рде рдХреМрди рд╕реА рд╕рдорд╕реНрдпрд╛рдПрдБ рддреБрд░рдВрдд рдЖрдкрдХреЗ рд╕рд╛рдордиреЗ рдЖ рдЦрдбрд╝реА рд╣реЛрддреА рд╣реИрдВ? рдбреАрдПрдкреА рд▓реЗрдЦрд╛?
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ:
рдмреВрдм рдФрд░ рдХреВрдкрд░ рдЧрд▓рддреА рд╕реЗ рд░реЗрдЧреБрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреАрдПрдкреА рдкрддреЗ рдкрд░ рдзрдирд░рд╛рд╢рд┐ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд▓реЗрди-рджреЗрди рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛ред

рджреВрд╕рд░реА рдмрд╛рдд рдпрд╣ рд╣реИ:
рд╣рдо рдРрд▓рд┐рд╕ рдХреЛ рдмреВрдм рдФрд░/рдпрд╛ рдХреВрдкрд░ рдХреА рдордВрдЬреВрд░реА рдХреЗ рдмрд┐рдирд╛ рдзрдирд░рд╛рд╢рд┐ рдирд┐рдХрд╛рд▓рдиреЗ рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐, рд╕рддреНрдпрд╛рдкрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдРрд▓рд┐рд╕ рд╕реЗ рд╕рднреА рд▓реЗрдирджреЗрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рдЖрдЗрдП рдРрд▓рд┐рд╕ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдХрд░ рджреВрд╕рд░рд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд▓реЗрди-рджреЗрди. рдЖрдЗрдП рд╕рдВрд╢реЛрдзрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рддреИрдирд╛рдд рдХрд░реЗрдВ:
RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)
я┐╝
рд╣рдо рдбреАрдПрдкреА рдРрд▓рд┐рд╕ рдФрд░ рдЙрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рд╕рд┐рдХреНрдХреЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:
RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдЖрдЗрдП рдирд┐рдХрд╛рд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдХрд╛рд╕реА рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

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

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ рд╣рдордиреЗ рджреВрд╕рд░рд╛ рдмрд┐рдВрджреБ рд╕рдордЭ рд▓рд┐рдпрд╛ рд╣реИ!

рдЪрд░рдг 4. рд╡реЛрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдбреАрдПрдУ рдмрдирд╛рдПрдВ

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, RIDE рднрд╛рд╖рд╛ рдЕрднреА рддрдХ рд╕рдВрдЧреНрд░рд╣ (рд╢рдмреНрджрдХреЛрд╢ рд╢рдмреНрджрдХреЛрд╢, рдЗрдЯрд░реЗрдЯрд░, рд░рд┐рдбреНрдпреВрд╕рд░, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлреНрд▓реИрдЯ рд╕рдВрдЧреНрд░рд╣ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдореМрд▓рд┐рдХ рдореВрд▓реНрдп рд╣рдо рдЪрд╛рдмрд┐рдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ; рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдЗрдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рд▓реЗрдирджреЗрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╣рдордиреЗ рдЗрд╕ рддрдереНрдп рдкрд░ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рдХрд┐ рдРрд▓рд┐рд╕ рдЯреНрд░рд╛рдВрд╕рдлрд░ рд▓реЗрдирджреЗрди рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреНрд╖рдорддрд╛ @verifier рдореЗрдВ рдЕрд╡рд░реБрджреНрдз рдереАред

рдЖрдЗрдП рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдВред

рд░рд╛рдЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕

рд▓реЗрди-рджреЗрди рдлрд┐рд░ рд╕реЗ рд╕рдВрднрд╡ рд╣реИ, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред
RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

я┐╝
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬреЗрдВ рдореМрдЬреВрдж рд╣реИрдВ рдбреАрдПрдУ рдбреАрдПрдкреА.

рдбреЗрдЯрд╛ рд▓реЗрдирджреЗрди

рдбреЗрдЯрд╛ рд▓реЗрдирджреЗрди:
тАЬрдПрдХ рдХреБрдВрдЬреА рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ 100 рдЕрдХреНрд╖рд░ рд╣реИ, рдФрд░ рдПрдХ рдХреБрдВрдЬреА рдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдФрд░ рдЕрдиреНрдп рдЧреИрд░-рдореБрджреНрд░рдг рдпреЛрдЧреНрдп рдкреНрд░рддреАрдХреЛрдВ рд╕рд╣рд┐рдд рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдпреВрдирд┐рдХреЛрдб рдХреЛрдб рдмрд┐рдВрджреБ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХреА рд╕реАрдорд╛ 32,768 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рд▓реЗрдирджреЗрди рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ 100 рд╣реИред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдбреЗрдЯрд╛ рд▓реЗрдирджреЗрди рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рд▓рдЧрднрдЧ 140kb рд╣реИтАКтАФтАКрд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рд▓рдЧрднрдЧ рд╢реЗрдХреНрд╕рдкрд┐рдпрд░ рдХреЗ рдирд╛рдЯрдХ 'рд░реЛрдорд┐рдпреЛ рдПрдВрдб рдЬреВрд▓рд┐рдпрдЯ' рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ '.''

рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ DAO рдмрдирд╛рддреЗ рд╣реИрдВ:
рдХрд┐рд╕реА рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдлрдВрдбрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП getFunds() рдХрдо рд╕реЗ рдХрдо 2 рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ - рдбреАрдПрдУ рдирд┐рд╡реЗрд╢рдХреЛрдВ - рдХрд╛ рд╕рдорд░реНрдерди рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдирд┐рдХрд╛рд▓рдирд╛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЙрддрдирд╛ рд╣реА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬрд┐рддрдирд╛ рдХрд┐ рдХреБрд▓ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдорддрджрд╛рди рдбреАрдПрдУ рдорд╛рд▓рд┐рдХ.

рдЖрдЗрдП 3 рдкреНрд░рдХрд╛рд░ рдХреА рдХреБрдВрдЬрд┐рдпрд╛рдБ рдмрдирд╛рдПрдБ рдФрд░ 2 рдирдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╡реЛрдЯ рдФрд░ рдЧреЗрдЯрдлрдВрдб рдореЗрдВ рд╕рдВрддреБрд▓рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдЬреЛрдбрд╝реЗрдВ:
xxтАж xx_рдореИрдВ рдПрдХ = рдирд┐рд╡реЗрд╢рдХ, рдЙрдкрд▓рдмреНрдз рд╢реЗрд╖ рд░рд╛рд╢рд┐ (рд╡реЛрдЯ, рдЬрдорд╛, рдирд┐рдХрд╛рд╕реА)
xxтАж xx_рдПрд╕рд╡реА = рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк, рд╡реЛрдЯреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (рд╡реЛрдЯ рдХрд░реЗрдВ, рдлрдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ)
xxтАж xx_sf = рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк, рд╡реЛрдЯреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (рд╡реЛрдЯ рдХрд░реЗрдВ, рдлрдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ)
xxтАжxx = рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрддрд╛ (35 рдЕрдХреНрд╖рд░)

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡реЛрдЯ рдореЗрдВ рд╣рдореЗрдВ рдПрдХ рд╕рд╛рде рдХрдИ рдлрд╝реАрд▓реНрдб рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА:

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

рд░рд╛рдЗрдЯрд╕реЗрдЯ рд╣рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ invokeScript рд▓реЗрди-рджреЗрди.

рдмреЙрдм рдФрд░ рдХреВрдкрд░ рджреНрд╡рд╛рд░рд╛ рдкреБрдирдГрдкреВрд░реНрддрд┐ рдХреЗ рдмрд╛рдж, рдбреАрдПрдУ рдбреАрдПрдкреА рдХреЗ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рднрдВрдбрд╛рд░рдг рдореЗрдВ рдпрд╣ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ ia-рдЬрдорд╛:
RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рд╣рдорд╛рд░рд╛ рдЬрдорд╛ рдХрд╛рд░реНрдп рдереЛрдбрд╝рд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ:
RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдЕрдм рдбреАрдПрдУ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрд╖рдг рдЖрддрд╛ рд╣реИ - рд╡реЛрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд╡рд┐рддреНрддрдкреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдмреЙрдм рдиреЗ рдиреЗрд▓реА рдХреА 500000 рд╡реЗрд╡рд▓реЗрдЯреНрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рдХрд┐рдпрд╛:

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

RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╣рдо рдиреЗрд▓реА рдХреЗ рдкрддреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рджреЗрдЦрддреЗ рд╣реИрдВ:
RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)
рдХреВрдкрд░ рдиреЗ рдиреЗрд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рднреА рдорддрджрд╛рди рдХрд┐рдпрд╛ред
RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдЖрдЗрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ. рдбреАрдПрдУ рд╕реЗ рдзрдирд░рд╛рд╢рд┐ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрд▓реА рдХреЛ рдиреНрдпреВрдирддрдо 2 рд╡реЛрдЯ рдПрдХрддреНрд░ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред
RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдиреЗрд▓реА рдЙрд╕реЗ рд╕реМрдВрдкреА рдЧрдИ рд░рд╛рд╢рд┐ рдХрд╛ рдЖрдзрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╛рдкрд╕ рд▓реЗрдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИ:

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

RIDE рдФрд░ RIDE4DAPPS рдкрд░ рд╡реЗрд╡реНрд╕ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдирд╛ред рднрд╛рдЧ 2 (рдбреАрдПрдУ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рд╡рд╣ рд╕рдлрд▓ рд╣реЛрддреА рд╣реИ, рдпрд╛рдиреА рдбреАрдПрдУ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рд╣рдордиреЗ рднрд╛рд╖рд╛ рдореЗрдВ 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
    }
}

рдкрд╣рд▓реЗ рднрд╛рдЧ
GitHub рдкрд░ рдХреЛрдб
рд▓рд╣рд░реЗрдВ рдЖрдИрдбреАрдИ рдХреА рд╕рд╡рд╛рд░реА рдХрд░рддреА рд╣реИрдВ
рдЕрдиреБрджрд╛рди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдШреЛрд╖рдгрд╛

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ