Tightly- 和 Loosely-Coupled Pallets

check-membership crate包含了两个pallet去用稍微不同的方式去解决同一个问题。两个pallet都实现了一个单独的只能由访问控制列表(以下简称为ACL)里的caller成员执行的可调度函数。维护ACL的工作被抽象包装为另一个pallet,这个pallet和membership-managing pallet可以以两种方式来耦合,下面我们用tight和loose这两个变体pallet来演示这两种耦合方式。

孪生Pallets

在观察pallet代码之前,我们先来讲讲在pallets/check-membership目录下crate中的结构。这个目录文件夹是用来独立存放两个pallet的crate。这两个pallet被分别存放在pallets/check-membership/tightpallets/check-membership/loose目录下。在这个crate的主要文件lib.rs,我们简单地引入了各个变体pallet。

pub mod loose;
pub mod tight;

这一步骤让我们能够演示这两种耦合技术,同时把相关联的工程放在同一个crate。

控制访问

虽然使用这些孪生pallet主要目的是用来学习它们如何在membership-managing pallets中耦合,但是它们也体现了一个ACL的概念,这是我们先要关注学习的。

我们经常把一些函数指定为已授权的(permissioned),因此,这些函数只能被一个已被定义授权的用户组执行。在这个pallet,我们检查函数的caller是否符合已授权集合的成员。

loosely变体看上去像是这样:

/// Checks whether the caller is a member of the set of Account Ids provided by the
/// MembershipSource type. Emits an event if they are, and errors if not.
/// 翻译:检查这个caller是不是通过MembershipSource type所提供的账户身份集合的其中一个成员。如果是的话发送事件,否则就报错。
fn check_membership(origin) -> DispatchResult {let caller = ensure_signed(origin)?;// Get the members from the vec-set pallet// 翻译:从vec-set pallet中得到成员组let members = T::MembershipSource::accounts();// Check whether the caller is a member// 翻译:检查caller是不是一个成员ensure!(members.contains(&caller), Error::<T>::NotAMember);// If the previous call didn't error, then the caller is a member, so emit the event// 翻译:如果先前的呼叫(call)没有发生错误,那么这个caller是个成员,因此发送事件Self::deposit_event(RawEvent::IsAMember(caller));Ok(())
}

耦合Pallets

事实上,每个check-membership pallet都包含了非常少的逻辑,它并不存储自己的数据,而由一个单独的外在(extrinsic)来检查会员数据。所有繁重的工作都被抽象包装为pallet。存在着两种不同的让一个pallet与另一个pallet耦合的方式,下面的部分将会研究这两种方式。

紧耦合(Tight Coupling)

紧耦合比松耦合更容易。当你为了把一些其他pallet作为依赖来进行紧耦合而去写pallet的时候,你明确指定你所要依赖的pallet的名字来作为你正在编写的pallet的配置trait所绑定的trait。现在将展示在紧耦合下的变体check-membership

pub trait Config: frame_system::Config + vec_set::Trait {// --snip--
}

这个pallet以及所有的pallet都与frame_system紧耦合

提供这个trait绑定意味着check-membership的紧耦合只可以安装在runtime中,而runtime中也安装着vec-set pallet。我们也可以在pallet的Cargo.toml文件中发现紧耦合,其中指定了vec-sec的名称。

vec-set = { path = '../vec-set', default-features = false }

为了真正得到集合下的成员,我们需要定义getter函数这样一种途径。

// Get the members from the vec-set pallet
// 翻译:从vec-set pallet中得到成员组
let members = vec_set::Module::<T>::members();

虽然紧耦合pallets在概念上很简单,但是它存在着缺点,即它由一个特定的实现而不是一个抽象接口来决定。这使得随着时间的推移,代码变得更难以维护,这是我们所不能接受的。check-membership的紧耦合版本完全由vec-set pallet来决定而不是由例如管理一系列账户等行为来决定。

松耦合(Loose Coupling)

松耦合解决了耦合特定实现的问题。当向其他pallet松耦合时,你需要在pallet的配置trait增加一个关联类型,并且确保你所提供的类型通过指定了一个trait绑定而实现了必要的行为。

pub trait Config: frame_system::Config {// --snip--/// A type that will supply a set of members to check access control against/// 翻译:一个能够提供一组成员来再次检查访问控制的类型type MembershipSource: AccountSet<AccountId = Self::AccountId>;
}

整个生态中的许多pallet都通过Currency trait而耦合在一起

拥有了这个关联类型意味着变体check-membership pallet的松耦合可以安装在任何runtime,这个变体可以提供一组账户去当作ACL来使用。AccountSet trait的代码存放在traits/account-set/src/lib.rs目录下,而且非常短。

