当前位置:网站首页>Principe du contrat évolutif - delegatecall
Principe du contrat évolutif - delegatecall
2022-07-02 11:35:00 【Luan ni xiansen】
Principe du contrat évolutif-DelegateCall
En introductionDelegateCallHeure,On doit prendreCallLes méthodes sont présentées ensemble,Et faire des comparaisons.
Commençons par le concept.!
DelegateCall:Il y a un type particulier d'appel de message,Appelé Appel délégué(delegatecall) .C'est un appel de message général(call)La différence est que,Le Code de l'adresse cible sera exécuté dans le contexte du contrat qui a lancé l'appel,Et msg.sender Et msg.value Sans changement. Cela signifie qu'un contrat peut charger dynamiquement le code à partir d'une autre adresse au moment de l'exécution.
Je n'aime pas parler de concepts dès le début,Après tout, c'est trop difficile à comprendre..Tu ferais mieux d'aller à la démo de code
Environnement de démonstration
Remix IDE:RemixEst basé sur le Navigateur IDE,Intégration du compilateur et Solidity Environnement d'exécution,Le composant serveur n'est pas nécessaire,Prise en charge de la création de pages Web en ligne、Déployer et tester des contrats intelligents.
Ce chapitre vise principalement à vous donner un aperçu rapide deDelegateCallCaractéristiques de,Donc le choix est basé surRemixPour montrer.
Codage
On est là.contractsNouveau dans le répertoiredelegatecall.solDocumentation,Et ensuite coller le Code de démonstration suivant dansdelegatecall.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
contract A {
address public msgsender;
function callFunc() public {
msgsender = msg.sender;
}
}
contract B {
address public msgsender;
address public a;
constructor(address _a) {
a = _a;
}
function call_a_call() public{
// isOk Utilisé pour recevoir un appel réussi
(bool isOk,bytes memory result) = a.call(abi.encodeWithSignature("callFunc()"));
// En cas d'échec,Signaler une exception
require(isOk,"call faild");
}
function delegatecall_a_delegatecall() public{
(bool isOk,bytes memory result) = a.delegatecall(abi.encodeWithSignature("callFunc()"));
require(isOk,"call faild");
}
}
Nous définissons ici deux contrats AEtB
A Le contrat a un msgsender Variables d'état et callFunc()Méthodes
B Le contrat comporte deux variables d'état msgsenderEta,msgsender Pour valider nos résultats expérimentaux ,a C'est un contrat de dépôt AExemple de référence pour, Et deux méthodes sont définies , Pour la démonstration BAdoption du contratcallEtdelegatecall Appelé de deux façons AContractuelcallFunc()
Et on appuie surCtrl + sRaccourcis clavier, Le Code du contrat est sauvegardé ici , Le compilateur nous aidera automatiquement à compiler
Déploiement contractuel
Cliquez sur le bouton ci - dessous pour passer à Déploiement et mise en service Page
Déployez d'abord le contrat A,Contrat de redéploiementB,Parce queB Variables d'état dans aCitéAAdresse
- Contrat de déploiement
A
- Contrat de déploiement
B
Contrat de déploiementBBesoin de passer àAAdresse
Interaction contractuelle
Cliquez d'abord sur> Bouton pour agrandir notre contrat ,Et cliquez surAContrats etBContractuelmsgsenderRequête par bouton( Cliquez sur le bouton pour appeler automatiquement msgsenderMéthode de requête pour) Valeur de la variable d'état actuelle , Ici, nous pouvons voir que tout est 0
Ensuite, cliquez surBContratsdelegatecall_a_delegatecallBoutons(Appelezdelegatecall_a_delegatecallMéthodes),Puis cliquez à nouveau surAContrats etBContractuelmsgsenderRequête par bouton
Quelque chose d'étrange est arrivé!!!AContractuelmsgsenderAucune valeur,MaisBContractuelmsgsender C'est devenu ma propre adresse 0x5B38Da6a....
C'est bon, Nous pouvons combiner les résultats expérimentaux ci - dessus , Encore une fois, pour comprendre les concepts décrits au début de l'article
Adresse de destinationA Le Code du contrat sera appelé à BContractuelContexteExécution intermédiaire,Et msg.sender Et msg.value Sans changement.Contexte C'est l'environnement de fonctionnement , Y compris le contrat Variables d'état, Donc quand le contrat est exécuté callFunc()Le contenu de,callFunc()La méthode est deB Exécuté dans le contrat ,Ce qui a été modifiéBVariable d'état du contrat,EtAContractuelmsgsenderMais ça n'a pas changé..
SiB Deux variables d'état du contrat msgsenderEta Changer de position dans le Code ,C'est une autre histoire, Il s'agit d'un autre concept 《 Disposition du stockage des données contractuelles 》
Ensuite, cliquez surBContratscall_a_callBoutons,Puis cliquez à nouveau surAContrats etBContractuelmsgsenderRequête par bouton
MaintenantAContractuelmsgsenderÇa vaut le coup,BContractuelmsgsenderLa valeur n'a pas changé.
Quand on appelleBContratscall_a_callLa méthode,B La variable d'état du contrat n'a pas changé ,AContractuelmsgsenderÇa vaut le coup,Ça montrecallFunc()La méthode est deAContractuelContexte Exécuté dans l'environnement ,Ici.ContexteIl y a eu un changement..
Et nous avons découvertAContractuelmsgsenderEst devenuBAdresse du contrat, Cela signifie qu'au cours de l'appel msg.sender Et msg.valueIl y a eu un changement.,msg.sender Ce n'est plus moi 0x5B38Da6a....Mais...BAdresse du contrat
Résumé
Je m'occuperai de ce qu'on a écrit Contrat évolutif,Oui.Contrat d'agenceLorsque l'appel est lancé,Contrat d'agenceAvecContrat logique L'interaction est utile Appel délégué(DelegateCall).Contrat logiqueLa méthodeContrat d'agence Exécution contextuelle de , Et modifié Variables d'étatC'est aussiContrat d'agenceDe. Donc les données du contrat ont été Contrat d'agence- Oui.,QuandContrat logique La mise à niveau n'affectera pas les données existantes du contrat
Il y a un problème, Ou suggérez de laisser un message ,Merci beaucoup..
边栏推荐
- RPA advanced (II) uipath application practice
- LVM operation
- TIPC messaging3
- QT learning diary 8 - resource file addition
- The difference between self and static in PHP in methods
- Jenkins安装
- Resources reads 2D texture and converts it to PNG format
- 解决uniapp列表快速滑动页面数据空白问题
- 亚马逊云科技 Community Builder 申请窗口开启
- Iii. Système de démarrage et d'horloge à puce
猜你喜欢

