рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЧрд░реНрдиреЗ рд░ рддрд░рдВрдЧрд╣рд░реВ RIDE dApp рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ

рдирдорд╕реНрддреЗ! рдпрд╕ рд▓реЗрдЦрдорд╛ рдо рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдХрд╕рд░реА рд▓реЗрдЦреНрдиреЗ рд░ рд▓рд╣рд░ рдиреЛрдбрдорд╛ рдирд┐рдпрдорд┐рдд dApp рдЪрд▓рд╛рдЙрдиреЗ рджреЗрдЦрд╛рдЙрдиреЗрдЫреБред рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдгрд╣рд░реВ, рд╡рд┐рдзрд┐рд╣рд░реВ рд░ рд╡рд┐рдХрд╛рд╕рдХреЛ рдЙрджрд╛рд╣рд░рдг рд╣реЗрд░реМрдВред

рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЧрд░реНрдиреЗ рд░ рддрд░рдВрдЧрд╣рд░реВ RIDE dApp рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ

dApps рд░ рдирд┐рдпрдорд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рдХрд╛рд╕ рдпреЛрдЬрдирд╛ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдЫ:

  • рдХреЛрдб рд▓реЗрдЦрди
  • рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рд▓реЗрдЦрди
  • рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд░реБ рдЧрд░реНрджреИ
  • рдкрд░реАрдХреНрд╖рдг

рдЙрдкрдХрд░рдгрд╣рд░реВ

1. docker рдиреЛрдб рд░ рд╡реЗрднреНрд╕ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдЪрд▓рд╛рдЙрди

рдпрджрд┐ рддрдкрд╛рдЗрдБ рдиреЛрдб рд╕реБрд░реБ рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрди рднрдиреЗ, рддрдкрд╛рдЗрдБ рдпреЛ рдЪрд░рдг рдЫреЛрдбреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдЖрдЦрд┐рд░, рддреНрдпрд╣рд╛рдБ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд░ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдиреЗрдЯрд╡рд░реНрдХ рдЫред рддрд░ рддрдкрд╛рдИрдВрдХреЛ рдЖрдлреНрдиреИ рдиреЛрдб рддреИрдирд╛рдд рдирдЧрд░реА, рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрд╛рдиреНрди рд╕рдХреНрдЫред

  • рддрдкрд╛рдИрд▓рд╛рдИ рдирд┐рд░рдиреНрддрд░ рдкрд░реАрдХреНрд╖рдг рдЯреЛрдХрдирд╣рд░реВрдХреЛ рд╕рд╛рде рдирдпрд╛рдБ рдЦрд╛рддрд╛рд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫред рдкрд░реАрдХреНрд╖рдг рдиреЗрдЯрд╡рд░реНрдХ рдирд▓рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ 10 рдорд┐рдиреЗрдЯрдорд╛ 10 рд▓рд╣рд░рд╣рд░реВ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджрдЫред
  • рдкрд░реАрдХреНрд╖рдг рдиреЗрдЯрд╡рд░реНрдХрдорд╛ рдФрд╕рдд рдмреНрд▓рдХ рд╕рдордп 1 рдорд┐рдиреЗрдЯ рд╣реЛ, рдиреЛрдбрдорд╛ - 15 рд╕реЗрдХреЗрдиреНрдбред рд▓реЗрдирджреЗрдирд▓рд╛рдИ рдзреЗрд░реИ рдкреБрд╖реНрдЯрд┐рдХрд░рдгрд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджрд╛ рдпреЛ рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдзреНрдпрд╛рди рджрд┐рди рд╕рдХрд┐рдиреНрдЫред
  • рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрд░реАрдХреНрд╖рдг рдиреЛрдбрд╣рд░реВрдорд╛ рдЖрдХреНрд░рд╛рдордХ рдХреНрдпрд╛рд╕рд┐рдЩ рд╕рдореНрднрд╡ рдЫред
  • рддрд┐рдиреАрд╣рд░реВ рдкрдирд┐ рдорд░реНрдорддрд╕рдореНрднрд╛рд░рдХреЛ рдХрд╛рд░рдгрд▓реЗ рдЕрд╕реНрдерд╛рдпреА рд░реВрдкрдорд╛ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реБрди рд╕рдХреНрдЫрдиреНред

