Waves ๋ธ”๋ก์ฒด์ธ์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ถ„์‚ฐ ์ œํœด ํ”„๋กœ๊ทธ๋žจ

Bettex ํŒ€์ด Waves Labs ๋ณด์กฐ๊ธˆ์˜ ์ผ๋ถ€๋กœ ๊ตฌํ˜„ํ•œ Waves ๋ธ”๋ก์ฒด์ธ ๊ธฐ๋ฐ˜์˜ ๋ถ„์‚ฐํ˜• ์ œํœด ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

๊ฒŒ์‹œ๋ฌผ์€ ํ›„์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ์ด ํ”„๋กœ๊ทธ๋žจ์€ ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ ์‚ฌ์šฉ ๋ฐ ๋ฐฐํฌ๋Š” ๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ์‚ฌ์šฉ์€ dApp ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐœ๋ฐœ์„ ์ž๊ทนํ•˜๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ๋„คํŠธ์›Œํฌ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ์œ ์ตํ•œ ํƒˆ์ค‘์•™ํ™”๋ฅผ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค.

Waves ๋ธ”๋ก์ฒด์ธ์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ถ„์‚ฐ ์ œํœด ํ”„๋กœ๊ทธ๋žจ

์ œ์‹œ๋œ ์ œํœด ํ”„๋กœ๊ทธ๋žจ์šฉ dApp์€ ๊ธฐ๋Šฅ์˜ ์ผ๋ถ€๋กœ ์ œํœด๋ฅผ ํฌํ•จํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋ณต์‚ฌ๋ฅผ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๊ธฐ์ˆ  ๊ตฌํ˜„์„ ์œ„ํ•œ ์ผ๋ จ์˜ ์•„์ด๋””์–ด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ๋ฉด์—์„œ ์ด๊ฒƒ์€ ์ถ”์ฒœ์ž ๋“ฑ๋ก, ์ถ”์ฒœ์— ๋Œ€ํ•œ ๋‹ค๋‹จ๊ณ„ ๋ณด์ƒ ๋ฐœ์ƒ ๋ฐ ์‹œ์Šคํ…œ ๋“ฑ๋ก ๋™๊ธฐ ๋ถ€์—ฌ (์บ์‹œ๋ฐฑ)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ œํœด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ "์ˆœ์ˆ˜ํ•œ" dApp์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ž์ฒด ๋ฐฑ์—”๋“œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ ์—†์ด ๋ธ”๋ก์ฒด์ธ๊ณผ ์ง์ ‘ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋งŽ์€ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ์ฆ‰์‹œ ์ƒํ™˜๋˜๋Š” ํฌ๋ ˆ๋”ง์œผ๋กœ ์Šค๋งˆํŠธ ๊ณ„์ •์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค(ํ†ตํ™” ์‹œ์ ์—๋Š” ๊ณ„์ •์— ํ†ตํ™” ๋Œ€๊ธˆ์„ ์ง€๋ถˆํ•  ํ† ํฐ์ด ์—†์ง€๋งŒ ํ†ตํ™” ๊ฒฐ๊ณผ๋กœ ํ‘œ์‹œ๋จ).
  • PoW-captcha - ์Šค๋งˆํŠธ ๊ณ„์ • ๊ธฐ๋Šฅ์˜ ๊ณ ์ฃผํŒŒ ์ž๋™ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๋ณดํ˜ธ - captcha์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ์ฆ๋ช…์„ ํ†ตํ•ด.
  • ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋ฐ์ดํ„ฐ ํ‚ค๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ride4dapps ์–ธ์–ด์˜ ์Šค๋งˆํŠธ ๊ณ„์ • ์ฝ”๋“œ(๊ณ„ํš๋Œ€๋กœ ์ œํœด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋ณธ ์Šค๋งˆํŠธ ๊ณ„์ •์— ๋ณ‘ํ•ฉ๋จ)
  • WAVES NODE REST API๋ฅผ ํ†ตํ•ด ์ถ”์ƒํ™” ๊ณ„์ธต์„ ๊ตฌํ˜„ํ•˜๋Š” js ๋ž˜ํผ;
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ RIDE ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ์ธ vuejs ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

๋‚˜์—ด๋œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฆ‰๊ฐ์ ์ธ ์ƒํ™˜์œผ๋กœ ์Šค๋งˆํŠธ ๊ณ„์ •์„ ๋ถ€์ฑ„๋กœ ๋ถˆ๋Ÿฌ๋“ค์ž…๋‹ˆ๋‹ค.

InvokeScript๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ ๊ณ„์ •์—์„œ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ง€๋ถˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์ •์— ์ผ์ • ์ˆ˜์˜ WAVES ํ† ํฐ์„ ๋ณด์œ ํ•œ ๋ธ”๋ก์ฒด์ธ ๊ดด์งœ๋ฅผ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ ๋Œ€์ค‘์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ œํ’ˆ์ด๋ผ๋ฉด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์‚ฌ์šฉ์ž๋Š” WAVES ํ† ํฐ(๋˜๋Š” ๊ฑฐ๋ž˜ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์ ์ ˆํ•œ ์ž์‚ฐ) ๊ตฌ๋งค์— ์ฐธ์„ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ์ด๋ฏธ ํ”„๋กœ์ ํŠธ์— ์ง„์ž…ํ•˜๊ธฐ ์œ„ํ•œ ์ƒ๋‹นํ•œ ์ž„๊ณ„๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฑฐ๋ž˜ ๋น„์šฉ์„ ์ง€๋ถˆํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž์‚ฐ์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹œ์Šคํ…œ์—์„œ ์œ ๋™ ์ž์‚ฐ์„ ํŽŒํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™ํ™”๋œ ์‹œ์Šคํ…œ์ด ์ƒ์„ฑ๋  ๋•Œ ์˜ค์šฉ์˜ ์œ„ํ—˜์— ์ง๋ฉดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

InvokeScript๋ฅผ "์ˆ˜์ทจ์ธ ๋น„์šฉ์œผ๋กœ"(์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์„ค์น˜๋œ ์Šค๋งˆํŠธ ๊ณ„์ •) ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋งค์šฐ ํŽธ๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ€๋Šฅ์„ฑ์€ ๋ถ„๋ช…ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

InvokeScript ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ์ž์˜ ์ฃผ์†Œ๋กœ ScriptTransfer๊ฐ€ ์ˆ˜ํ–‰๋˜์–ด ์ˆ˜์ˆ˜๋ฃŒ์— ์†Œ๋น„๋œ ํ† ํฐ์„ ๋ณด์ƒํ•˜๋ฉด ํ˜ธ์ถœ ๋‹น์‹œ ํ˜ธ์ถœ ๊ณ„์ •์— ์ž์‚ฐ์ด ์—†๋”๋ผ๋„ ํ˜ธ์ถœ์ด ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค. . ์ด๋Š” ์ถฉ๋ถ„ํ•œ ํ† ํฐ์— ๋Œ€ํ•œ ํ™•์ธ์ด ํŠธ๋žœ์žญ์…˜ ํ˜ธ์ถœ ์ด์ „์ด ์•„๋‹ˆ๋ผ ํŠธ๋žœ์žญ์…˜ ํ˜ธ์ถœ ์ดํ›„์— ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฆ‰๊ฐ์ ์ธ ์ƒํ™˜์— ๋”ฐ๋ผ ์‹ ์šฉ์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ScriptTransfer(i.caller, i.fee, ๋‹จ์œ„)

์•„๋ž˜ ์ฝ”๋“œ๋Š” ์Šค๋งˆํŠธ ์–ด์นด์šดํŠธ ์ž๊ธˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•œ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ํ™˜๋ถˆํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์˜ ์˜ค์šฉ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๋ฐœ์‹ ์ž๊ฐ€ ํ•ฉ๋ฆฌ์ ์ธ ํ•œ๋„ ๋‚ด์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์ž์‚ฐ์— ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ง€์ถœํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ˆ˜ํ‘œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

