当前位置:网站首页>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..
边栏推荐
- ImportError: cannot import name ‘Digraph‘ from ‘graphviz‘
- Wechat applet uses Baidu API to achieve plant recognition
- VS2019代码中包含中文内容导致的编译错误和打印输出乱码问题
- 抖音海外版TikTok:正与拜登政府敲定最终数据安全协议
- 2022 love analysis · panoramic report of digital manufacturers of state-owned enterprises
- MySQL linked list data storage query sorting problem
- 【云原生】2.5 Kubernetes 核心实战(下)
- ASTParser 解析含有emum 枚举方法的类文件的踩坑记
- PKG package manager usage instance in FreeBSD
- SSRF
猜你喜欢

How does the whole network display IP ownership?

Redis exceeds the maximum memory error oom command not allowed when used memory & gt; ' maxmemory'

II Stm32f407 chip GPIO programming, register operation, library function operation and bit segment operation

三.芯片启动和时钟系统

Attribute acquisition method and operation notes of C # multidimensional array

微信小程序利用百度api达成植物识别
![[in simple terms, play with FPGA learning 3 ----- basic grammar]](/img/f0/0204fa5197033877dc0758203253ae.png)
[in simple terms, play with FPGA learning 3 ----- basic grammar]

【IDEA】使用插件一键逆向生成代码

从攻击面视角,看信创零信任方案实践

抖音海外版TikTok:正与拜登政府敲定最终数据安全协议
随机推荐
Is it safe to open a stock account online? I'm a novice, please guide me
Verilog and VHDL signed and unsigned number correlation operations
PKG package manager usage instance in FreeBSD
Introduction to interface debugging tools
Tidb DM alarm DM_ sync_ process_ exists_ with_ Error troubleshooting
STM32 single chip microcomputer programming learning
The first white paper on agile practice in Chinese enterprises was released | complete download is attached
对毕业季即将踏入职场的年轻人的一点建议
Digital transformation takes the lead to resume production and work, and online and offline full integration rebuilds business logic
spritejs
由粒子加速器产生的反中子形成的白洞
Importerror: impossible d'importer le nom « graph» de « graphviz»
ASTParser 解析含有emum 枚举方法的类文件的踩坑记
程序员成长第六篇:如何选择公司?
解决uniapp列表快速滑动页面数据空白问题
Jinshanyun - 2023 Summer Internship
Flick two open, realized a batch lookup join (with source code)
What are the methods of adding elements to arrays in JS
Attribute acquisition method and operation notes of C # multidimensional array
函数式接口和方法引用