RIDE рд░ RIDE4DAPPS рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (DAO - рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

RIDE рд░ RIDE4DAPPS рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (DAO - рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдирдорд╕реНрдХрд╛рд░!

╨Т рдкрд╣рд┐рд▓реЛ рднрд╛рдЧ рд╣рд╛рдореАрд▓реЗ dApp (рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ) рдорд╛ рдХрд╕рд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рд░ рдХрд╛рдо рдЧрд░реНрдиреЗ рднрдиреЗрд░ рд╡рд┐рд╕реНрддреГрдд рд░реВрдкрдорд╛ рд╣реЗрд░реНрдпреМрдВ рдЫрд╛рд▓рд╣рд░реВ рд╕рд╡рд╛рд░реА IDE.

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

рдЪрд░рдг 3. dApp рдЦрд╛рддрд╛ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрджреИ

RIDE рд░ RIDE4DAPPS рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (DAO - рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдПрд▓рд┐рд╕рдХреЛ рд╕рд╛рдердорд╛ рдХреЗ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рддреБрд░реБрдиреНрддреИ рдмрд╛рд╣рд┐рд░ рдЖрдЙрдБрдЫрдиреН? dApp рдЦрд╛рддрд╛?
рдкрд╣рд┐рд▓реЛ:
Boob рд░ Cooper рд▓реЗ рд╕рдВрдпреЛрдЧрд╡рд╢ рдирд┐рдпрдорд┐рдд рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ dApp рдареЗрдЧрд╛рдирд╛рдорд╛ рд░рдХрдо рдкрдард╛рдЙрди рд╕рдХреНрдЫ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН рд▓реЗрдирджреЗрди рд░ рдпрд╕реИрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдлрд┐рд░реНрддрд╛ рдкрд╣реБрдБрдЪ рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗрдЫреИрдиред

рджреЛрд╕реНрд░реЛ:
рд╣рд╛рдореА рдПрд▓рд┐рд╕рд▓рд╛рдИ Boob рд░/рд╡рд╛ рдХреВрдкрд░рдХреЛ рд╕реНрд╡реАрдХреГрддрд┐ рдмрд┐рдирд╛ рд░рдХрдо рдЭрд┐рдХреНрдирдмрд╛рдЯ рдХреБрдиреИ рдкрдирд┐ рд╣рд┐рд╕рд╛рдмрд▓реЗ рдкреНрд░рддрд┐рдмрдиреНрдз рд▓рдЧрд╛рдЙрдБрджреИрдиреМрдВред рдХрд┐рдирдХрд┐, рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЧрд░реНрди рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН, рдПрд▓рд┐рд╕рдмрд╛рдЯ рд╕рдмреИ рд▓реЗрдирджреЗрдирд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреЗрдЫред

рдПрд▓рд┐рд╕рд▓рд╛рдИ рдкреНрд░рддрд┐рдмрдиреНрдз рд▓рдЧрд╛рдПрд░ 2 рдлрд┐рдХреНрд╕ рдЧрд░реМрдВ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН рд▓реЗрдирджреЗрдиред рд╕рд╣реА рд▓рд┐рдкрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВ:
RIDE рд░ RIDE4DAPPS рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (DAO - рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)
я┐╝
рд╣рд╛рдореА dApp рдПрд▓рд┐рд╕ рд░ рдЙрдирдХреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдмрд╛рдЯ рд╕рд┐рдХреНрдХрд╛ рдлрд┐рд░реНрддрд╛ рд▓рд┐рди рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджреИрдЫреМрдВред рд╣рд╛рдореАрд▓реЗ рддреНрд░реБрдЯрд┐ рдкрд╛рдЙрдБрдЫреМрдВ:
RIDE рд░ RIDE4DAPPS рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (DAO - рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдирд┐рдХрд╛рд╕реА рдорд╛рд░реНрдлрдд рдлрд┐рд░реНрддрд╛ рд▓рд┐рдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ:

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

рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓реЗ рдХрд╛рдо рдЧрд░реНрдЫ рд░ рд╣рд╛рдореАрд▓реЗ рджреЛрд╕реНрд░реЛ рдмрд┐рдиреНрджреБ рдкрддреНрддрд╛ рд▓рдЧрд╛рдпреМрдВ!

рдЪрд░рдг 4. рдорддрджрд╛рдирдХреЛ рд╕рд╛рде DAO рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, RIDE рднрд╛рд╖рд╛рд▓реЗ рдЕрдЭреИ рдкрдирд┐ рд╕рдЩреНрдЧреНрд░рд╣рд╣рд░реВ (рд╢рдмреНрджрдХреЛрд╢ рд╢рдмреНрджрдХреЛрд╢рд╣рд░реВ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рд╣рд░реВ, рдШрдЯрд╛рдЙрдиреЗрд╣рд░реВ, рдЖрджрд┐) рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрджреИрдиред рдпрджреНрдпрдкрд┐, рдлреНрд▓реНрдпрд╛рдЯ рд╕рдВрдЧреНрд░рд╣рдХреЛ рд╕рд╛рде рдХреБрдиреИ рдкрдирд┐ рдЕрдкрд░реЗрд╕рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдХреБрдЮреНрдЬреА-рдорд╛рди рд╣рд╛рдореА рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдкреНрд░рдгрд╛рд▓реА рдбрд┐рдЬрд╛рдЗрди рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ, рддрджрдиреБрд╕рд╛рд░ рдХреБрдЮреНрдЬреАрд╣рд░реВ рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рдирдХреЛ рд╕рд╛рдеред

рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВ рдорд┐рд▓рд╛рдЙрди рдзреЗрд░реИ рд╕рдЬрд┐рд▓реЛ рдЫ; рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рджреНрд╡рд╛рд░рд╛ рдЫреБрдЯреНрдпрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫред
рдПрдЙрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдЩрд▓рд╛рдИ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгрдХреЛ рд░реВрдкрдорд╛ рд╕рдЩреНрдХрд▓рди рд░ рдкрд╛рд░реНрд╕ рдЧрд░реМрдВ рд░ рдпрд╕рд▓реЗ рд▓реЗрдирджреЗрдирдХреЛ рдирддрд┐рдЬрд╛рд▓рд╛рдИ рдХрд╕рд░реА рдЕрд╕рд░ рдЧрд░реНрдЫ рдЬрд╛рдБрдЪ рдЧрд░реМрдВред
рдпрд╕ рдкреНрд░рдХрд╛рд░рдХреЛ рд▓реЗрдирджреЗрдирдХреЛ рд▓рд╛рдЧрд┐ @verifier рдорд╛ рдпреЛ рдХреНрд╖рдорддрд╛ рдЕрд╡рд░реБрджреНрдз рднрдПрдХреЛрд▓реЗ рдПрд▓рд┐рд╕рд▓реЗ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рд▓реЗрдирджреЗрдирдорд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЧрд░реНрди рд╕рдХреЗрди рднрдиреНрдиреЗ рддрдереНрдпрдорд╛ рд╣рд╛рдореАрд▓реЗ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдпреМрдВред

рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВрд╕рдБрдЧ рдЕрднреНрдпрд╛рд╕ рдЧрд░реМрдВ рд░ рддреНрдпрд╕рдкрдЫрд┐ рдпрд╕рд▓рд╛рдИ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреБрд╣реЛрд╕реНред

RIDE рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВ

рд▓реЗрдирджреЗрди рдлреЗрд░рд┐ рд╕рдореНрднрд╡ рдЫ, рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдХрд╕рд░реА рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗред
RIDE рд░ RIDE4DAPPS рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (DAO - рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

я┐╝
рдХреБрд▓рдорд╛, рд╣рд╛рдореАрд╕рдБрдЧ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рд▓реЗрдЦреНрди рдЖрд╡рд╢реНрдпрдХ рд╕рдмреИ рдЫ DAO dApp.

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

рдбрд╛рдЯрд╛ рд▓реЗрдирджреЗрди:
"рдХреБрдЮреНрдЬреАрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ 100 рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд╣рд░реВ рдЫрдиреН, рд░ рдПрдЙрдЯрд╛ рдХреБрдЮреНрдЬреАрдорд╛ рдЦрд╛рд▓реА рдард╛рдЙрдБрд╣рд░реВ рд░ рдЕрдиреНрдп рдЫрд╛рдкреНрди рдирд╕рдХреНрдиреЗ рдкреНрд░рддреАрдХрд╣рд░реВ рд╕рд╣рд┐рдд рд╕реНрд╡реЗрдЪреНрдЫрд╛рдЪрд╛рд░реА рдпреБрдирд┐рдХреЛрдб рдХреЛрдб рдмрд┐рдиреНрджреБрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрди рд╕рдХреНрдЫред рд╕реНрдЯреНрд░рд┐рдЩ рдорд╛рдирд╣рд░реВрдХреЛ рд╕реАрдорд╛ 32,768 рдмрд╛рдЗрдЯ рд╣реБрдиреНрдЫ рд░ рдбреЗрдЯрд╛ рд▓реЗрдирджреЗрдирдорд╛ рд╕рдореНрднрд╛рд╡рд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рд╣рд░реВрдХреЛ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ 100 рд╣реЛред рд╕рдордЧреНрд░рдорд╛, рдбреЗрдЯрд╛ рд▓реЗрдирджреЗрдирдХреЛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рд▓рдЧрднрдЧ 140kb рд╣реЛ тАФ рд╕рдиреНрджрд░реНрднрдХреЛ рд▓рд╛рдЧрд┐, рд▓рдЧрднрдЧ рдареНрдпрд╛рдХреНрдХреИ рд╢реЗрдХреНрд╕рдкрд┐рдпрд░рдХреЛ рдирд╛рдЯрдХ 'рд░реЛрдорд┐рдпреЛ рд░ рдЬреБрд▓рд┐рдпрдЯ' рдХреЛ рд▓рдореНрдмрд╛рдЗред 'ред

рд╣рд╛рдореА рдирд┐рдореНрди рд╕рд░реНрддрд╣рд░реВрд╕рдБрдЧ DAO рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ:
рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЛ рд▓рд╛рдЧреА рдХрд▓ рдЧрд░реЗрд░ рдХреЛрд╖ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдХреЛрд╖ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН() рдХрдореНрддрд┐рдорд╛ реи рд╕рд╣рднрд╛рдЧреАрд╣рд░реВрдХреЛ рд╕рдорд░реНрдерди - DAO рд▓рдЧрд╛рдиреАрдХрд░реНрддрд╛рд╣рд░реВ - рдЖрд╡рд╢реНрдпрдХ рдЫред рдирд┐рдХрд╛рд▓реНрдиреБрд╣реЛрд╕реН рдпреЛ рд╕рдореНрднрд╡ рд╣реБрдиреЗрдЫ рдареНрдпрд╛рдХреНрдХреИ рдЬрддрд┐ рдХреБрд▓ рдорд╛ рд╕рдВрдХреЗрдд рдЧрд░рд┐рдПрдХреЛ рдЫ рдорддрджрд╛рди DAO рдорд╛рд▓рд┐рдХрд╣рд░реВред

3 рдкреНрд░рдХрд╛рд░рдХрд╛ рдХреБрдЮреНрдЬреАрд╣рд░реВ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН рд░ 2 рдирдпрд╛рдБ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рдмреНрдпрд╛рд▓реЗрдиреНрд╕рдХреЛ рд╕рд╛рде рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рддрд░реНрдХ рдердкреНрдиреБрд╣реЛрд╕реН рд░ рдлрдиреНрдбрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН:
xxтАжxx_ia = рд▓рдЧрд╛рдиреАрдХрд░реНрддрд╛, рдЙрдкрд▓рдмреНрдз рдмреНрдпрд╛рд▓реЗрдиреНрд╕ (рднреЛрдЯ, рдЬрдореНрдорд╛, рдирд┐рдХрд╛рд╕реА)
xxтАжxx_sv = рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкрд╣рд░реВ, рднреЛрдЯрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ (рднреЛрдЯ, рдХреЛрд╖ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН)
xxтАжxx_sf = рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкрд╣рд░реВ, рднреЛрдЯрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ (рднреЛрдЯ, рдХреЛрд╖ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН)
xxтАжxx = рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдареЗрдЧрд╛рдирд╛ (рейрел рд╡рд░реНрдг)

рдХреГрдкрдпрд╛ рдиреЛрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рднреЛрдЯрдорд╛ рд╣рд╛рдореАрд▓реЗ рдПрдХреИ рдкрдЯрдХ рдзреЗрд░реИ рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

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

WriteSet рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдПрдХреИ рдкрдЯрдХрдорд╛ рдзреЗрд░реИ рд░реЗрдХрд░реНрдбрд╣рд░реВ рдмрдирд╛рдЙрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ invokeScript рд▓реЗрдирджреЗрдиред

DAO dApp рдХреЛ рдореБрдЦреНрдп-рдорд╛рди рднрдгреНрдбрд╛рд░рдгрдорд╛ рдпреЛ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ, рдмрдм рд░ рдХреВрдкрд░рд▓реЗ рдкреБрди: рднрд░рд┐рд╕рдХреЗ рдкрдЫрд┐ ia- рдирд┐рдХреНрд╖реЗрдк:
RIDE рд░ RIDE4DAPPS рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (DAO - рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рд╣рд╛рдореНрд░реЛ рдЬрдореНрдорд╛ рдкреНрд░рдХрд╛рд░реНрдп рдереЛрд░реИ рдкрд░рд┐рд╡рд░реНрддрди рднрдПрдХреЛ рдЫ:
RIDE рд░ RIDE4DAPPS рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (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 рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (DAO - рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдбрд╛рдЯрд╛ рд╕реНрдЯреЛрд░рдорд╛ рд╣рд╛рдореА рдиреЗрд▓реАрдХреЛ рдареЗрдЧрд╛рдирд╛рдХрд╛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рд╕рдмреИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рд╣рд░реВ рджреЗрдЦреНрдЫреМрдВ:
RIDE рд░ RIDE4DAPPS рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (DAO - рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)
рдХреБрдкрд░рд▓реЗ рдкрдирд┐ рдиреЗрд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдкрдХреНрд╖рдорд╛ рдорддрджрд╛рди рдЧрд░реЗред
RIDE рд░ RIDE4DAPPS рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (DAO - рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдкреНрд░рдХрд╛рд░реНрдп рдХреЛрдбрдорд╛ рдПрдХ рдирдЬрд░ рд░рд╛рдЦреМрдВ рдХреЛрд╖ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдиреЗрд▓реАрд▓реЗ DAO рдмрд╛рдЯ рд░рдХрдо рдЭрд┐рдХреНрди рд╕рдХреНрд╖рдо рд╣реБрди рдХрдореНрддрд┐рдорд╛ реи рднреЛрдЯ рдЬрдореНрдорд╛ рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫред
RIDE рд░ RIDE4DAPPS рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (DAO - рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдиреЗрд▓реАрд▓реЗ рдЖрдлреВрд▓рд╛рдИ рджрд┐рдПрдХреЛ рд░рдХрдордХреЛ рдЖрдзрд╛ рд░рдХрдо рдлрд┐рд░реНрддрд╛ рд▓рд┐рдиреЗ рднрдПрдХреЛ рдЫ ред

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

RIDE рд░ RIDE4DAPPS рдорд╛ Waves smart Contracts рд▓реЗрдЦреНрди рд╕рд┐рдХреНрджреИред рднрд╛рдЧ реи (DAO - рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рд╕реНрд╡рд╛рдпрддреНрдд рд╕рдВрдЧрдарди)

рдЙрдиреА рд╕рдлрд▓ рд╣реБрдиреНрдЫрдиреН, рддреНрдпреЛ рд╣реЛ, DAO рдХрд╛рдо рдЧрд░реНрджрдЫ!

рд╣рд╛рдореАрд▓реЗ рднрд╛рд╖рд╛рдорд╛ DAO рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рд╣реЗрд░реНрдпреМрдВ RIDE4DAPPS.
рдирд┐рдореНрди рднрд╛рдЧрд╣рд░реВрдорд╛ рд╣рд╛рдореА рдХреЛрдб рд░рд┐рдлреНрдпрд╛рдХреНрдЯрд░рд┐рдЩ рд░ рдХреЗрд╕ рдкрд░реАрдХреНрд╖рдгрд▓рд╛рдИ рдирдЬрд┐рдХрдмрд╛рдЯ рд╣реЗрд░реНрдиреЗрдЫреМрдВред

рдХреЛрдбрдХреЛ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдорд╛ рддрд░рдВрдЧ рд╕рд╡рд╛рд░реА IDE:

# 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 рдорд╛ рдХреЛрдб
рдЫрд╛рд▓рд╣рд░реВ рд╕рд╡рд╛рд░реА IDE
рдЕрдиреБрджрд╛рди рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рдШреЛрд╖рдгрд╛

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди