1. 首页
  2. 区块链资讯

怎样使用 Substrate 做一个能安全支持百万地址的热钱包?

用于 runtime 开发的 Substrate 和 FRAME 系统界说了一组壮大的原语功效,用于构建区块链基础架构。将两者配合使用,为解决现有问题缔造了新颖的方式。本文将形貌一个现实应用程序,其中 Substrate 的函数用于实现多地址热钱包。

热钱包通常意味着将支出密钥保留在在线装备上,以便可以方便地建立和广播买卖,但风险通常较高。本文将探讨一些 Substrate 的账户抽象 —— 多署名账户、署理账户和衍生账户 —— 若何让我们能构建一个可以平安支持数百万个地址的热钱包。

若是您需要为多个用户账户持有代币,但又想为每个客户提供自己的存款地址,那么这样的钱包将异常有用。简朴的解决方案是通过天生新的密钥对为每个客户天生一个新的存款地址。然则快速处置所有这些密钥对并不容易。若是您有成千上万的用户怎么办?使用 Substrate 的账户抽象,我们可以构建一个可扩展性和平安性更高的解决方案。

泉源和账户 ID

在最先构建热钱包之前,我们需要奠基它将要使用的基础。当用户与区块链举行交互时,他们正在挪用某些函数。这些 “可调剂(dispatchable)” 函数的聚集组成了区块链的界面。

由于可调剂函数是从外部挪用的,因此区块链可能首先体贴的是谁真正挪用了该函数。首先,一个函数需要检查挪用方是否有权执行该函数。其次,链可能需要确切地知道谁挪用了该函数以更新有关挪用者的一些信息。若是挪用者是一个账户,则链可能需要更新该账户的余额,例如扣除买卖用度。

您可能会想,“若是挪用者是账户,那意味着什么?” Substrate 中的函数自己不是来自帐户,而是来自泉源(origins)。例如,Polkadot 的治理系统具有一系列特殊泉源,这些特殊泉源具有特权,例如分配国库资金或打消 Slash。若是您使用 Substrate 设计自己的区块链,则可以建立自己的自界说泉源。然则,本文要记着的一点是,账户只是 Substrate 泉源的一种变体。您可以想象成 Substrate 告诉可调剂函数,“此调剂的泉源是一个账户。”

既然我们已经实现了抽象的第一个飞跃,我们需要一种方式来告诉函数泉源是指哪个账户。若是您使用过任何区块链,则可能会习惯于使用一个账户 ID 作为与私钥相对应的公钥。这没问题,这一点也可以在 Substrate 中使用。从这个意义上说,一个账户由公钥标识,并由响应的私钥授权。

Substrate 支持更多抽象。账户 ID 可以是任何 32 个字节的数字。[1]可以是与私钥相对应的公钥,但不是必须的。它只需要某种授权方式。就像在其中一样,必须有某种怪异的方式来天生此帐户标识号,以便 Substrate 可以完成上述开头的句子:“此调剂的泉源是由该编号标识的账户。” [2]

哈希函数

哈希函数一直在区块链中泛起。区块现实上是通过其哈希值链接在一起的。然则我们将使用哈希函数的属性来到达另外两个目的:天生账户 ID 和识别函数挪用。

哈希函数会接受一些随便巨细的输入,并将其映射到牢固巨细的输出(例如 32 个字节)。然则,它不仅将数据映射到任何 32 字节的数字,而是应该确定性地将唯一数据映射到一个唯一的数字。恰巧的是,32 个字节可以捕捉天文数字量级的 item。[3]

例如,我们可以获取有关链的一些信息,例如 “polkadot-treasury”,并使用哈希函数将其转换为账户 ID (32 字节)。或者,我们可以获取有关某些买卖的信息,例如 “将 10 个单元转移到账户 123…”,并信赖哈希是该信息的唯一图像。

多签账户

有了这些,我们就可以最先构建热钱包的第一部门:多重署名(multisig)账户。由于总体对照粗笨,多重署名账户可能看起来不像是热门钱包的一部门,然则此账户将作为其余组件的平安基础,而且刚刚所说的粗笨不会故障一样平常使用。

一些区块链使用加密多重署名,其中多个密钥持有者在链上提交买卖之前,先在链外签署了单个买卖。Substrate 的 FRAME 附带的多重署名系统以另一种方式事情:它凭据组成多重署名的各个账户以及从天生的账户中分发所需的需要阈值来天生账户 ID。Substrate 向所有这些信息添加一个特殊的多重署名前缀,并对其举行哈希处置以获取一个 32 字节的输出,该输出将用作多重署名账户 ID。请注意,此账户 ID 没有与其关联的私钥。