MTK full dump抓取

念念不忘,必有回响 | 悬镜诚邀您参与OpenSCA用户有奖调研
![[play with FPGA learning 2 in simple terms ----- design skills (basic grammar)]](/img/50/22f2fa8fd606572b13a18cc889ca2e.png)
[play with FPGA learning 2 in simple terms ----- design skills (basic grammar)]

Thanos Receiver

八大排序汇总

MySQL linked list data storage query sorting problem

enumrate的start属性的坑

TIPC Cluster5

map集合赋值到数据库

Is the Ren domain name valuable? Is it worth investing? What is the application scope of Ren domain name?
随机推荐
Tick Data and Resampling
Amazon cloud technology community builder application window opens
The difference between SQL left join main table restrictions written after on and where
MySQL linked list data storage query sorting problem
enumrate的start属性的坑
bedtools使用教程
三.芯片啟動和時鐘系統
TIPC Getting Started6
PHP tea sales and shopping online store
Never forget, there will be echoes | hanging mirror sincerely invites you to participate in the opensca user award research
TIPC Cluster5
The difference between self and static in PHP in methods
高德根据轨迹画线
TIPC介绍1
ROS lacks catkin_ pkg
ros缺少xacro的包
C file and folder operation
Thanos Receiver
从攻击面视角,看信创零信任方案实践
III Chip startup and clock system