如何在智能合约中调用另一个合约的函数

这篇具有很好参考价值的文章主要介绍了如何在智能合约中调用另一个合约的函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

智能合约是在区块链中被执行的一段程序,因为它们在区块链上执行,所以不依赖于任何的中心化服务器。目前最主流的智能合约编程语言是 Solidity。

在以太坊区块链中,智能合约可以和其他已经部署的智能合约进行交互。除了以太坊,其他 EVM 兼容的区块链(使用以太坊虚拟机执行智能合约的区块链)也都有这个特点。

以下是需要在一个智能合约中调用其他合约的一些场景:

  • 通证的铸造者和发行人,通过一个合约来调用通证的智能合约来发行它。
  • 去中心化交易所(DEX)在进行通证交易的时候,一直都需要和其他智能合约相交互。
  • 当你想通过 Chainlink Data Feed 获得一个通证价格的时候,你的智能合约也需要和资产的 aggregator 相交互,这里的 aggregator 也是一个智能合约。
  • 当你使用 Chainlink VRF 的时候,你的合约需要给 VRF Coordinator 发送一个请求,Coordinator 才可以将随机数发送回你的智能合约。
  • 在通过 Chainlink Keepers 自动化执行智能合约的时候,你需要创建 Keepers Upkeep,而 Upkeep 需要通过一个合约来查看和执行你部署的用户合约。

为什么要在一个合约中调用另外一个合约的函数?

有的时候,一个应用是由多个合约组成的。比如,我曾经创建过一个应用,它是由三个合约组成的并且彼此之间需要交互,但是我没法将它部署在以太坊的主网上,因为它们占的空间太大了,超出了区块限制。我不得不将这个应用重构为 5 个更小的智能合约,这样这个应用才可以被发布。

另一个有趣的应用场景是可升级的合约。区块链是不可更改的,这就意味着在智能合约部署以后,代码就不能被修改了。但是可以通过代理函数来指向其他合约来完成“升级”。

如果你想要改变逻辑,你可以给代理合约提供一个不同的目标合约地址,比如一个更新过的合约。还可以把逻辑和数据分到不同的智能合约中。这样,逻辑合约可以被代理合约升级或者替换,但是所有的数据还是存储在数据合约之中。

这个特性非常有用,因为它允许代码被重复利用,部署的合约可以被当成一个库来使用。因此,它还可以减少部署时的消耗,因为当合约可以被重复使用的时候,每次新的应用需要部署的合约就可能变少。

Solidity 中调用另一个智能合约

让我们使用 Remix 这个在线 IDE 来进行一些尝试。

创建你的第一个智能合约

创建一个文件,用来存储智能合约,你可以将多个智能合约存储在一个文件中!

  • 在 Remix 中,点击左边工具栏的“File Explorers”。
  • 点击“Create a new file”按钮。
  • 给你的文件命名为 Contracts.sol

你将要在这个文件中编写并且部署两个合约。
首先,定义 SPDX license 信息和编译器版本。复制并且粘贴这部分代码:

// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

Counter 合约

第一个合约是“Counter”,合约中只有一个数字自增的函数。
复制并且粘贴这个例子:

contract Counter {
    uint public number;
    function increment() external {
        number += 1;
    }
}

Counter 合约有:

  • 一个公共的变量 number,是一个无符号整型变量,这个变量会做自增。
  • 一个函数 increment 给整型变量增加 1。它是一个 external 函数,所以它可以被其他合约发送的交易调用。

编译 Counter 合约

  1. 在左边工具栏中找到“Solidity compiler”按钮。
  2. 点击“Compile Contracts.sol”按钮
  3. Enable 自动编译(auto-compile)选项
  4. 看下有没有绿色的标志,如果有的话就说明编译成功了

部署 Counter 合约

  1. 在左边的工具栏,点击按钮“Deploy and run transactions”。
  2. 现在,我们只有一个智能合约,所以“Counter”在“Contracts”下拉菜单中会被自动选择。
  3. 点击“Deploy”按钮

在下方找到部署好的合约,然后复制它的地址。就像下面这个地址:

0xd9145CCE52D386f254917e481eB44e9943F39138
你会看到如下图所示:

_exists在智能合约中怎么调用,预言机,Chainlink,区块链
在左边工具栏的下方可以找到部署好的合约

与 Counter 合约交互

打开 Counter 合约然后:

  1. 点击“number”按钮,然后检查它的值是不是 0。
  2. 点击“increment”按钮,发送一个交易来给数字增加 1。
  3. 再次点击“number”按钮,检查现在的值是不是1。

这个是最终结果:
_exists在智能合约中怎么调用,预言机,Chainlink,区块链
counter 合约的最终结果

CounterCaller 合约

现在我们第一个合约 Counter 已经部署了,让我们创建另一个合约来使用 Counter 合约中的 increment 函数。这个机制就像是依赖注入(Dependency Injection),调用者可以通过合约函数的签名和变量来初始化一个合约。

在 Contract.sol 文件的底部复制和粘贴以下的代码:

contract CounterCaller {
    Counter public myCounter;

    constructor(address counterAddress) {
        myCounter = Counter(counterAddress);
    }

    function counterIncrement() external {
        myCounter.increment();
    }
}

CounterCaller 合约有:

  • 一个叫 myCounter 的变量,数据类型就是 Counter。这意味着我们已经将即将调用的合约作为一个数据类型,以便我们可以通过这个变量来获得合约的函数和变量。
  • 构造函数,构造函数只有在部署的过程中才会被调用,它会使用之前部署的 Counter 合约的地址初始化 myCounter。
  • counterIncrement 函数会通过 myCounter 调用 increment 函数,这里的 myCounter 就像是指向 Counter 智能合约的“指针”。

请看完整的 Contracts.sol 文件:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;

contract Counter {
    uint public number;

    function increment() external {
        number += 1;
    }
}

contract CounterCaller {
    Counter public myCounter;

    constructor(address counterAddress) {
        myCounter = Counter(counterAddress);
    }

    function counterIncrement() external {
        myCounter.increment();
    }
}

编译 CounterCaller 合约

  1. 如果你已经 enable 来 auto-compile 选项,它就已经完成了编译。
  2. 查看按钮旁边的绿色按钮,已确定是否已经编译成功。
  3. 或者,根据之前的步骤去编译 Counter 合约。

现在,让我们来部署 CounterCaller 合约。在左边的工具栏中,点击按钮“Deploy and run transactions”。

  1. 在合约的下拉菜单中,选择 CounterCaller。
  2. 在 Deploy 按钮旁边粘贴 Counter 合约的地址。
  3. 点击“Deploy”按钮。

_exists在智能合约中怎么调用,预言机,Chainlink,区块链
部署 ContractCaller 合约。

与 CounterCaller 合约交互

在左边工具栏中找到 CounterCaller 合约,然后展开。

  • 点击“myCounter” 按钮然后查看 Counter 的地址。
  • 点击“counterIncrement”按钮,发送交易来调用 Counter 合约中的 increment 函数。
  • 在 Counter 合约中点击 number 按钮,验证数字是否增加了 1,现在应该已经是 2 了。
    这是最终的结果:

_exists在智能合约中怎么调用,预言机,Chainlink,区块链

  • 与 CounterCaller 合约交互。*

这个基础的例子演示了如何从在一个合约中调用另一个合约。

还有一些别的方式在不同的合约之间互相调用,只要你知道部署好的合约的地址,函数和公共变量,另一个合约就可以调用它。

在你知道了合约中能够调用另一个合约之后,你就可以:

  • 将一个合约分成多个合约
  • 设计复杂的 dApp 的架构
  • 实现代码的复用
  • 创建工厂合约(一个可以创建别的合约的合约)

您可以关注 Chainlink 预言机并且私信加入开发者社区,有大量关于智能合约的学习资料以及关于区块链的话题!文章来源地址https://www.toymoban.com/news/detail-815104.html

