bitcoin地址相关总结

比特币密钥
众所周知,数字货币基本都是采用椭圆曲线作为其公钥加密的基础。比特币使用了secp256k1标准所定义的一种特殊的椭圆曲线,其函数描述为:
y 2 m o d p = ( x 3 + 7 ) m o d p y^2modp=(x^3 + 7) mod p y2modp=(x3+7)modp
其中: p = 2 256 − 2 32 − 2 9 − 2 8 − 2 7 − 2 6 − 2 5 − 2 4 − 1 p = 2^{256} - 2^{32} - 2^{9}-2^{8}-2^{7}-2^{6}-2^{5}-2^{4} - 1 p=22562322928272625241另外比特币在这条曲线上,选定了一个G(x,y)作为预定点.

  • 私钥 k
    其实是一串256bit的数字,随机产生,为了方便举例我们假设:
    k=1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32
  • 公钥K
    K = k*G

公钥格式
公钥K,其实也是曲线中的一个点坐标(x,y)。假设:
x = f028892bad7ed57d2fb57bf33081d5cfcf6f9ed3d3d7f159c2e2fff579dc341a
y =07cf33da18bd734c600b96a72bbc4749d5141c90ec8ac328ae52ddfe2e505bdb

  • 非压缩公钥(04||x||y)
    Pub=04f028892bad7ed57d2fb57bf33081d5cfcf6f9ed3d3d7f159c2e2fff579dc341a07cf33da18bd734c600b96a72bbc4749d5141c90ec8ac328ae52ddfe2e505bdb
  • 压缩公钥(02||x or 03 || x)
    回顾曲线公式,对于一条确定的曲线,已知x,将x带入椭圆曲线方程后可以计算出y的值,这也意味着,我们只需要保存x即可,但是会有两个解+y和-y(其平方后值是一样的)。也就是说将x带入方程后会产生两个公钥。(x,y)和(x,-y),都可以作为比特币验签的公钥。我们需要确定选择其中一条,以避免在不同的应用中解压出不同的y值。在素数p阶的有限域计算椭圆曲线的时候,y坐标可能是奇数或者偶数,利用这一特点,我们在压缩公钥的时候,将奇偶性带入就可以确定的选择y了。
    规定:
    02||x 选择偶数的y
    03||y 选择奇数的y
    采用压缩公钥的好处是减少了很多数据的传输和存储

公钥到地址
我们先简单的将公钥转换到地址的方法描述为(RIPEMD160(SHA256(K))),即对公钥SHA256运算后,在进行RIPEMD160运算,可以得到公钥的原始格式的地址addr,就是一串160bit的十六进制串,我们看到的地址是经过了base58编码后的地址。base58编码可以实现数据的压缩,容易阅读而且增加了错误校验值。base58编码同时增加了版本作为前缀也区分地址的类型以及如何使用,以下仅列出base58编码对公钥和私钥的编码类型。

类型版本前缀编码后的前缀
Bitcoin Address0x001
Bitcoin Testnet Address0x6Fm or n
BIP-32 Public Key0x0488B21Expub
BIP-32 Private Key0x0488ADE4xprv
Testnet BIP32 pubkey0x043587CFtpub
Testnet BIP32 private0x04358394tprv
PrivateKey WIF0x805,K,L

生成过程见下图:
在这里插入图片描述
私钥的格式
同公钥一样,原始的私钥也是十六进制串,长度为256bit即32B,为了便于导出和传递,对私钥也进行base58的编码,对私钥采用base58编码的方式成为Wallet Import Format(稍后解释这个名词的意义)。私钥的格式如下:

类型前缀描述举例
原始格式(256bit)32B的原始数据(RawData)0x1e,0x99,0x42,…,0xed,0xcc,0x32
Hex格式64B字符串1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32
WIF5base58(version=0x80,RAWDATA)5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
WIF-compressedK/Lbase58(version=0x80,RAWDATA|0x01)KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

WIF-compressed,并不是缩短了私钥,反而是增加一个字节,compressed不是指“压缩私钥”

关于 WIF(Wallet Import Format)的意义
早期的钱包采用的是非压缩的公钥,而新开发的钱包大多数都采用压缩的公钥。在目前的区块链中即有早期的非压缩公钥生成的地址,也有压缩公钥生成的地址。那么设想,你要导入一个私钥到自己的钱包里,你是要用该私钥对应的非压缩公钥生成的地址去区块链上检索交易呢,还是用压缩的公钥生成的地址去检索?这就是WIF存在的意义!当一个私钥导出时候,若采用WIF格式,那么就用对应的非压缩公钥去检索交易,若采用WIF-compressed格式,则用压缩公钥去检索。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值