Waves RIDE dApp์„ ๊ตฌ์ถ•, ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•

์•ˆ๋…•ํ•˜์„ธ์š”! ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” Waves ๋…ธ๋“œ์—์„œ ์ผ๋ฐ˜ dApp์„ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋„๊ตฌ์™€ ๋ฐฉ๋ฒ•, ๊ฐœ๋ฐœ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Waves RIDE dApp์„ ๊ตฌ์ถ•, ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•

dApp๊ณผ ์ผ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐœ๋ฐœ ๊ณ„ํš์€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

  • ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค
  • ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
  • ํ…Œ์ŠคํŠธ

๋„๊ตฌ

1. docker ๋…ธ๋“œ์™€ Waves Explorer๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด

๋…ธ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ด ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ํ…Œ์ŠคํŠธ ๋ฐ ์‹คํ—˜ ๋„คํŠธ์›Œํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž์ฒด ๋…ธ๋“œ๋ฅผ ๋ฐฐํฌํ•˜์ง€ ์•Š์œผ๋ฉด ํ…Œ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง€์—ฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ…Œ์ŠคํŠธ ํ† ํฐ์ด ์žˆ๋Š” ์ƒˆ ๊ณ„์ •์ด ์ง€์†์ ์œผ๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋„คํŠธ์›Œํฌ ์ˆ˜๋„๊ผญ์ง€๋Š” 10๋ถ„๋งˆ๋‹ค 10๊ฐœ์˜ WAVES๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ๋„คํŠธ์›Œํฌ์˜ ํ‰๊ท  ๋ธ”๋ก ์‹œ๊ฐ„์€ 1๋ถ„์ด๊ณ , ๋…ธ๋“œ์—์„œ๋Š” 15์ดˆ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฑฐ๋ž˜์— ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ํ™•์ธ์ด ํ•„์š”ํ•  ๋•Œ ํŠนํžˆ ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค.
  • ๊ณต๊ฐœ ํ…Œ์ŠคํŠธ ๋…ธ๋“œ์—์„œ๋Š” ๊ณต๊ฒฉ์ ์ธ ์บ์‹ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ์œ ์ง€๋ณด์ˆ˜๋กœ ์ธํ•ด ์ผ์‹œ์ ์œผ๋กœ ์ด์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ๋ถ€ํ„ฐ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ์ž์‹ ์˜ ๋…ธ๋“œ๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2. ์„œํ•‘๋ณด๋“œ ๋ช…๋ น์ค„ ๋„๊ตฌ

  • ์—ฌ๊ธฐ์—์„œ ppa, homebrew ๋˜๋Š” exe๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Node.js๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•˜์„ธ์š”. https://nodejs.org/en/download/.
  • ๊ธฐ์กด ๋…ธ๋“œ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ธ Surfboard๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

npm install -g @waves/surfboard

3. Visual Studio Code ํ”Œ๋Ÿฌ๊ทธ์ธ

IDE ํŒฌ์ด ์•„๋‹ˆ๊ณ  ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋‹จ๊ณ„๋Š” ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ชจ๋“  ๋„๊ตฌ๋Š” ๋ช…๋ น์ค„ ์œ ํ‹ธ๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค. vim์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ฃผ์˜ํ•˜์„ธ์š” vim-ride.

Visual Studio Code๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. https://code.visualstudio.com/

VS Code๋ฅผ ์—ด๊ณ  wave-ride ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

Waves RIDE dApp์„ ๊ตฌ์ถ•, ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•

Waves Keeper ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ: https://wavesplatform.com/products-keeper

์™„๋ฃŒ!

๋…ธ๋“œ ๋ฐ Waves Explorer ์‹œ์ž‘

1. ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

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

๋…ธ๋“œ๊ฐ€ REST API๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. http://localhost:6869:

Waves 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. ๋นˆ ๋กœ์ปฌ ๋…ธ๋“œ ํšŒ๋กœ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ๊ตฌ์ถ•๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Waves RIDE dApp์„ ๊ตฌ์ถ•, ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•
Waves Explorer์— ๋กœ์ปฌ ๋…ธ๋“œ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

RIDE ๊ตฌ์กฐ ๋ฐ ์„œํ•‘๋ณด๋“œ ๋„๊ตฌ

๋นˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์„ธ์š”.

surfboard init

