主页 > 苹果可以下载imtoken钱包吗 > 比特币钱包简介

比特币钱包简介

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

钱包程序

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

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

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

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

上面和下面提到的输出通常是指未使用的交易输出。缩写是UTXO,即比特币。

全方位服务钱包

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

img

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

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

全服务钱包的缺点是它们将私钥存储在可以连接到 Internet 的设备上,并且由于 Internet,此类设备中的私钥很容易受到攻击。

仅签名钱包

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

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

img

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

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

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

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

在线钱包将签名的交易广播到点对点网络。

离线钱包

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

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

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

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

硬件钱包

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

分发钱包分发专用钱包

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

img

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

钱包文件

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

私钥格式

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

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

这个范围是比特币ECDSA加密标准管理使用的secp256k1。

钱包导入格式(WIF)

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

迷你私钥格式

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

上面很啰嗦,我回去整理一下再写。

## 公钥格式 公钥格式

比特币的 ECDSA 公钥代表特定椭圆曲线上的一个点,比特币使用 secp256k1。在传统的未压缩形式中,公钥包含标识字节、32 字节的 X 坐标和 32 字节的 Y 坐标。

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

img

p>

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

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

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

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

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

分层确定性密钥创建

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

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

HD协议使用ECDSA公钥创建函数-point(),取一个大数(私钥)比特币一个私钥变成几个地址,将其转换为曲线上的一个点(公钥):

point(private_key) == public_key

由于 point() 的工作方式,它允许您将现有的公钥(父公钥)与另一个公钥(通过整数 (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 协议使用单个根种子和不可链接的确定性生成整数来为子代、孙代和其他后代创建密钥。每个子键还通过其父键获得确定性生成的种子,称为链码,因此在不破坏整个序列层次结构的情况下破坏一个链码。

img

如上图,高清键分散需要四个输入:

在上面显示的标准形式中,父链码、父公钥和索引索引被输入到单向哈希 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)进行拼接,公钥在高位index,合并后的字节序为big endian,对合并后的数据进行HMAC-SHA512操作,以父链码作为hash key。

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

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

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

img

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

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

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

强化键

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

img

更糟糕的是,攻击者可以反转正常的子私钥散布公式,只需从子私钥中减去父链码就可以恢复父私钥,如上子图和父图所示。这意味着攻击者只要获得扩展公钥及其后代的任何私钥,就可以恢复修改后的公钥的私钥及其散布的所有密钥。

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

img

上述增强公告结合索引索引、父链码和父私钥创建生成子链码和子私钥的数据。该公告使得在不知道父私钥的情况下无法创建子公钥。换句话说比特币一个私钥变成几个地址,父扩展公钥无法创建强化子公钥。

为了加强密钥生成过程,在父私钥前面加一个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代子键(索引=122)增强子键(按索引索引)。

img

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

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

储存根种子

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

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

熵位词

128

12

160

15

192

18

224

21

256

24

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

散键钱包

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

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