到了这里,关于如何在智能合约中调用另一个合约的函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 如果Fabric的智能合约函数陷入死循环会怎么样

    大家好,我是 powervip !今天和大家一起探讨一下:如果Fabric的智能合约函数陷入死循环会怎么样 先看一段合约函数代码: func (t *SimpleChaincode) Test(stub shim.ChaincodeStubInterface, args []string) pb.Response { // 选择商品价格在1元到100元之间的商品名称和数量 s := \\\"{\\\"fields\\\": [\\\"GoodsName\\\",

    2023年04月21日
    浏览(35)
  • 关于web3.js中与交易发送、交易签名、智能合约函数调用相关api的理解

    web3.js中有一些与交易发送、签名、合约函数调用相关的api,初学者(如me)常常搞不清什么情况下应该调用哪个,以及它们之间的区别。现将个人浅见记录如下,备忘。 sendTransaction web3.eth.sendTransaction(transactionObject [, callback]) transactionObject对象设置交易的各种参数(不包括签名r,

    2023年04月09日
    浏览(113)
  • Java Web3J :使用web3j调用自己的智能合约,返回一个内部有数组的对象结构时出现NPE问题

    之前有写过一篇文章Java Web3J :使用web3j调用自己的智能合约的方法(教程),当时只是简单的方法调用,也不涉及到什么复杂的数据类型,入参是long类型,出参是String类型。 遇到这个问题是因为有一个方法,需要通过提案的治理id,查询链上提案数据,这个就需要接收提案

    2024年01月19日
    浏览(51)
  • 智能合约:从 Python 调用智能合约

    以太坊带来了智能合约的进步,其是可公开验证的代码。如果我们改变合约状态,我们将花费一些gas。现在,让我们创建一个Python程序,它可以在以太坊上调用智能合约。因为我们不想实验中支付费用,所以我们将运行Ganache,这是一个本地以太坊实例。 首先,我们去Remix.e

    2024年01月19日
    浏览(50)
  • 如何在 Java 中从另一个构造函数调用一个构造函数?

    是否可以从另一个(在同一个类中,而不是从子类中)调用构造函数?如果是怎么办?调用另一个构造函数的最佳方法是什么(如果有几种方法可以做到)? huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求 对的,这是可能的: 要链接到特定的超类构造函数而不是同一

    2024年02月03日
    浏览(44)
  • Java智能合约工具包|Java调用智能合约|Java调用ERC20、ERC721、ERC1155合约

    Magician-ContractsTools是一个用于调用智能合约的工具包,你可以非常容易地在Java程序中调用智能合约进行查询和写入操作。 有三个内置的标准合约模板,分别是ERC20、ERC721和ERC1155,如果你需要调用这三个合约中的标准函数,可以帮助你非常快速地完成工作。除了内置的合同模板

    2024年02月11日
    浏览(41)
  • ai智能体如何实现函数调用?我的猜测

    ai智能体,又名ai agent,是一种基于ai大模型推理能力,具有外部感知、工具使用、信息反馈的智能系统。 自从2023年3月autoGPT发布以来,已经诞生了许多ai agent框架。他们大多遵循这个基本的结构: 大部分框架基本都提供了让开发者自定义添加行为与函数调用的方法。openai在

    2024年01月21日
    浏览(26)
  • python如何调用另外一个py文件中的函数

    在Python中,可以通过导入模块的方式调用另外一个.py文件中的函数。具体步骤如下: 创建一个.py文件,其中包含需要调用的函数,例如: 在调用该函数的代码文件中,使用 import 导入这个.py文件(注意,要确保两个文件处于同一目录下),例如: 在这个例子中,首先

    2024年02月11日
    浏览(513)
  • 智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击

    Safful发现了一个有趣的错误,有可能成为一些 DeFi 项目的攻击媒介。这个错误尤其与著名的 ERC777 代币标准有关。此外,它不仅仅是众所周知的黑客中常见的简单的重入问题。 这篇文章对 ERC777 进行了全面的解释,涵盖了所有必要的细节。深入研究 ERC777 代币的具体细节的资源

    2024年02月04日
    浏览(29)
  • 四:调用部署在ganache的智能合约

    如果朋友有代码,工具,使用流程等不太清楚的,可用去专栏看看,专栏中有文章中所提及的具体使用方式。不太明白的朋友可以自己去看看~~ 瞬移专栏 实验目的 实验原理 ether.js中提供了我们对智能合约进行调用的方法,使用ether.js能很方便我们和智能合约进行交互。 js代码

    2023年04月09日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包