์ด ๋ช…๋ น์€ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ, "hello world" ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. VS Code๋กœ ์ด ํด๋”๋ฅผ ์—ด๋ฉด ๋‹ค์Œ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Waves RIDE dApp์„ ๊ตฌ์ถ•, ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•
Surfboard.config.json

  • ./ride/ ํด๋” ์•„๋ž˜์— ๋‹จ์ผ ํŒŒ์ผ wallet.ride(dApp ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ธ”๋ก์—์„œ๋Š” dApp์„ ๊ฐ„๋žตํ•˜๊ฒŒ ๋ถ„์„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ./test/ ํด๋” ์•„๋ž˜์— *.js ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ์—ฌ๊ธฐ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ./surfboard.config.json โ€“ ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์œ„ํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

Envs๋Š” ์ค‘์š”ํ•œ ์„น์…˜์ž…๋‹ˆ๋‹ค. ๊ฐ ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • dApp์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ๋…ธ๋“œ์˜ REST API ์—”๋“œํฌ์ธํŠธ์™€ ๋„คํŠธ์›Œํฌ์˜ CHAIN_ID์ž…๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ํ† ํฐ์˜ ์†Œ์Šค๊ฐ€ ๋  ํ† ํฐ์ด ์žˆ๋Š” ๊ณ„์ •์— ๋Œ€ํ•œ ๋น„๋ฐ€ ๋ฌธ๊ตฌ์ž…๋‹ˆ๋‹ค.

๋ณด์‹œ๋‹ค์‹œํ”ผ, Surfboard.config.json์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๋กœ์ปฌ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค(defaultEnv ํ‚ค๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค).

์ง€๊ฐ‘ ๋ฐ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

์ด ์„น์…˜์€ RIDE ์–ธ์–ด์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ณด๋‹ค๋Š” ๋ธ”๋ก์ฒด์ธ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐํฌํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ดํŽด๋ณด์„ธ์š”.

๊ฐ„๋‹จํ•œ Wallet ๋ฐ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ dApp ์ฃผ์†Œ๋กœ ํ† ํฐ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WAVES๋งŒ ์ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. InvokeScriptTransaction์„ ํ†ตํ•ด ๋‘ ๊ฐ€์ง€ @Callable ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • deposit()WAVES์— ์ฒจ๋ถ€๋œ ๊ฒฐ์ œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • withdraw(amount: Int)ํ† ํฐ์„ ๋ฐ˜ํ™˜ํ•˜๋Š”

dApp ๋ผ์ดํ”„์‚ฌ์ดํด ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ตฌ์กฐ(์ฃผ์†Œ โ†’ ๊ธˆ์•ก)๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘
๊ฒฐ๊ณผ ์ƒํƒœ

์ฒ˜์Œ์—๋Š”
๋นˆ

์•จ๋ฆฌ์Šค๋Š” 5 WAVES๋ฅผ ์˜ˆ์น˜ํ•ฉ๋‹ˆ๋‹ค.
์•จ๋ฆฌ์Šค ์ฃผ์†Œ โ†’ 500000000

Bob์€ 2 WAVES๋ฅผ ์ž…๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค.

์•จ๋ฆฌ์Šค ์ฃผ์†Œ โ†’ 500000000
๋ฐฅ ์ฃผ์†Œ โ†’ 200000000

Bob์€ 7 WAVES๋ฅผ ์ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
๊ฑฐ๋ถ€๋จ!

์•จ๋ฆฌ์Šค๋Š” 4๊ฐœ์˜ WAVES๋ฅผ ์ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์•จ๋ฆฌ์Šค ์ฃผ์†Œ โ†’ 100000000
๋ฐฅ ์ฃผ์†Œ โ†’ 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 ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜๋Š” ๋™์•ˆ ์ง€์†์ ์ธ ์ปดํŒŒ์ผ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ œ ํƒญ์—์„œ ํ•ญ์ƒ ์˜ค๋ฅ˜๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Waves RIDE dApp์„ ๊ตฌ์ถ•, ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•
ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•  ๋•Œ ๋‹ค๋ฅธ ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

surfboard compile ride/wallet.ride

๊ทธ๋Ÿฌ๋ฉด ์ผ๋ จ์˜ base64 ์ปดํŒŒ์ผ๋œ RIDE ์ฝ”๋“œ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

'wallet.ride'์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ

์‚ดํŽด ๋ณด์ž ํ…Œ์ŠคํŠธ ํŒŒ์ผ. JavaScript์˜ Mocha ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค. "์ด์ „" ๊ธฐ๋Šฅ๊ณผ ์„ธ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  • "์ด์ „"์€ MassTransferTransaction์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ณ„์ •์— ์ž๊ธˆ์„ ์กฐ๋‹ฌํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ๋ธ”๋ก์ฒด์ธ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
  • "์˜ˆ๊ธˆ ๊ฐ€๋Šฅ"์€ InvokeScriptTransaction์„ ๋„คํŠธ์›Œํฌ๋กœ ์ „์†กํ•˜์—ฌ ๋‘ ๊ณ„์ • ๊ฐ๊ฐ์— ๋Œ€ํ•ด ์˜ˆ๊ธˆ() ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ˆ„๊ตฌ๋„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ† ํฐ์„ ํ›”์น  ์ˆ˜ ์—†๋‹ค๋Š” โ€œ์˜ˆ์น˜๋œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธˆ์•ก์„ ์ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹คโ€ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.
  • โ€œ์ž…๊ธˆ ๊ฐ€๋Šฅโ€์€ ์ถœ๊ธˆ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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 ์ƒํƒœ, ๋””์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Waves RIDE dApp์„ ๊ตฌ์ถ•, ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•
์›จ์ด๋ธŒ ์ต์Šคํ”Œ๋กœ๋Ÿฌ. ๋ฐฉ๊ธˆ ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์„œํ•‘๋ณด๋“œ ํŒ:

1. ํ…Œ์ŠคํŠธ๋„ท ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

surfboard test --env=testnet

ํ…Œ์ŠคํŠธ ํ† ํฐ ๋ฐ›๊ธฐ

2. ํŠธ๋žœ์žญ์…˜์˜ JSON ๋ฒ„์ „๊ณผ ๋…ธ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์„ ๋ณด๋ ค๋ฉด -v('verbose'๋ฅผ ์˜๋ฏธ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

surfboard test -v

Waves Keeper์™€ ํ•จ๊ป˜ ์•ฑ ์‚ฌ์šฉํ•˜๊ธฐ

1. Waves Keeper๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. http://localhost:6869

Waves 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. "์ž…๊ธˆ" ํ•„๋“œ์— ์†Œ์•ก์„ ์ž…๋ ฅํ•˜๊ณ  ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”:

Waves RIDE dApp์„ ๊ตฌ์ถ•, ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•
Waves Keeper๋Š” 10 WAVES๋ฅผ ์ง€๋ถˆํ•˜๊ณ  InvokeScriptTransaction์— ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

6. ๊ฑฐ๋ž˜๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

Waves RIDE dApp์„ ๊ตฌ์ถ•, ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•
ํŠธ๋žœ์žญ์…˜์ด ์ƒ์„ฑ๋˜์–ด ๋„คํŠธ์›Œํฌ์— ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ๊ทธ๋…€์˜ ID๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

7. Waves Explorer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์ฐฝ์— ์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”

Waves RIDE dApp์„ ๊ตฌ์ถ•, ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•

๊ฒฐ๋ก  ๋ฐ ์ถ”๊ฐ€ ์ •๋ณด

Waves ํ”Œ๋žซํผ์—์„œ ๊ฐ„๋‹จํ•œ dApp์„ ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

  • RIDE ์–ธ์–ด
  • VS ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ
  • ์›จ์ด๋ธŒ ํƒ์ƒ‰๊ธฐ
  • ์„œํ•‘ ๋ณด๋“œ
  • ์›จ์ด๋ธŒ ํ‚คํผ

RIDE๋ฅผ ๊ณ„์† ๋ฐฐ์šฐ๊ณ  ์‹ถ์€ ๋ถ„๋“ค์„ ์œ„ํ•œ ๋งํฌ:

๋” ๋งŽ์€ ์˜ˆ
์˜ˆ์ œ๊ฐ€ ํฌํ•จ๋œ ์˜จ๋ผ์ธ IDE
์›จ์ด๋ธŒ ๋ฌธ์„œ
ํ…”๋ ˆ๊ทธ๋žจ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„ํŒ…
์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์˜ Waves ๋ฐ RIDE
์ƒˆ๋กœ์šด! Waves ํ”Œ๋žซํผ์—์„œ dApp์„ ์ƒ์„ฑํ•˜๋Š” ์˜จ๋ผ์ธ ๊ณผ์ •

๊ณ„์†ํ•ด์„œ RIDE ์ฃผ์ œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  ์ฒซ ๋ฒˆ์งธ dApp์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”!

TL; DR : bit.ly/2YCFnwY

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€