func checkFee(i:Invocation) = {
if i.fee > maxFee then throw(โ€œunreasonable large feeโ€) else
if i.feeAssetId != unit then throw(โ€œfee must be in WAVESโ€) else true
}

๋˜ํ•œ ์•…์˜์ ์ด๊ณ  ๋ฌด์˜๋ฏธํ•œ ์ž๊ธˆ ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™ ํ˜ธ์ถœ(PoW-captcha)์— ๋Œ€ํ•œ ๋ณดํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

PoW ์บก์ฐจ

์ž‘์—… ์ฆ๋ช… ์บก์ฐจ์˜ ์•„์ด๋””์–ด๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ ์ด๋ฏธ WAVES ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด์˜ ์š”์ ์€ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ์ž๋„ ์ž์‹ ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋น„ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฆฌ์†Œ์Šค ๊ณ ๊ฐˆ ๊ณต๊ฒฉ์— ์ƒ๋‹นํ•œ ๋น„์šฉ์ด ๋“ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ๋ฐœ์‹ ์ž๊ฐ€ PoW ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ๋งค์šฐ ์‰ฝ๊ณ  ์ €๋ ดํ•œ ๊ฒ€์ฆ์„ ์œ„ํ•ด ํŠธ๋žœ์žญ์…˜ ID ํ™•์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

if take(toBase58String(i.transactionId), 3) != "123" then throw("์ž‘์—… ์ฆ๋ช… ์‹คํŒจ") else

ํŠธ๋žœ์žญ์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ์ž๋Š” base58 ์ฝ”๋“œ(id)๊ฐ€ ์ˆซ์ž 123์œผ๋กœ ์‹œ์ž‘ํ•˜๋„๋ก ์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ์„ธ์„œ ์‹œ๊ฐ„์˜ ํ‰๊ท  ์ˆ˜์‹ญ ์ดˆ์— ํ•ด๋‹นํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ ์ž‘์—…์— ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๋” ๊ฐ„๋‹จํ•˜๊ฑฐ๋‚˜ ๋” ๋ณต์žกํ•œ PoW๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ž‘์—…์„ ๋ช…๋ฐฑํ•œ ๋ฐฉ์‹์œผ๋กœ ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ ํ‚ค

๋ธ”๋ก์ฒด์ธ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ key-val๋กœ ์ฟผ๋ฆฌํ•˜๋Š” API ๋„๊ตฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํˆดํ‚ท์€ 2019๋…„ XNUMX์›” ์ดˆ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ?์„ฑ๋ƒฅ REST API ์š”์ฒญ์‹œ /์ฃผ์†Œ/๋ฐ์ดํ„ฐ?์ผ์น˜=regexp. ์ด์ œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ชจ๋“  ํ‚ค๊ฐ€ ์•„๋‹Œ ํ•˜๋‚˜ ์ด์ƒ์˜ ํ‚ค๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ถ€ ๊ทธ๋ฃน๋งŒ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ‚ค ์ด๋ฆ„์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์ธ์ถœ ๊ฑฐ๋ž˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค.

withdraw_${userAddress}_${txid}

ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์–ด์ง„ ์ฃผ์†Œ์— ๋Œ€ํ•œ ์ž๊ธˆ ์ธ์ถœ ๊ฑฐ๋ž˜ ๋ชฉ๋ก์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

?matches=withdraw_${userAddress}_.*

์ด์ œ ์™„์„ฑ๋œ ์†”๋ฃจ์…˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ถ„์„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

vuejs ์ฝ”๋“œ

์ฝ”๋“œ๋Š” ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ๊ฐ€๊นŒ์šด ์ž‘์—… ๋ฐ๋ชจ์ž…๋‹ˆ๋‹ค. Waves Keeper๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๊ณ  affiliate.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ ์‹œ์Šคํ…œ์— ์‚ฌ์šฉ์ž๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜๋ฉฐ ํš๋“ํ•œ ์ž๊ธˆ์„ ์‚ฌ์šฉ์ž ๊ณ„์ •์œผ๋กœ ์ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Waves ๋ธ”๋ก์ฒด์ธ์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ถ„์‚ฐ ์ œํœด ํ”„๋กœ๊ทธ๋žจ