рдЕрдм рджреЗрдЦрд┐ рдо рдорд╛рдиреНрдЫреБ рдХрд┐ рддрдкрд╛рдИрдВ рдЖрдлреНрдиреЛ рдиреЛрдб рд╕рдВрдЧ рдХрд╛рдо рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫред

2. рд╕рд░реНрдлрдмреЛрд░реНрдб рдХрдорд╛рдгреНрдб рд▓рд╛рдЗрди рдЙрдкрдХрд░рдг

  • рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдпрд╣рд╛рдБ ppa, homebrew рд╡рд╛ exe рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Node.js рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН: https://nodejs.org/en/download/.
  • рд╕рд░реНрдлрдмреЛрд░реНрдб рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдПрдЙрдЯрд╛ рдЙрдкрдХрд░рдг рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЕрд╡рд╕реНрдерд┐рдд рдиреЛрдбрдорд╛ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЪрд▓рд╛рдЙрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

npm install -g @waves/surfboard

3. рднрд┐рдЬреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдпреЛ рдХреЛрдб рдкреНрд▓рдЧрдЗрди

рдпрджрд┐ рддрдкрд╛рдИрдВ IDEs рдХреЛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реБрдиреБрд╣реБрдиреНрди рд░ рдкрд╛рда рд╕рдореНрдкрд╛рджрдХрд╣рд░реВрд▓рд╛рдИ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджрд┐рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ рдпреЛ рдЪрд░рдг рд╡реИрдХрд▓реНрдкрд┐рдХ рдЫред рд╕рдмреИ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдгрд╣рд░реВ рдХрдорд╛рдгреНрдб рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╣рд░реВ рд╣реБрдиреНред рдпрджрд┐ рддрдкрд╛рдЗрдБ vim рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдкреНрд▓рдЧрдЗрдирдорд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН vim-рд╕рд╡рд╛рд░реА.

рднрд┐рдЬреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдпреЛ рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рд░ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН: https://code.visualstudio.com/

VS рдХреЛрдб рдЦреЛрд▓реНрдиреБрд╣реЛрд╕реН рд░ рддрд░рдВрдЧ-рд╕рд╡рд╛рд░реА рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЧрд░реНрдиреЗ рд░ рддрд░рдВрдЧрд╣рд░реВ RIDE dApp рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ

рд╡реЗрднреНрд╕ рдХрд┐рдкрд░ рдмреНрд░рд╛рдЙрдЬрд░ рд╡рд┐рд╕реНрддрд╛рд░: https://wavesplatform.com/products-keeper

рднрдпреЛ!

рдиреЛрдб рд░ рд╡реЗрднреНрд╕ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН

1. рдиреЛрдб рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

docker run -d -p 6869:6869 wavesplatform/waves-private-node

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рдиреЛрдб REST API рдорд╛рд░реНрдлрдд рд╕реБрд░реБ рдЧрд░рд┐рдПрдХреЛ рдЫ http://localhost:6869:

рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЧрд░реНрдиреЗ рд░ рддрд░рдВрдЧрд╣рд░реВ RIDE dApp рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ
рдиреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ Swagger REST API

2. Waves Explorer рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer

рдмреНрд░рд╛рдЙрдЬрд░ рдЦреЛрд▓реНрдиреБрд╣реЛрд╕реН рд░ рдЬрд╛рдиреБрд╣реЛрд╕реН http://localhost:3000ред рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрдиреБрд╣реБрдиреЗрдЫ рдХрд┐ рдЦрд╛рд▓реА рд╕реНрдерд╛рдиреАрдп рдиреЛрдб рд╕рд░реНрдХрд┐рдЯ рдХрддрд┐ рдЫрд┐рдЯреЛ рдмрдирд╛рдЗрдПрдХреЛ рдЫред

рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЧрд░реНрдиреЗ рд░ рддрд░рдВрдЧрд╣рд░реВ RIDE dApp рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ
Waves Explorer рд▓реЗ рд╕реНрдерд╛рдиреАрдп рдиреЛрдб рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрд╛рдЙрдБрдЫ

рд╕рд╡рд╛рд░реА рд╕рдВрд░рдЪрдирд╛ рд░ рд╕рд░реНрдлрдмреЛрд░реНрдб рдЙрдкрдХрд░рдг

рдПрдЙрдЯрд╛ рдЦрд╛рд▓реА рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдпрд╕рдорд╛ рдЖрджреЗрд╢ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН

surfboard init

