ืืขืื! ืืื ืืขื ืึทืจืืืงื ืืื ืืืขื ืืืืึทืื ืืืจ ืืื ืฆื ืฉืจืืึทืื ืืื ืืืืคื ืึท ืจืขืืืืขืจ ืืึทืคึผืคึผ ืืืืฃ ืึท ืืืึทืืืขืก ื ืึธืืข. ืืื ืก ืงืืง ืืื ืื ื ืืืืืง ืืืฉืืจืื, ืืขืืืึธืืก ืืื ืึท ืืืืฉืคึผืื ืคืื ืึทื ืืืืืงืืื ื.
ืื ืึทื ืืืืืงืืื ื ืกืืขืืข ืคึฟืึทืจ ืืึทืคึผืคึผืก ืืื ืจืขืืืืขืจ ืึทืคึผืืึทืงืืืฉืึทื ื ืืื ืึผืืขื ืื ืืขืืืข:
- ืฉืจืืืื ืงืึธื
- ืฉืจืืืื ืึธืืึทืืืืืื ืืขืกืืื ื
- ืืึธื ืืฉืื ื ืื ืึทืคึผืืึทืงืืืฉืึทื
- ืืขืกืืื ื
ืืืฉืืจืื
1. docker
ืฆื ืืืืคื ืื ื ืึธืืข ืืื ืืืึทืืืขืก Explorer
ืืืื ืืืจ ืืึธื ื ืืฉื ืืืขืื ืฆื ืึธื ืืืืื ืึท ื ืึธืืข, ืืืจ ืงืขื ืขื ืืึธืคึผืงืขื ืืขื ืฉืจืื. ื ืึธื ืึทืืข, ืขืก ืืื ืึท ืคึผืจืึธืืข ืืื ืืงืกืคึผืขืจืืขื ืึทื ื ืขืฅ. ืึธืืขืจ ืึธื ืืืคึผืืืืื ื ืืืื ืืืืืขื ืข ื ืึธืืข, ืื ืืขืกืืื ื ืคึผืจืึธืฆืขืก ืงืขื ืฉืืขืคึผื ืืืืฃ.
- ืืืจ ืืืขื ืงืขืกืืืืขืจ ืืึทืจืคึฟื ื ืืึท ืึทืงืึทืื ืฅ ืืื ืคึผืจืืืืจื ืืึธืงืขื ืก. ืื ืคึผืจืืืืจื ื ืขืฅ ืงืจืึทื ืืจืึทื ืกืคืขืจืก 10 ืืืึทืืืขืก ืืขืืขืจ 10 ืืื ืื.
- ืื ืืืจืืฉื ืืืืขื ืืืึธืง ืฆืืื ืืื ืื ืคึผืจืืืืจื ื ืขืฅ ืืื 1 ืืื ืื, ืืื ืื ื ืึธืืข - 15 ืกืขืงืื ืืขืก. ืืึธืก ืืื ืกืคึผืขืฆืืขื ืืืืขืจืงื ืืืขื ืึท ืืจืึทื ืกืึทืงืืืึธื ืจืืงืืืืืขืจื ืงืืืคื ืงืึทื ืคืขืจืืืืฉืึทื ื.
- ืึทืืจืขืกืืื ืงืึทืืฉืื ื ืืื ืืขืืืขื ืืืืฃ ืฆืืืืจ ืคึผืจืืืืจื ื ืึธืืื.
- ืืื ืงืขื ืืืื ืืืื ืืขืืคึผืขืจืขืจืึทืื ืึทื ืึทืืืืืืึทืืึทื ืจืขืื ืฆื ืืืฉืึทืื.
ืคืื ืืืฆื ืืืืฃ ืืื ืืืขื ืืืขืจื ืขืืขื ืึทื ืืืจ ืึทืจืืขื ืืื ืืืื ืืืืื ื ืึธืืข.
2. ืกืขืจืคืืึธืจื ืงืึทืืึทื ื ืฉืืจื ืืื
- ืืจืืคืงืืคืืข ืืื ืื ืกืืึทืืืจื Node.js ื ืืฆื ppa, homebrew ืึธืืขืจ exe ืืึธ:
https://nodejs.org/en/download/ . - ืื ืกืืึทืืืจื Surfboard, ืึท ืืขืฆืืึทื ืืืึธืก ืึทืืึทืื ืืืจ ืฆื ืืืืคื ืืขืกืฅ ืืืืฃ ืึท ืืืืืกืืื ื ื ืึธืืข.
npm install -g @waves/surfboard
3. ืืืืกืืึทื ืกืืืืืึธ ืงืึธืื ืคึผืืืืื
ืืขืจ ืฉืจืื ืืื ืึทืคึผืฉืึทื ืึทื ืืืื ืืืจ ืืขื ื ื ืืฉื ืึท ืคืึธืืขืจ ืคืื IDEs ืืื ืืขืกืขืจ ืืขืงืกื ืจืขืืืงืฆืืข. ืึทืืข ืื ื ืืืืืง ืืืฉืืจืื ืืขื ืขื ืืึทืคึฟืขืื ืฉืืจื ืืืืืืึทืืื. ืืืื ืืืจ ื ืืฆื vim, ืืึทืฆืึธืื ืืคืืขืจืงืืึทืืงืืึทื ืฆื ืื ืคึผืืืืื
ืืจืืคืงืืคืืข ืืื ืื ืกืืึทืืืจื ืืืืกืืึทื ืกืืืืืึธ ืงืึธื:
ืขืคึฟื VS ืงืึธื ืืื ืื ืกืืึทืืืจื ืื ืืืืืืืขืก-ืคืึธืจ ืคึผืืืืื:
Waves Keeper ืืืขืืขืจืขืจ ืืขืฉืคึผืจืืื:
ืืขืืื!
ืงืึทืืขืจ ืื ื ืึธืืข ืืื ืืืึทืืืขืก 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 ืืืกืคึผืืืื ืึท ืืืืข ื ืึธืืข ืืืึทืฉืคึผืื
ืคืึธืจ ืกืืจืืงืืืจ ืืื ืกืขืจืคืืึธืจื ืืขืฆืืึทื
ืฉืึทืคึฟื ืึท ืืืืืืง ืืืขืืืืืึทืืขืจ ืืื ืืืืคื ืื ืืึทืคึฟืขื ืืื ืขืก
surfboard init
ืืขืจ ืืึทืคึฟืขื ืื ืืืืึทืืืืืื ืึท ืืืขืืืืืึทืืขืจ ืืื ืื ืคึผืจืืืขืงื ืกืืจืืงืืืจ, "ืืขืื ืืืขืื" ืึทืคึผืืึทืงืืืฉืึทื ื ืืื ืืขืกืฅ. ืืืื ืืืจ ืขืคึฟืขื ืขื ืืขื ืืขืงืข ืืื VS ืงืึธื, ืืืจ ืืืขื ืืขื:
Surfboard.config.json
- ืืื ืืขืจ ืื ./ride/ ืืขืงืข ืืืจ ืืืขื ืืขืคึฟืื ืขื ืึท ืืืื ืืขืงืข wallet.ride - ืืขืจ ืืืขืืืืืึทืืขืจ ืืื ืื ืืึทืคึผืคึผ ืงืึธื ืืื ืืืื. ืืืจ ืืืขืื ืืขืงืืฆืขืจ ืึทื ืึทืืืื dApps ืืื ืืขืจ ืืืืึทืืขืจ ืืืึธืง.
- ืืื ืืขืจ ืื ./test/ ืืขืงืข ืืืจ ืืืขื ืืขืคึฟืื ืขื ืึท *.js ืืขืงืข. ืืขืกืฅ ืืขื ืขื ืกืืึธืจื ืืึธ.
- ./surfboard.config.json - ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืงืข ืคึฟืึทืจ ืคืืืกื ืืืง ืืขืกืฅ.
Envs ืืื ืึท ืืืืืืืง ืึธืคึผืืืืืื ื. ืืขืืขืจ ืกืืืืืืข ืืื ืงืึทื ืคืืืืขืจื ืืื ืืึธืก:
- REST API ืขื ืืคึผืืื ื ืคืื ืื ื ืึธืืข ืืืึธืก ืืืขื ืืืื ืืขื ืืฆื ืฆื ืงืึทืืขืจ ืื ืืึทืคึผืคึผ ืืื CHAIN_ID ืคืื ืื ื ืขืฅ.
- ื ืกืื ืคึฟืจืึทืืข ืคึฟืึทืจ ืึท ืืฉืืื ืืื ืืึธืงืขื ืก ืืืึธืก ืืืขื ืืืื ืื ืงืืืืื ืคืื ืืืื ืคึผืจืืืืจื ืืึธืงืขื ืก.
ืืื ืืืจ ืงืขื ืขื ืืขื, surfboard.config.json ืฉืืืฆื ืงืืืคื ืื ืืืืืจืึทื ืืึทื ืฅ ืืืจื ืคืขืืืงืืึทื. ืื ืคืขืืืงืืึทื ืืื ืื ืืืืข ืกืืืืืืข (ืื defaultEnv ืฉืืืกื ืืื ืึท ืืฉืืื ืืืฉืึทืืึทื ืคึผืึทืจืึทืืขืืขืจ).
ืืืึทืื-ืืขืืึธ ืึทืคึผืืึทืงืืืฉืึทื
ืืขืจ ืึธืคึผืืืืืื ื ืืื ื ืืฉื ืึท ืจืขืคึฟืขืจืขื ืฅ ืฆื ืื RIDE ืฉืคึผืจืึทื. ืืื, ืึท ืงืืง ืืื ืื ืึทืคึผืืึทืงืืืฉืึทื ืึทื ืืืจ ืฆืขืืืืงืืขื ืืื ืคึผืจืืืืจื ืฆื ืืขืกืขืจ ืคึฟืึทืจืฉืืืื ืืืึธืก ืืื ืืขืฉืขืขื ืืฉ ืืื ืื ืืืึธืงืืฉืืื.
ืืื ืก ืงืืง ืืื ืึท ืคึผืฉืื ืืืึทืืืขื-ืืขืืึธ ืึทืคึผืืึทืงืืืฉืึทื. ืืืขืจ ืขืก ืื ืงืขื ืขื ืฉืืงื ืืึธืงืขื ืก ืฆื ืึท ืืึทืคึผ ืึทืืจืขืก. ืืืจ ืงืขื ื ืืืืื ืฆืืจืืงืฆืืขื ืืืื ืืืืืืืขืก. ืฆืืืื @Callable ืคืึทื ืืงืฉืึทื ื ืืขื ืขื ืืืจืขืืืืื ืืืจื InvokeScriptTransaction:
deposit()
ืืืึธืก ืจืืงืืืืืขืจื ืึท ืึทืืึทืืฉื ืฆืึธืืื ื ืืื WAVESwithdraw(amount: Int)
ืืืึธืก ืงืขืจื ืืึธืงืขื ืก
ืื ืกืืจืืงืืืจ (ืึทืืจืขืก โ ืกืืืข) ืืืขื ืืืื ืืืื ืืืื ื ืืืืขืจ ืื dApp ืืืืคืกืืืง:
ืงืึทืืฃ
ืจืืืึทืืืื ื ืฉืืึทื
ืขืจืฉื
ืืืืืืง
ืึทืืืก ืืืคึผืึทืืึทืฅ 5 ืืืืืืืขืก
ืึทืืืก-ืึทืืจืขืก โ 500000000
ืืึธื ืืืคึผืึทืืึทืฅ 2 ืืืืืืืขืก
ืึทืืืก-ืึทืืจืขืก โ 500000000
ืืึธื ืึทืืจืขืก โ 200000000
ืืึธื ืฆืืจืืงืฆืืขื 7 ืืืืืืืขืก
ืืื ืืื!
ืึทืืืก ืฆืืจืืงืฆืืขื 4 ืืืืืืืขืก
ืึทืืืก-ืึทืืจืขืก โ 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 ืฆื ืื ื ืขืฅ, ืึทืงืืึทืืืืืืื ื ืื ืึทืืืขืงืืืืื () ืคืื ืงืฆืืข ืคึฟืึทืจ ืืขืืขืจ ืคืื ืื ืฆืืืื ืึทืงืึทืื ืฅ.
- "ืงืขื ื ืืฉื ืฆืืจืืงืฆืืขื ืืขืจ ืืื ืืืคึผืึทืืึทืืึทื" ืืขืกืฅ ืึทื ืงืืื ืืืื ืขืจ ืงืขื ืขื ืืึทื ืืืขื ืขื ืื ืืขืจืข ืืขื ืืฉื ืก ืืึธืงืขื ืก.
- "ืงืขื ืขื ืึทืืืขืงืืืืื" ืืฉืขืงืก ืึทื ืืืืืืจืึธืึทืื ืืขื ืขื ืคึผืจืึทืกืขืกื ืจืืืืืง.
ืืืืคื ืืขืกืฅ ืคึฟืื ืกืืจืคืืึธืจื ืืื ืคืื ืึทื ืืขืจืงืืืึทืื ืจืขืืืืืึทืื ืืื ืืืึทืืืขืก Explorer
ืฆื ืืืืคื ืื ืคึผืจืึธืืข, ืืืืคื
surfboard test
ืืืื ืืืจ ืืึธืื ืงืืืคื ืกืงืจืืคึผืก (ืืืฉื, ืืืจ ืืึทืจืคึฟื ืึท ืืึทืืื ืืขืจ ืืืคึผืืืืืึทื ื ืฉืจืืคื), ืืืจ ืงืขื ืขื ืืืืคื
surfboard test my-scenario.js
ืกืขืจืคืืึธืจื ืืืขื ืงืืืึทืื ืื ืคึผืจืึธืืข ืืขืงืขืก ืืื ืื ./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)
ืืืจืื! ืืขืกืฅ ืืืจืืืขืืื ืืขื. ืืืฆื ืืึธืืืจ ื ืขืืขื ืึท ืงืืง ืืื ืืืึธืก ืืึทืคึผืึทื ื ืืืขื ื ืืฆื ืืืึทืืืขืก Explorer: ืงืืง ืืื ืื ืืืึทืงืก ืึธืืขืจ ืคึผืึทืคึผ ืืืื ืขืจ ืคืื ืื ืึทืืจืขืกืขืก ืืืืื ืืื ืืขืจ ืืืื (ืืืฉื, ืื ืงืึธืจืึทืกืคึผืึทื ืืื ื wallet#
. ืขืก ืืืจ ืงืขื ืขื ืืขืคึฟืื ืขื ืืจืึทื ืกืึทืงืืืึธื ืืขืฉืืืืข, ืืึทืคึผืคึผ ืกืืึทืืืก, ืืขืงืึธืืคึผืืืื ืืืื ืขืจื ืืขืงืข.
ืืืึทืืืขืก Explorer. ืึท ืึทืคึผืืึทืงืืืฉืึทื ืืืึธืก ืืื ืคึผืื ืงื ืืืคึผืืืื.
ืขืืืขืืข ืกืขืจืคืืึธืจื ืขืฆืืช:
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. ืืืจ ืงืขื ืขื ืืืืคื ืึท ืกืขืจืืืขืจืืขืกืก ืืืื ืืืึทื ืึทืคึผืืึทืงืืืฉืึทื ืืื ื ืืฆื ื ืคึผื. ืึธืืขืจ ืืืื ืฆื ืื ืืืืืกืืื ื ืืืื ืขืจ:
4. ืึทืจืืึทื ืื ืืืึทืื ืึทืืจืขืก ืคืื ืื ืคึผืจืืืืจื ืืืืคื (ืึทื ืืขืจืืืื ื ืืืืื) ืืื ืื ืืึทืคึผืคึผ ืึทืืจืขืก ืืขืงืกื ืงืขืกืื
5. ืึทืจืืึทื ืึท ืงืืืื ืกืืืข ืืื ืื "ืึทืืืขืงืืืืื" ืคืขืื ืืื ืืื ืื ืงื ืขืคึผื:
Waves Keeper ืจืืงืืืขืก ืืขืจืืืืืขื ืืฉ ืฆื ืฆืืืื ืึทื InvokeScriptTransaction ืืื ืฆืึธืืื ื ืคืื 10 WAVES.
6. ืืึทืฉืืขืืืงื ืื ืืจืึทื ืกืึทืงืืืึธื:
ืื ืืจืึทื ืกืึทืงืืืึธื ืืื ืืืฉืืคื ืืื ืืจืึธืืงืึทืกื ืฆื ืื ื ืขืฅ. ืืืฆื ืืืจ ืงืขื ืขื ืืขื ืืืจ ืฉืืึทื
7. ืืึธื ืืืึธืจ ืื ืืจืึทื ืกืึทืงืืืึธื ื ืืฆื ืืืึทืืืขืก Explorer. ืึทืจืืึทื ID ืืื ืื ืืืื ืคืขืื
ืงืึทื ืงืืืืฉืึทื ื ืืื ื ืึธื ืืื ืคึฟืึธืจืืึทืฆืืข
ืืืจ ืืึธืื ืืขืงืืงื ืืืืฃ ืื ืืืฉืืจืื ืคึฟืึทืจ ืืขืืืขืืึธืคึผืื ื, ืืขืกืืื ื, ืืืคึผืืืืื ื ืืื ื ืืฆื ืคึผืฉืื ืืึทืคึผืคึผืก ืืืืฃ ืื ืืืึทืืืขืก ืคึผืืึทืืคืึธืจื:
- RIDE ืฉืคึผืจืึทื
- VS ืงืึธื ืขืืืืึธืจ
- ืืืึทืืืขืก Explorer
- ืกืขืจืคืืึธืจื
- Waves Keeper
ืืื ืงืก ืคึฟืึทืจ ืื ืืืืก ืืืืื ืฆื ืคืึธืจืืขืฆื ืืขืจื ืขื RIDE:
ืคืึธืจืืขืฆื ืืืืืืื ื ืืื ืื RIDE ืืขืืข ืืื ืฉืึทืคึฟื ืืืื ืขืจืฉืืขืจ ืืึทืคึผืคึผ!
ืื; ืืจ:
ืืงืืจ: www.habr.com