对比特币熟悉的朋友一定都知道,买卖比特币最后都是通过一个钱包地址来实现的,就像我们日常使用的银行卡卡号,我们随便找一个比特币的钱包地址,大家看一下:
1QCXRuoxWo5Bya9NxHaVBArBQYhatHJrU7,但是当谈到比特币的钱包地址是如何算出来的时候,可能就很少有人能够说清楚了。
钱包地址生成
1、随机数发生器会首先生成一个【私钥】。一个256bits的字符串,有这串数字就可以对【钱包地址】中的比特币进行操作,所以必须被安全地保管起来。
2、【私钥】经过SECP256K1算法处理形成了【公钥】。SECP256K1是一种椭圆曲线算法,通过一个已知的【私钥】可以算出【公钥】,而【公钥】无法反向计算出【私钥】,这是保障比特币安全的基础算法。
3、同SHA256一样,RIPEMD160也是一种Hash算法,可以由【公钥】计算得到【公钥哈希】,反过来【公钥哈希】是不能计算得到【公钥】的。
4、将一字节的地址版本号连接到【公钥哈希】的头部(比特币网络的pubkey地址中这一字节为“0”),然后对他进行两次SHA256运算,将结果的前4个字节作为【公钥哈希】的校验值,连接在它尾部。
5、将上一步的结果使用BASE58进行编码(比特币定制编码),就可以得到一串【钱包地址】。例如:
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
在上述的五个步骤里只有“BASE58编码”有相应的可逆算法(“BASE58解码”),其他算法都是不可逆的,所以这些数据之间的关系可以表示为:
可以看到:
【私钥】可以计算得到公钥、公钥哈希、钱包地址。
【公钥哈希】和【钱包地址】可以互相进行转换,它们是等价的。
比特币钱包间的转账是交易,交易数据是由转出钱包【私钥】的所有者发出,也就是说有了【私钥】就可以使用该钱包的比特币。
交易发出的过程如下:
1、交易的数据包括“转账金额”和“转入钱包地址”,但是只有这些是不够的,因为无法确认交易的发出人对“转出钱包”余额的使用权。所以需要用【私钥】对交易数据进行签名认证。
2、生成“转出钱包公钥”,这一过程与生成【钱包地址】的第2步是一样的。
3、将“转出签名”和“转出公钥”添加到交易数据中,生成了正式的交易数据,这样数据就可以广播到比特币网络中进行转账确认了。
交易数据被广播到比特币网络中后,节点会对交易数据进行检验,其中就包括对签名的验证。如果验证正确,那么这笔金额就成功地从“转出钱包”转移到“转入钱包”。
小结
1、如果一个【钱包地址】从未曾发送余额到其他【钱包地址】,那么它的【公钥】是不会被暴露在比特币网络上的。而公钥生成算法(SECP256K1)是不可逆的,即使【公钥】被暴露,也很难对【私钥】的安全性造成影响(难易取决于【私钥】生成的算法)。
2、【私钥】用来生成【公钥】和【钱包地址】,也用来对交易进行签名。拥有了【私钥】就是拥有了对这个钱包余额的一切操作权力。所以,保护【私钥】是所有比特币钱包应用最基本也是最重要的功能。