主页 > imtoken钱包下载安卓版 > 比特币钱包简介

比特币钱包简介

imtoken钱包下载安卓版 2023-01-18 10:42:11

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

钱包程序

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

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

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

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

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

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

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

全方位服务钱包的优势在于使用方便,一个程序就可以完成支付和接收比特币的所有工作。

缺点

全服务钱包是将私钥存储在可以连接到互联网的设备上,这使得攻击此类设备中的私钥变得容易。

仅签名钱包

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

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

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

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

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

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

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

离线钱包 离线钱包

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

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

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

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

硬件钱包硬件钱包

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

仅分发钱包

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

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

钱包文件

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

私钥格式

私钥用于解锁公钥地址对应的比特币。在比特币中,私钥的标准格式是一个 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官方文档中描述了未压缩和压缩的公钥,广泛使用的密码算法库一般都支持这两种格式的公钥。

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

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

因此,Bitcoin Core 使用几个不同的标识符字节来帮助程序识别应该如何使用密钥:

分层确定性密钥创建

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

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

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 运算)创建子私钥或子公钥 Key:

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)拼接,公钥为在高位索引中,并且组合字的字节序为大端,对组合数据进行HMAC-SHA512操作,以父链码作为哈希键。

可见父私钥和生成对应的链码可以计算出子私钥,然后使用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) 生成(索引=122)增强子私钥(按索引索引)。

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

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

储存根种子

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

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

熵位词

128

12

160

15

192

18

224

21

256

24

密码可以是任意长度,它可以简单地附加到助记词伪句中,助记词和密码将使用 2048 个 HMAC-SHA512 操作,从而产生看似随机的 512 位种子。

散键钱包

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

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