solidity 之 call与delegatecall区别

Solidity之DelegateCall委托调用详解 前言 在编写以太坊智能合约代码时,有些情况下(功能的解耦,分区明确)我们需要与其他合约进行交互。如果只是为了代码复用,可把公共代码单独抽离出来,部署到一个library中(类似util工具包),后面就可以直接引入使用了。但是library中不允许定义任何storage类型的变量,这就意味着library不能修改合约的状态。如果需要修改合约状态变量,我们就需要另外部署一个新合约,具体怎么操作呢? 贴个官方文档说明: There exists a special variant of a message 阅读详情

今天我们谈一谈solidity 中call与delegatecall区别。这两个方法都是进行合约之间的调用。call是自己本身不发生改变,被调用的值发生改变,delegatecall是自己本身的值发生改变,被调用的不发生改变。

可能这样说大家大家理解不够直观,接下来我们创建2个合约代码,进行演示调用。直接上示例代码:

pragma solidity ^0.4.1;
//首先定义了两个合约
contract A{
uint public p;
event e(address add,uint p);//为了观察声明一个事件
//定义了一个方法
function fun(uint u1,uint u2) {
p=u1+u2;//改变了A合约中的p,改变被调用者合约方法中的变量
e(msg.sender,p);//下面的2,3传给了fun方法

}

}
pragma solidity ^0.4.1;



contract B{

uint public qq;
bool public b;

//当我们用B中的call方法的时候,调用A中的某个方法的执行,只会改变A中某个方法的值,B中的某个方法的值不会发生改变,被调用的合约本身发生改变

function call1(address add) returns(bool){
b=add.call(bytes4(keccak256("fun(uint256,uint256)")),30,3);
return b;//下面的add调用call方法
}

//下面的delegatecall是会改变B中的某个方法,而A中的某个方法是不会有任何的改变,下面是自己的合约发生变化
function call2(address add) returns(bool){
b=add.delegatecall(bytes4(keccak256("fun(uint256,uint256)")),10,3);
return b;
}
}

接下来分别把代码复制remix进行编译->部署
智能合约1部署后如下界面:
在这里插入图片描述
智能合约2如下:
在这里插入图片描述

call1方法填入智能合约1的部署后的地址,点击运行后结果会在部署合约1中显示,而call2中的结果在本合约下显示结果。

完整示例代码:

pragma solidity ^0.4.0;

//定义一个合约
contract CA{
uint public p;
bytes public failmsg;
string public str;
event e(address add,uint p)
event e1(address add, bytes b);

//定义一个构造函数,构造方法 
function CA(string _str) {
str=_str;//str重新被赋值
}
function fun(uint u1,uint u2) {
p=u1+u2;
e(msg.sender,p)
}
//构造一个匿名函数
function () {//下面就会执行这个匿名函数
failmsg=msg.data;
e1(msg.sender,failmsg)//
}
}

contract CB{
uint public q;
bool public b;
function call1(address add) returns(bool){
b=add.call(bytes4(keccak256("fun(uint256,uint256)")),2,3);
return b
}
function call2(address add) returns(bool){
b=add.delegatecall(bytes4(keccak256("fun(uint256,uint256)")),2,3);
return b
}

 

//使用的是call方法,上面发生的值发生改变,下面不发生改变
function call3(address add) returns(bool){
b=false
b=add.call("aaaa",2,4,5,54,3);
return b
}


//下面是本身自己的值发生改变,b的值发生改变
function call4(address add) returns(bool){
b=false;
b=add.delegatecall("bbbb",5,"10x2323",43);//执行匿名函数
return b
}
}

还有什么不懂的 大家可以评论,自己实践一下。

Solidity—— call、staticcall和delegatecall用法介绍 在一个智能合约中调用另外一个外部智能合约的函数,我们可以通过接口interface的方式进行调用。另外,还有一种比较底层的调用方法,就是使用call、staticcall和delegatecall函数。它们是一种低级、底层的调用方式,具有更大的灵活性。我们将分别进行讲解。 阅读详情

相关推荐

图文并茂详细介绍Solidity的三种合约间的调用方式 call、delegatecall 和 callcode

