Como construír, implementar e probar a aplicación Waves RIDE
Ola! Neste artigo mostrarei como escribir e executar unha dApp normal nun nodo de Waves. Vexamos as ferramentas, os métodos e un exemplo de desenvolvemento necesarios.
O esquema de desenvolvemento para dApps e aplicacións habituais é case o mesmo:
Código de escritura
Redacción de probas automatizadas
Lanzamento da aplicación
Probando
Ferramentas
1. docker para executar un nodo e Waves Explorer
Se non queres iniciar un nodo, podes omitir este paso. Despois de todo, hai unha rede de probas e experimentais. Pero sen implantar o teu propio nodo, o proceso de proba pode prolongarse.
Necesitarás constantemente novas contas con tokens de proba. A billa da rede de proba transfire 10 ONDAS cada 10 minutos.
O tempo medio de bloqueo na rede de proba é de 1 minuto, no nodo - 15 segundos. Isto é especialmente notable cando unha transacción require varias confirmacións.
O caché agresivo é posible nos nodos de proba públicos.
Tamén poden non estar dispoñibles temporalmente debido ao mantemento.
A partir de agora suporei que está a traballar co seu propio nodo.
2. Ferramenta de liña de comandos da táboa de surf
Instala Surfboard, unha ferramenta que che permite realizar probas nun nodo existente.
npm install -g @waves/surfboard
3. Complemento de Visual Studio Code
Este paso é opcional se non es fan dos IDE e prefires editores de texto. Todas as ferramentas necesarias son utilidades de liña de comandos. Se usas vim, presta atención ao complemento vim-paseo.
Descarga e instala Visual Studio Code: https://code.visualstudio.com/
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Abre un navegador e vai a http://localhost:3000. Verás a rapidez con que se constrúe un circuíto de nodos locais baleiros.
Waves Explorer mostra unha instancia de nodo local
Estrutura RIDE e ferramenta de táboa de surf
Crea un directorio baleiro e executa o comando nel
surfboard init
O comando inicializa un directorio coa estrutura do proxecto, aplicacións "hola mundo" e probas. Se abres este cartafol con VS Code, verás:
Surfboard.config.json
Baixo o cartafol ./ride/ atoparás un único ficheiro wallet.ride: o directorio onde se atopa o código dApp. Analizaremos brevemente as dApps no seguinte bloque.
Baixo o cartafol ./test/ atoparás un ficheiro *.js. As probas almacénanse aquí.
./surfboard.config.json: ficheiro de configuración para realizar probas.
Envs é unha sección importante. Cada ambiente está configurado así:
Punto final da API REST do nodo que se utilizará para iniciar a dApp e a CHAIN_ID da rede.
Unha frase secreta para unha conta con tokens que serán as fontes dos teus tokens de proba.
Como podes ver, surfboard.config.json admite varios ambientes por defecto. O predeterminado é o ambiente local (a clave defaultEnv é un parámetro modificable).
Aplicación de demostración de carteira
Esta sección non é unha referencia á linguaxe RIDE. Pola contra, unha ollada á aplicación que implementamos e probamos para comprender mellor o que está a suceder na cadea de bloques.
Vexamos unha simple aplicación de demostración de Wallet. Calquera persoa pode enviar tokens a un enderezo dApp. Só podes retirar as túas WAVES. Dúas funcións @Callable están dispoñibles a través de InvokeScriptTransaction:
deposit()que require un pago anexo en WAVES
withdraw(amount: Int)que devolve fichas
Ao longo do ciclo de vida de dApp, a estrutura (enderezo → importe) manterase:
acción
Estado resultante
inicio
baleiro
Alice deposita 5 ONDAS
enderezo-alicia → 500000000
Bob deposita 2 ONDAS
enderezo-alicia → 500000000
enderezo bob → 200000000
Bob retira 7 ONDAS
¡NEGADO!
Alice retira 4 ONDAS
enderezo-alicia → 100000000
enderezo bob → 200000000
Aquí está o código para comprender completamente a situación:
# 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
O código de mostra tamén se pode atopar en GitHub.
O complemento VSCode admite a compilación continua ao editar un ficheiro. Polo tanto, sempre pode supervisar os erros na pestana PROBLEMAS.
Se quere utilizar un editor de texto diferente ao compilar o ficheiro, use
surfboard compile ride/wallet.ride
Isto producirá unha serie de código RIDE compilado base64.
Script de proba para 'wallet.ride'
Vexamos arquivo de proba. Desenvolvido polo framework Mocha de JavaScript. Hai unha función "Antes" e tres probas:
"Antes" financia varias contas a través de MassTransferTransaction, compila o script e implantao na cadea de bloques.
"Pode depositar" envía unha InvokeScriptTransaction á rede, activando a función deposit() para cada unha das dúas contas.
"Non se pode retirar máis do depositado" probas que ninguén pode roubar as fichas alleas.
"Pode depositar" cheques de que as retiradas se procesan correctamente.
Realiza probas desde Surfboard e analiza os resultados en Waves Explorer
Para executar a proba, executa
surfboard test
Se tes varios scripts (por exemplo, necesitas un script de implementación separado), podes executalo
surfboard test my-scenario.js
Surfboard recollerá os ficheiros de proba no cartafol ./test/ e executará o script no nodo que está configurado en surfboard.config.json. Despois duns segundos verás algo así:
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)
Hurra! Probas superadas. Agora vexamos o que ocorre ao usar Waves Explorer: mira os bloques ou pega un dos enderezos anteriores na busca (por exemplo, o correspondente wallet#. Alí podes atopar o historial de transaccións, o estado da dApp, o ficheiro binario descompilado.
Explorador de ondas. Unha aplicación que acaba de ser implantada.
Configurando Waves Keeper para traballar cun nodo local
2. Importar frase secreta con tokens para a rede? Para simplificar, usa a semente inicial do teu nodo: waves private node seed with waves tokens. Enderezo: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.