主页 > 如何下载imtoken钱包 > 比特币钱包简介

比特币钱包简介

如何下载imtoken钱包 2023-12-03 05:11:43

比特币钱包涉及钱包程序和钱包文件。钱包程序创建公钥以接受比特币(satoshis)付款,并使用相应的私钥来花费比特币。钱包文件包含与钱包程序相关的私钥和其他交易信息(可选)。

钱包程序

允许接受和支付比特币是钱包软件的唯一功能,但是一个特定的钱包程序不需要两者都做,两个钱包程序可以一起工作,一个程序分发公钥来接收比特币,一个程序做交易签名以支付这些比特币。

钱包程序还需要与点对点网络交互以从区块链获取信息并广播新交易。当然,分发公钥和交易签名程序不需要与对等网络本身进行交互。

因此,钱包系统具有三个必要但独立的部分:公钥分发程序、签名程序和联网程序。

注意:这是公钥分发的一般情况。在某些情况下,将分发 P2PKH 和 P2SH 哈希来代替公钥分发,并且只有在他们控制的输出被支付时才会分发实际的公钥。

上面和下面提到的输出通常是指未使用的交易输出。缩写是UTXO,即比特币。全方位服务钱包 全方位服务钱包

最简单的钱包是一个执行三个功能的程序:

如今,几乎所有流行的 BTC 钱包都是全方位服务钱包。

全方位服务钱包的优点是易于使用,单个程序可以完成用户支付和接收比特币的所有工作。

全服务钱包的缺点是它们将私钥保存在可以连接到互联网的设备上,这使得由于互联网而攻击此类设备中的私钥很容易。

仅签名钱包

私钥可以保存在更安全的环境中的单独钱包程序中,以提高安全性。这些签名钱包与可以与点对点网络交互的网络钱包一起使用。

签名钱包通常使用确定性密钥创建,用于创建可以生成子公钥和私钥的父公钥和私钥。

首次运行时,签名钱包创建父私钥并将对应的公钥传输到联网钱包。

网络钱包使用父公钥派生子公钥,帮助分发它们(可选),监控支付给这些公钥的输出,创建未签名的支付交易,并将未签名的支付交易传输到签名钱包。

通常用户有机会使用签名钱包查看未签名交易的详细信息(尤其是输出的详细信息)。

用户查看步骤后(可选),签名钱包使用父私钥推导出对应的子私钥并对交易进行签名,将签名后的交易发送回在线钱包。

联网钱包将签名交易广播到点对点网络。

离线钱包 离线钱包

几个全方位服务的钱包也可以用作两个独立的钱包:一个程序实例作为签名钱包(通常称为“离线钱包”)比特币硬件钱包原理,另一个程序实例作为网络钱包(通常称为在线钱包或监控钱包)钱包) .

离线钱包在未连接到互联网的设备上运行,可以减少供应。如果是这种情况,通常由用户来处理所有数据传输和 USB 驱动器等可移动设备的使用。用户的工作流程如下所示:

离线钱包的主要优势在于,与全功能钱包相比,安全性大大提高。只要离线钱包没有被泄露(或有缺陷),用户在签名前会检查所有已支付的交易,即使在线钱包被泄露,用户的比特币也是安全的。

离线钱包的主要缺点是笨重,需要用户离线操作以获得最大的安全性。任何时候要支付比特币,都必须激活离线设备,并且用户必须将数据从在线设备物理复制到离线设备,然后从离线设备复制回在线设备。

硬件钱包 硬件钱包

硬件钱包是专门用于签名的钱包设备,一般是采用智能卡等安全芯片开发的设备。它们可以与其他连接的设备安全通信,用户无需手动传输数据。硬件钱包的工作流程如下:

仅分发钱包

运行在难以保证安全的环境(如web服务器)的钱包程序只能设计为分发公钥,不能有其他功能。这个简单的钱包有两种常见的设计方法:

这两种方法都不会增加大量开销。

钱包文件

比特币钱包的核心是一组私钥。这些馆藏被数字化在一个文件中,甚至在一张纸上。

私钥格式

私钥用于解锁公钥地址对应的比特币。在比特币中,标准格式的私钥是一个 256 位的数字,其值在以下范围内:

0x01 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140

该范围受比特币使用的 secp256k1 ECDSA 加密标准控制。

钱包导入格式 (WIF)

为了使私钥复制不易出错,可以使用钱包导入格式WIF。WIF 使用 base58Check 对私钥进行编码,这大大降低了复制错误的机会,就像标准的比特币地址一样。

迷你私钥格式

迷你私钥格式是一种将私钥编码到 30 个字符以内的方法,可以嵌入到更小的物理空间中,例如物理比特币令牌或二维码。

下面这个超级简单的图显示了比特币使用的椭圆曲线上的一个点,$y^2= x^3+7$

