请参考以下文章一起阅读:

本文尝试用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

发表评论