最近开始学习以太坊智能合约编程,其中涉及到智能合约之间的函数调用。 Solidity的三种合约间的调用方式有call、delegatecall 和 callcode这3种方式。参考了下面的文章: https://www.cnblogs.com/x-poior/p/10511552.html 对于文章中提到的三种调用方式的异同点 call: 最常用的调用方式,调用后内置变量 msg 的值会修改为...

powervip的博客 5362

Solidity极简入门#23.代理合约Delegatecall

与上面的callSetVars函数相同,有两个参数_addr和_num,分别对应合约C的地址和setVars的参数。而当用户A通过合约B来delegatecall合约C的时候,执行的是合约C的函数,但是语境仍是合约B的:msg.sender是A的地址,并且如果函数改变一些状态变量,产生的效果会作用于合约B的变量上。执行的是VC的函数,但是改变的是富商的状态。当用户A通过合约B来call合约C的时候,执行的是合约C的函数,语境(Context,可以理解为包含变量和状态的环境)也是合约C的:​。

sleep的博客 1186

solidity call()与delegatecall()的理解和区别

如何理解 智能合约的call()与delegatecall()

m0_37298500的博客 494

23. solidity 用 delegatecall 调用其他合约

这里介绍solidity中的另一个低级函数。与call类似,它也可以用来调用其他合约。不同点在于运行的语境,B call C,语境为C;而,语境为B。目前最大的应用是代理合约和(钻石)。与call类似,是solidity中 address 地址类型的低级成员函数。delegate中是委托/代表的意思,那么委托了什么?当用户A通过合约B来call合约C的时候,执行的是合约C的函数,语境Context,可以理解为包含变量和状态的环境)也是合约Cmsg.sender是B。

一个字,学 809

solidity的call跟delegatecall

call 原型 <address>.call(...) returns (bool) 简介 调用后内置变量 msg .sender的值会修改为调用者合约地址,涉及存储修改,修改的是被调用者合约的内存(<address>的)。默认情况下将所有可用的gas传输过去,gas传输量可调。执行失败时返回false。 如果调用的函数不存在,则调用fallback函数; 实例 //c...

xiaohei5194的博客 2733

Call,CallCode,DelegateCall,StaticCall,你分得清吗?

孔乙己懂“回”字的四种写法,你会智能合约的四种调用方式吗? 在中大型的项目中,我们不可能在一个智能合约中实现所有的功能,而且这样也不利于分工合作。一般情况下,我们会把代码按功能划分到不同的库或者合约中,然后提供接口互相调用。 在Solidity中,如果只是为了代码复用,我们会把公共代码抽出来,部署到一个library中,后面就可以像调用C库、Java库一样使用了。但是library中不允许定义任何...

飞久 9770

分析solidity中delegatecall和call区别

在之前的文章中,已经详细介绍了和的用法, 原文: EIP1967-实现可升级智能合约 调用合约的函数,合约内会以的方式调用, 更确切地说是将的函数代码加载到的运行环境,因此,就很容易理解修改的是中的数据,而不是中的数据了。

yqq1997的博客 385

使用solidity与web3创作一个在线小游戏之一:(proxy合约,call, delegatecall与callcode)

在我们的上个系列文章跟我一起阅读并修复某知名DEX交易所源码的最后,我们提到了proxy合约与admin合约,在这个新系列中,我将和大家一起使用solidity完成一个小游戏,并使用web3做一个客户的游戏客户端,并与之完成交互。现在让我们开始吧! 首先我们考虑到,一个游戏具有相当复杂的逻辑,而如果使用solidity编写,一旦合约部署到链上,那将无法更改,此时如果游戏要更新怎么办?那有没有什么办法可以让我们的合约可以更新呢?这样不就可以解决这个问题了吗?答案是有的,就是使用PROXCY合约。下面让我们看

lixiaodog的博客 7103

Solidity--call、delegatecall 和 callcode 的区别

call 函数都可以实现跨合约的函数调用功能,其中包括 call、delegatecall 和 callcode 三种方式

知识的共享,拓宽视野,深化思考,获得新的启发. 1462

两张 300I Duo 部署 Qwen3.5‑32B