为了从该新帐户 ID 授权买卖,多签的成员均使用其希望多签帐户举行的函数挪用在链上提交买卖。然则,每个人都提交函数挪用效率不高;它可能很大,而且区块空间是稀缺的(因此很昂贵)。哈希函数再次派上用场:只有一个账户需要提交现实的函数挪用;其他人只提交哈希。他们只用说:“我们赞成通过多签账户使用此哈希挪用函数”,而无需重新提交函数。

这个多重署名自己太拙笨,无法用作热钱包,由于它需要多个密钥持有者提交买卖才气使其正常事情。然则它是高度平安的,可以将它作为基本账户,而我们可以在不牺牲其平安性的情况下将其转变为热钱包。

署理账户

署理帐户允许多签地址将支出权限委派给另一个账户,该账户将用作热钱包,同时仍保持多签的平安。我们将设置一次性延时署理来治理支出,并设置另一个(或多个)即时署理来治理此多签账户的平安性。

署理账户将一个账户的特权授予另一个账户,以代表该账户举行函数挪用。这些特权可以是特定的,例如 “仅限与抵押相关的买卖”,或普遍的,例如 “不涉及转移资金的所有买卖”,甚至是完整的特权,如 “任何买卖”。

建立署理只需要从要署理的账户举行一次买卖,并说明哪个其他账户是其署理及其特权。署理关系到位后,署理账户就可以为署理账户举行买卖,本质上就是告诉链:“我是该账户的署理,我具有这些特权,而且我想代表署理账户。” 链的逻辑将验证署理确实具有准确的特权,并使用署理账户的泉源派遣该功效。

添加时间延迟会增添一层平安性。想象一下 600 个区块的时间延迟(在 Polkadot 中为一小时)。署理账户仍会提交买卖,说它是具有某些特权的署理,但只会宣布它要举行的函数挪用的哈希值。署理账户的所有者可以请求现实的函数挪用并举行审查。若是所有者不赞成,他们可以通过在延迟时间到期之前提交另一个买卖来拒绝函数挪用。在时间延迟之后,署理可以提交与通告相对应的现实函数挪用,然后由 Substrate 调剂。[4]

对于我们的用例,多签密钥持有者将举行买卖以将另一个账户设置为具有完全特权的延时署理,例如包罗余额转移在内。也许此署理账户将存在于可自动举行买卖的在线服务器上。每当举行买卖时,它都必须先宣布哈希,然后将现实的函数挪用发送给其他帐户持有人(为简朴起见,我们将此其他帐户持有人视为多签的成员),他们可以验证该函数挪用是否为非恶意的。若是是恶意的,多签可以实时举行买卖以拒绝该挪用,而且出于郑重思量,确定署理账户已被盗用并将其删除。

这样设置确实行得通,然则我们仍然可以让它变得更方便使用。仅使用一个署理,我们可能需要很长的时间延迟,由于协调足够多的多重署名密钥持有人以举行拒绝买卖可能会在短时间内对照难题。然则一个帐户可以有多个具有差别特权的署理帐户。要解决此问题,请将每个多签密钥持有者设置为具有非转账特权的署理,尤其是具有拒绝来自延时署理的通知的特权。

流动性提供平台Wootrade即将上线BitMax交易所

如何提高流动性是推动下一波数字资产交易增长的关键点,试想如果现在有一个平台致力于解决市场流动性分散的痛点,使得大量场外资金能自由进出加密货币市场,改善整体加密资

让我们简要先容一下此设置。在中央,我们有一个多签账户。该账户没有私钥,然则有两种方式可以控制它:使用延时署理账户或网络足够的成员账户署名者。多签的每个成员还具有拒绝来自完全特权署理的买卖的能力,然则若是没有其他成员加入举行多签买卖,则无法举行余额转账。

它自己就是一个功效齐全的热钱包,只需删除署理并设置一个新的热钱包即可更改热键(具有完全特权的署理帐户),而无需更改其地址(多重署名帐户)。然则我们最初的问题陈述要求成千上万的用户使用唯一的存款地址,到目前为止,我们只有一个用户。

衍生账户

