从 Web3 钱包看 OSKey:助记词生成原理与 OSKey 实现逻辑

我们现在使用钱包,无论是软件钱包还是硬件钱包,第一步操作就是让选择生成助记词还是导入助记词,对于新人来说,一定是生成助记词,那这个助记词是怎么生成呢?

我们在前一篇文章中拆解了助记词的演变之路,本篇详细讨论下助记词的生成步骤。

BIP39

助记词是有共识性标准的,几乎所有的钱包和链都会遵守,文件在这里 https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki。BIP39 规定了生成的步骤和提供了标准单词表。

OSKey 实现完全遵循 BIP39 规范,并完整通过提供的测试向量。

助记词是什么?

助记词的本质是一段随机数,助记词用人类可读的方式记录这个随机数。单词数越多的助记词对应越长的随机数,安全性越高。

我们先看下规范中的描述:
MS: 助记词单词个数,数量在 12-24 之间按 3 个单词递增。
ENT: 随机数长度
CS: 校验长度

CS = ENT / 32
MS = (ENT + CS) / 11

|  ENT  | CS | ENT+CS |  MS  |
+-------+----+--------+------+
|  128  |  4 |   132  |  12  |
|  160  |  5 |   165  |  15  |
|  192  |  6 |   198  |  18  |
|  224  |  7 |   231  |  21  |
|  256  |  8 |   264  |  24  |

如果是需要 12 个单词的助记词,对应 128 bits 的随机数,对这个随机数进行 SHA256,取 hash 的 4 bits 作为校验位,总长度 132 bits。

单词是如何对应到随机数的?

上面提到的 ENT(随机数)+ CS(校验)总是 11 的倍数,把它们按照每组 11 个 bit 分组,把 11 个 bit 的 2 进制转为 10 进制,我们会得到 0-2047,这些数字对应到单词表就可以得到助记词。

可以看到最后一个单词是带校验的,所以不是从单词表取对应数量的单词就是助记词。

这是单词表,对应各个语言,为了通用性,我们一般选择英语。
https://github.com/bitcoin/bips/tree/master/bip-0039
在这里插入图片描述

OSKey 的随机数

计算机如何能够提供一个足够随机的随机熵一直是一个难题,多个钱包因为随机数生成的问题造成用户的资金损失。

OSKey 使用硬件随机数生成器(RNG)来获取随机数,芯片的硬件随机数生成器一般都是符合工业标准的。采用多种方式保证足够随机。

如果芯片没有硬件支持的随机数生成器,则 OSKey 这时候会回退到基于时间的伪随机,如果 OSKey 提示芯片不具备硬件随机数生成器,则生成过程不够安全。

OSKey 助记词的实现

对于助记词的实现在这里,我们解释下生成相关的方法。
https://github.com/butterfly-community/oskey-lib-core/blob/main/wallet/src/mnemonic.rs

Mnemonic::from_phrase(phrase: &str) -> Result<Self> 

输入助记词,还原回原始熵并校验校验位,导入

Mnemonic::from_entropy(entropy: &[u8]) -> Result<Self, anyhow::Error>

从随机数生成助记词,提供需要的原始熵。

Mnemonic:: entropy_to_bits(entropy: &[u8]) -> Result<BitVec> 

从原始熵生成按 11 个 bit 分组的助记词序号

Mnemonic::bits_to_words(bits: &BitVec) -> Result<Vec<&'static str, 24>> 

从助记词序号列表中取出对应的单词,最多 24 个。

OSKey 导入助记词的实现

我们从上面助记词的生成过程已经知晓,不是任意一组单词都是助记词,最后一个单词可以校验输入的单词是否正确。

完整实现中,我们需要执行一个反向的过程,还原回原始熵然后计算一遍校验,对比校验是否正确,如果正确则开始下一步。

关于下一步的实现我们在接下来的 HD Wallet 篇中讨论。


关于 OSKey

图片

OSKey 是 OpenBuild 的社区项目之一。OSKey 的口号是提供 1 美元的 Web3 基础安全性,通用硬件。是一个全开源的非商业硬件钱包项目,DIY First and Maker movement,帮助所有人创造并使用无需信任的通用硬件钱包。

用户可以自由选择第三方的几千种开发板,刷入 OSKey 固件就可以作为一个体验优秀的硬件钱包使用。

如果你想深度体验 OSKey 硬件钱包、了解 OSKey 最新开源进展,或者对 OSKey 有更好的想法,欢迎加入我们,一起重新定义硬件钱包!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值