利用底层抽象账户,开发者可以构建一个更具伸缩性和安全性的钱包解决方案。
原题:如何使用基板制作一个可以安全支持数百万个地址的热钱包?”《
》,乔·彼得罗夫斯基著
,波尔卡世界社译
用于运行时开发的底层和框架系统为构建区块链基础设施定义了一组强大的原始功能。二者的结合为解决现有问题开辟了新的途径。本文介绍了一种利用基板功能实现多地址热钱包的实际应用。
“热钱包”通常意味着在在线设备上保留费用密钥,以便交易可以轻松创建和广播,但风险通常很高。本文将探讨Substract的一些账户抽象——多重签名账户、**账户和衍生账户——如何让我们建立一个能够安全支持数百万个地址的热钱包。
如果你需要为多个用户帐户持有代币,但又想为每个客户提供自己的存款地址,这样的钱包会非常有用。一个简单的解决方案是通过生成新的密钥对为每个客户生成一个新的存款地址。但要快速处理所有这些密钥对并不容易。如果你有成千上万的用户呢?利用substract的帐户抽象,我们可以构建一个更可伸缩和更安全的解决方案。
来源和帐户ID
在我们开始制作热钱包之前,我们需要为它的使用打下基础。当用户与区块链交互时,他们正在调用某些功能。这些“可调度”功能构成了区块链的接口。
由于可调度函数是从外部调用的,区块链可能首先关心谁实际调用了该功能。首先,函数需要检查调用者是否有权执行该函数。其次,链可能需要确切地知道谁调用了函数来更新有关调用方的一些信息。如果调用方是帐户,则链可能需要更新该帐户的余额,例如扣除交易成本。
你可能会想,“如果来电者是一个账户,那意味着什么?基底中的功能不是来自帐户本身,而是来源。例如,波卡的治理体系有许多特殊的资源,比如分配国库资金或撤销大幅削减。如果您使用基板来设计自己的区块链,您可以创建自己的自定义源。然而,在本文中需要记住的一点是,账户只是基底源的一种变体。想象一下基板告诉可调度函数,“这个调度的源是一个帐户。”
现在我们已经在抽象上迈出了第一步,我们需要一种方法来判断函数源引用的是哪个帐户。如果您使用过任何区块链,您可能习惯于使用帐户ID作为与私钥对应的公钥。没关系,它也可以用在基板上。在这个意义上,帐户由公钥标识,并由相应的私钥授权。
底层支持更多的抽象。帐户ID可以是任何32字节的数字。[1] 可以是私钥对应的公钥,但不是必需的。它只需要某种授权方法。在这里,必须有一些独特的方法来生成这个帐户ID,这样底物就可以完成开头的一句话:“这个计划的来源是由那个号码标识的帐户。”[2]
散列函数
哈希函数总是出现在区块链中。块实际上是通过它们的散列值链接在一起的。但是我们将把hash函数的属性用于另外两个目的:生成帐户ID和标识函数调用。
hash函数接受任意大小的输入并将其映射到固定大小的输出(例如,32字节)。但是,它不仅应该将数据映射到任何32字节的数字,而且应该将唯一的数据映射到具有确定性的唯一数字。碰巧,32个字节可以捕获天文数字的项目。[3]
例如,我们可以获取链的一些信息,例如“POLKADOT treasury”,并使用哈希函数将其转换为帐户ID(32字节)。或者我们可以获得某些交易的信息,例如“将10个单位转移到账户123,并相信哈希是信息的唯一图像。
多账户
有了这些,我们就可以开始建立热门钱包的第一部分:多签名帐户。由于整体臃肿,多重签名帐户可能不像是流行的钱包的一部分,但这个帐户将作为其余部分的安全基础,刚才提到的庞大不会妨碍日常使用。
一些区块链使用加密的多重签名,即在链上提交交易之前,多个密钥持有者在链外签署单个交易。substrate框架附带的多重签名系统以不同的方式工作:它根据组成多重签名的帐户和从生成的帐户分配所需的阈值来生成帐户id。Substrate向所有这些信息添加一个特殊的多重签名前缀,并对其进行哈希处理以获得一个32字节的输出,该输出将用作多签名帐户ID。请注意,此帐户ID没有与之关联的私钥。
为了从其成员链签署多帐户交易,需要调用多帐户授权函数。但是,对于每个人来说,提交函数调用是低效的;它可能很大,块空间很少(因此代价高昂)。散列函数又派上了用场:只有一个帐户需要提交实际的函数调用;其他帐户只需要提交哈希。他们只是说,“我们同意使用这个哈希通过多个签名帐户调用函数”,而不需要重新提交函数。
多重签名本身太笨拙了,不适合用作热钱包,因为它需要多个密钥持有者提交一个交易才能正常工作。但它的安全性很高,可以作为基本帐户使用,我们可以在不牺牲安全性的情况下将其变成热门钱包。
账户**机构
**帐户允许多个签名将支出权限委托给另一个帐户,该帐户将用作热钱包,同时仍保持多个签名的安全。我们将设置一个一次性延迟**来管理费用,另一个(或多个)直接**来管理此多签名帐户的安全性。
**帐户授予从一个帐户到另一个帐户的权限,以代表该帐户进行函数调用。这些特权可以是特定的,例如“仅与抵押有关的交易”,也可以是广泛的,例如“不涉及资金转移的所有交易”,甚至可以是完全的特权,例如“任何交易”。
要创建**,只需从要表示的帐户进行事务处理,并指定哪个帐户是其**及其特权。**关系建立后,**账户可以交易**账户,这本质上就是一个告知链:“我是账户的**人,我有这些特权,我想代表**账户。链的逻辑将验证**是否具有正确的特权,并使用**帐户的源来分派函数。
增加时间延迟增加了一层安全性。想象一下600个街区的时间延迟(波卡一小时)。**帐户仍将提交事务,表示它是一个具有某些特权的**,但只会公布它将要进行的函数调用的哈希值。**帐户的所有者可以请求实际的函数调用并查看它。如果所有者不同意,他们可以在延迟时间到期之前提交另一个事务来拒绝函数调用。经过时间延迟后,**可以提交与公告相对应的实际函数调用,然后由基板调度。[4]
在我们的用例中,多签名者密钥持有者将交易来建立另一个帐户作为延迟**,具有完全的特权,例如余额转移。也许这个**帐户将存在于一个可以自动交易的在线服务器上。每当进行交易时,它必须首先公布散列值,然后将实际函数调用发送给其他帐户持有者(为了简单起见,我们将此另一个帐户持有者视为多签名成员),这些帐户持有者可以验证函数调用不是恶意的。如果是恶意的,多签名者可以及时进行交易拒绝呼叫,并确保**帐户已被盗用和删除,以便仔细考虑。
这个配置可以工作,但我们仍然可以使它更易于使用。仅使用一个**,我们可能需要很长的时间延迟,因为很难协调足够多的多签名密钥持有者在短时间内拒绝交易。但是,一个帐户可以有多个具有不同权限的**帐户。要解决此问题,请将每个多重签名密钥持有者设置为具有非传输权限的**,特别是具有拒绝来自延迟**的通知的权限。
让我们简单描述一下这个配置。在中心,我们有一个多点登录帐户。帐户没有私钥,但有两种方法可以控制它:使用延迟**帐户或为成员帐户收集足够的签名者。具有多个签名的每个成员还可以拒绝来自完全特权**的事务,但是如果没有其他成员加入多签名事务,则无法执行余额转移。
它本身是一个功能齐全的热钱包,它可以通过删除**和设置新的热钱包来更改热键(具有完全权限的**帐户),而无需更改其地址(多签名帐户)。但目前为止我们的用户只有一个唯一的问题,那就是订金和唯一的问题。
衍生账户
到目前为止,我们已经使用了多种方法来访问多签名帐户。现在,我们将使用一个帐户访问多个帐户。
基板中的每个帐户都有一个可访问的派生帐户树。为了得到帐户ID,substrator理所当然地使用它来散列算法。substrator通过使用所需索引和派生前缀散列调用帐户的帐户ID来创建一个新的帐户ID。例如,发送方提供了一个函数调用和一个索引,并说:“我想从具有此索引的派生帐户调度此函数。”
你可能已经猜到接下来会发生什么。钱包所有者可以为每个用户分配一个索引,并提供导出的帐户ID作为用户的存款地址。为了存取资金,**地址将发出从多签名帐户的派生地址转移资金的交易。
具体来说,索引限制为16位或65536个派生帐户,但也可以嵌套。换言之,每个衍生账户可以有自己的65536个衍生账户,依此类推。这棵树的Layer2将拥有超过40亿个账户。
整个画面
**,让我们运用这些知识。假设一个索引为11的用户向您付款,而您有一些“储蓄帐户”要存款。整个交易看起来像是,“我是多签名账户的**人,我想把钱从多签名衍生品账户(指数11)转到储蓄账户。”
假设监管机构一切正常,延迟时间将到期,**可以广播完整的交易。如果多签名成员认为需要更改热键,则可以简单地生成一个新密钥并删除旧密钥作为**,而不会影响多签名或其任何派生地址。
上图为我们设置的钱包示意图:多重签名(MS)由一组N个键(标记为K)控制,延时**(H)设置为热键。它几乎可以从多个签名中派生出无限多个地址(D的集合)。
我们甚至可以进一步优化这个工作流程。Substrate还提供发送一批函数调用的函数。如果用户从其衍生账户定期存取款,您可以将其全部以一批转账的方式发送。
Substrator的链上帐户抽象提供了一种管理帐户的强大方法。通过减少所需的实际密钥数量,并根据正式规则而不是私钥访问帐户,您可以在数千个帐户上操作,而不必处理存储相同数量签名密钥的限制。本文只关注构建热钱包的一个示例,但是所有抽象都是孤立的,可以形成更**的应用程序。
笔记
1它不必是32字节。您可以随意构建运行时,但我不希望本文超出必要的范围。
2快速解释“****”这个词。从严格意义上讲,我这里的意思比普通字典里的定义更严格。一个帐户是唯一的,不是它只能有一个表示,而是所有表示(或一系列表示)可以被证明是相等的。生成一个特定数量(account)的方法可能不受限制,但只要所有这些方法都生成同一个帐户,该帐户就可以被认为是唯一的。对数学原理的详细解释将过于复杂,您无法理解,但我们将生成帐户ID并在函数之间传递它们。这里的关键是,无论我们有多少函数串联起来,以达到一个帐户ID,它的行为将与调度源的帐户ID相同。
3如果您感兴趣,32字节最多可容纳1.15×10^77。到宇宙可观测边缘的距离为457亿光年,即4.32×10^23km或4.32×10^29mm。如果我们把它看作一个平圆盘,它的面积是5.87×10^59mm。我们还差10^18或者10亿平方米。因此,两个不同的散列输入有相同的输出机会,就像两个项目落在可观测宇宙中的同一平方毫米上,然后将它们分解成10亿乘以10亿的网格,然后两者都落在同一个正方形上。这些正方形有一皮米宽。氦原子的直径是62皮克。
4事实上,只要**发送通知,任何帐户都可以提交呼叫。然而,出于实用主义,我们假设我们的热钱套餐只使用相同的账户进行通知和提交。
文章链接:https://www.btchangqing.cn/147855.html
更新时间:2020年11月26日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。