简介
钱包程序用来创建接受比特币的公钥和使用公钥对应的私钥来花费接收到的比特币。钱包文件用来保存私钥和交易相关的信息。钱包程序和钱包文件将分成两个部分分别阐述。
钱包程序
钱包程序的基本功能是接受转账进入的币和花费账户上币。但是,一些特殊功能的钱包并不需要完成这两个功能。这两个功能可采用两个钱包程序来完成。一个是分发用来接受用户转账的公钥,另一个用来签名来消费账户上的币。
钱包程序同样需要连接到p2p网络,从区块链上获取信息和广播新的交易。但是用来签名和分发公钥的钱包程序本身并不需要连接到p2p网络中。
因此,钱包可以分成三个独立的部分:公钥分发程序、签名程序和网络程序。
备注:通常情况下,我们说分发公钥。但是在很多情况下,分发的是P2PKH或者P2SH 哈希而不是公钥
全功能钱包:
全功能钱包具有上面的三个功能:生成私钥,根据私钥产生公钥,根据需要分发公钥,监控转入到自己公钥的输出。创建和签名交易花费输出。最后是广播交易。
钱包文件
比特币钱包是私钥的集合。这些集合保存在文件中,也可以保存在纸上。
私钥格式
比特币私钥用来解锁特定地址上的utxo。比特币私钥的标准格式是一个介于0x01 和 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140之间的256位的数字.这个范围是由比特币采用的secp256k1 ECDSA加密标准决定的
文件导入格式(wallet import format wif)
为了减少复制私钥导致的出错,Wallet Import Format 被采用了。WIF使用base58对私钥进行编码。大大减少了复制错误。
(1)产生一个私钥
(2)在私钥前面添加0x80(主网)或者0xef(测试网络)
(3)如果是压缩公钥,在后面追加0x01,如果不是,那就什么也不追加。
(4)对扩展私钥进行hash256计算
(5)对(4)的结果再次进行hash256
(6)去(5)的计算结果的前四个字节作为校验码
(7)将校验码添加到从(2)获取到的扩展密钥上
(8)将结果从二进制转换成base58编码
HD钱包
HD钱包简化了钱包的备份。消除了使用相同钱包的程序之间的重复通信。允许创建独立的子账号。父账号可以完全控制子账号。将每个账号分解为完全控制和部分控制部分,这样不可信的程序和个人可以被允许用来收款和监控账户余额。
HD协议利用了ECDSA的公钥创建函数 point.这个函数接受私钥作为参数,然后将它转变为椭圆曲线上的一个点(也就是公钥)。
point(private_key)==public_key
根据point函数的工作方式,我们可可以创建一个子公钥,这个子公钥是通过父公钥和另一个由数字i生成的公钥生成的。这个子公钥和用父私钥+i,然后对这个和取模,最后作为point函数的参数求得的公钥是一样的。公式如下
point((parent_private_key+i)%p)==parent_public_key+point(i)
这意味着两个独立的程序可以在不通信的情况下,通过一个公私钥对,使用约定的数字。就可以创建出一些列的子公私钥对。
网友评论