J’ai récemment réappris solidity, consolidé les détails et écrit un « Solidity Minimalist Primer » pour les débutants (les gars de la programmation peuvent trouver un autre tutoriel), mis à jour 1 à 3 fois par semaine.
Tout le code et les didacticiels sont open source sur GitHub : github.com/AmazingAng/WTFSolidity
Dans la conférence 17 : Envoyer de l’ETH, nous avons parlé de l’utilisation de l’appel pour envoyer de l’ETH, et dans cette conférence, nous allons vous montrer comment l’utiliser pour appeler des contrats.
Appeler
call est une fonction membre de bas niveau du type address, qui est utilisée pour interagir avec d’autres contrats. Il retourne (bool, data), ce qui correspond respectivement à la réussite de l’appel et à la valeur de retour de la fonction objectif.
call est la méthode officiellement recommandée pour envoyer de l’ETH en déclenchant les fonctions de secours ou de réception par solidity. Il n’est pas recommandé d’appeler un autre contrat avec un appel, car lorsque vous appelez la fonction d’un contrat non sécurisé, vous lui donnez l’initiative. La méthode recommandée est toujours d’appeler la fonction après avoir déclaré la variable de contrat, voir Leçon 19 : Appel d’autres contrats. Si nous ne connaissons pas le code source ou l’ABI du contrat de l’autre partie, nous ne pouvons pas générer de variables de contrat, mais nous pouvons toujours appeler les fonctions contractuelles de l’autre partie via un appel.
Règles d’utilisation de l’appel
Les règles d’utilisation de l’appel sont les suivantes :
L’encodage binaire utilise la fonction d’encodage structuré abi.encodeWithSignature pour obtenir :
La signature de la fonction est « Nom de la fonction (type de paramètre séparé par des virgules) ». Par exemple, abi.encodeWithSignature(« f(uint256,address) », _x, _addr).
De plus, lors de l’appel du contrat, vous pouvez spécifier la quantité d’ETH et de gaz à envoyer par la transaction :
Cela semble un peu compliqué, alors prenons l’exemple d’une application d’appel.
Contrat cible
Commençons par écrire un contrat cible simple, OtherContract, et le déployer, le code est fondamentalement le même que dans Lecture 19, sauf avec l’ajout d’une fonction de secours.
Ce contrat contient une variable d’état x, un journal d’événements qui est déclenché lorsque l’ETH est reçu, et trois fonctions :
getBalance() : Renvoie le solde en ETH du contrat. setX() : fonction externe payante, qui permet de définir la valeur de x et d’envoyer de l’ETH au contrat. getX() : Lit la valeur de x.
Utiliser call pour appeler le contrat cible
1. Événement de réponse
Écrivons un contrat d’appel pour appeler la fonction de contrat cible. Tout d’abord, écrivez une définition d’un événement Response, et affichez le succès et les données renvoyées par l’appel, afin que nous puissions observer la valeur de retour.
2. Appelez la fonction setX
Nous définissons la fonction callSetX pour appeler setX() du contrat cible, transférons la quantité d’ETH vers msg.value et libérons l’événement Response pour générer le succès et les données :
Ensuite, nous appelons callSetX pour changer la variable d’état _x à 5, et les paramètres sont l’adresse OtherContract et 5, car la fonction objectif setX() ne renvoie pas de valeur, donc la sortie de données de l’événement Response est 0x, qui est vide.
3. Appelez la fonction getX
Appelons la fonction getX(), qui renverra la valeur du contrat cible _x, de type uint256. Nous pouvons utiliser abi.decode pour décoder la valeur de retour de l’appel, des données et lire la valeur.
À partir de la sortie de l’événement Response, nous pouvons voir que les données sont 0x0000000000000000000000000000000000000000000000000000000000000005. Après abi.decode, la valeur de retour finale est 5.
4. Appeler une fonction qui n’existe pas
Si la fonction que nous saisissons à l’appel n’existe pas dans le contrat cible, la fonction de secours du contrat cible sera déclenchée.
Dans l’exemple ci-dessus, nous avons appelé la fonction foo inexistante. L’appel peut toujours être exécuté avec succès et renvoyer un succès, mais il s’agit en fait de la fonction de secours du contrat cible appelé.
Résumé
Dans cette présentation, nous avons montré comment utiliser l’appel de fonction de bas niveau pour appeler d’autres contrats. L’appel n’est pas la méthode recommandée pour appeler un contrat, car elle n’est pas sécurisée. Mais il est utile de nous laisser appeler le contrat cible sans connaître le code source et l’ABI.
Voir l'original
Cette page peut inclure du contenu de tiers fourni à des fins d'information uniquement. Gate ne garantit ni l'exactitude ni la validité de ces contenus, n’endosse pas les opinions exprimées, et ne fournit aucun conseil financier ou professionnel à travers ces informations. Voir la section Avertissement pour plus de détails.
Premiers pas avec Solidity|Conférence 22 : Appel
J’ai récemment réappris solidity, consolidé les détails et écrit un « Solidity Minimalist Primer » pour les débutants (les gars de la programmation peuvent trouver un autre tutoriel), mis à jour 1 à 3 fois par semaine.
Tout le code et les didacticiels sont open source sur GitHub : github.com/AmazingAng/WTFSolidity
Dans la conférence 17 : Envoyer de l’ETH, nous avons parlé de l’utilisation de l’appel pour envoyer de l’ETH, et dans cette conférence, nous allons vous montrer comment l’utiliser pour appeler des contrats.
Appeler
call est une fonction membre de bas niveau du type address, qui est utilisée pour interagir avec d’autres contrats. Il retourne (bool, data), ce qui correspond respectivement à la réussite de l’appel et à la valeur de retour de la fonction objectif.
call est la méthode officiellement recommandée pour envoyer de l’ETH en déclenchant les fonctions de secours ou de réception par solidity. Il n’est pas recommandé d’appeler un autre contrat avec un appel, car lorsque vous appelez la fonction d’un contrat non sécurisé, vous lui donnez l’initiative. La méthode recommandée est toujours d’appeler la fonction après avoir déclaré la variable de contrat, voir Leçon 19 : Appel d’autres contrats. Si nous ne connaissons pas le code source ou l’ABI du contrat de l’autre partie, nous ne pouvons pas générer de variables de contrat, mais nous pouvons toujours appeler les fonctions contractuelles de l’autre partie via un appel.
Règles d’utilisation de l’appel
Les règles d’utilisation de l’appel sont les suivantes :
L’encodage binaire utilise la fonction d’encodage structuré abi.encodeWithSignature pour obtenir :
La signature de la fonction est « Nom de la fonction (type de paramètre séparé par des virgules) ». Par exemple, abi.encodeWithSignature(« f(uint256,address) », _x, _addr).
De plus, lors de l’appel du contrat, vous pouvez spécifier la quantité d’ETH et de gaz à envoyer par la transaction :
Cela semble un peu compliqué, alors prenons l’exemple d’une application d’appel.
Contrat cible
Commençons par écrire un contrat cible simple, OtherContract, et le déployer, le code est fondamentalement le même que dans Lecture 19, sauf avec l’ajout d’une fonction de secours.
Ce contrat contient une variable d’état x, un journal d’événements qui est déclenché lorsque l’ETH est reçu, et trois fonctions :
getBalance() : Renvoie le solde en ETH du contrat. setX() : fonction externe payante, qui permet de définir la valeur de x et d’envoyer de l’ETH au contrat. getX() : Lit la valeur de x.
Utiliser call pour appeler le contrat cible
1. Événement de réponse
Écrivons un contrat d’appel pour appeler la fonction de contrat cible. Tout d’abord, écrivez une définition d’un événement Response, et affichez le succès et les données renvoyées par l’appel, afin que nous puissions observer la valeur de retour.
2. Appelez la fonction setX
Nous définissons la fonction callSetX pour appeler setX() du contrat cible, transférons la quantité d’ETH vers msg.value et libérons l’événement Response pour générer le succès et les données :
Ensuite, nous appelons callSetX pour changer la variable d’état _x à 5, et les paramètres sont l’adresse OtherContract et 5, car la fonction objectif setX() ne renvoie pas de valeur, donc la sortie de données de l’événement Response est 0x, qui est vide.
3. Appelez la fonction getX
Appelons la fonction getX(), qui renverra la valeur du contrat cible _x, de type uint256. Nous pouvons utiliser abi.decode pour décoder la valeur de retour de l’appel, des données et lire la valeur.
À partir de la sortie de l’événement Response, nous pouvons voir que les données sont 0x0000000000000000000000000000000000000000000000000000000000000005. Après abi.decode, la valeur de retour finale est 5.
4. Appeler une fonction qui n’existe pas
Si la fonction que nous saisissons à l’appel n’existe pas dans le contrat cible, la fonction de secours du contrat cible sera déclenchée.
Dans l’exemple ci-dessus, nous avons appelé la fonction foo inexistante. L’appel peut toujours être exécuté avec succès et renvoyer un succès, mais il s’agit en fait de la fonction de secours du contrat cible appelé.
Résumé
Dans cette présentation, nous avons montré comment utiliser l’appel de fonction de bas niveau pour appeler d’autres contrats. L’appel n’est pas la méthode recommandée pour appeler un contrat, car elle n’est pas sécurisée. Mais il est utile de nous laisser appeler le contrat cible sans connaître le code source et l’ABI.