嵌套智能合约:在合约中创建合约
核心要点
- 了解 LogRocket 的 Galileo AI 如何为您解决最严重的问题 无需注册 智能合约是存储在区块链上的程序,在预先确定或调用某些条件时运行。
- 智能合约用于实现协议自动化、消除中介机构并创建一个不受外部影响的更加去中心化的网络。
- 在本文中,我们将研究一种称为嵌套合约或带有合约的合约的特定策略。

了解 LogRocket 的 Galileo AI 如何为您解决最严重的问题 无需注册
智能合约是存储在区块链上的程序,在预先确定或调用某些条件时运行。智能合约用于实现协议自动化、消除中介机构并创建一个不受外部影响的更加去中心化的网络。
在本文中,我们将研究一种称为嵌套合约或带有合约的合约的特定策略。具体来说,我们将回顾如何创建多个合约并从父合约中调用函数。我们将演示如何从父合约调用嵌套合约以及如何从外部合约调用它。本文中使用的所有智能合约示例都是用 Solidity 编写的。
让我们深入了解一下。
向前跳转:
先决条件
为了遵循本文的教程部分,您应该具备以下条件:
为什么要在合同中嵌套合同?
将一个智能合约包含在另一个智能合约中可能是有利的,原因有几个:
安全性:嵌套合约有助于隔离漏洞风险;当所有合约变量都包含在一个智能合约中时,就更容易错过可能被不良行为者利用的错误或弱点
分段:多个合约使我们能够将主合约分解为逻辑不太复杂的更小的部分
可重用代码:许多基本合约功能都可以通过 OpenZeppelin 等公司以开源、可重用逻辑的形式轻松获得;利用他们的代码可以显着节省开发时间
智能合约可以相互交互吗?
智能合约能够创建或部署其他合约。他们还可以调用其他智能合约的函数。在本文中,我们将研究调用嵌套智能合约的两个示例:
合约中的合约:当合约嵌套在一个主合约中时,可以从其他合约之一调用它们或它们的函数
从外部合约调用嵌套合约:合约也可以被外部调用;例如,您可以使用构造函数来调用外部合约
演示:从父合约调用嵌套智能合约
对于我们的第一个示例,我们创建一个子合约,然后在父合约中部署它。
创建嵌套合约
首先,我们将打开 Remix 并创建父合约。对于这个例子,我们将签订一份贷款合同;任何人都可以调用此合约并请求贷款。
合同的第一行是我们的许可证。这非常重要,因为不调用它会引发错误:
//SPDX-许可证标识符:MIT pragma Solidity ^0.8.0;
我们使用 Remix 作为编译器,它有不同的版本。验证您正在使用的版本;如果版本与编译器不符,你会得到一个错误。在此示例中,我们使用 Remix 版本 ^0.8.0 及更高版本。 ^ 符号表示“以上”。
如下所示,ParentLoanCompany 合约采用名为 TakeLoan 的函数,该函数采用外部属性。外部模块可用于向 Web3 实例引入自定义或第三方 API。外部模块只是一些类,其方法和属性可以在 Web3 实例中使用。
合约 ParentLoanCompany { function TakeLoan() external { LoanContract 贷款 = new LoanContract (2000); } }
我们使用外部属性来调用我们的子合约。
在此之前,让我们在父合约中创建子合约:
Contract ChildLoanContract { uint 公共金额;构造函数(uint _amount)公共{金额= _amount; } }
我们的ChildLoanContract是用户直接交互的合约,我们将子合约称为父合约。让我们回顾一下子合约的基本细节:
uint公众金额;构造函数(uint _amount)公共{
我们必须让 Solidity 意识到这个合约涉及金钱。为此,我们将其称为 uint (无符号整数),并将其设为 public 。
我们创建一个首先运行的构造函数,一旦调用合约时,我们给出一个参数 _amount ,这意味着调用此函数的人必须指定他们希望借入的金额。
最后,我们调用 amount = _amount;这意味着用户投入的任何金额都将成为公开的贷款金额。
现在,让我们回到 ParentLoanCompany 合约并添加以下代码片段来连接两个合约。
LoanContract 贷款 = new LoanContract (2000);
我们通过调用 LoanContract 来调用 ChildLoanContract 并为其命名为 Loan 。当我们稍后想要呼叫借款人的地址时,这一点非常重要。这相当于 new ,它是创建 LoanContract 类型的新合约的函数。
部署嵌套合约
使用 Remix IDE 部署 ParentLoanCompany 合约后,我们应该在 Contract 面板上看到两个合约。
演示:从外部合约调用嵌套智能合约
现在,我们来看看外部合约如何调用嵌套合约。