RIDE์˜ ์ฝ”๋“œ

๋“ฑ๋ก, ์ž…๊ธˆ, ์ถœ๊ธˆ ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋“ฑ๋ก ๊ธฐ๋Šฅ์€ ์‹œ์Šคํ…œ์— ์‚ฌ์šฉ์ž๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ฐธ์กฐ์ž(์ฐธ์กฐ์ž์˜ ์ฃผ์†Œ)์™€ ํŠธ๋žœ์žญ์…˜ ID(PoW-captcha ์ž‘์—…)๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํ•จ์ˆ˜ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์†”ํŠธ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋‘ ๊ฐ€์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜(์ด ํ”„๋กœ์ ํŠธ์˜ ๋‚˜๋จธ์ง€ ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ)๋Š” ์ฐจ์šฉ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜ ๋•๋ถ„์— ๋ฐฉ๊ธˆ ์ง€๊ฐ‘์„ ๋งŒ๋“  ์‚ฌ์šฉ์ž๋Š” ์‹œ์Šคํ…œ์—์„œ ์ฆ‰์‹œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฑฐ๋ž˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ง€๋ถˆํ•  ์ˆ˜ ์žˆ๋Š” ์ž์‚ฐ์„ ํš๋“ํ•˜๊ฑฐ๋‚˜ ๋ฐ›๋Š” ๋ฌธ์ œ๋กœ ๋‹นํ™ฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋“ฑ๋ก ๊ธฐ๋Šฅ์˜ ๊ฒฐ๊ณผ๋Š” ๋‘ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

${owner)_referer = referer
${referer}_referral_${owner} = owner

์ด๋ฅผ ํ†ตํ•ด ์ •๋ฐฉํ–ฅ ๋ฐ ์—ญ๋ฐฉํ–ฅ ์กฐํšŒ(์ง€์ •๋œ ์‚ฌ์šฉ์ž์˜ ์ฐธ์กฐ์ž ๋ฐ ์ง€์ •๋œ ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ์ฐธ์กฐ)๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํŽ€๋“œ ๊ธฐ๋Šฅ์€ ์‹ค์ œ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์ œ์‹œ๋œ ํ˜•ํƒœ๋กœ ๊ฑฐ๋ž˜์— ์˜ํ•ด ์ด์ฒด๋œ ๋ชจ๋“  ์ž๊ธˆ์„ ๊ฐ€์ ธ ์™€์„œ 1, 2, 3 ์ˆ˜์ค€์˜ ์ถ”์ฒœ์ž ๊ณ„์ •, "์บ์‹œ๋ฐฑ" ๊ณ„์ • ๋ฐ "๋ณ€๊ฒฝ" ๊ณ„์ •์œผ๋กœ ๋ถ„๋ฐฐํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์ •์ด ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค).