рдЖрджреЗрд╢рд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛, "рд╣реЗрд▓реЛ рд╕рдВрд╕рд╛рд░" рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд░ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрдХреЛ рд╕рд╛рде рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рдкреНрд░рд╛рд░рдореНрдн рдЧрд░реНрджрдЫред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ VS рдХреЛрдбрдХреЛ рд╕рд╛рде рдпреЛ рдлреЛрд▓реНрдбрд░ рдЦреЛрд▓реНрдиреБрднрдпреЛ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рджреЗрдЦреНрдиреБрд╣реБрдиреЗрдЫ:

рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЧрд░реНрдиреЗ рд░ рддрд░рдВрдЧрд╣рд░реВ RIDE dApp рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ
Surfboard.config.json

  • ./ride/ рдлреЛрд▓реНрдбрд░ рдЕрдиреНрддрд░реНрдЧрдд рддрдкрд╛рдИрд▓реЗ рдПрдХрд▓ рдлрд╛рдЗрд▓ wallet.ride рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫ - рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рдЬрд╣рд╛рдБ dApp рдХреЛрдб рдЕрд╡рд╕реНрдерд┐рдд рдЫред рд╣рд╛рдореА рдЕрд░реНрдХреЛ рдмреНрд▓рдХрдорд╛ dApps рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреЗрдЫреМрдВред
  • ./test/ рдлреЛрд▓реНрдбрд░ рдЕрдиреНрддрд░реНрдЧрдд рддрдкрд╛рдИрдВрд▓реЗ *.js рдлрд╛рдЗрд▓ рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫред рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдпрд╣рд╛рдБ рднрдгреНрдбрд╛рд░ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреНред
  • ./surfboard.config.json - рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлрд╛рдЗрд▓ред

Envs рдПрдХ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЦрдгреНрдб рд╣реЛред рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдпрд╕рд░реА рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫ:

  • рдиреЗрдЯрд╡рд░реНрдХрдХреЛ dApp рд░ CHAIN_ID рд╕реБрд░реБ рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреЗ рдиреЛрдбрдХреЛ REST API рдЕрдиреНрддреНрдп рдмрд┐рдиреНрджреБред
  • рдЯреЛрдХрдирд╣рд░реВ рднрдПрдХреЛ рдЦрд╛рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЧреЛрдкреНрдп рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдЬреБрди рддрдкрд╛рдИрдВрдХреЛ рдкрд░реАрдХреНрд╖рдг рдЯреЛрдХрдирд╣рд░реВрдХреЛ рд╕реНрд░реЛрдд рд╣реБрдиреЗрдЫред

рддрдкрд╛рдИрдВрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреЗ рд░реВрдкрдорд╛, surfboard.config.json рд▓реЗ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рдзреЗрд░реИ рд╡рд╛рддрд╛рд╡рд░рдгрд╣рд░реВрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫред рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрдерд╛рдиреАрдп рд╡рд╛рддрд╛рд╡рд░рдг рд╣реЛ (defaultEnv рдХреБрдЮреНрдЬреА рдкрд░рд┐рд╡рд░реНрддрди рдпреЛрдЧреНрдп рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рд╣реЛ)ред

рд╡рд╛рд▓реЗрдЯ-рдбреЗрдореЛ рдЖрд╡реЗрджрди

рдпреЛ рдЦрдгреНрдб RIDE рднрд╛рд╖рд╛рдХреЛ рд╕рдиреНрджрд░реНрдн рд╣реЛрдЗрдиред рдмрд░реБ, рдмреНрд▓рдХрдЪреЗрдирдорд╛ рдХреЗ рднрдЗрд░рд╣реЗрдХреЛ рдЫ рднрдиреЗрд░ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдмреБрдЭреНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореАрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рд░ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдорд╛ рдПрдХ рдирдЬрд░ред

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╛рд▓реЗрдЯ-рдбреЗрдореЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реЗрд░реМрдВред рдЬреЛ рдХреЛрд╣реАрд▓реЗ dApp рдареЗрдЧрд╛рдирд╛рдорд╛ рдЯреЛрдХрди рдкрдард╛рдЙрди рд╕рдХреНрдЫред рддрдкрд╛рдИрдВ рдЖрдлреНрдиреЛ WAVES рдорд╛рддреНрд░ рдлрд┐рд░реНрддрд╛ рд▓рд┐рди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рджреБрдИ @Callable рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ InvokeScriptTransaction рдорд╛рд░реНрдлрдд рдЙрдкрд▓рдмреНрдз рдЫрдиреН:

  • deposit()рдЬрд╕рд▓рд╛рдИ WAVES рдорд╛ рд╕рдВрд▓рдЧреНрди рднреБрдХреНрддрд╛рдиреА рдЪрд╛рд╣рд┐рдиреНрдЫ
  • withdraw(amount: Int)рдЬрд╕рд▓реЗ рдЯреЛрдХрдирд╣рд░реВ рдлрд░реНрдХрд╛рдЙрдБрдЫ

