Comment interagir directement avec des smarts contracts

Les smarts contracts ne sont pas uniquement fonctionnels sur les sites des plateformes qui les déploient. Tout le monde peut interagir avec, et ça peut être parfois très utile. Explications, trucs et astuces.

Hold Smart Contract by James Fok from the Noun Project

Lorsque vous allez sur des sites de la DeFi, vous interagissez régulièrement avec des smart contracts. En général, les différents sites utilisent la librairie Web3.js, qui va permettre de lire les données sur la blockchain et d'écrire dessus grâce au renfort de votre portefeuille.

Le portefeuille le plus utilisé aujourd'hui est Metamask, mais il existe également d'autres extensions navigateur, ou encore des applications mobiles de portefeuille qui embarquent un navigateur. Le navigateur Brave embarque également un portefeuille.

Mais il reste un problème : un site web est une ressource centralisée. Il dépend d'un nom de domaine, qui est distribués et géré par des autorités centrales (le gouvernement français pour les .fr, par exemple, ou l'ICANN pour les .com). Il dépend aussi d'un hébergeur qui est une entreprise, et très certainement les développements de celui-ci ne sont pas gérés non plus par une communauté large à gouvernance décentralisée. Ceci dit, si le code est open-source, il sera alors facile de répliquer celui-ci et de les déployer sur d'autres URLs.

Néanmoins, ces sites peuvent-être sujets à problèmes. L'autre jour, en trainant sur le telegram de PancakeSwap, je suis tombé sur un utilisateur qui ne retrouvait plus le coffre dans lequel il avait envoyé ses BNB. Les jetons n'avaient pas disparu, ils étaient toujours bel et bien dans le smart contract, mais il n'arrivait plus à accéder à celui-ci ! Heureusement, il y a toujours une solution :)

Evidemment, forker du code et utiliser web3.js n'est pas à la portée de tout le monde. Dans cet article, on va voir ensemble comment interagir directement avec des smarts contracts, même quand on n'est pas développeur.

A quoi ça sert, d'interagir directement avec des smarts contracts