曲线上只有两个点共享任意一个X坐标,所以只需要一位来表示Y坐标的正负,即Y坐标被压缩为1位,这样就达到了接近而不用改变任何东西。50% 公钥压缩

使用此压缩公钥不会丢失任何数据,只需进行少量操作即可重建 Y 坐标并使用未压缩的公钥。secp256官方文档中描述了未压缩和压缩的公钥,广泛使用的密码算法库一般都支持这两种格式的公钥。

由于易于使用,它们减少了区块链空间,压缩公钥是比特币核心的默认设置,也是所有比特币软件的推荐默认设置。

0.6 之前的比特币核心版本使用未压缩的密钥。这会产生一些复杂性。未压缩的密钥和压缩的密钥具有不同的哈希形式。因此,相同的密钥适用于两个不同的 P2PKH 地址。这也意味着必须在签名脚本中以正确的格式提交密钥,以匹配之前公钥脚本输出中的哈希值。

出于这个原因,比特币核心使用几个不同的标识符字节来帮助程序识别应该如何使用密钥:

分层确定性密钥创建

早期比特币客户端的钱包都是一组随机生成的私钥。这些密钥需要用户自己保管。如果钥匙丢失,则无法访问相应的钱包,钱包控制的比特币也无法使用。. 比特币有一个避免地址重用的原则。每个比特币地址只能有一次交易,所以用户会有大量的私钥来保存和备份,所以早期的解决方案并不是一个好办法。

分层确定性密钥和传输协议大大简化了钱包备份,消除了使用同一个钱包的多个程序之间重复通信的需要,允许创建可以独立操作的子账户,并赋予每个父账户监控或控制其的能力子账户,即使子账户被盗,每个账户也分为完全访问和受限访问两部分,使不受信任的用户或程序可以接收或监控付款,但无法进行外部付款。

HD 协议利用 ECDSA 公钥创建函数 -point(),它取一个大数(私钥)并将其转换为曲线上的一个点(公钥):

point(private_key) == public_key

由于 point() 的工作方式,它可以通过将现有公钥(父公钥)与另一个公钥(通过 integer(i) 值)组合来创建子公钥。p 是所有比特币软件使用的全局常数。

point( (parent_private_key + i) % p ) == parent_public_key + point(i)

这意味着如果两个或多个独立程序在整数序列上达成一致,则可以从单个父密钥对创建一系列唯一的子密钥对,而无需额外的通信。此外,为支付分发新的公钥,程序可以在不接触私钥的情况下执行,从而使公钥分发程序可以在不安全的环境(Web服务器)上运行。

子公钥也可以通过重复子密钥分散操作来创建自己的子公钥(grand-key public keys):

point( (child_private_key + i) % p ) == child_public_key + point(i)

无论是创建子公钥还是后代公钥,对所有交易使用可预测的整数序列并不比使用单个公钥好,因为任何知道子公钥的人都可以通过这个父公钥找到所有其他公钥。公钥去中心化的子公钥。相反,使用随机种子来确定生成的整数序列,这样没有种子的人就无法看到子公钥之间的关系。

HD 协议使用单个根种子和不可链接的确定性生成的整数来为子、孙和其他后代创建密钥。每个子键还通过其父键获得确定性生成的种子,称为链码,以便在不破坏整个序列层次结构的情况下破坏一个链码。

高清键分散需要四个输入:

在上面显示的规范形式中,父链码、父公钥和索引索引被输入到单向哈希 HMAC-SHA512 中,生成确定性生成但看似随机的 512 位数据。哈希输出一共512位,数据的右256位(低256位)作为新的子链码。将哈希输出的左 256 位视为整数,结合父私钥或父公钥(对父私钥和哈希输出的高 256 位椭圆曲线进行加模 G 运算)创建子私钥或子公钥密钥:

child_private_key == (parent_private_key + lefthand_hash_output) % G
child_public_key == point( (parent_private_key + lefthand_hash_output) % G )
child_public_key == point(child_private_key) == parent_public_key + point(lefthand_hash_output)

父链码、父公钥、索引索引计算HMAC-SHA512的过程如下: 父公钥(256bits)和子密钥索引(32bits)拼接,公钥在高位-order 索引,合并后的字节序为Big endian,对合并后的数据进行HMAC-SHA512操作,以父链码作为hash key。

可见父私钥和对应代的链码可以计算出子私钥,然后用point()和子私钥计算子公钥,也可以使用子公钥key 和 point(父链码)计算子公钥。这样,只需要知道某一代的公钥和对应代的链码就可以计算出下一代的公钥,而不需要私钥。

指定不同的代际索引索引可以使用相同的父键来分散不同的不相关子键。子密钥使用子链代码重复密钥分散过程以生成不相关的孙密钥。

因为创建子密钥需要密钥和链码,所以密钥和链码合称为扩展密钥。扩展私钥和对应的扩展公钥具有相同的链码。主私钥(最顶层)和主链码由随机数生成。

