请参考以下文章一起阅读:
- 我生成的比特币地址竟然与别人的重合了
- 用NBitcoin进行区块链开发(1)
本文尝试用NBitcoin源代码详细解释下面这幅图的含义。
插图取自《精通比特币》
首先介绍NBitcoin里的一个Encoders工具类,它处于NBitcoin.DataEncoders名字空间内,有两个函数可以把十六进制字符串和字节数组相互转换。
- Encoders.Hex.DecodeData()
- Encoders.Hex.EncodeData()
这两个函数可以方便进行SHA256运算和打印输出。
公钥哈希
先回顾一个公钥的组成:
022e88d239fb78cee0c1c55943a96dcc8b70adf47e18b53f9ba110b6fb871e1f8b
前面的02表示压缩公钥,后面的一长串十六进制数表示椭圆曲线上点的X坐标。
公钥再经过SHA256和RIPEMD160变换之后,得到20个字节的公钥哈希。
在NBitcoin.Crypto名字空间中有一个Hashes类,可以完成这些哈希操作,最后得到的结果与pk.Hash是一样的。
输出结果:
比特币地址
公钥哈希前面加上版本号,后面加上校验码,再经过Base58编码,就是比特币地址。
直接看代码:
刚才的加上了版本号的公钥哈希经过两次SHA256之后,取前4个字节作为校验码,就得到了:
006168f1c0384241c4f6185171df8e800def5e63f10749c64b
再经过Base58编码,就得到了比特币地址。
与pk.GetAddress()函数的结果一样。
参考文献:
https://www.codeproject.com/Articles/768412/NBitcoin-The-most-complete-Bitcoin-port-Part-Crypt
--- END ---