当前位置: 首页 > news >正文

038.Solidity入门——25调用其他合约的方法

Solidity 提供了几种方式用于调用其他合约:

方法

描述

直接调用

使用 address.call 函数,可以向另一个合约发送消息并返回结果。

低级调用

使用 address.calladdress.callcode 函数,可以执行一个外部合约中的代码。与直接调用不同,低级调用允许合约调用修改其状态

委托调用

使用 address.delegatecall 函数,可以调用另一个合约中的代码,但是在执行代码时将存储器、状态和 msg.value 转发到当前合约中。

示例代码:

pragma solidity ^0.8.7;
contract OtherContract {uint public value;//公共变量 function setValue(uint newValue) public {//用于更改value的值value = newValue;}
}contract CallerContract {uint public value;function callOtherContract(address otherContract) public {// 直接调用(bool success, ) = otherContract.call(abi.encodeWithSignature("setValue(uint256)", 123));require(success, "Call to OtherContract failed");// 低级调用(success, ) = otherContract.call(abi.encodeWithSignature("setValue(uint256)", 456));require(success, "Call to OtherContract failed");// 委托调用(success, ) = otherContract.delegatecall(abi.encodeWithSignature("setValue(uint256)", 789));require(success, "Call to OtherContract failed");}
}

callOtherContract 函数中,我们演示了三种不同的调用方式:

  1. 直接调用:使用 call 函数,将 setValue 函数的签名和参数编码后,作为参数传递给 call 函数。如果调用成功,success 变量将为 true

  1. 低级调用:使用 callcallcode 函数,将 setValue 函数的签名和参数编码后,作为参数传递给 callcallcode 函数。如果调用成功,success 变量将为 true。在这种情况下,我们可以修改被调用合约的状态。

  1. 委托调用:使用 delegatecall 函数,将 setValue 函数的签名和参数编码后,作为参数传递给 delegatecall 函数。如果调用成功,success 变量将为 true。在这种情况下,我们将存储器、状态和 msg.value 转发到当前合约中。

注:使用 委托调用 时,必须确保被调用合约是可信的,并且不会对当前合约的安全性造成威胁。因为被调用合约的代码在当前合约的上下文中执行,被调用合约的代码可以访问和修改当前合约的存储变量和内部函数。如果被调用合约中存在恶意代码,它可能会修改当前合约的存储状态或者执行一些非预期的操作,从而导致安全漏洞

http://www.lryc.cn/news/15252.html

相关文章:

  • Revit项目浏览器的标准设置应用和快速视图样板?
  • 安装MQTT Server遇到报错“cannot verify mosquitto.org‘s certificate”,该如何解决?
  • 程序员如何向架构师转型?看完就明白该怎么做了
  • Flask入门(9):蓝图
  • 跑步戴哪种耳机好,最适合运动跑步的蓝牙耳机
  • 微信小程序实现瀑布流布局
  • 2023最新网络工程师HCIA-Datacom“1000”道题库,光速刷题拿证
  • [蓝桥杯] 递归与递推习题训练
  • 领航智能汽车信息安全新征程 | 云驰未来乔迁新址
  • Kaldi语音识别技术(七) ----- 训练GMM
  • Java 集合基础
  • Day896.MySql的kill命令 -MySQL实战
  • L2-010 排座位
  • C++的完美讲解,还不快来看看?
  • C语言学习_DAY_5_循环结构while和for语句【C语言学习笔记】
  • JavaScript高级程序设计读书分享之4章——4.3垃圾回收
  • Java线程的6 种状态
  • 5年测试在职经验之谈:3年手工测试、2年的自动化测试,从入门到不可自拔...
  • QHash-官翻
  • MYSQL 配置优化
  • 多 态
  • Java集合
  • 高校借力泛微,搭建一体化、流程化的​内控管理平台
  • 使用人工智能赚钱的方式,行业领域有哪些?
  • 【数组中重复的数字】-C语言-题解
  • C++调用Python脚本进行18次循环操作后,脚本不执行
  • 字节10年架构师职业发展经历,助你做好职业规划
  • ArrayList真的是因为实现了RandomAccess接口才能做到快速随机访问的吗
  • OSI七层模型与物理层与设备链路层
  • Java8的Optional类的使用 和 Stream流式操作