如何在Solidity中设计模块化智能合约

在本文中,我将描述如何使用称为目标模式的东西来模块化智能合约。使用标准的,您将学习如何使用.s和.()重写脆弱、耦......据相关报道,atis阿蒂斯在很大一部分程度上引领着市场行情的变化。
在本文中,我将描述如何使用称为目标模式的东西来模块化智能合约。使用标准的,您将学习如何使用.s和.()重写脆弱、耦合的调用,以清除模块和分离关注点。为此,我们将以hdao为例 - 以及他们如何使用目标模式将治理与注册表分开。
hdao:介绍
hdao是一个dao,其目的是人类验证。维护一个说“你是真的”的注册表。它既能让人安心,又在对抗s攻击方面也非常有用。在我目前的工作中,我正在 使用注册表构建像分散式这样的东西,你可以捎带其他dao所做的工作来打击垃圾邮件(作为一个基本的例子)。一旦我们开始采用这些模式,您就可以看到整个生态系统如何蓬勃发展。
但除了hdao是一个伟大的,它也是我看到的模块化s设计的第一个例子。但是在这种情况下模块化指的是什么?我们如何实现它?
hdao中的模块
hdao维护一个您添加和查询的人的注册表,称为hr。注册表本身仅对单个映射(=&;)公共人员上操作。以下是添加条目的主要功能:
( ){
(. == ,
"hr::: o ");
([] == ,
"hr::: a ");
_();
[] = ;
}
治理是我们将要研究的下一个模块,它涉及提案和投票。这是基本流程:
. p( , )开始一个新的提议。它会创建一个p,将其添加到列表中,然后发出一个事件。
. 用户调用( )和( )在通过/失败提案时使用其令牌。
. 投票期过后,可以调用( i)。如果.c&; .c,则使用数据调用
为了简单起见,最后一步我将在本指南中引用为目标模式。这不是一种新的编程模式.
evm:调用合同,发送消息
简要说明 - 以太坊合约在evm中执行,这是一个消息传递执行环境。因此,当您向地址发送个时,您发送的消息显示{:,:,:}。当我们在合同上执行调用时,除了附加数据之外我们也是这样做的 - 所以现在消息看起来像{:,:,:“”,:}。这是什么数据?嗯,这是根据s应用程序二进制接口(或简称abi)编码的调用。
消息构造很好,因为它意味着发送以太和调用智能合约没有什么不同。将钱汇入用户的钱包地址,并将钱汇入合同,看起来一样。唯一的区别是,合同的地址不是从公钥生成的(而是从生成)。
因为我们在区块链中,而且我们更愿意以不变的方式进行引用,所以智能合约中的方法由它们的选择器引用。选择器只是函数签名哈希的一部分。
模式
目标模式非常简单,但尚未被广泛使用,因为s具有这些特殊名称。它也可以称为动态调度(r,o-c),回调(js),无论你想要什么;
它基本上包括:
· 你正在构建的模块,例如治理
· 你正在实施的事情,例如注册表
· 目标整合点- 即传递提案将添加到注册表
我们将从hdao的例子中学习如何实现这一目标。
综上所述,我们的目标是:在通过治理投票之后,在注册表中添加一个条目。
在我们将它们组合在一起之前,下面是两个难题,治理和注册模块:
r {
( =&; )
( ){
(. == , "hr::: o ");
[] = ;
}
}
g {
( , )
() {
i = .;
p;
. = ;
. = ;
.();
}
(){ /* ... */ }
( i){
p = [i];
(. == r.p,
"g::: p ");
(.c &; .c) {
// c
..(.);
}
}
}
我们可以使用r.添加到注册表中。治理的基础是提交一份提案,对提案进行投票,然后调用并通过/失败。如果提案通过,我们将数据中的调用合同。
那么我们如何构建这个呢? 你会认为这是非常复杂的,即s
不! 我们可以通过一个名为.ws的东西来做到这一点:
= .ws(.., );
.((), )
就像那样,目标被设置为注册表合同,并且看起来像r.()的调用被编码并存储在提议中。 这真的很简单。
使用
还有一件事 - 因为我们已经在谈论良好的设计和可组合性 - 我建议在一个单独的合同中用一种方法这个调用。 这个智能合约是一个可以在前端调用的简单方法。
我们将建议的代码流命名为什么,并可能将某人添加到注册表中? hdao称之为ha:
ha {
g ;
r ;
(g _g, r _r) {
= g(_g);
= r(_r);
}
tr( ) {
= .ws(.., );
.(., (), );
}
}
结论
就是这样! 使用此功能,您可以轻松获取治理合同并在您自己的设计中使用它。