到目前为止,我们已经使用多种方式接见一个多重署名账户。现在,我们将使用一个帐户接见许多账户。

Substrate 中的每个账户都有一个可以接见的衍生帐户树。为了获得账户 ID,Substrate 天经地义地使用来哈希算法。通过用所需的索引和派生前缀对提议挪用的帐户的账户 ID 举行哈希处置,Substrate 建立了一个新的账户 ID。例如,发送方提供一个函数挪用和一个索引,说:“我想从具有此索引的派生账户中调剂此函数。”

你可能已经猜到后面会发生什么了。钱包所有者可以为其每个用户分配一个索引,并提供派生账户 ID 作为该用户的存款地址。为了接见资金,署理地址将发出买卖以从多重署名帐户的派生地址转移资金。

详细而言,索引限制为 16 位或 65,536 个派生帐户,然则也可以嵌套。也就是说,每个衍生产帐户可以拥有自己的 65,536 个衍生产帐户集,依此类推。树的第二层将拥有跨越 40 亿个账户。

全貌

最后让我们把这些知识用起来。想象一下,索引为 11 的用户向您付款,您有一些 “储蓄账户” 要存入资金。整个买卖看起来像是:“我是多签账户的署理人,我想将资金从多签的衍生账户(索引为 11) 转移到储蓄账户。”

假设对监管者来说一切正常,则延迟时间将到期,而且署理可以广播完整的买卖。若是多重署名成员以为热键需要更改,他们可以简朴地天生一个新密钥并将旧密钥作为署理删除,而不会影响多重署名或其任何派生地址。

怎样使用 Substrate 做一个能安全支持百万地址的热钱包?

上图显示了我们已设置的钱包的示意图:多重署名(MS)由一组 n 个密钥(记为 k)控制,并将时间延迟署理(H)设置为热键。它险些可以从多签中导出无限的地址(d 的聚集)。

我们甚至可以进一步优化此事情流程。Substrate 还提供了发送一批函数挪用的函数。若是用户定期在其衍生帐户中举行存款和提款,你可以在一批转账中将其所有发送。

Substrate 的链上帐户抽象提供了治理账户的壮大方式。通过削减所需的现实密钥数目并凭据正式规则而不是私钥接见账户,您可以操作成千上万个账户,而不必处置存储相等数目的署名密钥的限制。本文仅关注构建热钱包的一个示例,然则所有抽象都是伶仃的,可以组成更高级的应用程序。

注释

  1. 不必非得是 32 个字节。您可以为所欲为地构建 runtime,但我不希望本文超出了需要局限。↩︎

  2. 快速注释一下 “unique” 一词,从严酷的意义上讲,我在这里的意思比通俗字典中的界说更严酷。一个账户是唯一的,并不是说它只能有一个示意,而是所有示意(或一系列示意)都可证明为相等的。可能存在无限数目的方式来天生一个特定的数字(账户),然则只要所有这些方式都确实天生相同的帐户,那么该账户就可以视为唯一的。详细注释其中的数学原理会庞大到让你头大,然则我们将天生账户 ID 并将它们在函数之间通报,这里的关键是无论我们有多少个函数串在一起(串联)以到达某个帐户 ID,它在充当调剂源的方面表现为相同的账户 ID。↩︎

  3. 若是您有兴趣领会的话,32 个字节最多可容纳 1.15×10 ^ 77。到可考察宇宙边缘的距离为 457 亿光年,即 4.32×10 ^ 23 公里或 4.32×10 ^ 29 毫米。若是我们我们把它想作是一张平面的光盘,则其面积为 5.87×10 ^ 59 平方毫米。我们仍然相差 10 ^ 18 或十亿平方。因此,两个差别的哈希输入具有相同输出的机遇就像两个项目都落在可考察的宇宙中的统一平方毫米上,然后将其分解为 10 亿乘以 10 亿的网格,然后又都落在了相同的正方形上。这些正方形是 1 皮米(picometer)宽。作为参考,氦原子的直径为 62 皮米。↩︎

  4. 现实上,只要署理发出通知,任何账户都可以提交挪用,然则出于实用主义的思量,假设我们的热钱包仅使用统一账户举行通知和提交。↩︎

原文:

https://www.parity.io/building-a-hot-wallet-with-substrate-primitives/

翻译:PolkaWorld 社区

原创文章,作者:链大大,如若转载,请注明出处:http://www.chaindada.com/chain/25788.html