开发者成功使用两张华为300IDuo(共4颗Ascend310P3芯片)部署Qwen3/Qwen3.5的30B/32B模型,并公开详细步骤。关键点包括:硬件需两张300IDuo(每芯片44GB显存),软件需CANN≥24.1和MindIE2.3.0专用镜像。部署流程涵盖驱动安装、模型下载(需修改为FP16格式)、容器启动、张量并行配置(TP=4)等环节。实测显示每芯片显存占用20-35GB,系统稳定运行。该方案已在知乎等平台验证可行,适用于Qwen3.5-32B等同类模型。

evering的博客 2248

Linux PE vs WinPE:为何麒麟系统修复需要专属工具?

本文探讨了Linux PE与WinPE在修复国产麒麟系统时的关键差异,强调了专属工具的必要性。通过分析文件系统兼容性、引导修复、硬件适配和安全合规等方面,揭示了通用PE工具的局限性,并提供了构建专属修复工具链的实用方案,确保系统维护的高效与安全。

weixin_29290863的博客 1055

深入解析:Solidity中call与delegatecall的核心区别——谁在修改谁的存储?

Solidity中call与delegatecall的核心区别 call()执行目标合约代码并修改其存储,address(this)指向目标合约,msg.sender为调用者合约。 delegatecall()执行目标合约代码但修改调用者存储,address(this)保持调用者地址,msg.sender为原始用户地址。 关键差异在于执行上下文:call切换至目标合约上下文,delegatecall保持调用者上下文。代理合约模式依赖delegatecall实现可升级逻辑,但需注意安全风险,如恶意合约可能通过

友莘居士的博客 443

智驾系统分层架构:从传感器到执行器的全链路解析

本文深入解析了智能驾驶系统的分层架构,从传感器数据采集融合、应用层决策到车辆管理层执行,完整呈现了从感知到控制的全链路工作流程。文章重点阐述了架构设计的核心优势在于接口标准化与模块解耦,以ACC和LKA协同场景为例,说明了各层级如何通过清晰分工与高效协作,实现复杂系统的可靠、灵活与易于升级。

weixin_29219189的博客 399

solidity中的transfer、send、call(delegatecall)的区别和用法总结

务必注意:solidity0.5.0以上的版本发生了很大的变化,具体的规则以官方最新版为准!!! transfer、send、call都是可以合约之间相互转账的方法,但是用法有很大的不同! //如果异常会转账失败,抛出异常(等价于requi(send()))(合约地址转账) // 有gas限制,最大2300 <addresspayable>.transfer(uint25...

weixin_43343144的博客 1万+

数学建模学习(75):全局敏感性分析Morris 方法

敏感性分析 (SA) 是分析不同应用条件下模型行为的基本实践。提出了许多 SA 技术,从简单的筛选方法到计算成本高昂的基于方差的方法。本篇内容我们通过将 Morris 方法来对模型进行分析。

全栈川川 1万+

使用 Azure DevSecOps 和 AIOps 构建可扩展且安全的多区域金融科技 SaaS 平台

这家虚构的金融科技 SaaS 组织在 Microsoft Azure 上构建了一个现代化的多区域架构,以实现高可用性、主动安全性和简化的 DevSecOps 工作流。如果您是 DevOps 从业者、SRE 专业人士或致力于创建弹性、可扩展且安全的金融科技解决方案的技术领导者,您将从中获得可直接应用于您自身项目的见解和经验教训。与大多数快速扩张的金融科技公司一样,他们需要确保不间断的正常运行时间、坚不可摧的安全性以及快速的功能交付,以满足全球用户群的需求。即使是短暂的中断也会损害用户的信心和忠诚度。

介绍AWS Azure GCP devops Terraform 等技术 1298

Solidity的三种合约间的调用方式 call、delegatecall 和 callcode

最近开始学习以太坊智能合约编程,其中涉及到智能合约之间的函数调用。 Solidity的三种合约间的调用方式有call、delegatecall 和 callcode这3种方式。参考了下面的文章: https://www.cnblogs.com/x-poior/p/10511552.html 对于文章中提到的三种调用方式的异同点 call: 最常用的调用方式,调用后内置变量 msg 的值会修改为调用者,执行环境为被调用者的运行环境(合约的 storage)。 delegatecall: 调用后内置变量 ms

q_776355102的博客 2099

DTI-ALPS处理笔记