pub trait AccountSet {type AccountId;fn accounts() -> BTreeSet<Self::AccountId>;
}

我们也可以看到松耦合在pallet的Cargo.toml文件下,其中还列出了account-set

account-set = { path = '../../traits/account-set', default-features = false }

为了真正得到一组成员,我们需要调用trait提供的accounts方法。

// Get the members from the vec-set pallet
// 翻译:从vec-set pallet中得到成员组
let members = T::MembershipSource::accounts();

[Substrate Recipes翻译]1.21 Tightly- and Loosely-Coupled Pallets相关推荐

  1. Building Loosely Coupled and Scalable RESTful Services using Orleans

    These days, I'm working on Orleans and Actor-based systems as I mentioned in my post titled "Ov ...

  2. Spring loosely coupled example

    其实Spring的反转控制,只是将依赖放到了配置文件中取管理,修改完配置文件后,还是要refresh整个context, 来使得对应的依赖生效. http://www.mkyong.com/sprin ...

  3. Prism : Communicating Between Loosely Coupled Components

    注意:这一系列随笔都基于这个假设 -------- Prsim 提供了4中方式:Commanding,Event Aggregation,Region Context,Shared Services ...

  4. Loosely Coupled: The Missing Pieces of Web Services

    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版.作者信息和本声明.否则将追究法律责任. http://blog.csdn.net/topmvp - topmvp Buildin ...

  5. 松散架构(Loosely Coupled Architecture)

    接触了一些采用Linux/Unix工具的架构的应用以后,我发现我越来越喜欢松散的架构.即除了接口(UI),然后是算法,最后是面向领域的工具或DSL.而Microsoft的架构大都反其道而行之,原因是: ...

  6. 翻译Prism4碰到生单词

    (1)potentially [pə'tenʃəli]  潜在地(adv) Applications based on the Prism Library are composite applicat ...

  7. 有道翻译蛋的进阶:丁磊为其加冕称“王”

    作者 | Just 从一代的"翻译蛋",然后改名为"有道翻译王",丁磊亲自为其"加冕". 由"蛋"成"王&qu ...

  8. substrate介绍

    Blockchain Development for Innovators 官网 https://substrate.dev/ 的介绍: Substrate is a modular framewor ...

  9. Building Maintainable Software-java篇之Couple Architecture Components Loosely

    Building Maintainable Software-java篇之Couple Architecture Components Loosely There are two ways of co ...

最新文章

  1. 【组合数学】组合存在性定理 ( 三个组合存在性定理 | 有限偏序集分解定理 | Ramsey 定理 | 相异代表系存在定理 | Ramsey 定理内容概要 )
  2. Hightchart y轴不允许显示小数
  3. 南理工计算机技术专业学位,南京理工大学计算机技术(专业学位)考研难吗
  4. Android P(3)---Android P 功能和 API
  5. 有哪些网站社区可以看原创平面设计大师作品?
  6. 【渝粤教育】电大中专电子线路作业 题库
  7. 外卖点餐系统源码|餐饮点餐源码开发
  8. 激活工具也带毒,一批携带病毒的“小马激活工具”被火绒拦截
  9. 大华C/C++面试题目解析
  10. 蓝牙音箱项目:记录CSR8635芯片的蓝牙音箱的开发过程
  11. 计算机视觉—车道线检测
  12. html实现自动图片轮播,图片轮播的实现(html__js)
  13. netstat -ano 查看端口是否被占用
  14. 解决JupyterLab或者Jupyter Notebook无法跳转到浏览器的问题
  15. windows使用命令执行exe文件
  16. 现代计算机理论模型与工作原理
  17. oppok5和荣耀play4tpro哪个好
  18. 摩托入门第一课[老猫]
  19. Leetcode 789.逃脱阻碍者
  20. VMware安装群晖

热门文章

  1. win10怎么连接android手机,如何将手机与Win10电脑关联以在电脑上继续任务?
  2. 今天第一次电面,国信证券金融工程
  3. 疯子网页采集器教程之采集需要保存图片的教程
  4. java编程题库公众号,已获万赞
  5. 国家计算机职业技能鉴定4级考试内容大全
  6. Xcode Unable to prepare iPhone for development
  7. 【Pytorch分布式训练】在MNIST数据集上训练一个简单CNN网络,将其改成分布式训练
  8. 互联网时代,机遇与挑战并存,我们该如何应对?
  9. python余数不等于的符号_有乐 这些符号如此重要,不知道就等于“白练琴”
  10. pta 7-34 a+aa+aaa+.. (10 分)