ããã«ã¡ã¯ïŒ ãã®èšäºã§ã¯ãWaves ããŒãäžã§éåžžã® dApp ãäœæããŠå®è¡ããæ¹æ³ã説æããŸãã å¿ èŠãªããŒã«ãææ³ãéçºäŸãèŠãŠã¿ãŸãããã
dApp ãšéåžžã®ã¢ããªã±ãŒã·ã§ã³ã®éçºã¹ããŒã ã¯ã»ãŒåãã§ãã
- ã³ãŒããæžã
- èªåãã¹ãã®äœæ
- ã¢ããªã±ãŒã·ã§ã³ã®èµ·å
- ãã¹ã
ããŒã«
1. docker
ããŒããšWaves Explorerãå®è¡ããã«ã¯
ããŒããéå§ããããªãå Žåã¯ããã®æé ãã¹ãããã§ããŸãã çµå±ã®ãšããããã¹ããšå®éšã®ãããã¯ãŒã¯ãååšããŸãã ãã ããç¬èªã®ããŒãããããã€ããªããšããã¹ã ããã»ã¹ãé·åŒãå¯èœæ§ããããŸãã
- ãã¹ã ããŒã¯ã³ãæã€æ°ããã¢ã«ãŠã³ããåžžã«å¿ èŠã«ãªããŸãã ãã¹ã ãããã¯ãŒã¯ ãã©ãŒã»ãã㯠10 åããšã« 10 WAVE ã転éããŸãã
- ãã¹ã ãããã¯ãŒã¯ã®å¹³åãããã¯æé㯠1 åãããŒãã§ã¯ 15 ç§ã§ãã ããã¯ããã©ã³ã¶ã¯ã·ã§ã³ã§è€æ°ã®ç¢ºèªãå¿ èŠãªå Žåã«ç¹ã«é¡èã§ãã
- ãããªã㯠ãã¹ã ããŒãã§ã¯ç©æ¥µçãªãã£ãã·ã¥ãå¯èœã§ãã
- ãŸããã¡ã³ããã³ã¹çã«ããäžæçã«ãå©çšããã ããªãå ŽåãããããŸãã
ããããã¯ãç¬èªã®ããŒãã䜿çšããŠäœæ¥ããŠããããšãåæãšããŸãã
2. ãµãŒãããŒãã³ãã³ãã©ã€ã³ããŒã«
- ãããããppaãhomebrewããŸã㯠exe ã䜿çšã㊠Node.js ãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãã
https://nodejs.org/en/download/ . - æ¢åã®ããŒãã§ãã¹ããå®è¡ã§ããããŒã«ã§ãã Surfboard ãã€ã³ã¹ããŒã«ããŸãã
npm install -g @waves/surfboard
3. Visual Studio ã³ãŒããã©ã°ã€ã³
IDE ã®ãã¡ã³ã§ã¯ãªããããã¹ã ãšãã£ã¿ã奜ãå Žåããã®æé ã¯ãªãã·ã§ã³ã§ãã å¿
èŠãªããŒã«ã¯ãã¹ãŠã³ãã³ã ã©ã€ã³ ãŠãŒãã£ãªãã£ã§ãã vimã䜿çšããå Žåã¯ãã©ã°ã€ã³ã«æ³šæããŠãã ãã
Visual Studio ã³ãŒããããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãã
VS Code ãéããŠãwaves-ride ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŸãã
Waves Keeper ãã©ãŠã¶æ¡åŒµæ©èœ:
å®äºïŒ
ããŒããšWaves Explorerãèµ·åããŸãã
1. ããŒããèµ·åããŸãã
docker run -d -p 6869:6869 wavesplatform/waves-private-node
ããŒãã REST API çµç±ã§èµ·åãããŠããããšã確èªããŠãã ããã
ããŒãçšã® 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
ãã©ãŠã¶ãéããŠã
Waves Explorer ã«ããŒã«ã« ããŒã ã€ã³ã¹ã¿ã³ã¹ã衚瀺ããã
RIDEæ§é ãšãµãŒãããŒãããŒã«
空ã®ãã£ã¬ã¯ããªãäœæãããã®äžã§ã³ãã³ããå®è¡ããŸã
surfboard init
ãã®ã³ãã³ãã¯ããããžã§ã¯ãæ§é ããhello worldãã¢ããªã±ãŒã·ã§ã³ããã³ãã¹ããå«ããã£ã¬ã¯ããªãåæåããŸãã VS Code ã§ãã®ãã©ã«ããŒãéããšã次ã®å 容ã衚瀺ãããŸãã
ãµãŒãããŒã.config.json
- ./ride/ ãã©ã«ããŒã®äžã«ãdApp ã³ãŒããé 眮ãããŠãããã£ã¬ã¯ããªã§ãããwallet.ride ãšããåäžã®ãã¡ã€ã«ããããŸãã 次ã®ãããã¯ã§ã¯ dApp ãç°¡åã«åæããŸãã
- ./test/ ãã©ã«ããŒã®äžã« *.js ãã¡ã€ã«ããããŸãã ãã¹ãã¯ããã«ä¿åãããŸãã
- ./surfboard.config.json â ãã¹ããå®è¡ããããã®æ§æãã¡ã€ã«ã
Envs ã¯éèŠãªã»ã¯ã·ã§ã³ã§ãã åç°å¢ã¯æ¬¡ã®ããã«æ§æãããŠããŸãã
- dApp ã®èµ·åã«äœ¿çšãããããŒãã® REST API ãšã³ããã€ã³ããšãããã¯ãŒã¯ã® CHAIN_IDã
- ãã¹ã ããŒã¯ã³ã®ãœãŒã¹ãšãªãããŒã¯ã³ãæã€ã¢ã«ãŠã³ãã®ç§å¯ã®ãã¬ãŒãºã
ã芧ã®ãšãããsurfboard.config.json ã¯ããã©ã«ãã§è€æ°ã®ç°å¢ããµããŒãããŠããŸãã ããã©ã«ãã¯ããŒã«ã«ç°å¢ã§ã (defaultEnv ããŒã¯å€æŽå¯èœãªãã©ã¡ãŒã¿ã§ã)ã
ãŠã©ã¬ãããã¢ã¢ããªã±ãŒã·ã§ã³
ãã®ã»ã¯ã·ã§ã³ã¯ RIDE èšèªãžã®èšåã§ã¯ãããŸããã ãããããããã¯ãã§ãŒã³ã§äœãèµ·ãã£ãŠããããããããç解ããããã«ããããã€ããã³ãã¹ãããã¢ããªã±ãŒã·ã§ã³ã«æ³šç®ããŠãã ããã
ç°¡å㪠Wallet ã㢠ã¢ããªã±ãŒã·ã§ã³ãèŠãŠã¿ãŸãããã 誰ã§ã dApp ã¢ãã¬ã¹ã«ããŒã¯ã³ãéä¿¡ã§ããŸãã WAVES ãåŒãåºãããšã®ã¿ãå¯èœã§ãã InvokeScriptTransaction çµç±ã§ XNUMX ã€ã® @Callable é¢æ°ã䜿çšã§ããŸãã
deposit()
WAVES ã§ã®æ¯æããå¿ èŠã§ãwithdraw(amount: Int)
ããŒã¯ã³ãè¿ã
dApp ã®ã©ã€ããµã€ã¯ã«å šäœãéããŠãæ§é (ã¢ãã¬ã¹ â éé¡) ãç¶æãããŸãã
Action
çµæã®ç¶æ
åæ
空ã®
ã¢ãªã¹ã¯ 5 WAVES ããããžããããŸã
ã¢ãªã¹ã¢ãã¬ã¹ â 500000000
ããã 2 WAVES ããããžãã
ã¢ãªã¹ã¢ãã¬ã¹ â 500000000
ããã¢ãã¬ã¹ â 200000000
ããã¯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
ãµã³ãã«ã³ãŒãã¯æ¬¡ã®å Žæã«ããããŸãã
VSCode ãã©ã°ã€ã³ã¯ããã¡ã€ã«ç·šéäžã®ç¶ç¶çãªã³ã³ãã€ã«ããµããŒãããŠããŸãã ãããã£ãŠã[PROBLEMS] ã¿ãã§ãã€ã§ããšã©ãŒãç£èŠã§ããŸãã
ãã¡ã€ã«ã®ã³ã³ãã€ã«æã«å¥ã®ããã¹ã ãšãã£ã¿ã䜿çšãããå Žåã¯ã次ã䜿çšããŸãã
surfboard compile ride/wallet.ride
ããã«ãããbase64 ã§ã³ã³ãã€ã«ãããäžé£ã® RIDE ã³ãŒããåºåãããŸãã
ãwallet.rideãã®ãã¹ãã¹ã¯ãªãã
ãèŠããã
- ãåã㯠MassTransferTransaction çµç±ã§è€æ°ã®ã¢ã«ãŠã³ãã«è³éãæäŸããã¹ã¯ãªãããã³ã³ãã€ã«ããŠãããã¯ãã§ãŒã³ã«ãããã€ããŸãã
- ããããžããå¯èœãã¯ãInvokeScriptTransaction ããããã¯ãŒã¯ã«éä¿¡ããXNUMX ã€ã®ã¢ã«ãŠã³ãã®ããããã«å¯Ÿã㊠Deposit() é¢æ°ãã¢ã¯ãã£ãã«ããŸãã
- ãå ¥éããã以äžã¯åŒãåºãããšãã§ããªããã¯ã誰ãä»äººã®ããŒã¯ã³ãçãããšãã§ããªãããšããã¹ãããŸãã
- ãå ¥éå¯èœãã¯ãåºéãæ£ããåŠçãããŠããããšã確èªããŸãã
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 ã䜿çšãããšãã«äœãèµ·ããããèŠãŠã¿ãŸãããããããã¯ã確èªããããäžèšã®ã¢ãã¬ã¹ã® XNUMX ã€ãæ€çŽ¢ã«è²Œãä»ããŸã (ããšãã°ã察å¿ããã¢ãã¬ã¹ wallet#
ã ããã§ã¯ããã©ã³ã¶ã¯ã·ã§ã³å±¥æŽãdApp ã¹ããŒã¿ã¹ãéã³ã³ãã€ã«ããããã€ã㪠ãã¡ã€ã«ãèŠã€ããããšãã§ããŸãã
ãŠã§ãŒããšã¯ã¹ãããŒã©ãŒã ãããã€ãããã°ããã®ã¢ããªã±ãŒã·ã§ã³ã
ãµãŒãããŒãã®ãã³ã:
1. ãã¹ããããç°å¢ã§ãã¹ãããã«ã¯ã以äžã䜿çšããŸãã
surfboard test --env=testnet
2. ãã©ã³ã¶ã¯ã·ã§ã³ã® JSON ããŒãžã§ã³ãšãããããããŒãã«ãã£ãŠã©ã®ããã«åŠçããããã確èªãããå Žåã¯ã-v (ãåé·ããæå³ããŸã) ãæå®ããŠãã¹ããå®è¡ããŸãã
surfboard test -v
Waves Keeper ã§ã¢ããªã䜿çšãã
1. Waves Keeper ãåäœããããã«èšå®ããŸãã
ããŒã«ã« ããŒããšé£æºããããã« Waves Keeper ãã»ããã¢ãããã
2. ãããã¯ãŒã¯ã®ããŒã¯ã³ãå«ãç§å¯ãã¬ãŒãºãã€ã³ããŒãããŸãã? ç°¡åã«ããããã«ãããŒãã®åæã·ãŒãã䜿çšããŸãã waves private node seed with waves tokens
ã äœæïŒ 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF
.
3. npm ã䜿çšããŠããµãŒããŒã¬ã¹ã®ã·ã³ã°ã« ããŒãž ã¢ããªã±ãŒã·ã§ã³ãèªåã§å®è¡ã§ããŸãã ãŸãã¯ãæ¢åã®ãã®ã«ç§»åããŸãã
4. ãã¹ãå®è¡ã§åŸããŠã©ã¬ãã ã¢ãã¬ã¹ (äžèšã®äžç·) ã dApp ã¢ãã¬ã¹ ããã¹ã ããã¯ã¹ã«å ¥åããŸãã
5. ãå ¥éããã£ãŒã«ãã«å°é¡ãå ¥åãããã¿ã³ãã¯ãªãã¯ããŸãã
Waves Keeper ã¯ã10 WAVES ã®æ¯æã㧠InvokeScriptTransaction ã«çœ²åããèš±å¯ãèŠæ±ããŸãã
6. ãã©ã³ã¶ã¯ã·ã§ã³ã確èªããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³ãäœæããããããã¯ãŒã¯ã«ãããŒããã£ã¹ããããŸãã ããã§åœŒå¥³ã®IDã衚瀺ãããŸã
7. Waves Explorer ã䜿çšããŠãã©ã³ã¶ã¯ã·ã§ã³ãç£èŠããŸãã æ€çŽ¢ãã£ãŒã«ãã«IDãå ¥åããŠãã ãã
çµè«ãšè¿œå æ å ±
Waves ãã©ãããã©ãŒã äžã§ã·ã³ãã«ãª dApps ãéçºããã¹ãããããã€ã䜿çšããããã®ããŒã«ãæ€èšããŸããã
- RIDEèšèª
- VSã³ãŒããšãã£ã¿
- ãŠã§ãŒãã¹ãšã¯ã¹ãããŒã©ãŒ
- ãµãŒãããŒã
- ãŠã§ã€ãã¹ããŒããŒ
RIDE ãåŠã³ç¶ããã人ã®ããã®ãªã³ã¯:
åŒãç¶ã RIDE ãããã¯ãæãäžããŠãæåã® dApp ãäœæããŠãã ããã
TL; DRïŒ
åºæïŒ habr.com