ΠΠ΄ΡΠ°Π²ΡΡΠ²ΡΠΉΡΠ΅! Π ΡΡΠ°ΡΡΠ΅ Ρ ΠΏΠΎΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Π½Π° Π½ΠΎΠ΄Π΅ Waves ΠΎΠ±ΡΡΠ½ΡΠΉ dApp. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
Π‘Ρ
Π΅ΠΌΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ dApps ΠΈ ΠΎΠ±ΡΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎΡΡΠΈ Π½Π΅ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ:
- ΠΠΈΡΠ΅ΠΌ ΠΊΠΎΠ΄
- ΠΠΈΡΠ΅ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
- ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
- Π’Π΅ΡΡΠΈΡΡΠ΅ΠΌ
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ
1. docker
Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° Π½ΠΎΠ΄Ρ ΠΈ Waves Explorer
ΠΡΠ»ΠΈ Π½Π΅ Ρ ΠΎΡΠΈΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π½ΠΎΠ΄Ρ, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΡΡΠΎΡ ΡΠ°Π³. ΠΠ΅Π΄Ρ Π΅ΡΡΡ ΡΠ΅ΡΡΠΎΠ²Π°Ρ ΠΈ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΡΠ΅ΡΡ. ΠΠΎ Π±Π΅Π· ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΡΠ²ΠΎΠ΅ΠΉ Π½ΠΎΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΡΡΠ½ΡΡΡΡΡ.
- ΠΠ°ΠΌ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π±ΡΠ΄ΡΡ Π½ΡΠΆΠ½Ρ Π½ΠΎΠ²ΡΠ΅ Π°ΠΊΠΊΠ°ΡΠ½ΡΡ Ρ ΡΠ΅ΡΡΠΎΠ²ΡΠΌΠΈ ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ. ΠΡΠ°Π½ ΡΠ΅ΡΡΠΎΠ²ΠΎΠΉ ΡΠ΅ΡΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡ ΠΏΠΎ 10 WAVES ΠΊΠ°ΠΆΠ΄ΡΠ΅ 10 ΠΌΠΈΠ½ΡΡ.
- Π‘ΡΠ΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π±Π»ΠΎΠΊΠΎΠ² Π² ΡΠ΅ΡΡΠΎΠ²ΠΎΠΉ ΡΠ΅ΡΠΈ β 1 ΠΌΠΈΠ½ΡΡΠ°, Π² Π½ΠΎΠ΄Π΅ β 15 ΡΠ΅ΠΊΡΠ½Π΄. ΠΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΎΡΡΡΠΈΠΌΠΎ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠΉ.
- Π ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΠ΅ΡΡΠΎΠ²ΡΡ Π½ΠΎΠ΄Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π°Π³ΡΠ΅ΡΡΠΈΠ²Π½ΠΎΠ΅ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅.
- ΠΡΠ΅ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΈΠ·-Π·Π° ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ.
ΠΠ°Π»Π΅Π΅ Π±ΡΠ΄Ρ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ ΡΠΎ ΡΠ²ΠΎΠ΅ΠΉ Π½ΠΎΠ΄ΠΎΠΉ.
2. ΠΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Surfboard
- Π‘ΠΊΠ°ΡΠ°ΠΉΡΠ΅ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Node.js Ρ ΠΏΠΎΠΌΠΎΡΡΡ ppa, homebrew ΠΈΠ»ΠΈ exe Π·Π΄Π΅ΡΡ:
https://nodejs.org/en/download/ . - Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Surfboard β ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ΅ΡΡΡ Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ Π½ΠΎΠ΄Π΅.
npm install -g @waves/surfboard
3. ΠΠ»Π°Π³ΠΈΠ½ Visual Studio Code
Π¨Π°Π³ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»Π΅Π½, Π΅ΡΠ»ΠΈ Π²Ρ β Π½Π΅ ΡΠ°Π½Π°Ρ IDE ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π΅ΡΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΡ. ΠΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ β ΡΡΠΎ ΡΡΠΈΠ»ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ vim, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ»Π°Π³ΠΈΠ½
Π‘ΠΊΠ°ΡΠ°ΠΉΡΠ΅ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Visual Studio Code:
ΠΡΠΊΡΠΎΠΉΡΠ΅ 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
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΡΡΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ Π² Π½Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
surfboard init
ΠΠΎΠΌΠ°Π½Π΄Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΡΠΎ ΡΡΡΡΠΊΡΡΡΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° Β«hello worldΒ» ΠΈ ΡΠ΅ΡΡΡ. ΠΡΠ»ΠΈ ΠΎΡΠΊΡΠΎΠ΅ΡΠ΅ ΡΡΡ ΠΏΠ°ΠΏΠΊΡ Ρ VS Code, ΡΠΎ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅:
Surfboard.config.json
- ΠΠΎΠ΄ ΠΏΠ°ΠΏΠΊΠΎΠΉ ./ride/ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» wallet.ride β Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ, Π³Π΄Π΅ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ ΠΊΠΎΠ΄ dApp. ΠΡ ΠΊΡΠ°ΡΠΊΠΎ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ dApp Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ Π±Π»ΠΎΠΊΠ΅.
- ΠΠΎΠ΄ ΠΏΠ°ΠΏΠΊΠΎΠΉ ./test/ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ ΡΠ°ΠΉΠ» *.js. ΠΠ΄Π΅ΡΡ Ρ ΡΠ°Π½ΡΡΡΡ ΡΠ΅ΡΡΡ.
- ./surfboard.config.json β ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ°ΠΉΠ» Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΡΠΎΠ².
Envs β Π²Π°ΠΆΠ½Π°Ρ ΡΠ΅ΠΊΡΠΈΡ. ΠΠ°ΠΆΠ΄Π°Ρ ΡΡΠ΅Π΄Π° Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ°ΠΊ:
- ΠΠΎΠ½Π΅ΡΠ½Π°Ρ ΡΠΎΡΠΊΠ° REST API Π½ΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° dApp ΠΈ CHAIN_ID ΡΠ΅ΡΠΈ.
- Π‘Π΅ΠΊΡΠ΅ΡΠ½Π°Ρ ΡΡΠ°Π·Π° Π΄Π»Ρ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° Ρ ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°ΠΌΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΠ² Π²Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΡΠ°.
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, surfboard.config.json ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅Π΄. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΡΡΡΠ°Π²Π»Π΅Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½Π°Ρ ΡΡΠ΅Π΄Π° (ΠΊΠ»ΡΡ defaultEnv β ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ).
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Wallet-demo
ΠΡΠ° ΡΠ΅ΠΊΡΠΈΡ β Π½Π΅ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΏΠΎ ΡΠ·ΡΠΊΡ RIDE. Π‘ΠΊΠΎΡΠ΅Π΅, Π²Π·Π³Π»ΡΠ΄ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΈ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ Π»ΡΡΡΠ΅ ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΡΡΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Wallet-demo. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π½Π° Π°Π΄ΡΠ΅Ρ dApp ΡΠΎΠΊΠ΅Π½Ρ. ΠΡΠ²Π΅ΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ²ΠΎΠΈ WAVES. ΠΠ²Π΅ @Callable ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠ΅ΡΠ΅Π· InvokeScriptTransaction:
deposit()
, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ»Π°ΡΠ΅ΠΆΠ° Π² WAVESwithdraw(amount: Int)
, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠΊΠ΅Π½Ρ
ΠΠ° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ Π²ΡΠ΅Π³ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° dApp, ΡΡΡΡΠΊΡΡΡΠ° (address β amount) Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ:
Action
Resulting state
initial
empty
Alice deposits 5 WAVES
alice-address β 500000000
Bob deposits 2 WAVES
alice-address β 500000000
bob-address β 200000000
Bob withdraws 7 WAVES
DENIED!
Alice withdraws 4 WAVES
alice-address β 100000000
bob-address β 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β
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π°
- Β«BeforeΒ» ΡΠΈΠ½Π°Π½ΡΠΈΡΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ² ΡΠ΅ΡΠ΅Π· MassTransferTransaction, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅Ρ ΡΠΊΡΠΈΠΏΡ ΠΈ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅.
- Β«Can depositΒ» ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π² ΡΠ΅ΡΡ InvokeScriptTransaction, Π°ΠΊΡΠΈΠ²ΠΈΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ deposit() Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π΄Π²ΡΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ².
- Β«Can’t withdraw more than was depositedΒ» ΡΠ΅ΡΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΡΠΊΡΠ°ΡΡΡ ΡΡΠΆΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Ρ.
- Β«Can 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: ΠΏΡΠΎΡΠΌΠΎΡΡΠΈΠΌ Π±Π»ΠΎΠΊΠΈ ΠΈΠ»ΠΈ Π²ΡΡΠ°Π²ΠΈΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠΊΠ°Π·Π°Π½Π½ΡΡ
Π²ΡΡΠ΅ Π°Π΄ΡΠ΅ΡΠΎΠ² Π² ΠΏΠΎΠΈΡΠΊ(Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ wallet#
. Π’Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΈΡΡΠΎΡΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ dApp, Π΄Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΡΠ°ΠΉΠ».
Waves Explorer. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠ°Π·Π²Π΅ΡΠ½ΡΠ»ΠΈ.
ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ²Π΅ΡΠΎΠ² ΠΏΠΎ Surfboard:
1. Π§ΡΠΎΠ±Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π² ΡΡΠ΅Π΄Π΅ testnet, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅:
surfboard test --env=testnet
2. ΠΡΠ»ΠΈ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ JSON-Π²Π΅ΡΡΠΈΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π½ΠΎΠ΄ΠΎΠΉ, Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ΅ΡΡ Ρ -v (ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ βverboseβ):
surfboard test -v
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ Waves Keeper
1. ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ Waves Keeper Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ:
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Waves Keeper Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ Π½ΠΎΠ΄ΠΎΠΉ
2. ΠΠΌΠΏΠΎΡΡΠΈΡΡΠΉΡΠ΅ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΡ ΡΡΠ°Π·Ρ Ρ ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ Π΄Π»Ρ ΡΠ΅ΡΠΈ? ΠΠ»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ seed Π²Π°ΡΠ΅ΠΉ Π½ΠΎΠ΄Ρ: waves private node seed with waves tokens
. ΠΠ΄ΡΠ΅Ρ: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF
.
3. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΎΠ΄Π½ΠΎΡΡΡΠ°Π½ΠΈΡΠ½ΠΎΠ΅ Π±Π΅Π·ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ npm. ΠΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ ΠΊ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΌΡ:
4. ΠΠ²Π΅Π΄ΠΈΡΠ΅ Π°Π΄ΡΠ΅Ρ ΠΊΠΎΡΠ΅Π»ΡΠΊΠ° ΠΈΠ· ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° (ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠ½ΡΡ Π²ΡΡΠ΅) Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π°Π΄ΡΠ΅ΡΠ° dApp
5. ΠΠΏΠΈΡΠΈΡΠ΅ Π½Π΅Π±ΠΎΠ»ΡΡΡΡ ΡΡΠΌΠΌΡ Π² ΠΏΠΎΠ»Π΅ Β«DepositΒ» ΠΈ Π½Π°ΠΆΠΌΠΈΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΡ:
Waves Keeper Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡ InvokeScriptTransaction Ρ ΠΏΠ»Π°ΡΠ΅ΠΆΠΎΠΌ 10 WAVES.
6. ΠΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ:
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΡΠΎΠ·Π΄Π°Π½Π° ΠΈ ΡΡΠ°Π½ΡΠ»ΠΈΡΡΠ΅ΡΡΡ Π² ΡΠ΅ΡΡ. Π’Π΅ΠΏΠ΅ΡΡ Π²ΠΈΠ΄Π½ΠΎ Π΅Π΅ ID
7. ΠΠ°Π±Π»ΡΠ΄Π°ΠΉΡΠ΅ Π·Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠ΅ΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Waves Explorer. ΠΠ²Π΅Π΄ΠΈΡΠ΅ ID Π² ΠΏΠΎΠΈΡΠΊΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅
ΠΡΠ²ΠΎΠ΄Ρ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΡΡΡΡ dApps Π½Π° Waves Platform:
- Π―Π·ΡΠΊ RIDE
- Π Π΅Π΄Π°ΠΊΡΠΎΡ VS Code
- Waves Explorer
- Surfboard
- Waves Keeper
Π‘ΡΡΠ»ΠΊΠΈ Π΄Π»Ρ ΡΠ΅Ρ , ΠΊΡΠΎ Ρ ΠΎΡΠ΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΠΈΠ·ΡΡΠ°ΡΡ RIDE:
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡΠ΅ ΡΠ³Π»ΡΠ±Π»ΡΡΡΡΡ Π² ΡΠ΅ΠΌΡ RIDE ΠΈ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ²ΡΠΉ dApp!
TL;DR:
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com