Les possibilités ne manquent vraiment pas. En voici quelques unes :

  • Aller récupérer le pognon qu'on y a laissé, même si le site plante ou ne marche plus.
  • Aller chercher des informations en plus, qui n'ont pas été données au public. La fin d'un timelock par exemple, peut nous donner une date de sortie !
  • Aller approuver un contrat à l'avance avant une ICO pour aller plus vite. Par exemple, le token Geforce (GFCE) s'est entièrement vendu en 5 secondes sur la Binance Smart Chain ! En approuvant le contrat à l'avance, vous gagnez de précieuses secondes sur les utilisateurs qui devront attendre que l'interface soit disponible.
  • Accéder à des fonctions du smart contract qui ne sont pas interfacées (ou pas encore).
  • Aller observer les investissements des autres (bon Yieldwatch et Zapper feront l'affaire aussi !)
  • Hacker un smart contract vulnérable (c'est très mal !) pour par exemple miner des jetons, ou acheter des jetons d'une ICO/IFO avant l'heure
  • Aller vérifier les données un smart contract. Par exemple, qui est l'owner du smart contract ? Combien de jetons a t'il ? etc.

Etherscan et BSCScan

La première chose à comprendre, c'est que la blockchain garde toujours une trace de vos transactions, quoi que vous ayez fait. Les explorateurs de blockchain sont des outils formidables pour investiguer.

Dans cet article, on se concentrera sur BSCScan, qui est le fork d'Etherscan, l'explorateur d'Ethereum, pour la Binance Smart Chain. Mais il existe bien des explorateurs, sûrement un par blockchain ! Cardano a CardanoScan, PolkaDot a PolkaScan, Avalanche a AvaScan, etc.

Pour l'exemple, allons déposer 1 CAKE dans le coffre d'Autofarm. Le coffre va simplement aller staker les CAKEs, et bon, pour approuver le contrat, mettre le CAKE, le ressortir, on va en avoir pour un bon 1-2$ en frais de transactions. Je note que vous me devez 2 balles dans mon petit carnet.

A présent, je peux prendre mon adresse ETH/BNB (Sur Metamask, la même adresse est utilisée pour le réseau ETH et le réseau BNB) et la chercher sur BSCScan.

BSCScan address

Ma transaction apparait bien ici, et le champs To m'indique l'adresse du smart contract. Allons cliquer dessus pour jeter un coup d'oeil.

BSCScan address

Les détails de la transaction apparaissent alors. On voit que le contrat d'autofarm a fait appel au contrat de PancakeSwap pour y placer le pognon. Les frais de transactions ont piqué un peu, également (0.79$ pour placer un $Cake qui en vaut 12 !). S'ils sont aussi élevés, c'est parce qu'il y a eu un certain nombre d'appels et d'écritures sur la blockchain suite à ça.

Enfin, dans les détails de la transaction, on voit l'adresse du contrat avec lequel on a interagi. Si on clique dessus, on peut aller voir le code (si le développeur a bien vérifié son smart contract). Je vous déconseille d'interagir avec des contrats non-vérifiés.

BSCScan autofarm contract

Le contrat implémente une interface de type ERC20/BEP20 (pour le token AUTO) de la plateforme. Il permet de gérer également les différents coffres. En plaçant vos cryptos dans les coffres, vous gagnez des AUTOs. Un pourcentage des gains récoltés par les coffres (3%) est utilisé afin de racheter et brûler des tokens AUTO, ce qui rend le token déflationniste (ça, et le fait qu'il y ait un max supply).

Revenons aux détails de la transaction, il y a encore des choses à voir. Si on clique sur l'onglet Logs ici, on peut voir les logs de la transaction. Ces logs correspondent aux évènements émis par les smart contracts. Allons y jeter un oeil. Allons tout en bas pour voir le premier log:

BSCScan transaction logs

On voit ici qu'on a appelé la fonction Deposit du smart contract, avec 3 arguments. Le premier est mon adresse, tout simplement. Le second argument (7) est le pid (l'id du coffre, en fait. Ils sont tous gérés dans le même smart contract, alors ils disposent d'un identifiant unique qui permet de les retrouver). Le troisième argument, amount, est simplement le nombre de tokens que j'ai déposé (ici, 1 $Cake). Notez que le contrat dépose dans amount le nombre 1000000000000000000, 1 suivi de 18 zéros. L'unité minimum est donc de 10^-18 Cake ici.

Ici, on pourrait aller lire le code du smart contract pour aller voir en détail ce que fait cette fonction Deposit, mais on va garder les choses simples pour l'instant. Notez que si vous ne savez pas lire du code, ce n'est pas toujours très grave : les développeurs commentent souvent bien le code de leurs smart contrats, afin d'attirer la confiance des autres développeurs, et de faciliter les audits.

Retournons sur le contrat, on va pouvoir commencer à s'amuser.

Vous voyez ces deux onglets à côté de l'onglet Code ?

BSCScan tabs smart contract

Et oui, les onglets Read Contract et Write Contract vont nous permettre de lire et d'écrire dedans !

Tout petit point de détail technique ici. Un smart contract est un ensemble de fonctions fournissant une interface à l'utilisateur pour interagir avec. Pour simplifier, il existe deux types de fonctions : les fonctions read, qui sont caractérisées par les types de fonction view et pure et les fonctions write qui sont elles caractérisées par les types external et public. Il existe d'autres types encore, mais c'est des détails de code qui ne nous intéressent pas ici.

Si vous fouillez dans le code et que vous voyez une fonction view ou pure, celà signifie que vous pouvez l'interroger. Vous ne faîtes alors que lire des données sur la blockchain, et vous ne payerez pas de frais de transactions. En revanche, les fonctions external et public iront écrire des données sur la blockchain, il faudra payer pour les appeler.

Notez également que les variables (des données dans le smart contract) qui sont déclarées en public seront aussi automatiquement accessibles, le compilateur Solidity créera des accesseurs automatiquement.

Allons faire un tour du côté des fonctions de lecture, dans un premier temps. Un certains nombres de fonctions sont disponibles. On pourrait aller lire le code pour voir ce qu'elles font, mais j'ai la flemme. Appelons les avec notre adresse et le pid 7.

La fonction stakedWantToken nous retournera le nombre de Cake qu'on a mis dans le coffre (on en a perdu un tout petit peu en frais au moment du dépôt) :

BSCScan read call BSCScan read call

La fonction userInfo, elle, nous renvoie d'autres informations (nos parts du coffre) : BSCScan read call

Allons à présent retirer notre jeton Cake. Allons dans la partie Write Contract.

BSCScan read call

La première différence, c'est la ligne en rouge, connect to web3. En effet, pour écrire dans le contrat, il va falloir payer. Il faut donc connecter notre portefeuille ici. Cliquer sur le lien fera apparaître une popup.

Note : n'aller pas jouer avec votre portefeuille qui contient beaucoup d'argent, surtout si vous n'avez pas lu le code du smart contract. Par sécurité, créez-vous un autre portefeuille pour explorer ces fonctions si vous débutez.

BSCScan read call

Une fois connecté, on peut commencer à fouiller dans les fonctions, mais celle qui va nous intéresser ici est la fonction withdraw. On lui passera en paramètre notre pid (7) et la quantité qu'on désire retirer (nous l'avons trouvé tout à l'heure, c'est 999441948354612694). Une fois la requête lancée, Metamask va nous demander de confirmer la transaction (et de payer les frais).

BSCScan read call

Quelques secondes plus tard, notre Cake est de retour !

BSCScan read call

Notez qu'il reste un peu dans le coffre. C'est la quantité qui a été farmée entre le moment où nous avons lu la première valeur et le moment où nous l'avons retiré. Oui, ça a pris quelques minutes, je n'écris pas si vite !

Conclusion

Les smart contracts survivront à la plupart des sites qui les opéraient (sauf si ceux-ci ont été muni d'une fonction kill et sont tués par leur propriétaire).

Savoir interagir et opérer directement avec peut vous donner une avance sur les autres, vous permettre de faire des investissements mieux étudiés, ou tout simplement vous sortir d'un mauvais pas. Allez regarder un peu un contrat ne coûte pas grand chose, et quand on sait lire le code du contrat, c'est encore plus puissant !

D'ailleurs, si vous désirez apprendre à lire/écrire des smart contracts en Solidity (le langage d'Ethereum), je ne saurais que trop vous recommander l'excellente série de tutoriels de CryptoZombies.