比特币地址生成过程

    xiaoxiao2025-05-20  40

    比特币地址生成过程

     https://blog.csdn.net/u013137970/article/details/84594822

     

    目录

    1 比特币地址生成过程2 地址实例 2.1 主网地址实例2.2 测试网地址实例3 参考资料

     

    1 比特币地址生成过程

    一个比特币地址的生成过程如下图所示:

    如上图所示,比特币的生成过程分为以下几步:

    a. 产生一个随机数,作为私钥; b. 由私钥生成公钥; c. 将生成的公钥进行SHA256运算; d. 将生成的256位哈希值进行RIPEMD160运算; e. 将版本号和公钥哈希值进行双SHA256运算得到校验码; f. 将版本号、公钥哈希和校验码连接并进行Base58转换。

    2 地址实例

    2.1 主网地址实例

    比特币私钥本质上是一个256位的0和1随机序列。从一个私钥生成比特币地址的过程从上图中已经清楚的知道了,接下来将从一个真实的例子说明整个过程。在此,需要使用比特币命令行工具Libbitcoin Explorer,这是一个功能强大的比特币命令行工具。

    a. 产生一个随机数,作为私钥

    $ bx seed e0dac469a482f6f06fa4c1e33ae0cd8751e87156b2cdaa75 #随机种子 $ bx ec-new e0dac469a482f6f06fa4c1e33ae0cd8751e87156b2cdaa75 6cad8e955967818e73a9ad1c8b0a4423910634e92a42b36820edc3a88606c7d0 #私钥 1234

    b. 由私钥生成公钥

    $ bx ec-to-public 6cad8e955967818e73a9ad1c8b0a4423910634e92a42b36820edc3a88606c7d0 02373f06458bc5ac5810d94a26b67963bef01fb52cb1c9ab7b0103fae27dbce6a3 #压缩格式公钥 12

    生成的公钥是压缩格式公钥,因此长度是33字节。首字节 02 表示该公钥是压缩格式,其Y坐标是偶数值。如果首字节为 03,则该公钥也是压缩格式,其Y坐标是奇数值。

    这个公钥的非压缩格式值为 04373f06458bc5ac5810d94a26b67963bef01fb52cb1c9ab7b0103fae27dbce6a30f71963b7f442c7a96ae7b6436f2ea92c917d2484fa0d1e7f988df22a8f35b2c。首字节 04 表示该公钥为非压缩格式。

    c. 将生成的公钥进行SHA256运算

    $ bx sha256 02373f06458bc5ac5810d94a26b67963bef01fb52cb1c9ab7b0103fae27dbce6a3 52c56b7b490e6f0455e94a3889bf585b27bb7b4e514a0225d79c0e646208fd93 #公钥的SHA256哈希值 12

    d. 将生成的256位哈希值进行RIPEMD160运算

    $ bx ripemd160 52c56b7b490e6f0455e94a3889bf585b27bb7b4e514a0225d79c0e646208fd93 34c18387ebedacab545ced2027c461ce05077468 #RIPEMD160哈希值 12

    e. 版本号和公钥哈希值进行双SHA256运算得到校验码

    比特币主网的地址版本号为00,加到上一步得到的哈希值前,然后计算双SHA256哈希值。

    $ bx sha256 0034c18387ebedacab545ced2027c461ce05077468 #首字节为主网版本号00 dfd7a84d2936267cc81cc00028704f5d98c7545177526035923f85ee2fe1d851 $ bx sha256 dfd7a84d2936267cc81cc00028704f5d98c7545177526035923f85ee2fe1d851 c6754cbc7fee2f70418f6815aab85008811a93c73546c5d4d4240b755d12a313 #双哈希结果 1234

    最后取双哈希值的前4个字节 c6754cbc 作为比特币地址的校验码。

    f. 将版本号、公钥哈希和校验码连接并进行Base58转换

    $ bx base58-encode 0034c18387ebedacab545ced2027c461ce05077468c6754cbc 15owxYraAxdfneQETbovBVigZg8a5Cv5Ns #最终地址 12

    将版本号 00、公钥哈希 34c18387ebedacab545ced2027c461ce05077468 和校验码 c6754cbc 依次连接得到 0034c18387ebedacab545ced2027c461ce05077468c6754cbc ,并进行Base58转换,得到最终的压缩格式地址 15owxYraAxdfneQETbovBVigZg8a5Cv5Ns。

    因为Base58转换可逆,可以从地址转化为16进制字符串:

    $ bx base58-decode 15owxYraAxdfneQETbovBVigZg8a5Cv5Ns 0034c18387ebedacab545ced2027c461ce05077468c6754cbc 12

    前面提到,公钥格式表示可以压缩格式表示,也可以非压缩格式表示,那么本例中,非压缩格式公钥地址是什么呢?

    $ bx ec-to-address 04373f06458bc5ac5810d94a26b67963bef01fb52cb1c9ab7b0103fae27dbce6a30f71963b7f442c7a96ae7b6436f2ea92c917d2484fa0d1e7f988df22a8f35b2c 16Q8SWS9vbwYX96Njqaf2Hf4EaqTeehBu5 #非压缩格式公钥地址 12

    比特币非压缩格式公钥地址为 16Q8SWS9vbwYX96Njqaf2Hf4EaqTeehBu5。该地址与压缩公钥格式地址 15owxYraAxdfneQETbovBVigZg8a5Cv5Ns 等价,都可以被同一个私钥验证。

    懒得敲代码的同学可以直接在https://www.bitaddress.org/网站上导入本实例的私钥 6cad8e955967818e73a9ad1c8b0a4423910634e92a42b36820edc3a88606c7d0 进行验证。

    2.2 测试网地址实例

    测试网地址生成过程与主网的地址生成过程相同,唯一不同的是采用的版本号,测试网的版本号为0x6f,主网的版本号为0x00。因此,生成比特币测试网地址的过程如下:

    a. 产生一个随机数,作为私钥

    $ bx ec-new e0dac469a482f6f06fa4c1e33ae0cd8751e87156b2cdaa75 6cad8e955967818e73a9ad1c8b0a4423910634e92a42b36820edc3a88606c7d0 12

    b. 由私钥生成公钥

    $ bx ec-to-public 6cad8e955967818e73a9ad1c8b0a4423910634e92a42b36820edc3a88606c7d0 02373f06458bc5ac5810d94a26b67963bef01fb52cb1c9ab7b0103fae27dbce6a3 12

    c.将生成的公钥进行SHA256运算

    $ bx sha256 02373f06458bc5ac5810d94a26b67963bef01fb52cb1c9ab7b0103fae27dbce6a3 52c56b7b490e6f0455e94a3889bf585b27bb7b4e514a0225d79c0e646208fd93 12

    d. 将生成的256位哈希值进行RIPEMD160运算

    $ bx ripemd160 52c56b7b490e6f0455e94a3889bf585b27bb7b4e514a0225d79c0e646208fd93 34c18387ebedacab545ced2027c461ce05077468 12

    e. 版本号和公钥哈希值进行双SHA256运算得到校验码

    注意,此时的版本号为0x6f,表示的是测试网的版本号。

    $ bx sha256 6f34c18387ebedacab545ced2027c461ce05077468 5792fdcc41623473b2656eeab6c39f4c8e369d1302186b6303eeeba01a3316d4 $ bx sha256 5792fdcc41623473b2656eeab6c39f4c8e369d1302186b6303eeeba01a3316d4 0e5c8446d3f7f85168beb2001060bb2f3315e1b7f718ceda4a8fed264e422ac3 1234

    f. 将版本号、公钥哈希和校验码连接并进行Base58转换

    $ bx base58-encode 6f34c18387ebedacab545ced2027c461ce050774680e5c8446 mkKuFbwYyz4vZksrBAnJ1Qw1RfjGuVjVpZ 12

    或者直接指定特定公钥生成测试网的地址:

    $ bx ec-to-address 02373f06458bc5ac5810d94a26b67963bef01fb52cb1c9ab7b0103fae27dbce6a3 -c .bx-testnet.cfg mkKuFbwYyz4vZksrBAnJ1Qw1RfjGuVjVpZ 12

    最终得到比特币测试网的地址mkKuFbwYyz4vZksrBAnJ1Qw1RfjGuVjVpZ。

    3 参考资料

    List of address prefixes:列举了不同前缀码生成不同的比特币地址。
    最新回复(0)