เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบ„เบทเป‰เบ™ RIDE dApp

เบชเบฐเบšเบฒเบเบ”เบต! เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ‚เป‰เบญเบเบˆเบฐเบชเบฐเปเบ”เบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ dApp เบ›เบปเบเบเบฐเบ•เบดเบขเบนเปˆเปƒเบ™ Waves node. เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™, เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ.

เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบ„เบทเป‰เบ™ RIDE dApp

เป‚เบ„เบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบชเปเบฒเบฅเบฑเบš dApps เปเบฅเบฐเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ›เบปเบเบเบฐเบ•เบดเปเบกเปˆเบ™เป€เบเบทเบญเบšเบ„เบทเบเบฑเบ™:

  • เบเบฒเบ™เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”
  • เบเบฒเบ™เบ‚เบฝเบ™เปเบšเบšเบ—เบปเบ”เบชเบญเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”
  • เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ
  • เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš

เป€เบ„เบทเปˆเบญเบ‡เบกเบท

1. docker เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ node เปเบฅเบฐ Waves Explorer

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ node, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เป‰เบฒเบกเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰. เบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”, เบกเบตเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเบฐเบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡. เปเบ•เปˆเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ deploy node เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบญเบฒเบ”เบˆเบฐ drag เบชเบธเบ”.

  • เบ—เปˆเบฒเบ™เบˆเบฐเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเบšเบฑเบ™เบŠเบตเปƒเบซเบกเปˆเบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เบเบฑเบš tokens เบ—เบปเบ”เบชเบญเบš. faucet เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบˆเบฐเป‚เบญเบ™ 10 WAVES เบ—เบธเบเป† 10 เบ™เบฒเบ—เบต.
  • เป€เบงเบฅเบฒเบšเบฅเบฑเบญเบเบชเบฐเป€เบฅเปˆเบเปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบกเปˆเบ™ 1 เบ™เบฒเบ—เบต, เปƒเบ™เป‚เบซเบ™เบ” โ€“ 15 เบงเบดเบ™เบฒเบ—เบต. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เบธเบฅเบฐเบเปเบฒเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เบขเบทเบ™เบขเบฑเบ™เบซเบผเบฒเบ.
  • เบเบฒเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เปเบšเบšเบฎเบธเบเบฎเบฒเบ™เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เปƒเบ™เบ‚เปเป‰เบ—เบปเบ”เบชเบญเบšเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ.
  • เบžเบงเบเบกเบฑเบ™เบญเบฒเบ”เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบŠเบปเปˆเบงเบ„เบฒเบงเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบšเบณเบฅเบธเบ‡เบฎเบฑเบเบชเบฒ.

เบˆเบฒเบเบ™เบตเป‰เป„เบ›เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš node เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡.

2. Surfboard Command Line Tool

  • เบ”เบฒเบงเป‚เบซเบฅเบ”เปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡ Node.js เป‚เบ”เบเปƒเบŠเป‰ ppa, homebrew เบซเบผเบท exe เบ—เบตเปˆเบ™เบตเป‰: https://nodejs.org/en/download/.
  • เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Surfboard, เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปƒเบ™ node เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง.

npm install -g @waves/surfboard

3. Visual Studio Code plugin

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเปเบกเปˆเบ™เปเบŸเบ™เบ‚เบญเบ‡ IDEs เปเบฅเบฐเบกเบฑเบเบ•เบปเบงเปเบเป‰เป„เบ‚เบ‚เปเป‰เบ„เบงเบฒเบก. เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เป€เบ„เบทเปˆเบญเบ‡เปƒเบŠเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบŠเป‰ vim, เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฑเบš plugin เบ‚เบตเปˆเบฅเบปเบ”.

เบ”เบฒเบงเป‚เบซเบผเบ” เปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡ Visual Studio Code: https://code.visualstudio.com/

เป€เบ›เบตเบ”เบฅเบฐเบซเบฑเบ” VS เปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡ plugin waves-ride:

เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบ„เบทเป‰เบ™ RIDE dApp

เบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบเบ‚เบญเบ‡เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš Waves Keeper: https://wavesplatform.com/products-keeper

เปเบฅเป‰เบง!