dApp рдЬреАрд╡рдирдЪрдХреНрд░ рднрд░рд┐, рд╕рдВрд░рдЪрдирд╛ (рдареЗрдЧрд╛рдирд╛ тЖТ рд░рдХрдо) рдХрд╛рдпрдо рд░рд╣рдиреЗрдЫ:

рдХрд╛рд░реНрдп
рдирддрд┐рдЬрд╛ рд░рд╛рдЬреНрдп

рд╕реБрд░реБрдорд╛
рдЦрд╛рд▓реА

рдПрд▓рд┐рд╕рд▓реЗ рел рддрд░рдЩреНрдЧрд╣рд░реВ рдЬрдореНрдорд╛ рдЧрд░реНрдЫ
рдПрд▓рд┐рд╕-рдареЗрдЧрд╛рдирд╛ тЖТ 500000000

Bob рдЬрдореНрдорд╛ 2 WAVES

рдПрд▓рд┐рд╕-рдареЗрдЧрд╛рдирд╛ тЖТ 500000000
bob-рдареЗрдЧрд╛рдирд╛ тЖТ 200000000

Bob 7 WAVES рдлрд┐рд░реНрддрд╛ рд▓рд┐рдиреНрдЫ
рдЕрд╕реНрд╡реАрдХрд╛рд░ рдЧрд░рд┐рдпреЛ!

рдПрд▓рд┐рд╕рд▓реЗ рек рддрд░рдЩреНрдЧрд╣рд░реВ рдлрд┐рд░реНрддрд╛ рд▓рд┐рдиреНрдЫрд┐рдиреН
рдПрд▓рд┐рд╕-рдареЗрдЧрд╛рдирд╛ тЖТ 100000000
bob-рдареЗрдЧрд╛рдирд╛ тЖТ 200000000

рд╕реНрдерд┐рддрд┐рд▓рд╛рдИ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдмреБрдЭреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдпрд╣рд╛рдБ рдХреЛрдб рдЫ:

# In this example multiple accounts can deposit their funds and safely take them back. No one can interfere with this.
# An inner state is maintained as mapping `address=>waves`.
{-# STDLIB_VERSION 3 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
@Callable(i)
func deposit() = {
 let pmt = extract(i.payment)
 if (isDefined(pmt.assetId))
    then throw("works with waves only")
    else {
     let currentKey = toBase58String(i.caller.bytes)
     let currentAmount = match getInteger(this, currentKey) {
       case a:Int => a
       case _ => 0
     }
     let newAmount = currentAmount + pmt.amount
     WriteSet([DataEntry(currentKey, newAmount)]) 
   }
 }
@Callable(i)
func withdraw(amount: Int) = {
 let currentKey = toBase58String(i.caller.bytes)
 let currentAmount = match getInteger(this, currentKey) {
   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(currentKey, newAmount)]),
       TransferSet([ScriptTransfer(i.caller, amount, unit)])
      )
 }
@Verifier(tx)
func verify() = false

рдирдореВрдирд╛ рдХреЛрдб рдкрдирд┐ рдорд╛ рдкрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ GitHub.

VSCode рдкреНрд▓рдЧрдЗрдирд▓реЗ рдлрд╛рдЗрд▓ рд╕рдореНрдкрд╛рджрди рдЧрд░реНрджрд╛ рдирд┐рд░рдиреНрддрд░ рд╕рдВрдХрд▓рдирд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫред рддреНрдпрд╕рдХрд╛рд░рдг, рддрдкрд╛рдЗрдБ рд╕рдзреИрдБ рд╕рдорд╕реНрдпрд╛ рдЯреНрдпрд╛рдмрдорд╛ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдирд┐рдЧрд░рд╛рдиреА рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЧрд░реНрдиреЗ рд░ рддрд░рдВрдЧрд╣рд░реВ RIDE dApp рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ
рдпрджрд┐ рддрдкрд╛рдЗрдБ рдлрд╛рдЗрд▓ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрджрд╛ рдлрд░рдХ рдкрд╛рда рд╕рдореНрдкрд╛рджрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН

surfboard compile ride/wallet.ride

рдпрд╕рд▓реЗ рдмреЗрд╕64 рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ RIDE рдХреЛрдбрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрдиреЗрдЫред

'wallet.ride' рдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдкрд┐

рд╣реЗрд░реМрдВ рдкрд░реАрдХреНрд╖рдг рдлрд╛рдЗрд▓ред рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯрдХреЛ рдореЛрдЪрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рддред рддреНрдпрд╣рд╛рдБ "рдкрд╣рд┐рд▓реЗ" рдкреНрд░рдХрд╛рд░реНрдп рд░ рддреАрди рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЫрдиреН:

  • MassTransferTransaction рдорд╛рд░реНрдлрдд рдзреЗрд░реИ рдЦрд╛рддрд╛рд╣рд░реВрд▓рд╛рдИ "рдкрд╣рд┐рд▓реЗ" рдХреЛрд╖ рджрд┐рдиреНрдЫ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрдЫ рд░ рдпрд╕рд▓рд╛рдИ рдмреНрд▓рдХрдЪреЗрдирдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред
  • "рдЬрдореНрдорд╛ рдЧрд░реНрди рд╕рдХреНрдЫ" рд▓реЗ рдиреЗрдЯрд╡рд░реНрдХрдорд╛ InvokeScriptTransaction рдкрдард╛рдЙрдБрдЫ, рдкреНрд░рддреНрдпреЗрдХ рджреБрдИ рдЦрд╛рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ deposit() рдкреНрд░рдХрд╛рд░реНрдп рд╕рдХреНрд░рд┐рдп рдЧрд░реНрджрдЫред
  • "рдЬрдорд╛ рдЧрд░рд┐рдПрдХреЛ рднрдиреНрджрд╛ рдмрдвреА рдЭрд┐рдХреНрди рд╕рдХрд┐рдБрджреИрди" рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдХрд┐ рдХрд╕реИрд▓реЗ рдЕрд░реВ рдорд╛рдирд┐рд╕рд╣рд░реВрдХреЛ рдЯреЛрдХрди рдЪреЛрд░реА рдЧрд░реНрди рд╕рдХреНрджреИрдиред
  • рдирд┐рдХрд╛рд╕реА рд╕рд╣реА рддрд░рд┐рдХрд╛рд▓реЗ рдкреНрд░рд╢реЛрдзрди рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд┐ "рдЬрдорд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ" рдЪреЗрдХред

рд╕рд░реНрдлрдмреЛрд░реНрдбрдмрд╛рдЯ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН рд░ рд╡реЗрднреНрд╕ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░рдорд╛ рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдЙрди, рджреМрдбреНрдиреБрд╣реЛрд╕реН

surfboard test

рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдзреЗрд░реИ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рдЫрдиреН (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдЫреБрдЯреНрдЯреИ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯ рд▓рд┐рдкрд┐ рдЪрд╛рд╣рд┐рдиреНрдЫ), рддрдкрд╛рдЗрдБ рдЪрд▓рд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ

surfboard test my-scenario.js

рд╕рд░реНрдлрдмреЛрд░реНрдбрд▓реЗ ./test/ рдлреЛрд▓реНрдбрд░рдорд╛ рдкрд░реАрдХреНрд╖рдг рдлрд╛рдЗрд▓рд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреЗрдЫ рд░ surfboard.config.json рдорд╛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдиреЛрдбрдорд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдЙрдиреЗрдЫред рдХреЗрд╣рд┐ рд╕реЗрдХреЗрдиреНрдб рдкрдЫрд┐ рддрдкрд╛рдИрд▓реЗ рдХреЗрд╣рд┐ рдпрд╕реНрддреЛ рджреЗрдЦреНрдиреБрд╣реБрдиреЗрдЫ:

