主页 > imtoken创建多个钱包 > 谈谈钱包技术

谈谈钱包技术

imtoken创建多个钱包 2023-09-29 05:07:50

钱包技术应该说是区块链技术的核心战场,对开发者的要求非常高。 除了要有非常扎实的比特币技术基础,还必须聪明,有解决复杂问题的能力。

钱包技术我怕是写不完十期,今天只说基础知识。 先不说扩展公钥(xpub)和扩展私钥(xpriv)这些复杂的东西,先说比特币最简单的公私钥。 谁能说出比特币公钥的长度(以字节为单位)是多少,私钥的长度是多少?

比特币公钥和私钥

比特币使用secp256k1,给出一个32字节(256bit)的随机数作为私钥,推导出对应的公钥。 因为secp256k1是一条对称曲线(如下图所示)比特币助记词导入钱包,给定x轴上的某个点(私钥),可以找到y轴上的两个点(公钥)。 因为公钥会出现在正负象限中,所以完整的公钥长度为64字节(32+32)。

比特币提币钱包_比特币助记词导入钱包_比特币怎么比特币钱包

一个64字节(实际上是65字节,前缀为04)的公钥称为比特币的未压缩公钥。 因为如果知道其中一个点,就可以推导出反象限的点,只剩下32字节的信息,称为压缩公钥。 并加上前缀02或03(计算过程中使用y的平方根,不同的私钥在计算压缩公钥时会得到不同的前缀),所以最终的压缩公钥是02或03开头的33字节数据03.

从上面可以看出,比特币私钥可以推导出三种公钥,分别是:02、03、04(注意:同一个比特币私钥对应的压缩公钥只能是02/03这一种的)。 他们最终都派生出不同的比特币地址。 为了指示正在使用哪个公钥(地址),出现了一种称为 WIF 的私钥编码格式。 WIF以5或K/L开头,分别代表对应的非压缩公钥和压缩公钥。

知道比特币,那以太坊呢? ETH采用非压缩形式,不需要以04开头,因为ETH中没有引入压缩公钥,所以不需要04标识。

另一个例子是 EOS,它只使用压缩公钥。 因为没有非压缩公钥,所以EOS WIF私钥不需要进行不同编码来识别是否压缩。 所以EOS的WIF只有一种形式。

其他币种大多和比特币差不多,大家可以自己研究下。 下面说说大家看到的比较常见的助记词。

助记词

BIP39助记词是现在钱包支持最多的,但实际上助记词早在BIP39之前就出现了,比如Electrum助记词。 由于它早于 BIP39,因此 Electrum 助记符与 BIP39 不兼容。

Electrum助记词前后也有两个不同的版本。 目前使用的v2版本使用与BIP39相同的词库,但Seed的生成方式与BIP39不同。 去年看了Electrum的源码,在Ownbit钱包里集成了Electrum助记词。 应该是目前唯一同时支持BIP39和Electrum助记词导入的钱包。

关于如何从助记词中推导出种子,进而推导出各种路径的扩展私钥(xpriv)和扩展公钥(xpub),这里就不介绍了。 这里只是最常见的问题之一。

问:我用的是中文助记词,能不能生成一套对应的英文助记词,然后地址和资产还是一样的?

这个问题的答案比较复杂比特币助记词导入钱包,断然回答是或否是不准确的。

对于大多数币种来说是不可接受的,比如比特币,ETH等。标准的BIP39 js库使用助记词串本身作为种子生成的来源,因为使用的是字符串本身,而不是词库中单词的索引,所以即使不同语言的助记词顺序相同,也会生成不同的种子,公私钥和地址也会不同。

但其实大可不必这样,也不好,大家可以想想。 如果中英文助记词可以互相转换,从产品的角度来说,会是一个非常实用的功能。 因为我们有些人用的是中文助记词,但是导入到一些钱包的时候,发现不支持中文助记词。 如果有这样的助记词转换功能就好了。

这里还有一个助记词的概念:熵。 每套助记词可以产生一个Entropy,它实际上是这套助记词在词库中的索引信息。 如果我们使用熵来生成种子而不是助记词本身,那么我们可以在不同的助记词语言之间切换。 有些代币会这样做,例如:ADA (Cardano)。

目前在国内,据我所知支持ADA币的钱包只有Ownbit和火币钱包。 火币钱包团队可能对熵没有很好的理解。 我试了一下,发现他们不能生成中文助记词的ADA地址。 而这在 Ownbit 中是没有问题的。

Entropy 方法不是 BIP39 标准方法,但从产品的角度来看它实际上是一种更好的方法。 现在用户在选择助记词时出现两难选择。 一方面,更多的新手用户开始使用数字钱包,他们需要更多本土化的助记词,比如中文助记词。 另一方面,很多钱包(尤其是国外的钱包)并不支持中文助记词的资产恢复。 使用中文助记词会降低资产追回的通用性,确实是两难选择。

这次先说这么多,下次再说吧。