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

这篇具有很好参考价值的文章主要介绍了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 转发到当前合约中。

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

到了这里,关于038.Solidity入门——25调用其他合约的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 以太坊智能合约开发:Solidity 语言快速入门

    在本文中,我们从一个简单的智能合约样例出发,通过对智能合约源文件结构的剖析与介绍,使大家对Solidity语言有一个初步的认识。最后,我们将该智能合约样例在 Remix 合约编译器中编译、部署,观察其执行结果。 在开始之前,我们先对Solidity有个初步的了解,即Solidity是

    2023年04月09日
    浏览(39)
  • 【区块链-智能合约工程师】第二篇:Solidity入门

    参考文章:一文速览2022十大智能合约开发工具 资料地址:WTF学院 HelloWorld remix:在线智能合约开发IDE(Integrated Development Environment,集成开发环境),可以在浏览器中快速部署测试智能合约。 合约HelloWorld: 事项 说明 代码所用的软件许可(license) 不写许可的话编译时会警告

    2024年02月09日
    浏览(44)
  • 写给Java程序员的Solidity合约快速入门

    前段时间有个项目要用到智能合约,合约的载体是类以太的某链,采用Solidity作为语言,因为疫情原因拉了公司一个Java来写,于是有了这篇Solidity快速入门。 我首先要说的是Java开发写solidity合约是基本可行的,大体思路和解决方案都类似,甚至我认为比通常的Java开发还要简单

    2023年04月09日
    浏览(28)
  • 调用合约方法创建子合约后获取子合约地址

    在通过调用合约的方法创建合约后,不能直接得到子合约地址。不便于单元测试。如下方法可解决: 合约: 单元测试:

    2024年02月15日
    浏览(26)
  • 仿`gRPC`功能实现像调用本地方法一样调用其他服务器方法

    在介绍 gRPC 简介之前我们先了解一写概念: 单体架构 单体架构简单理解就是所有的业务代码都在一台服务器上,一旦某个服务宕机,会引起整个应用不可用,隔离性差。只能整体应用进行伸缩,例如整体打包部署一台或多台服务器,浪费资源,可伸缩性差。代码耦合在一起

    2024年02月09日
    浏览(32)
  • 区块链入门教程(9)--使用WeBASE-Front部署及调用合约

    FISCO BCOS除了可以使用控制台,还可以使用WeBASE-Front对合约进行可视化开发、编译、部署、调用。 开发一个最基本的HelloWorld智能合约,并编译、部署、调用。 智能合约概念: 智能合约概念于1995年由Nick Szabo首次提出,指以数字形式定义的能自动执行条款的合约,数字形式意味

    2024年02月17日
    浏览(28)
  • 微服务http调用其他服务的方法

    在对应需要调的服务配置文件加上路径 依赖 获取服务器配置文件调用方法路径 调用方法

    2024年01月22日
    浏览(54)
  • Solidity——在合约中创建合约

    在以太坊链上,除了用户可以创建智能合约,智能合约同样也可以创建新的智能合约。两种常见的创建合约的方式: 计算合约地址的预测值: 使用 keccak256 哈希函数计算合约的初始化代码(包括合约的字节码和构造函数的参数)的哈希值。 从创建者地址(通常是工厂合约的

    2024年02月03日
    浏览(35)
  • solidity实现智能合约教程(3)-空投合约

    猛戳订阅学习专栏🍁🍁 👉 solidity系列合约源码+解析 👈 🍁🍁 空投就是一种营销策略,通过空投活动将某种数字货币或代币分发给用户,通常需要用户完成一项简单的任务,如分享新闻、介绍朋友或拥有某种数字货币,目前也被广泛应用于宣传新币种,在数字货币市场中

    2024年02月07日
    浏览(57)
  • 【Solidity】智能合约案例——①食品溯源合约

    目录 一、合约源码分析: 二、合约整体流程:       1.部署合约       2.管理角色       3.食品信息管理       4.食品溯源管理         Producer.sol:生产者角色的管理合约,功能为:添加新的生产者地址、移除生产者地址、判断角色地址是否被授权         Di

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包