wallet test suite
Generating accounts with nonce: ce8d86ee
Account generated: foofoofoofoofoofoofoofoofoofoofoo#ce8d86ee - 3M763WgwDhmry95XzafZedf7WoBf5ixMwhX
Account generated: barbarbarbarbarbarbarbarbarbar#ce8d86ee - 3MAi9KhwnaAk5HSHmYPjLRdpCAnsSFpoY2v
Account generated: wallet#ce8d86ee - 3M5r6XYMZPUsRhxbwYf1ypaTB6MNs2Yo1Gb
Accounts successfully funded
Script has been set
   тИЪ Can deposit (4385ms)
   тИЪ Cannot withdraw more than was deposited
   тИЪ Can withdraw (108ms)
3 passing (15s)

рд╣реБрд░реНрд░реЗ! рдкрд░реАрдХреНрд╖рд╛ рдЙрддреНрддреАрд░реНрдг рднрдпреЛред рдЕрдм рд╡реЗрднреНрд╕ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛ рдХреЗ рд╣реБрдиреНрдЫ рднрдиреЗрд░ рд╣реЗрд░реМрдВ: рдмреНрд▓рдХрд╣рд░реВ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН рд╡рд╛ рдЦреЛрдЬрдорд╛ рдорд╛рдерд┐рдХреЛ рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рдордзреНрдпреЗ рдПрдЙрдЯрд╛ рдЯрд╛рдБрд╕реНрдиреБрд╣реЛрд╕реН (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╕рдореНрдмрдиреНрдзрд┐рдд wallet#ред рддреНрдпрд╣рд╛рдБ рддрдкрд╛рдЗрдБ рд▓реЗрдирджреЗрди рдЗрддрд┐рд╣рд╛рд╕, dApp рд╕реНрдерд┐рддрд┐, decompiled рдмрд╛рдЗрдирд░реА рдлрд╛рдЗрд▓ рдкрд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЧрд░реНрдиреЗ рд░ рддрд░рдВрдЧрд╣рд░реВ RIDE dApp рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ
рд╡реЗрднреНрд╕ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ред рднрд░реНрдЦрд░реИ рддреИрдирд╛рде рдЧрд░рд┐рдПрдХреЛ рдПрдЙрдЯрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧред

рдХреЗрд╣рд┐ рд╕рд░реНрдлрдмреЛрд░реНрдб рд╕реБрдЭрд╛рд╡рд╣рд░реВ:

1. рдЯреЗрд╕реНрдЯрдиреЗрдЯ рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрди, рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

surfboard test --env=testnet

рдкрд░реАрдХреНрд╖рдг рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

2. рдпрджрд┐ рддрдкрд╛рдЗрдБ рд▓реЗрдирджреЗрдирдХреЛ JSON рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВ рд░ рдиреЛрдбрджреНрд╡рд╛рд░рд╛ рдХрд╕рд░реА рдкреНрд░рд╢реЛрдзрди рдЧрд░рд┐рдиреНрдЫ рднрдиреЗрд░ рд╣реЗрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, -v (рдЕрд░реНрдерд╛рдд 'рд╡рд░реНрдмреЛрдЬ') рдХреЛ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН:

surfboard test -v

Waves Keeper рд╕рдБрдЧ рдПрдкрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

1. рдХрд╛рдо рдЧрд░реНрди Waves Keeper рд╕реЗрдЯ рдЕрдк рдЧрд░реНрдиреБрд╣реЛрд╕реН: http://localhost:6869

рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЧрд░реНрдиреЗ рд░ рддрд░рдВрдЧрд╣рд░реВ RIDE dApp рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ
рд╕реНрдерд╛рдиреАрдп рдиреЛрдбрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди Waves Keeper рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ

2. рдиреЗрдЯрд╡рд░реНрдХрдХреЛ рд▓рд╛рдЧрд┐ рдЯреЛрдХрдирд╣рд░реВрдХреЛ рд╕рд╛рде рдЧреЛрдкреНрдп рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдЖрдпрд╛рдд рдЧрд░реНрдиреЗ? рд╕рд░рд▓рддрд╛рдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрдХреЛ рдиреЛрдбрдХреЛ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рдмреАрдЙ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН: waves private node seed with waves tokensред рдареЗрдЧрд╛рдирд╛: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.

3. рддрдкрд╛рдИрд▓реЗ npm рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рд░реНрднрд░рд░рд╣рд┐рдд рдПрдХрд▓ рдкреГрд╖реНрда рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЖрдлреИрдВ рдЪрд▓рд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рд╡рд╛ рдЕрд╡рд╕реНрдерд┐рддрдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН: chrome-ext.wvservices.com/dapp-wallet.html

4. dApp рдареЗрдЧрд╛рдирд╛ рдкрд╛рда рдмрд╛рдХрд╕рдорд╛ рдкрд░реАрдХреНрд╖рдг рд░рди (рдорд╛рдерд┐ рд░реЗрдЦрд╛рдЩреНрдХрд┐рдд) рдмрд╛рдЯ рд╡рд╛рд▓реЗрдЯ рдареЗрдЧрд╛рдирд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН

5. "рдирд┐рдХреНрд╖реЗрдк" рдлрд┐рд▓реНрдбрдорд╛ рд╕рд╛рдиреЛ рд░рдХрдо рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдмрдЯрди рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЧрд░реНрдиреЗ рд░ рддрд░рдВрдЧрд╣рд░реВ RIDE dApp рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ
рд╡реЗрднреНрд╕ рдХрд┐рдкрд░рд▓реЗ 10 WAVES рдХреЛ рднреБрдХреНрддрд╛рдиреАрдХреЛ рд╕рд╛рде InvokeScriptTransaction рдорд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рдЕрдиреБрд░реЛрдз рдЧрд░реНрджрдЫред

6. рд▓реЗрдирджреЗрди рдкреБрд╖реНрдЯрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЧрд░реНрдиреЗ рд░ рддрд░рдВрдЧрд╣рд░реВ RIDE dApp рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ
рд▓реЗрдирджреЗрди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реА рдиреЗрдЯрд╡рд░реНрдХрдорд╛ рдкреНрд░рд╕рд╛рд░рдг рдЧрд░рд┐рдиреНрдЫред рдЕрдм рддрдкрд╛рдИрдВ рдЙрдирдХреЛ рдЖрдИрдбреА рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ

7. Waves Explorer рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓реЗрдирджреЗрди рдирд┐рдЧрд░рд╛рдиреА рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдЦреЛрдЬ рдХреНрд╖реЗрддреНрд░рдорд╛ рдЖрдИрдбреА рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЧрд░реНрдиреЗ рд░ рддрд░рдВрдЧрд╣рд░реВ RIDE dApp рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ

рдирд┐рд╖реНрдХрд░реНрд╖ рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА

рд╣рд╛рдореАрд▓реЗ Waves рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ рд╕рд╛рдзрд╛рд░рдг dApps рдХреЛ рд╡рд┐рдХрд╛рд╕, рдкрд░реАрдХреНрд╖рдг, рдбрд┐рдкреНрд▓реЛрдЗрдЩ рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдЙрдкрдХрд░рдгрд╣рд░реВ рд╣реЗрд░реНрдпреМрдВ:

  • рд╕рд╡рд╛рд░реА рднрд╛рд╖рд╛
  • VS рдХреЛрдб рд╕рдореНрдкрд╛рджрдХ
  • рд╡реЗрднреНрд╕ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░
  • рд╕рд░реНрдлрдмреЛрд░реНрдб
  • рддрд░рдВрдЧ рд░рдХреНрд╖рдХ

RIDE рд╕рд┐рдХреНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрди рдЪрд╛рд╣рдиреЗрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рд▓рд┐рдЩреНрдХрд╣рд░реВ:

рдердк рдЙрджрд╛рд╣рд░рдгрд╣рд░реБ
рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд╕рд╛рде рдЕрдирд▓рд╛рдЗрди IDE
рддрд░рдВрдЧ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг
Telegram рдорд╛ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдЪреНрдпрд╛рдЯ
рд╕реНрдЯреНрдпрд╛рдХрдУрднрд░рдлреНрд▓реЛрдорд╛ рдЫрд╛рд▓рд╣рд░реВ рд░ рд╕рд╡рд╛рд░реА
рдирдпрд╛рдБ! рд╡реЗрднреНрд╕ рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ dApps рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдЕрдирд▓рд╛рдЗрди рдкрд╛рдареНрдпрдХреНрд░рдорд╣рд░реВ

RIDE рд╢реАрд░реНрд╖рдХрдорд╛ рдбрд╛рдЗрднрд┐рдЩ рдЬрд╛рд░реА рд░рд╛рдЦреНрдиреБрд╣реЛрд╕реН рд░ рдЖрдлреНрдиреЛ рдкрд╣рд┐рд▓реЛ dApp рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН!

TL; рдб: bit.ly/2YCFnwY

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

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