เป€เบฅเบตเปˆเบก node เปเบฅเบฐ Waves Explorer

1. เป€เบฅเบตเปˆเบก node:

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

เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒ node เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเป‚เบ”เบเบœเปˆเบฒเบ™ REST API เปƒเบ™ http://localhost:6869:

เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบ„เบทเป‰เบ™ RIDE dApp
Swagger REST API เบชเปเบฒเบฅเบฑเบš node

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. เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡เบงเบปเบ‡เบˆเบญเบ™ node เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒเป„เบงเป€เบ—เบปเปˆเบฒเปƒเบ”.

เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบ„เบทเป‰เบ™ RIDE dApp
Waves Explorer เบชเบฐเปเบ”เบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡ node เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™

เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ RIDE เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบกเบท Surfboard

เบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒเปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เปƒเบ™เบกเบฑเบ™

surfboard init

เบ„เปเบฒเบชเบฑเปˆเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ—เบตเปˆเบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™, เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบฅเบฐเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš "เบชเบฐเบšเบฒเบเบ”เบตเป‚เบฅเบ". เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบ›เบตเบ”เป‚เบŸเบ™เป€เบ”เบตเบ™เบตเป‰เบ”เป‰เบงเบเบฅเบฐเบซเบฑเบ” VS, เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™:

เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบ„เบทเป‰เบ™ RIDE dApp
Surfboard.config.json

  • เบžเบฒเบเปƒเบ•เป‰เป‚เบŸเบ™เป€เบ”เบต ./ride/ เบ—เปˆเบฒเบ™เบˆเบฐเบžเบปเบšเป€เบซเบฑเบ™เป„เบŸเบฅเปŒเบ”เบฝเบง wallet.ride - เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ—เบตเปˆเบฅเบฐเบซเบฑเบ” dApp เบ•เบฑเป‰เบ‡เบขเบนเปˆ. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบงเบดเป€เบ„เบฒเบฐ dApps เบชเบฑเป‰เบ™เป†เปƒเบ™เบšเบฅเบฑเบญเบเบ•เปเปˆเป„เบ›.
  • เบžเบฒเบเปƒเบ•เป‰เป‚เบŸเบ™เป€เบ”เบต ./test/ เบ—เปˆเบฒเบ™เบˆเบฐเบžเบปเบšเป€เบซเบฑเบ™เป„เบŸเบฅเปŒ *.js. เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เบ—เบตเปˆเบ™เบตเป‰.
  • ./surfboard.config.json โ€“ เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเบณเบฅเบฑเบšเบเบฒเบ™เปเบฅเปˆเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš.

Envs เปเบกเปˆเบ™เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™. เบชเบฐโ€‹เบžเบฒเบšโ€‹เปเบงเบ”โ€‹เบฅเป‰เบญเบกโ€‹เปเบ•เปˆโ€‹เบฅเบฐโ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบ”เบฑเปˆเบ‡โ€‹เบ™เบตเป‰โ€‹:

  • REST API endpoint เบ‚เบญเบ‡ node เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบ›เบตเบ” dApp เปเบฅเบฐ CHAIN_ID เบ‚เบญเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบ.
  • เบ›เบฐเป‚เบซเบเบเบฅเบฑเบšเบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบŠเบตเบ—เบตเปˆเบกเบต tokens เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡ tokens เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, surfboard.config.json เบฎเบญเบ‡เบฎเบฑเบšเบซเบผเบฒเบเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบกเปˆเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™ (เบ›เบธเปˆเบก defaultEnv เปเบกเปˆเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰).

เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ Wallet-demo

เบžเบฒเบเบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เบญเป‰เบฒเบ‡เบญเบตเบ‡เป€เบ–เบดเบ‡เบžเบฒเบชเบฒ RIDE. เปเบ—เบ™เบ—เบตเปˆเบˆเบฐ, เป€เบšเบดเปˆเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ™เปเบฒเปƒเบŠเป‰เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเป€เบžเบทเปˆเบญเปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเปƒเบˆเบ”เบตเบ‚เบถเป‰เบ™เบเปˆเบฝเบงเบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™ blockchain.

