Bonjour! Dans cet article, je vais vous montrer comment écrire et exécuter une dApp standard sur un nœud Waves. Examinons les outils, les méthodes et un exemple de développement nécessaires.
Le schéma de développement des dApps et des applications régulières est presque le même :
Nous écrivons le code
Rédaction de tests automatisés
Lancement de l'application
Test
Outils
1. docker pour exécuter le nœud et Waves Explorer
Si vous ne souhaitez pas démarrer de nœud, vous pouvez ignorer cette étape. Après tout, il existe un réseau de tests et d’expérimentations. Mais sans déployer votre propre nœud, le processus de test peut s'éterniser.
Vous aurez constamment besoin de nouveaux comptes avec des jetons de test. Le robinet du réseau de test transfère 10 ONDES toutes les 10 minutes.
Le temps de blocage moyen dans le réseau de test est de 1 minute, dans le nœud de 15 secondes. Ceci est particulièrement visible lorsqu'une transaction nécessite plusieurs confirmations.
La mise en cache agressive est possible sur les nœuds de test publics.
Ils peuvent également être temporairement indisponibles en raison de maintenance.
A partir de maintenant, je suppose que vous travaillez avec votre propre nœud.
Installez Surfboard, un outil qui vous permet d'exécuter des tests sur un nœud existant.
npm install -g @waves/surfboard
3. Plugin Visual Studio Code
Cette étape est facultative si vous n'êtes pas fan des IDE et préférez les éditeurs de texte. Tous les outils nécessaires sont des utilitaires de ligne de commande. Si vous utilisez vim, faites attention au plugin vim-ride.
Téléchargez et installez 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
Ouvrez un navigateur et accédez à http://localhost:3000. Vous verrez à quelle vitesse un circuit de nœud local vide est construit.
Waves Explorer affiche une instance de nœud local
Structure RIDE et outil planche de surf
Créez un répertoire vide et exécutez la commande dedans
surfboard init
La commande initialise un répertoire avec la structure du projet, les applications « hello world » et les tests. Si vous ouvrez ce dossier avec VS Code, vous verrez :
Planche de surf.config.json
Sous le dossier ./ride/, vous trouverez un seul fichier wallet.ride - le répertoire où se trouve le code dApp. Nous analyserons brièvement les dApps dans le bloc suivant.
Sous le dossier ./test/, vous trouverez un fichier *.js. Les tests sont stockés ici.
./surfboard.config.json – fichier de configuration pour exécuter les tests.
Envs est une section importante. Chaque environnement est configuré comme ceci :
Point de terminaison de l'API REST du nœud qui sera utilisé pour lancer le dApp et le CHAIN_ID du réseau.
Une phrase secrète pour un compte avec des tokens qui seront les sources de vos tokens de test.
Comme vous pouvez le constater, surfboard.config.json prend en charge plusieurs environnements par défaut. La valeur par défaut est l'environnement local (la clé defaultEnv est un paramètre modifiable).
Application de démonstration de portefeuille
Cette section n'est pas une référence au langage RIDE. Jetez plutôt un œil à l’application que nous déployons et testons pour mieux comprendre ce qui se passe dans la blockchain.
Regardons une simple application de démonstration Wallet. N'importe qui peut envoyer des jetons à une adresse dApp. Vous ne pouvez retirer que vos WAVES. Deux fonctions @Callable sont disponibles via InvokeScriptTransaction :
deposit()qui nécessite un paiement attaché en WAVES
withdraw(amount: Int)qui renvoie des jetons
Tout au long du cycle de vie de la dApp, la structure (adresse → montant) sera maintenue :
Action
État résultant
initiale
vide
Alice dépose 5 VAGUES
adresse-alice → 500000000
Bob dépose 2 VAGUES
adresse-alice → 500000000
adresse bob → 200000000
Bob retire 7 WAVES
REFUSÉ!
Alice retire 4 VAGUES
adresse-alice → 100000000
adresse bob → 200000000
Voici le code pour bien comprendre la situation :
# 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
Un exemple de code peut également être trouvé sur GitHub.
Le plugin VSCode prend en charge la compilation continue lors de l'édition d'un fichier. Par conséquent, vous pouvez toujours surveiller les erreurs dans l'onglet PROBLÈMES.
Si vous souhaitez utiliser un autre éditeur de texte lors de la compilation du fichier, utilisez
surfboard compile ride/wallet.ride
Cela produira une série de code RIDE compilé en base64.
Script de test pour 'wallet.ride'
Regardons fichier de test. Propulsé par le framework Mocha de JavaScript. Il existe une fonction « Avant » et trois tests :
« Avant » finance plusieurs comptes via MassTransferTransaction, compile le script et le déploie sur la blockchain.
« Can deposit » envoie une InvokeScriptTransaction au réseau, activant la fonction deposit() pour chacun des deux comptes.
« Impossible de retirer plus que ce qui a été déposé » teste que personne ne peut voler les jetons d'autrui.
« Can deposit » vérifie que les retraits sont traités correctement.
Exécutez des tests depuis Surfboard et analysez les résultats dans Waves Explorer
Pour exécuter le test, exécutez
surfboard test
Si vous disposez de plusieurs scripts (par exemple, vous avez besoin d'un script de déploiement distinct), vous pouvez exécuter
surfboard test my-scenario.js
Surfboard collectera les fichiers de test dans le dossier ./test/ et exécutera le script sur le nœud configuré dans surfboard.config.json. Après quelques secondes, vous verrez quelque chose comme ceci :
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)
Hourra! Tests réussis. Voyons maintenant ce qui se passe lors de l'utilisation de Waves Explorer : regardez les blocs ou collez l'une des adresses ci-dessus dans la recherche (par exemple, le correspondant wallet#. Vous y trouverez l'historique des transactions, le statut de la dApp et le fichier binaire décompilé.
Explorateur de vagues. Une application qui vient d'être déployée.
Quelques conseils en matière de planche de surf :
1. Pour tester dans l'environnement testnet, utilisez :
2. Si vous souhaitez voir les versions JSON des transactions et comment elles sont traitées par le nœud, exécutez le test avec -v (signifie « verbeux ») :
Configuration de Waves Keeper pour fonctionner avec un nœud local
2. Importer une phrase secrète avec des jetons pour le réseau ? Pour plus de simplicité, utilisez la graine initiale de votre nœud : waves private node seed with waves tokens. Adresse: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.