áááºá¹ááá¬áá«! á€áá±á¬ááºážáá«ážááœáẠWaves node áá áºáá¯áá±á«áºááœáẠáá¯á¶ááŸáẠdApp ááᯠáááºááá¯á·áá±ážáá¬ážááŒá®áž áá¯ááºáá±á¬ááºááááºááᯠááá·áºá¡á¬áž ááŒááá«áááºá ááá¯á¡ááºáá±á¬áááááá¬áá»á¬ážá áááºážá áá áºáá»á¬ážááŸáá·áº ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááá¯ááºáᬠá¥ááá¬ááᯠááŒáá·áºááŒáá«á áá¯á·á
dApps ááŸáá·áº áá¯á¶ááŸááºá¡ááá®áá±ážááŸááºážáá»á¬ážá¡ááœáẠááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡á
á®á¡á
ááºááẠá¡áá°áá°áá®ážáá«ážááŒá
áºáááº-
- áá¯ááºáá±ážáááºá
- á¡ááá¯á¡áá»á±á¬ááºá ááºážáááºáá±ážáá¬ážááŒááºážá
- áá»áŸá±á¬ááºááœáŸá¬ááá¯ááœáá·áºááŒááºážá
- á ááºážáááºááŒááºážá
áá°áááá¬
1. docker
node ááŸáá·áº Waves Explorer ááᯠrun áááº
node áá áááºááá¯áá«á á€á¡ááá·áºááᯠáá»á±á¬áºááœá¬ážááá¯ááºáá«áááºá ááŒá®ážáá±á¬ááºááŸáááá»áŸááá¯á·, á ááºážáááºááŒááºážááŸáá·áºá ááºážáááºááœááºáááºááŸááá«áááºá ááá¯á·áá±á¬áº ááá·áºááá¯ááºááá¯áẠnode ááᯠá¡áá¯á¶ážáááŒá¯áá²á á ááºážáááºááŸá¯áá¯ááºáááºážá ááºááẠááœá²áá°ááœá¬ážááá¯ááºáááºá
- á ááºážáááºááŸá¯ááá¯áááºáá»á¬ážáá«ááŸááá±á¬ á¡áá±á¬áá·áºá¡áá áºáá»á¬ážááᯠá¡áááºáááŒáẠááá¯á¡ááºáá«áááºá á ááºážáááºááœááºááẠfaucet ááẠ10 WAVES 10 áááá áºááá¯ááºáž ááœáŸá²ááŒá±á¬ááºážáá±ážáááºá
- á ááºážáááºááœááºáááºááŸá áá»ááºážáá»áŸááááºááá¯á·á¡áá»áááºááẠ1 áááá áºááŒá áºááŒá®áž node ááœáẠ- 15 á áá¹ááá·áºááŒá áºáááºá á¡áá±á¬ááºážá¡áááºáá áºáá¯ááœáẠá¡áááºááŒá¯áá»ááºáá»á¬ážá áœá¬ ááá¯á¡ááºááá·áºá¡áá« á¡áá°ážáááŒáá·áº áááá¬áááºá
- ááŒááºážáááºáá±á¬ áááºááŸáºááẠá¡áá»á¬ážáá°ááŸá¬ á ááºážáááºááŸá¯ áá¯á¶áá»á¬ážáá±á«áºááœáẠááŒá áºááá¯ááºáááºá
- ááŒá¯ááŒááºááááºážááááºážááŸá¯ááŒá±á¬áá·áº áááºážááá¯á·ááá¯áááºáž áá¬áá® ááááá¯ááºáá«á
ááá¯ááŸá á áááºááẠáááºáááá¯ááºááá¯áẠnode ááŸáá·áº áá¯ááºáá±á¬ááºáá±áááºáᯠáá»áœááºá¯ááºáá°ááá«áááºá
2. Surfboard Command Line Tool
- ppaá homebrew ááá¯á·ááá¯áẠexe ááᯠá€áá±áá¬ááœáẠá¡áá¯á¶ážááŒá¯á Node.js ááᯠáá±á«ááºážáá¯ááºáá¯ááºááŒá®áž ááá·áºááœááºážáá«-
https://nodejs.org/en/download/ . - ááŸáááŒá®ážáá¬áž node áá áºáá¯áá±á«áºááœáẠá ááºážáááºááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºá á±ááá·áº áááááá¬áá áºáá¯ááŒá áºááá·áº Surfboard ááᯠááá·áºááœááºážáá«á
npm install -g @waves/surfboard
3. Visual Studio Code ááááºá¡ááº
áááºááẠIDE áá»á¬ážááᯠáá«ááá¬ááŸááºááá¯ááºáᬠá
á¬áá¬ážáááºážááŒááºááŸá¯áá»á¬ážááᯠááŸá
áºáááºáá«á á€á¡ááá·áºááẠá
áááºááŒáá¯ááºááœá±ážáá»ááºááá¯ááºáááºá ááá¯á¡ááºáá±á¬áááááá¬áá»á¬ážá¡á¬ážáá¯á¶ážááẠcommand line utilities áá»á¬ážááŒá
áºáááºá vim ááá¯á¡áá¯á¶ážááŒá¯áá«á plugin ááá¯á¡á¬áá¯á¶á
áá¯ááºáá«á
Visual Studio Code ááá¯áá±á«ááºážáá¯ááºáá¯ááºááŒá®áž ááá·áºááœááºážáá«-
VS Code ááá¯ááœáá·áºááŒá®áž waves-ride plugin ááᯠááá·áºááœááºážáá«á
Waves Keeper ááá±á¬ááºáᬠááá¯ážáá»á²á·ááŸá¯-
Done!
node ááŸáá·áº Waves Explorer ááá¯ááœáá·áºáá«á
1. node ááᯠá áááºáá«á
docker run -d -p 6869:6869 wavesplatform/waves-private-node
node ááᯠREST API ááŸáááá·áºá
áááºááŒá±á¬ááºážáá±áá»á¬áá«á
á±á
node á¡ááœáẠ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
Browser ááá¯ááœáá·áºááŒá®ážááœá¬ážáá«á
Waves Explorer ááẠáá±áááœááºáž node instance ááá¯ááŒááááºá
RIDE ááœá²á·á ááºážáá¯á¶ááŸáá·áº Surfboard áááááá¬
á¡áá»ááºážááŸá®ážáá±á¬ áááºážááœáŸááºáá áºáá¯ááᯠáááºáá®ážááŒá®áž áááºážááŸá command ááᯠáá¯ááºáá±á¬ááºáá«á
surfboard init
ááœáŸááºááŒá¬ážáá»ááºááẠááá±á¬áá»ááºááœá²á·á ááºážáá¯á¶á "hello world" á¡ááºááºáá»á¬ážááŸáá·áº á ááºážáááºááŸá¯áá»á¬ážááŒáá·áº áááºážááœáŸááºáá áºáá¯ááᯠá áááºáááºá VS Code ááŒáá·áº á€ááá¯áá«ááá¯ááœáá·áºáá«áá
Surfboard.config.json
- ./ride/ ááá¯áá«á¡á±á¬ááºááœáẠwallet.ride - dApp áá¯ááºáááºááŸáááá·áº áááºážááœáŸááºááá¯ááºáá áºáá¯áááºážááᯠááœá±á·ááá«áááºá áá»áœááºá¯ááºááá¯á·ááẠáá¬ááá·áºááá±á¬ááºááœáẠdApps ááᯠá¡ááá¯áá»á¯á¶ážááœá²ááŒááºážá áááºááŒá¬áá«áááºá
- ./test/ ááá¯áá«á¡á±á¬ááºááŸá¬ *.js ááá¯ááºááᯠááœá±á·áááá·áºáááºá á ááºážáááºááŸá¯áá»á¬ážááᯠá€áá±áá¬ááœáẠááááºážáááºážáá¬ážáááºá
- ./surfboard.config.json â á ááºážáááºááŸá¯áá»á¬áž áá¯ááºáá±á¬ááºáááºá¡ááœáẠááœá²á·á ááºážááŸá¯ááá¯ááºá
Envs ááẠá¡áá±ážááŒá®ážáá±á¬á¡ááá¯ááºážááŒá áºáááºá áááºáááºážáá»ááºáá áºáá¯á á®ááᯠá€áá²á·ááá¯á· configure áá¯ááºáá¬ážáááº-
- ááœááºáááºá dApp ááŸáá·áº CHAIN_ID ááᯠá áááºááẠá¡áá¯á¶ážááŒá¯ááá·áº node á REST API á¡áá¯á¶ážááŸááºá
- áááºáá ááºážáááºááŸá¯ááá¯áááºáá»á¬ážááááºážááŒá áºáá»á¬ážááŒá áºááá·áº ááá¯áááºáá»á¬ážáá«ááá·áº á¡áá±á¬áá·áºáá áºáá¯á¡ááœáẠáá»áŸáá¯á·ááŸááºá áá¬ážá á¯á
áááºááœá±á·ááŒááºáááá·áºá¡ááá¯ááºážá surfboard.config.json ááẠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº áááºáááºážáá»ááºáá»á¬ážá áœá¬ááᯠáá¶á·ááá¯ážáá±ážáááºá áá¯á¶áá±ááẠáá±áááœááºážáááºáááºážáá»ááºááŒá áºááẠ(áá°áEnv áá®ážááẠááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ ááá·áºáááºáá±á¬ááºáá áºáá¯ááŒá áºáááº)á
ááá¯ááºáá¶á¡áááº-ááá¯ááºááŒáá»áŸá±á¬ááºááœáŸá¬
á€ááá¹áááẠRIDE áá¬áá¬á áá¬ážááᯠáááºááœáŸááºážááŒááºážááá¯ááºáá«á áááºážá¡á á¬ážá áá»áœááºá¯ááºááá¯á·ááẠblockchain ááœááºááŒá áºáá»ááºáá±áááºáá»á¬ážááá¯ááá¯ááá¯áá¬ážáááºáááºáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯ááŒá®ážá ááºážáááºááá·áº application ááá¯ááŒáá·áºááŸá¯áá«á
ááá¯ážááŸááºážáá±á¬ Wallet-ááá¯ááºáጠá¡ááá®áá±ážááŸááºážááᯠááŒáá·áºááŒáá«á áá¯á·á áááºáá°áááᯠdApp ááááºá á¬ááá¯á· ááá¯áááºáá»á¬áž áá±ážááá¯á·ááá¯ááºáá«áááºá áááºá WAVES ááá¯áᬠáá¯ááºááááºážááá¯ááºáááºá @Callable function ááŸá áºáá¯ááᯠInvokeScriptTransaction ááŸáááá·áº áááá¯ááºáááº-
deposit()
WAVES ááœáẠáá°ážááœá²áá±ážáá»á±ááŸá¯ ááá¯á¡ááºáááºáwithdraw(amount: Int)
ááá¯áááºáá»á¬ážááᯠááŒááºáá±ážáááºá
dApp ááá ááºáááºážáá áºáá»áŸá±á¬ááºááœááºá ááœá²á·á ááºážáá¯á¶ (ááááºá ᬠâ ááá¬á) ááᯠááááºážááááºážáá¬ážáááº-
ááŸá¯ááºááŸá¬ážááŸá¯
ááááºá¡ááŒá±á¡áá±
ááá¥á®áž
á¡áá»ááºážááŸá®ážáá±á¬
á¡á²áá
áºááá¯áẠ5 WAVES
alice-ááááºá
ᬠâ 500000000
Bob ááá¯áẠ2 WAVES
alice-ááááºá
ᬠâ 500000000
bob-ááááºá
ᬠâ 200000000
Bob ááẠ7 Waves ááᯠáá¯ááºááááºážááá¯ááºáááºá
ááŒááºážáá²á·áááº!
Alice ááẠááŸáá¯ááºáž 4 áá¯ááᯠáá¯ááºááááºážááá¯ááºáááºá
alice-ááááºá
ᬠâ 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
ááá°áá¬áá¯ááºááá¯áááºáž ááœááºááœá±á·ááá¯ááºáááºá
VSCode ááááºá¡ááºááẠááá¯ááºáá áºáá¯ááᯠáááºážááŒááºáá±á áẠáááºááá¯ááºá á¯á ááºážááŸá¯ááᯠáá¶á·ááá¯ážáá±ážáááºá ááá¯á·ááŒá±á¬áá·áºá áááºááẠPROBLEMS áááºááºááœáẠá¡ááŸá¬ážáá»á¬ážááᯠá¡ááŒá²á á±á¬áá·áºááŒáá·áºááá¯ááºáááºá
ááá¯ááºááᯠááŒá¯á
á¯áá¬ááœáẠááá°áá®áá±á¬ á
á¬áá¬ážáááºážááŒááºáá°á¡á¬áž á¡áá¯á¶ážááŒá¯ááá¯áá«áá á¡áá¯á¶ážááŒá¯áá«á
surfboard compile ride/wallet.ride
áááºážááẠbase64 compiled RIDE áá¯ááºáá á®ážáá®ážááá¯áá¯ááºáá±ážáááºááŒá áºáááºá
'wallet.ride' á¡ááœáẠá ááºážáááºááŸá¯ script
ááŒáá·áºááá¯ááºááŒáá¡á±á¬ááº
- MassTransferTransaction ááŸáá áºááá·áº á¡áá±á¬áá·áºáá»á¬ážá áœá¬ááᯠááœá±ááŒá±ážááá±á¬ááºáá¶á·áá®á áá¬ááºááœáŸááºážááᯠá á¯á ááºážááŒá®áž áááºážááᯠblockchain ááá¯á· á¡áá¯á¶ážáá»áá«á
- âááœá±ááœááºážááá¯ááºáááºâ ááẠá¡áá±á¬áá·áºááŸá áºáá¯áá áºáá¯á á®á¡ááœáẠá¡ááºááœá±() áá¯ááºáá±á¬ááºáá»ááºááᯠááœááºáááºááá¯á· InvokeScript Transaction áá±ážááá¯á·áááºá
- á¡ááŒá¬ážáá°áá»á¬ážá ááá¯áááºáá»á¬ážááᯠáááºáá°áá»áŸ áááá¯ážáá°ááá¯ááºáá±á¬ "á¡ááºááŸá¶áá¬ážáááºááẠááá¯áá¯ááºáá°ááááá«" á á¬áá±ážááœá²áá»á¬ážá
- "ááœá±ááœááºážááá¯ááºáááº" ááẠááœá±áá¯ááºááŒááºážáá»á¬ážááᯠááŸááºáááºá áœá¬ áá¯ááºáá±á¬ááºááŒá±á¬ááºáž á á áºáá±ážáááºá
Surfboard á០á ááºážáááºááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááŒá®áž Waves Explorer ááœáẠááááºáá»á¬ážááᯠááá¯ááºážááŒá¬ážá áááºááŒá¬áá«á
á ááºážáááºááŸá¯ááᯠáá¯ááºáá±á¬ááºáááºá ááŒá±ážáá«á
surfboard test
ááá·áºááœáẠscript á¡áá»á¬ážá¡ááŒá¬ážááŸááá»áŸáẠ(á¥ááá¬á áá®ážááŒá¬ážááŒáá·áºáá»ááºááŸá¯ script áá áºáᯠááá¯á¡ááºáááº)á ááẠrun ááá¯ááºáá«áááºá
surfboard test my-scenario.js
Surfboard ááẠ./test/ ááá¯áá«ááŸá á ááºážáááºááá¯ááºáá»á¬ážááᯠá á¯áá±á¬ááºážááŒá®áž surfboard.config.json ááœáẠconfigure áá¯ááºáá¬ážáá±á¬ node áá±á«áºááœáẠscript ááᯠrun áá«áááºá á áá¹ááá·áºá¡áááºážáááºááŒá¬ááŒá®ážáá±á¬ááºááœáẠá€áá²á·ááá¯á·áá±á¬á¡áá¬áá áºáá¯ááᯠáááºááœá±á·áááá·áºáááº-
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 á¡ááŒá±á¡áá±á decompiled binary ááá¯ááºááᯠááœá±á·ááá¯ááºáááºá
Waves Explorer á¡áá¯á¶ážáá»ááŒá®ážáá±á¬ á¡ááºááºáá
áºáá¯á
Surfboard Tips á¡áá»áá¯á·
1. testnet áááºáááºážáá»ááºááœáẠá ááºážáááºáááºá á¡áá¯á¶ážááŒá¯áá«-
surfboard test --env=testnet
2. ááœá±áá±ážááœá±áá°áá»á¬ážá JSON áá¬ážááŸááºážáá»á¬ážááŸáá·áº áááºážááá¯á·ááᯠnode á០áááºááá¯á·áá¯ááºáá±á¬ááºáááºááᯠáááºááŒááºááá¯áá«á -v ááŒáá·áº á ááºážáááºááŸá¯ááᯠáá¯ááºáá±á¬ááºáá« (á¡áááá¹áá¬áẠ'verbose')
surfboard test -v
Waves Keeper ááŒáá·áº á¡ááºááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá
1. á¡áá¯ááºáá¯ááºááẠWaves Keeper ááᯠáááºááŸááºáá«-
áá±ááᶠnode áá
áºáá¯ááŸáá·áºá¡áá¯ááºáá¯ááºááẠWaves Keeper ááᯠá
áá
áºááá·áºááœááºážááŒááºážá
2. ááœááºáááºá¡ááœáẠááá¯áááºáá»á¬ážáá«áá±á¬ áá»áŸáá¯á·ááŸááºá
á¬á
á¯ááᯠáááºááœááºážááá¬ážá ááá¯ážááŸááºážáááºá¡ááœáẠááá·áº node á áááŠážáá»áá¯ážá
á±á·ááᯠá¡áá¯á¶ážááŒá¯áá«- waves private node seed with waves tokens
. ááááºá
á¬- 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF
.
3. npm ááᯠá¡áá¯á¶ážááŒá¯á serverless single page application ááᯠáááºááá¯ááºááá¯áẠrun ááá¯ááºáá«áááºá ááá¯á·ááá¯áẠááŸáááŒá®ážáá¬ážáá
áºáá¯ááá¯á· ááœá¬ážáá«-
4. á ááºážáááºáááºáááºááŸá¯ (á¡áááºáá±á¬áºááŒáá«) á០ááá¯ááºáá¶á¡áááºááááºá á¬ááᯠdApp ááááºá á¬á á¬áá¬ážá¡ááœááºáá²ááá¯á· ááá·áºáá«á
5. "á¡ááºááœá±" á¡ááœááºááœáẠááá¬áá¡áááºážáááºááᯠááá·áºááœááºážááŒá®áž ááá¯ááºááᯠááŸáááºáá«-
Waves Keeper ááẠ10 WAVES ááœá±áá±ážáá»á±ááŸá¯ááŒáá·áº InvokeScriptTransaction áááºááŸááºáá±ážááá¯ážááẠááœáá·áºááŒá¯áá»ááºáá±á¬ááºážáá¶áá«áááºá
6. ááœá±áá±ážááœá±áá°ááᯠá¡áááºááŒá¯áá«-
ááœá±áá±ážááœá±áá°ááᯠáááºáá®ážááŒá®áž ááœááºáááºááá¯á· áá¯ááºááœáŸáá·áºáááºá ááá¯áá°áá ID ááá¯áááºááŒááºááá¯ááºáááºá
7. Waves Explorer ááᯠá¡áá¯á¶ážááŒá¯á ááœá±áá±ážááœá±áá°ááᯠá á±á¬áá·áºááŒáá·áºáá«á ááŸá¬ááœá±ááŸá¯á¡ááœááºááœáẠID ááá·áºáá«á
áá±á¬ááºáá»ááºáá»á¬ážááŸáá·áº áááºáá±á¬ááºážá¡áá»ááºá¡áááºáá»á¬áž
Waves Platform áá±á«áºááŸá ááá¯ážááŸááºážáá±á¬ dApps áá»á¬ážááᯠáááºáá®ážááŒááºážá á ááºážáááºááŒááºážá á¡áá¯á¶ážááŒá¯ááŒááºážááŸáá·áº á¡áá¯á¶ážááŒá¯ááŒááºážá¡ááœáẠáááááá¬áá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· ááŒáá·áºááŸá¯áá²á·áááº-
- RIDE áá¬áá¬á áá¬áž
- VS áá¯ááºáááºážááŒááºáá°
- Waves Explorer
- á
- Waves Keeper
áááºáááºáá±á·áá¬ááá¯áá°áá»á¬ážá¡ááœáẠRIDE ááá·áºááºáá»á¬áž
RIDE áá±á«ááºážá ááºááá¯á· áááºáááºáááºáá±á¬ááºááŒá®áž áááºáááááá¯á¶áž dApp ááá¯áááºáá®ážáá«á
TL; DR:
source: www.habr.com