
En avril 2018, l'équipe Waves a présenté ses contrats intelligents non complets.
Un peu plus tard, lorsque le hackathon Waves a été annoncé, j'ai décidé qu'il était temps de s'immerger dans les nouvelles technologies. Sous la coupe, vous trouverez des informations détaillées sur le contrat intelligent qui a remporté la troisième place du hackathon.
L'article sera utile aux développeurs pour mettre en œuvre leurs propres contrats intelligents et se familiariser avec la technologie.
Idée
L'idée du projet est de distribuer automatiquement les salaires des développeurs de logiciels utilisant Github, proportionnellement au travail effectué. La tâche principale, la tâche que le contrat intelligent résout en même temps, nous libère de la nécessité de faire confiance au programme de distribution d'argent et permet même à l'utilisateur sans compétences en programmation de vérifier la bonne distribution des fonds avant de transférer de l'argent
Pile technologique
Html et JavaScript (
bibliothèque Node.js Waves), open
source sur GitHub et
démonstration du projet sur Firebase Hosting
Le processus
- L'utilisateur sélectionne le référentiel GitHub et détermine le montant total des salaires
- L'utilisateur effectue un paiement de 0,01 Waves (environ 0,02 dollar) pour enregistrer les données sur la blockchain et créer un contrat intelligent
- L'utilisateur vérifie l'exactitude des données puis transfère le montant des salaires à l'adresse du smart contract
- Les salaires sont partagés entre les développeurs
Développement
Le meilleur point d'entrée pour un développeur novice est la
console de démonstration , qui contient un bon exemple et une console pour tester le code. Pendant le développement, il est préférable d'utiliser une
blockchain de test , où vous pouvez obtenir 10 vagues de test gratuites en
un seul clic . Bien que Google ne trouve toujours pas beaucoup d'exemples en raison de la nouveauté de la technologie, les contrats intelligents sont bien
documentés et contiennent toutes les informations nécessaires.
La bibliothèque NodeJs (1.4.0) fonctionne déjà bien dans les navigateurs (à l'exception de la création d'Alias), mais, malheureusement, elle n'est PAS encore compatible avec Google Functions ou React Native (les développeurs de Waves
promettent de corriger cela bientôt).
Contrat intelligent
Un contrat intelligent est créé pour un compte et vérifie chaque action avec ce compte (à l'exception des transferts d'argent entrants):
let signature = base58'${currentWallet.keyPair.publicKey}'; match tx { case tx:TransferTransaction => { let employerAddress = addressFromPublicKey(tx.senderPk); let dateKey = toBase58String(addressFromRecipient(tx.recipient).bytes); let salary = extract(getLong(employerAddress, dateKey)); if((salary == tx.amount) && sigVerify(tx.bodyBytes, tx.proofs[0], signature)) then true else false } case _ => false }
Analyse de contrat intelligente ligne par ligne
let signature = base58'${currentWallet.keyPair.publicKey}';
Ici, nous enregistrons la clé publique du portefeuille (votre JavaScript doit contenir la variable currentWallet créée à l'aide de la commande Waves.Seed.create ()), afin que seul le compte de contrat intelligent du portefeuille (Smart Rewarding Project dans notre cas) puisse transférer des fonds.
match tx { case tx:TransferTransaction => {some validations} case _ => false }
Il s'agit de la construction de base de tout contrat intelligent Waves qui nous indique que ce contrat interdit toute activité autre que le transfert de fonds (TransferTransaction). Ainsi, après avoir créé un contrat, il est impossible de modifier les données sur les développeurs (DataTransaction) ou de changer le contrat intelligent lui-même (SetScript).
let employerAddress = addressFromPublicKey(tx.senderPk);
Il utilise la méthode de base addressFromPublicKey de la
bibliothèque intégrée pour obtenir l'adresse du créateur de la demande à partir de sa clé publique.
let dateKey = toBase58String(addressFromRecipient(tx.recipient).bytes);
La méthode de base addressFromRecipient obtient l'adresse du destinataire des fonds
let salary = extract(getLong(employerAddress, dateKey));
La méthode de base getLong nous donne des données stockées sur la blockchain à l'adresse du créateur de la demande, qui est le montant du salaire du développeur. Le contrat peut accéder aux données stockées dans la blockchain Waves (et ne peut PAS accéder aux données situées sur un site Web ou un serveur tiers).
if((salary == tx.amount) && sigVerify(tx.bodyBytes, tx.proofs[0], signature)) then true else false
C'est là que la vérification du montant et de la signature corrects. Vrai signifie que la transaction sera autorisée et faux signifie que la transaction sera refusée. Ainsi, lors de tout transfert d'argent depuis ce compte, il est vérifié que l'argent ne sera envoyé qu'au portefeuille du développeur et au montant déjà stocké dans la chaîne de blocs, au format d'une paire de clés facilement lisible (adresse sous forme de clé et montant sous forme de valeur), ce qui permet faites confiance au programme, vérifiez vous-même toutes les données pendant 5 à 10 secondes avant de transférer les salaires.
Démonstration en ligne du projet sur la blockchain de test, disponible
iciIci vous pouvez voir le code du projet.
J'espère que l'article a été informatif et vous sera utile pour rédiger votre premier contrat intelligent.