当前位置:网站首页>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 introductionDelegateCall
Heure,On doit prendreCall
Les 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à.contracts
Nouveau dans le répertoiredelegatecall.sol
Documentation,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 A
EtB
A
Le contrat a un msgsender
Variables d'état et callFunc()
Méthodes
B
Le contrat comporte deux variables d'état msgsender
Eta
,msgsender
Pour valider nos résultats expérimentaux ,a
C'est un contrat de dépôt A
Exemple de référence pour, Et deux méthodes sont définies , Pour la démonstration B
Adoption du contratcall
Etdelegatecall
Appelé de deux façons A
ContractuelcallFunc()
Et on appuie surCtrl + s
Raccourcis 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 a
CitéA
Adresse
- Contrat de déploiement
A
- Contrat de déploiement
B
Contrat de déploiementB
Besoin de passer àA
Adresse
Interaction contractuelle
Cliquez d'abord sur>
Bouton pour agrandir notre contrat ,Et cliquez surA
Contrats etB
Contractuelmsgsender
Requête par bouton( Cliquez sur le bouton pour appeler automatiquement msgsender
Méthode de requête pour) Valeur de la variable d'état actuelle , Ici, nous pouvons voir que tout est 0
Ensuite, cliquez surB
Contratsdelegatecall_a_delegatecall
Boutons(Appelezdelegatecall_a_delegatecall
Méthodes),Puis cliquez à nouveau surA
Contrats etB
Contractuelmsgsender
Requête par bouton
Quelque chose d'étrange est arrivé!!!A
Contractuelmsgsender
Aucune valeur,MaisB
Contractuelmsgsender
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é à B
ContractuelContexte
Exé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éB
Variable d'état du contrat,EtA
Contractuelmsgsender
Mais ça n'a pas changé..
SiB
Deux variables d'état du contrat msgsender
Eta
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 surB
Contratscall_a_call
Boutons,Puis cliquez à nouveau surA
Contrats etB
Contractuelmsgsender
Requête par bouton
MaintenantA
Contractuelmsgsender
Ça vaut le coup,B
Contractuelmsgsender
La valeur n'a pas changé.
Quand on appelleB
Contratscall_a_call
La méthode,B
La variable d'état du contrat n'a pas changé ,A
Contractuelmsgsender
Ça vaut le coup,Ça montrecallFunc()
La méthode est deA
ContractuelContexte
Exécuté dans l'environnement ,Ici.Contexte
Il y a eu un changement..
Et nous avons découvertA
Contractuelmsgsender
Est devenuB
Adresse du contrat, Cela signifie qu'au cours de l'appel msg.sender
Et msg.value
Il y a eu un changement.,msg.sender
Ce n'est plus moi 0x5B38Da6a....
Mais...B
Adresse du contrat
Résumé
Je m'occuperai de ce qu'on a écrit Contrat évolutif,Oui.Contrat d'agence
Lorsque l'appel est lancé,Contrat d'agence
AvecContrat logique
L'interaction est utile Appel délégué(DelegateCall)
.Contrat logique
La méthodeContrat d'agence
Exécution contextuelle de , Et modifié Variables d'état
C'est aussiContrat d'agence
De. 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..
边栏推荐
- What are the methods of adding elements to arrays in JS
- RPA advanced (II) uipath application practice
- STM32单片机编程学习
- Functional interfaces and method references
- Map set assignment to database
- 八大排序汇总
- C#基于当前时间,获取唯一识别号(ID)的方法
- Some suggestions for young people who are about to enter the workplace in the graduation season
- tqdm的多行显示与单行显示
- [cloud native] 2.5 kubernetes core practice (Part 2)
猜你喜欢
Wechat applet uses Baidu API to achieve plant recognition
Digital transformation takes the lead to resume production and work, and online and offline full integration rebuilds business logic
C#多维数组的属性获取方法及操作注意
在连接mysql数据库的时候一直报错
webauthn——官方开发文档
How does the whole network display IP ownership?
数字化转型挂帅复产复工,线上线下全融合重建商业逻辑
TIPC messaging3
二.Stm32f407芯片GPIO编程,寄存器操作,库函数操作和位段操作
Jinshanyun - 2023 Summer Internship
随机推荐
CentOS8之mysql基本用法
How does the whole network display IP ownership?
TIPC Cluster5
Jenkins安装
The working day of the month is calculated from the 1st day of each month
The difference between SQL left join main table restrictions written after on and where
Regular and common formulas
Redis exceeds the maximum memory error oom command not allowed when used memory & gt; ' maxmemory'
Jinshanyun - 2023 Summer Internship
TIPC Getting Started6
Verilog 和VHDL有符号数和无符号数相关运算
QT learning diary 7 - qmainwindow
CTF record
Approximate sum count (approximate
念念不忘,必有回响 | 悬镜诚邀您参与OpenSCA用户有奖调研
Tick Data and Resampling
Never forget, there will be echoes | hanging mirror sincerely invites you to participate in the opensca user award research
Digital transformation takes the lead to resume production and work, and online and offline full integration rebuilds business logic
每月1号开始计算当月工作日
Programmer growth Chapter 6: how to choose a company?