DAPP智能合约方案模式系统开发定制(合约调用方案)
智能合约是在区块链中被执行的一段程序,因为它们在区块链上执行,所以不依赖于任何的中心化服务器。目前最主流的智能合约编程语言是 Solidity。智能合约可以和其他已经部署的智能合约进行交互。其他 EVM 兼容的区块链也都有这个特点。
以下是需要在一个智能合约中调用其他合约的一些场景:
- 通证的铸造者和发行人,通过一个合约来调用通证的智能合约来发行它。
- 去中心化交易所(DEX)在进行通证交易的时候,一直都需要和其他智能合约相交互。
- 当你想通过 Chainlink Data Feed 获得一个通证价格的时候,你的智能合约也需要和资产的 aggregator 相交互,这里的 aggregator 也是一个智能合约。
- 当你使用 Chainlink VRF 的时候,你的合约需要给 VRF Coordinator 发送一个请求,Coordinator 才可以将随机数发送回你的智能合约。
- 在通过 Chainlink Keepers 自动化执行智能合约的时候,你需要创建 Keepers Upkeep,而 Upkeep 需要通过一个合约来查看和执行你部署的用户合约。
为什么要在一个合约中调用另外一个合约的函数? 有的时候,一个应用是由多个合约组成的。比如,我曾经创建过一个应用,它是由三个合约组成的并且彼此之间需要交互,但是我没法将它部署在以太坊的主网上,因为它们占的空间太大了,超出了区块限制。我不得不将这个应用重构为 5 个更小的智能合约,这样这个应用才可以被发布。
另一个有趣的应用场景是可升级的合约。区块链是不可更改的,这就意味着在智能合约部署以后,代码就不能被修改了。但是可以通过代理函数来指向其他合约来完成“升级”。
如果你想要改变逻辑,你可以给代理合约提供一个不同的目标合约地址,比如一个更新过的合约。还可以把逻辑和数据分到不同的智能合约中。这样,逻辑合约可以被代理合约升级或者替换,但是所有的数据还是存储在数据合约之中。
这个特性非常有用,因为它允许代码被重复利用,部署的合约可以被当成一个库来使用。因此,它还可以减少部署时的消耗,因为当合约可以被重复使用的时候,每次新的应用需要部署的合约就可能变少。
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();
}
}
这个基础的例子演示了如何从在一个合约中调用另一个合约。
还有一些别的方式在不同的合约之间互相调用,只要你知道部署好的合约的地址,函数和公共变量,另一个合约就可以调用它。
在你知道了合约中能够调用另一个合约之后,你就可以:
- 将一个合约分成多个合约
- 设计复杂的 dApp 的架构
- 实现代码的复用
- 创建工厂合约(一个可以创建别的合约的合约)
相关文章
- 工具推荐|ESMValTool地球系统模式评估工具
- 网页游戏开发入门教程二(游戏模式+系统)[通俗易懂]
- SpringCloud——微服务介绍+系统架构
- 缩短汽车服务行业企业供销链,经销商系统打造企业销售新模式
- BSC链智能合约质押挖矿模式系统开发
- TMOS系统之VLANs
- DAPP众筹商城开发(源码)丨DAPP众筹商城系统开发方案及逻辑丨DAPP众筹商城系统源码模式
- 简述消息队列在电商系统使用场景以及工作模式
- 关于usdt质押模式系统开发讲解/质押DAPP系统开发合约方案
- 服务利用Linux系统搭建FTP服务器(linux创建FTP)
- Linux系统:成功脱离故障困境(linux系统救援模式)
- Linux系统如何进入修复模式(linux进入修复模式)
- 模式Linux系统极速进入单用户模式(linux系统进入单用户)
- Mysql版本升级:从低到高改善系统性能(mysql版本过低)
- Linux系统下监听模式实现原理分析(linux监听模式)
- 切换Linux系统模式,实现多样化操作(linux切换模式)
- 关闭Linux系统防火墙:安全护航(关闭linux的防火墙)
- 模式MySQL 休眠模式:提升系统性能的好方法。(mysql休眠)
- 如何在AHCI模式下安装Linux系统:详细步骤指南(ahci安装linux)
- 深入了解 Redis 哨兵模式原理,提高系统可用性(redis哨兵模式原理)
- 哪个文件系统最适合你的Linux系统
- 探秘Apache在Linux系统中的应用与优势(apachelinux)
- Linux授权用户组:为你的系统更安全开启新的模式(linux授权用户组)
- 理解计算机字节序:解析Linux系统的大端模式(linux是大端)