以太坊中智能合约的编排模式

2020-09-07 09:21 栏目:经验之谈 来源:网络整理 查看()

除了最简单的以太网应用程序,所有其他应用程序都由几个智能契约组成。这是因为任何已部署的智能合同都有24KB的硬限制,而且随着智能合同的复杂性增加,您的担忧也会增加。

您可以将代码分解成可管理的智能契约,您肯定会发现一个智能契约具有只能由另一个智能契约调用的功能。

例如,在Uniswap v2中,只有智能契约因子应该初始化Uniswap对。

以太坊中智能合约的编排模式

Uniswap团队用一个简单的检查解决了他们的问题,但是无论我在哪里,我都能找到更多从头开始为每个项目编写编排解决方案的例子。

在理解这个问题和开发模式的过程中,我们更好地理解了如何从多个智能契约构建应用程序,这使得产量更加健壮和安全。

在本文中,我将通过著名项目的实例来深入研究智能合同编排。当你读完它的时候,你将能够看到你自己项目的布局需求,并决定哪种现有的方法适合你。

我创建了这个示例存储库,让您在准备好之后继续。

让我们准备开始行动。

背景

我已经指出,你需要把你的项目分解成一系列聪明的合同,因为有两个限制,一个是技术限制,另一个是精神限制。

2016年11月实施了技术限制。当时,以太网主网(包括EIP-170)实现了乱真龙硬叉。此更改将部署的智能合同的大小限制在最大24576字节。

没有这种限制,攻击者可以部署智能合同,这可以在部署期间进行无限制的计算。它不会影响存储在区块链的任何数据,但它可以用作对以太网节点的拒绝服务攻击。

当时,天然气限制不允许使用这种规模的智能合同,因此这种变化被认为是非破坏性的:

解决方案是为可在区块链保存的对象大小设置一个硬上限,并通过将上限设置为比当前气体限制略高的可行值来不间断地运行。如果智能合同可以创建23,200字节的470万种气体,并且通常创建的智能合同可以达到18 kb

那是在DeFi爆炸之前。对于产量,我们编写了2000行智能合同代码,部署后的总数将接近100千字节。我们的审计师甚至不认为我们的项目很复杂。

然而,我们仍然必须把这个项目分解成几个聪明的合同。

复杂性和面向对象编程

将区块链应用程序分解成多个智能合同的第二个原因与技术限制无关,但与人为限制无关。

在给定的时间里,我们只能在大脑中储存这么多信息。如果我们能够处理以有限的方式相互作用的小问题,我们的表现将会比处理所有事情都可以在一个大问题中相互作用的问题要好。

可以说,面向对象编程使软件实现了更高的复杂度。通过定义代表某个概念的“对象”,并将变量和函数定义为对象的属性,开发人员可以更好地从心理上解决他们的问题。

稳固性使用面向对象的编程,但是在智能契约级别。您可以将智能契约视为带有变量和函数的对象。复杂的区块链应用程序在你的脑海中更容易被描绘成一组智能合同,每一个都代表一个实体。

例如,在MakerDAO中,每个密码货币都有一个单独的智能契约,另一个用于记录债务的智能契约,以及一个代表债务池和外部世界之间的网关的单独的智能契约。试图在一个智能契约中编写所有代码可能是不可能的。如果可以,那也很难。

将大问题分解成相互作用有限的小问题真的很有帮助。

部署

在下一节中,我们将研究Uniswap、MakerDAO和Yield的业务流程实现。这会很有趣的。

简单的一个——统一的和可拥有的

我喜欢Uniswap v2,因为它太简单了。他们成功地在410行智能合同代码中建立了一个非常成功的分散交换。他们只有两种部署的智能合同:一个工厂和无限数量的交易对合同。

由于工厂合同的设计方法,通过新事务部署合同需要两个步骤。首先,部署智能契约,然后用两个要交易的令牌初始化它。

以太坊中智能合约的编排模式

我不知道他们如何保护自己免受攻击,但他们需要确保只有创建匹配事务契约的工厂才能初始化契约。为了解决这个问题,他们重新实现了可拥有模式。

以太坊中智能合约的编排模式

如果你的情况和他们的一样简单,你就会成功。如果您知道您的智能合同只需要授予对另一个智能合同的特权访问权,那么您可以使用Ownable.sol您甚至不需要使用像Uniswap这样的工厂。您可以让用户部署两个智能合同(boss和Minion,从Ownable.sol继承而来),然后执行minion.transferownership(地址(Boss))。

最完整的例子——产量

关于产量,我们没有试图写一个像Uniswap v2那样简单的解决方案。我们的核心是五个智能合同,特权访问关系不是一对一的。一些智能合同功能有限,我们需要将这些功能提供给核心组中的多个智能合同。

因此,我们简单地将Ownable.sol扩展为两个访问层,其中一个具有多个成员:

以太坊中智能合约的编排模式

智能合同所有者可以向特权列表(业务流程)添加任何地址。继承契约只能包含限制对注册地址的访问的协调修饰符。

作为额外的安全检查,每个地址都用特征签名注册,因此减少了对协调契约中的单个特征的访问范围。有关此内容的更多信息,请查看示例存储库。

没有可以撤销访问权限的函数,因为我们将在部署期间安排智能合同,然后所有者将通过调用所有智能合同上的转移所有权(地址(0))来放弃对自己的特权访问。

我们自己的平台令牌yDai将从Orched继承,并在部署期间将mint限制为特定的智能合同集:

以太坊中智能合约的编排模式

这种模式相对容易实现和调试,并且允许我们实现只能由我们控制的契约使用的功能。

MakerDAO

MakerDAO因使用荒谬的术语而臭名昭著,这使得它非常难以理解。直到我分解了产量问题,我才意识到他们使用了几乎相同的实现。

以太坊中智能合约的编排模式

1.smart contract deployer是wards的原始成员。

2.被监护人可以依靠其他人(usr ),这样他们也可以成为被监护人。

3.函数可以被限制(授权),这样只有被监护人才能执行它们。

例如,MakerDAO的Vat.sol合同中的折叠函数用于更新利率累加器,并且只能由其集合中的另一个合同调用(Jug.sol合同,滴水函数)。如果您查看该函数,您将看到auth修饰符,它们用于业务流程:

以太坊中智能合约的编排模式

在某种程度上,auth和其他业务流程实现是私有和内部功能概念的扩展,仅用于智能合同之间的访问控制。

MakerDAO的实现与我们自己的实现非常相似。

1.smart contract deployer是wards的原始成员。在回报率方面,它将是所有者。

2.被监护人可以依靠其他人(usr ),这样他们也可以成为被监护人。在“让与”中,只有所有者可以将其他地址指定为特权。

3.函数可以被限制(授权),这样只有被监护人才能执行它们。在返回速率中,我们说标记的函数只能通过only编排的地址来调用。我们进一步限制对单个功能的访问。

除了我们在产量中使用两个访问层(所有者和授权)和单一功能限制,实现是相同的。智能契约编排是一种通用模式,它可以实现一次,也可以频繁重用。

为了让审计员和用户满意,我们还开发了一个脚本,可以跟踪区块链事件,描述我们智能合同的所有权和业务流程。该脚本可以从我们的网站在线获得,它证明除了在部署期间设置的智能合同之外,没有人拥有或拥有访问它们的权限。

毕竟,这是智能合同编排的重点。

结论

在大多数项目中,智能合同的安排是一个反复出现的问题,大多数项目都是从零开始实施的。通常,实现的解决方案几乎彼此相同。

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发