เบกเบฒเป€เบšเบดเปˆเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ Wallet-demo เบ‡เปˆเบฒเบเป†. เบ—เบธเบเบ„เบปเบ™เบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡ tokens เป„เบ›เบซเบฒเบ—เบตเปˆเบขเบนเปˆ dApp. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ–เบญเบ™ WAVES เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป„เบ”เป‰เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เบชเบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™ @Callable เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบœเปˆเบฒเบ™ InvokeScriptTransaction:

  • deposit()เป€เบŠเบดเปˆเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบˆเปˆเบฒเบเป€เบ‡เบดเบ™เบ—เบตเปˆเบ•เบดเบ”เบ„เบฑเบ”เบกเบฒเปƒเบ™ WAVES
  • withdraw(amount: Int)เป€เบŠเบดเปˆเบ‡เบชเบปเปˆเบ‡เบ„เบทเบ™ tokens

เบ•เบฐเบซเบผเบญเบ”เบงเบปเบ‡เบˆเบญเบ™เบŠเบตเบงเบดเบ”เบ‚เบญเบ‡ dApp, เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ (เบ—เบตเปˆเบขเบนเปˆ โ†’ เบˆเปเบฒเบ™เบงเบ™) เบˆเบฐเบ–เบทเบเบฎเบฑเบเบชเบฒเป„เบงเป‰:

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”
เบชเบฐเบ–เบฒเบ™เบฐเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš

เปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™
เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ

Alice เบเบฒเบ 5 WAVES
alice-address โ†’ 500000000

Bob เบเบฒเบ 2 WAVES

alice-address โ†’ 500000000
bob-เบ—เบตเปˆเบขเบนเปˆ โ†’ 200000000

Bob เบ–เบญเบ™ 7 WAVES
เบ›เบฐเบ•เบดเป€เบชเบ”!

Alice เบ–เบญเบ™ 4 WAVES
alice-address โ†’ 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.

plugin VSCode เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเปเบเป‰เป„เบ‚เป„เบŸเบฅเปŒ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เปเบ–เบšเบšเบฑเบ™เบซเบฒเป„เบ”เป‰เบ•เบฐเบซเบผเบญเบ”เป€เบงเบฅเบฒ.

เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบ„เบทเป‰เบ™ RIDE dApp
เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบ•เบปเบงเปเบเป‰เป„เบ‚เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปƒเบ™เป€เบงเบฅเบฒเบฅเบงเบšเบฅเบงเบกเป„เบŸเบฅเปŒ, เปƒเบซเป‰เปƒเบŠเป‰

surfboard compile ride/wallet.ride

เบ™เบตเป‰เบˆเบฐเบญเบญเบเบŠเบธเบ”เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ” RIDE เบ—เบตเปˆเบฅเบงเบšเบฅเบงเบกเบˆเบฒเบ base64.

เบ—เบปเบ”เบชเบญเบšเบชเบฐเบ„เบฃเบดเบšเบชเบณเบฅเบฑเบš 'wallet.ride'

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบขเบนเปˆ เป„เบŸเบฅโ€‹เปŒโ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹. เบ‚เบฑเบšเป€เบ„เบทเปˆเบญเบ™เป‚เบ”เบเบเบญเบš Mocha เบ‚เบญเบ‡ JavaScript. เบกเบตเบซเบ™เป‰เบฒเบ—เบตเปˆ "เบเปˆเบญเบ™" เปเบฅเบฐเบชเบฒเบกเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš:

  • "เบเปˆเบญเบ™" เบชเบฐเบซเบ™เบญเบ‡เบ—เบถเบ™เบซเบผเบฒเบเบšเบฑเบ™เบŠเบตเบœเปˆเบฒเบ™ MassTransferTransaction, เบฅเบงเบšเบฅเบงเบกเบชเบฐเบ„เบดเบšเปเบฅเบฐเบ™เปเบฒเป„เบ›เปƒเบŠเป‰เปƒเบ™ blockchain.
  • "เบชเบฒเบกเบฒเบ”เบเบฒเบเป€เบ‡เบดเบ™เป„เบ”เป‰" เบชเบปเปˆเบ‡ InvokeScriptTransaction เป„เบ›เบซเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เป€เบ›เบตเบ”เปƒเบŠเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ‡เบดเบ™เบเบฒเบ () เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบšเบฑเบ™เบŠเบตเบ—เบฑเบ‡เบชเบญเบ‡.
  • "เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ–เบญเบ™เป„เบ”เป‰เบซเบผเบฒเบเบเปˆเบงเบฒเป€เบ‡เบดเบ™เบเบฒเบ" เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ—เบตเปˆเบšเปเปˆเบกเบตเปƒเบœเบชเบฒเบกเบฒเบ”เบฅเบฑเบ tokens เบ‚เบญเบ‡เบ„เบปเบ™เบญเบทเปˆเบ™.
  • โ€œเบชเบฒเบกเบฒเบ”เบเบฒเบเป€เบ‡เบดเบ™เป„เบ”เป‰โ€ เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบเบฒเบ™เบ–เบญเบ™เป€เบ‡เบดเบ™เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡.

เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบˆเบฒเบ Surfboard เปเบฅเบฐเบงเบดเป€เบ„เบฒเบฐเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปƒเบ™ Waves Explorer

เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš, เปเบฅเปˆเบ™

surfboard test

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบชเบฐเบ„เบดเบšเบซเบผเบฒเบเบ•เบปเบง (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฐเบ„เบดเบšเบ—เบตเปˆเปƒเบŠเป‰เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ), เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป„เบ”เป‰

surfboard test my-scenario.js

Surfboard เบˆเบฐเป€เบเบฑเบšเบเบณเป„เบŸเบฅเปŒเบ—เบปเบ”เบชเบญเบšเบขเบนเปˆเปƒเบ™เป‚เบŸเป€เบ”เบต ./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)

เป‚เบซเป‰เบ! เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบœเปˆเบฒเบ™. เบ•เบญเบ™เบ™เบตเป‰เบฅเบญเบ‡เป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เป€เบกเบทเปˆเบญเปƒเบŠเป‰ Waves Explorer: เป€เบšเบดเปˆเบ‡เบšเบผเบฑเบญเบ เบซเบผเบทเบงเบฒเบ‡เบ—เบตเปˆเบขเบนเปˆเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบฑเป‰เบ™เปƒเบชเปˆเปƒเบ™เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™. wallet#. เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบ›เบฐเบซเบงเบฑเบ”เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ, เบชเบฐเบ–เบฒเบ™เบฐ dApp, เป„เบŸเบฅเปŒเบ–เบฒเบ™เบชเบญเบ‡เบ—เบตเปˆเปเบ•เบเบซเบฑเบ.

เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบ„เบทเป‰เบ™ RIDE dApp
Waves Explorer. เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบซเบฒเบเปเปˆเบ–เบทเบเบ™เบณเปƒเบŠเป‰.

เบšเบฒเบ‡เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ Surfboard:

1. เป€เบžเบทเปˆเบญเบ—เบปเบ”เบชเบญเบšเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก testnet, เปƒเบŠเป‰:

surfboard test --env=testnet

เบฎเบฑเบšเป‚เบ—เป€เบ„เบฑเบ™เบ—เบปเบ”เบชเบญเบš

2. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบชเบฐเบšเบฑเบš JSON เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบžเบงเบเบกเบฑเบ™เบ–เบทเบเบ›เบธเบ‡เปเบ•เปˆเบ‡เป‚เบ”เบ node, เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ”เป‰เบงเบ -v (เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ 'verbose'):

surfboard test -v

เปƒเบŠเป‰เปเบญเบฑเบšเบเบฑเบš Waves Keeper

1. เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Waves Keeper เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบ: http://localhost:6869

เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบ„เบทเป‰เบ™ RIDE dApp
เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Waves Keeper เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš node เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™

2. เบ™เปเบฒเป€เบ‚เบปเป‰เบฒเบ›เบฐเป‚เบซเบเบเบฅเบฑเบšเบ—เบตเปˆเบกเบต tokens เบชเปเบฒเบฅเบฑเบšเป€เบ„เบทเบญเบ‚เปˆเบฒเบ? เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบ, เปƒเบซเป‰เปƒเบŠเป‰เปเบเปˆเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบ‚เบญเบ‡ node เบ‚เบญเบ‡เบ—เปˆเบฒเบ™: waves private node seed with waves tokens. เบ—เบตเปˆเบขเบนเปˆ: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.

3. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบซเบ™เป‰เบฒเบ”เบฝเบง serverless เบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡เป‚เบ”เบเปƒเบŠเป‰ npm. เบซเบผเบทเป„เบ›เบ—เบตเปˆเบญเบฑเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง: chrome-ext.wvservices.com/dapp-wallet.html

4. เปƒเบชเปˆเบ—เบตเปˆเบขเบนเปˆ wallet เบˆเบฒเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš (เบ‚เบตเบ”เบเป‰เบญเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡) เปƒเบชเปˆเปƒเบ™เบเปˆเบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบขเบนเปˆ dApp

5. เปƒเบชเปˆเบˆเปเบฒเบ™เบงเบ™เบ™เป‰เบญเบเป†เปƒเบ™เบŠเปˆเบญเบ‡ "เป€เบ‡เบดเบ™เบเบฒเบ" เปเบฅเบฐเบ„เบฅเบดเบเปƒเบชเปˆเบ›เบธเปˆเบก:

เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบ„เบทเป‰เบ™ RIDE dApp
Waves Keeper เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เป€เบžเบทเปˆเบญเป€เบŠเบฑเบ™เบŠเบทเปˆ InvokeScriptTransaction เบ”เป‰เบงเบเบเบฒเบ™เบˆเปˆเบฒเบเป€เบ‡เบดเบ™ 10 WAVES.

6. เบขเบทเบ™เบขเบฑเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ:

เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบ„เบทเป‰เบ™ RIDE dApp
เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปเบฅเบฐเบญเบญเบเบญเบฒเบเบฒเบ”เป„เบ›เบชเบนเปˆเป€เบ„เบทเบญเบ‚เปˆเบฒเบ. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡ ID เบ‚เบญเบ‡เบ™เบฒเบ‡

7. เบ•เบดเบ”เบ•เบฒเบกเบเบงเบ”เบเบฒเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเป‚เบ”เบเปƒเบŠเป‰ Waves Explorer. เปƒเบชเปˆ ID เปƒเบ™เบŠเปˆเบญเบ‡เบŠเบญเบเบซเบฒ

เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบ„เบทเป‰เบ™ RIDE dApp

เบšเบปเบ”เบชเบฐเบซเบผเบธเบšเปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก

เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบšเบดเปˆเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบ—เบปเบ”เบชเบญเบš, เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ™เบณเปƒเบŠเป‰ dApps เบ‡เปˆเบฒเบเป†เปƒเบ™เป€เบงเบ—เบต Waves:

  • เบžเบฒเบชเบฒ RIDE
  • VS Code Editor
  • Waves Explorer
  • เป€เบฎเบทเบญเปƒเบš
  • เบœเบนเป‰เบฎเบฑเบเบชเบฒเบ„เบทเป‰เบ™

เบฅเบดเป‰เบ‡เบชเบณเบฅเบฑเบšเบœเบนเป‰เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบทเบšเบ•เปเปˆเบเบฒเบ™เบฎเบฝเบ™เบฎเบนเป‰ RIDE:

เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบžเบตเปˆเบกเป€เบ•เบตเบก
Online IDE เบกเบตเบ•เบปเบงเบขเปˆเบฒเบ‡
เป€เบญเบเบฐเบชเบฒเบ™เบ„เบทเป‰เบ™
เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบชเบปเบ™เบ—เบฐเบ™เบฒเปƒเบ™ Telegram
เบ„เบทเป‰เบ™เบŸเบญเบ‡เปเบฅเบฐ RIDE เบชเบธเบ” stackoverflow
เปƒเบซเบกเปˆ! เบซเบผเบฑเบเบชเบนเบ”เบญเบญเบ™เป„เบฅเบ™เปŒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡ dApps เปƒเบ™ Waves Platform

เบชเบทเบšเบ•เปเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบซเบปเบงเบ‚เปเป‰ RIDE เปเบฅเบฐเบชเป‰เบฒเบ‡ dApp เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™!

TL; DR: bit.ly/2YCFnwY

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™