Como construir, implantar e testar o dApp Waves RIDE
Olá! Neste artigo, mostrarei como escrever e executar um dApp normal em um nó Waves. Vejamos as ferramentas, métodos necessários e um exemplo de desenvolvimento.
O esquema de desenvolvimento para dApps e aplicativos regulares é quase o mesmo:
Nós escrevemos o código
Escrevendo testes automatizados
Iniciando o aplicativo
Teste
Ferramentas
1. docker para executar o nó e o Waves Explorer
Se não quiser iniciar um nó, você pode pular esta etapa. Afinal, existe uma rede de teste e experimental. Mas sem implantar seu próprio nó, o processo de teste pode se arrastar.
Você precisará constantemente de novas contas com tokens de teste. A torneira da rede de teste transfere 10 ONDAS a cada 10 minutos.
O tempo médio de bloqueio na rede de teste é de 1 minuto, no nó – 15 segundos. Isto é especialmente perceptível quando uma transação requer múltiplas confirmações.
O cache agressivo é possível em nós de teste públicos.
Eles também podem estar temporariamente indisponíveis devido à manutenção.
De agora em diante assumirei que você está trabalhando com seu próprio nó.
2. Ferramenta de linha de comando da prancha de surf
Instale o Surfboard, uma ferramenta que permite executar testes em um nó existente.
npm install -g @waves/surfboard
3. Plug-in de código do Visual Studio
Esta etapa é opcional se você não é fã de IDEs e prefere editores de texto. Todas as ferramentas necessárias são utilitários de linha de comando. Se você usa vim, preste atenção no plugin passeio vim.
Baixe e instale o código do Visual Studio: https://code.visualstudio.com/
docker run -d -p 6869:6869 wavesplatform/waves-private-node
Certifique-se de que o nó seja iniciado por meio da API REST em http://localhost:6869:
API REST Swagger para nó
2. Inicie uma instância do Waves Explorer:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Abra um navegador e vá para http://localhost:3000. Você verá a rapidez com que um circuito de nó local vazio é construído.
Waves Explorer exibe uma instância de nó local
Estrutura RIDE e ferramenta de prancha de surf
Crie um diretório vazio e execute o comando nele
surfboard init
O comando inicializa um diretório com a estrutura do projeto, aplicações “hello world” e testes. Se você abrir esta pasta com VS Code, verá:
Prancha de surf.config.json
Na pasta ./ride/ você encontrará um único arquivo wallet.ride - o diretório onde o código dApp está localizado. Analisaremos brevemente os dApps no próximo bloco.
Na pasta ./test/ você encontrará um arquivo *.js. Os testes são armazenados aqui.
./surfboard.config.json – arquivo de configuração para execução de testes.
Envs é uma seção importante. Cada ambiente é configurado assim:
Endpoint da API REST do nó que será usado para iniciar o dApp e CHAIN_ID da rede.
Uma frase secreta para uma conta com tokens que serão as fontes dos seus tokens de teste.
Como você pode ver, surfboard.config.json oferece suporte a vários ambientes por padrão. O padrão é o ambiente local (a chave defaultEnv é um parâmetro alterável).
Aplicativo de demonstração de carteira
Esta seção não é uma referência à linguagem RIDE. Em vez disso, dê uma olhada no aplicativo que implantamos e testamos para entender melhor o que está acontecendo no blockchain.
Vejamos um aplicativo simples de demonstração da Wallet. Qualquer pessoa pode enviar tokens para um endereço dApp. Você só pode retirar seus WAVES. Duas funções @Callable estão disponíveis via InvokeScriptTransaction:
deposit()que requer um pagamento anexado em WAVES
withdraw(amount: Int)que retorna tokens
Ao longo do ciclo de vida do dApp, a estrutura (endereço → valor) será mantida:
Açao Social
Estado resultante
do estado inicial,
vazio
Alice deposita 5 ONDAS
endereço-alice → 500000000
Bob deposita 2 ONDAS
endereço-alice → 500000000
endereço bob → 200000000
Bob retira 7 ONDAS
NEGADO!
Alice retira 4 ONDAS
endereço-alice → 100000000
endereço bob → 200000000
Aqui está o código para entender completamente a situação:
# 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 exemplo também pode ser encontrado em GitHub.
O plugin VSCode suporta compilação contínua durante a edição de um arquivo. Portanto, você sempre pode monitorar erros na aba PROBLEMAS.
Se você quiser usar um editor de texto diferente ao compilar o arquivo, use
surfboard compile ride/wallet.ride
Isso produzirá uma série de códigos RIDE compilados em base64.
Script de teste para 'wallet.ride'
Vamos olhar para arquivo de teste. Desenvolvido pela estrutura Mocha do JavaScript. Existe uma função “Antes” e três testes:
“Before” financia múltiplas contas via MassTransferTransaction, compila o script e o implanta no blockchain.
“Can deposit” envia uma InvokeScriptTransaction para a rede, ativando a função deposit() para cada uma das duas contas.
“Não é possível sacar mais do que foi depositado” testa que ninguém pode roubar tokens de outras pessoas.
“Pode depositar” verifica se os saques foram processados corretamente.
Execute testes no Surfboard e analise os resultados no Waves Explorer
Para executar o teste, execute
surfboard test
Se você tiver vários scripts (por exemplo, precisar de um script de implantação separado), poderá executar
surfboard test my-scenario.js
O Surfboard coletará os arquivos de teste na pasta ./test/ e executará o script no nó configurado em surfboard.config.json. Depois de alguns segundos você verá algo assim:
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)
Viva! Os testes foram aprovados. Agora vamos dar uma olhada no que acontece ao usar o Waves Explorer: observe os blocos ou cole um dos endereços acima na pesquisa (por exemplo, o correspondente wallet#. Lá você pode encontrar o histórico de transações, status do dApp e arquivo binário descompilado.
Explorador de ondas. Um aplicativo que acabou de ser implantado.
Configurando o Waves Keeper para funcionar com um nó local
2. Importar frase secreta com tokens para a rede? Para simplificar, use a semente inicial do seu nó: waves private node seed with waves tokens. Endereço: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.