์บ์‰ฌ๋ฐฑ์€ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์ถ”์ฒœ ์‹œ์Šคํ…œ์— ์ฐธ์—ฌํ•˜๋„๋ก ์žฅ๋ คํ•˜๋Š” ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ์ง€๊ธ‰ํ•œ ์ˆ˜์ˆ˜๋ฃŒ ์ค‘ ์ผ๋ถ€๋ฅผ "์บ์‹œ๋ฐฑ" ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ์ž๋Š” ์ถ”์ฒœ ๋ณด์ƒ๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ฒœ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ๋•Œ ์‹œ์Šคํ…œ์ด ์ž‘๋™ํ•  ์Šค๋งˆํŠธ ๊ณ„์ •์˜ ๊ธฐ๋ณธ ๋…ผ๋ฆฌ์— ๋‚ด์žฅ๋œ ์ž๊ธˆ ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฒ ํŒ…์— ๋Œ€ํ•ด ์ถ”์ฒœ ๋ณด์ƒ์ด ์ง€๊ธ‰๋˜๋Š” ๊ฒฝ์šฐ ๋ฒ ํŒ…์ด ์ด๋ฃจ์–ด์ง„ ๋กœ์ง์— ์ž๊ธˆ ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ๋ณด์ƒ์ด ์ง€๊ธ‰๋˜๋Š” ๋‹ค๋ฅธ ๋Œ€์ƒ ์ž‘์—…์ด ์ˆ˜ํ–‰๋จ). ์ด ๊ธฐ๋Šฅ์—๋Š” ์„ธ ๊ฐ€์ง€ ์ˆ˜์ค€์˜ ์ถ”์ฒœ ๋ณด์ƒ์ด ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ๊ฑฐ๋‚˜ ์ ์€ ์ˆ˜์ค€์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์ฝ”๋“œ์—์„œ๋„ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. ๋ณด์ƒ ๋น„์œจ์€ level1-level3 ์ƒ์ˆ˜๋กœ ์„ค์ •๋˜๋ฉฐ ์ฝ”๋“œ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ๊ธˆ์•ก * ๋ ˆ๋ฒจ / 1000์ฆ‰, ๊ฐ’ 1์€ 0,1%์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค(์ฝ”๋“œ์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์Œ).

ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๊ณ„์ •์˜ ์ž”์•ก์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์–‘์‹์„ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•œ ํ•ญ๋ชฉ๋„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

fund_address_txid = address:owner:inc:level:timestamp
ะ”ะปั ะฟะพะปัƒั‡ะตะฝะธั timestamp (ั‚ะตะบัƒั‰ะตะณะพ ะฒั€ะตะผะตะฝะธ) ะธัะฟะพะปัŒะทัƒะตั‚ัั ั‚ะฐะบะฐั ะฒะพั‚ ัะฒัะทะบะฐ
func getTimestamp() = {
let block = extract(blockInfoByHeight(height))
toString(block.timestamp)
}

์ฆ‰, ํŠธ๋žœ์žญ์…˜์˜ ์‹œ๊ฐ„์€ ํŠธ๋žœ์žญ์…˜์ด ์œ„์น˜ํ•œ ๋ธ”๋ก์˜ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ์ฝœ๋Ÿฌ๋ธ”์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜ ์ž์ฒด์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.
์ธ์ถœ ๊ธฐ๋Šฅ์€ ๋ˆ„์ ๋œ ๋ณด์ƒ์„ ์‚ฌ์šฉ์ž ๊ณ„์ •์œผ๋กœ ๋ชจ๋‘ ์ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊น… ๋ชฉ์ ์œผ๋กœ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

# withdraw log: withdraw_user_txid=amount:timestamp

์‹ ์ฒญ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฃผ์š” ๋ถ€๋ถ„์€ ์ œํœด ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ WAVES NODE REST API ์‚ฌ์ด์˜ ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•˜๋Š” affiliate.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ ๋…๋ฆฝ์ ์ธ ์ถ”์ƒํ™” ๊ณ„์ธต์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค(์•„๋ฌด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ). ํ™œ์„ฑ ๊ธฐ๋Šฅ(๋“ฑ๋ก, ์ฒ ํšŒ)์€ Waves Keeper๊ฐ€ ์‹œ์Šคํ…œ์— ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๋Š” ์ด๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋Šฅ์€ ์ด๋ฆ„, ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ๋ฐ์ดํ„ฐ์—์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ์ฝ”๋“œ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋“ฑ๋ก ๊ธฐ๋Šฅ์—๋Š” ์ถ”๊ฐ€ ์„ค๋ช…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ID ์„ ํƒ ์ฃผ๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ 123์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๋Ÿ‰ ๋“ฑ๋ก์„ ๋ฐฉ์ง€ํ•˜๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ PoW ๋ณด์•ˆ ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ํ•„์š”ํ•œ ID๋ฅผ ๊ฐ€์ง„ ํŠธ๋žœ์žญ์…˜์„ ์ฐพ์€ ๋‹ค์Œ Waves Keeper๋ฅผ ํ†ตํ•ด ์„œ๋ช…ํ•ฉ๋‹ˆ๋‹ค.

DEX ์ œํœด ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GitHub.com.

์ถœ์ฒ˜ : habr.com

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