前段时间刚好学习了一下DTI-ALPS处理(diffusion tensor image analysis along the perivascular space ),记录一下,以便后续学习。ALPS是2017年发表在《Japanese Journal of Radiology》的一篇文章首次提出的 (),主要用于无创评估脑内淋巴系统功能的衡量数值。C图和D图中的蓝色部分是投射纤维,绿色部分是联合纤维,红色部分是皮下纤维。

weixin_52073820的博客 4788

Solidity 小白教程:23. Delegatecall

这一讲我们介绍了solidity中的另一个低级函数。与call类似,它可以用来调用其他合约;不同点在于运行的语境,B call C,语境为C;而,语境为B。目前最大的应用是代理合约和(钻石)。

区块链、智能合约工具箱 545

基于STM32设计的计算器(实现基本运算)

当前文章介绍的是STM32+LCD触摸屏设计的一个触摸计算器功能,实现基本的加减乘除,二进制转换显示等功能。LCD屏使用的是3.5寸带触摸屏的显示屏,方便操作屏幕,MCU采用STM32F103ZET6。

8815

城市仿真软件:AnyLogic_(8).行人与人群动态仿真

定义行人个体的行为和属性,如行走速度、目标位置等。// 创建一个行人// 设置行走速度为1.5 m/s// 设置目标位置为入口// 创建另一个行人// 设置行走速度为1.2 m/s// 设置目标位置为出口// 创建行人// 创建乘客行人与人群动态仿真在城市规划、交通管理和紧急疏散等领域具有广泛的应用。通过AnyLogic提供的行人模型模块,可以有效地模拟行人的个体行为、群体动态和与环境的交互。

kkchenjj的博客 1246

web3区块链-小镇店铺的 “借力办事”:call 与 delegatecall 的区别与联系

摘要:本文通过水果店Alice和管理咨询店Bob的类比,解释Solidity中call和delegatecall的区别。两者都用于合约间调用,但关键差异在于操作谁的存储:call执行被调用合约的代码并修改其存储,而delegatecall执行被调用合约的代码但修改调用合约的存储。call适用于修改对方状态(如调用USDT转账),delegatecall适用于复用逻辑并修改自身状态(如代理合约升级)。存储结构必须对齐是delegatecall的特殊要求。

想~ai抽 1130

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

solidity encode encodePacked encodeWithSignature delegatecall

文章目录bit bytes 0x uint1. encode 标准的对参数abi编码2. encodePacked3. decode对编码后的数据解码4. encodeWithSelector 对方法编码5. encodeWithSignature 相当于上面的简写6. Storage Proxy中的属性要和impl的一致7. delegatecall 调用编码后的方法 修改proxy中的值8. call 调用编码后的方法 修改impl中的值如果想一起学习进步 QQ群766903559 bit byt

yujunlong3919的专栏 1111

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Solidity(address的四个方法)

address的四个方法send,call,callcode,delegatecall 例子:发送以太币的send方法//下面是send方法,涉及到以太币的情况可能用到payable,senddemo方法是可以发送以太币过去的,add.transfer(u) pragma solidity ^0.4.1; contract addressDemo{ function addr...

weixin_30695195的博客 1028

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Solidity极简入门|第二十三讲Delegatecall

delegatecalldelegatecall 与 call 类似,是 solidity 中地址类型的低级成员函数。delegate 中是委托/代表的意思,那么 delegatecall 委托了什么?当用户 A 通过合约 B 来 call 合约 C 的时候,执行的是合约 C 的函数,语境 (Context,可以理解为包含变量和状态的环境) 也是合约 C 的:msg.sender 是 B 的地址,...

weixin_31351409的博客 332

solidity 学习笔记(6)call 函数

call() 方法 call()是一个底层的接口,用来向一个合约发送消息,也就是说如果你想实现自己的消息传递,可以使用这个函数。函数支持传入任意类型的任意参数,并将参数打包成32字节,相互拼接后向合约发送这段数据。 简单说 根据地址调用指定合约的方法。 pragma solidity ^0.4.24; contract cat{ function...

weixin_30412013的博客 438
上一篇: 区块链之超级账本Fabric 基于SDK应用开发
下一篇: solidity最全开发详细语法解释以及示例说明
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值