根种子由 123 位、256 位或 512 位的随机数生成。这个根种子,至少 128 位,是唯一需要用户备份的数据,未来将用于通过特定的钱包和设置去中心化所有密钥。

对根种子进行哈希处理以创建 512 位随机数据​​,用于创建主私钥和主链码(统称为主扩展密钥)。主公钥由主私钥使用 point() 计算得出。主公钥和主链码合称为主扩展公钥。主扩展键在功能上等同于其他扩展键,不同之处仅在于其最高位置。

根种子哈希后的512位输出,左256位作为主私钥,右256位作为主链码

强化键

强化扩展键修复了普通扩展键的潜在问题。如果攻击者获得了一个普通扩展密钥的父链码和父公钥,他可以暴力破解该链码衍生的所有链码。如果攻击者还获得了子私钥、孙子私钥或下一代私钥,则可以使用链码生成该私钥后代的所有私钥。

更糟糕的是比特币硬件钱包原理,攻击者可以通过简单地从子私钥中减去父链码来反转正常的子私钥分散公式并恢复父私钥,如上图的子图和父图所示。这意味着攻击者只要获得一个扩展公钥及其后代的任何私钥,就可以恢复修改后的公钥的私钥及其散布的所有密钥。

因为扩展公钥中有对应级别的链码,所以可以得到这个公钥后代的任意一代的公钥,所以只要得到这个公钥后代的私钥,可以计算出这个私钥上一代的链码。,然后通过私钥链码计算上一代的私钥,最后计算出公钥和后代的所有密钥。

上述加固公告结合索引索引、父链码和父私钥创建生成子链码和子私钥的数据。该公告使得在不知道父私钥的情况下无法创建子公钥。换句话说,父扩展公钥不能创建强化子公钥。

加强密钥生成过程,在父私钥前面加一个0x00字节,拼接父私钥和索引索引,私钥高位,索引低位,字节序是大端。对拼接后的数据进行HMAC-SHA512运算,哈希键为父链码,父私钥与哈希高256位在椭圆曲线上相加取模运算生成子私钥,低 256 位是子链码。如果 ECC 模运算结果为 0,则索引值递增并重新计算密钥。子公钥可以从子私钥计算出来。

因此,强化的扩展私钥不如普通的扩展私钥有用,但是强化的扩展私钥创建了防火墙,因此不会发生多层密钥分发泄漏。由于增强子扩展公钥不能自行生成孙子链码,所以不能将父扩展公钥的公开与孙子私钥的公开结合起来创建孙子扩展私钥。

HD 协议使用不同的索引来指示是生成普通密钥还是硬化密钥。索引从 0x00~0x7FFFFFFF 将生成普通密钥;索引从 0x80000000~0xFFFFFFFF 将生成增强密钥。为了描述方便,很多开发者使用'(撇号)来表示硬化密钥,所以第一个普通密钥(0x00)为0,第一个硬化密钥(0x80000000)为0)0 '。

(比特币开发人员通常使用 ASCII 撇号而不是 unicode 素数符号。)

此压缩描述进一步与斜杠和 m 或 M 前缀组合以指示层次结构和密钥类型。m 代表私钥,M 代表公钥。例如m/0'/0/122'表示第1代主私钥(index=0)第1代硬化子密钥(index=0)第123代普通subkey) 生成 (index=122)enhanced child private key (by index index)。

符合 BIP32 HD 协议的钱包只创建主私钥(m)的增强子密钥,以防止因子密钥泄露导致主密钥泄露。因为主密钥没有普通的子密钥,所以HD钱包中不会使用主公钥。其他所有密钥都可以有普通子密钥,所以可以使用对应的普通扩展公钥。

HD协议还描述了扩展公钥和扩展私钥的序列化格式。详细请参考 BIP32 协议。

储存根种子

HD协议中的根种子是128、256或512位的随机数,这些种子需要备份。为方便起见,可以使用非数字备份方法,例如记忆、手抄等。BIP39 定义了一种方法来创建带有助记符的 512 位根种子。

生成的单词数与使用的熵值有关:

熵位词

128

12

160

15

192

18

224

二十一

256

二十四

密码可以是任意长度,它可以像附加到助记词伪句一样简单,助记词和密码将使用 2048 次 HMAC-SHA512 操作生成看似随机的 512 位种子。

散装钱包

看来松散密钥钱包中文也称为零型非确定性钱包,也称为Just a Bunch Of Keys (JBOK),是比特币核心客户端的早期钱包形式,已被弃用。比特币核心客户端钱包通过伪随机数生成器自动创建 100 个公私密钥对,供以后使用。

这些未使用的私钥存储在虚拟密钥池中。在使用之前生成的密钥后,会生成新的密钥并放入池中,以确保池中有 100 个未使用的密钥。钥匙。