比特币地址与密钥

    比特币中没有账户的概念,那么如何确定你的比特币是你比特币,或者说如何证明你是你?
    这个主要应用到密码学,举个简单的例子,小王向小张转100btc,其实是把这100btc放到区块链上的,然后使用锁定脚本把这笔钱锁定到 小张的地址,而小张只需要提供签名和公钥就可以使用这笔钱;同样的道理小张要花这笔钱的时候,也是将btc锁到一个新的地址,由下个人解开去花费;那么这里小张的地址,是什么呢,这次主要介绍一下比特币中的钱包,地址等概念。

   
    公钥和私钥

    在比特币中,私钥相当于密码,而公钥相当于你的账号;别人向你的公钥地址转钱,你用私钥去取钱。
    私钥就是⼀个随机选出的数字⽽已。如果我们自己随便写一个,肯定安全性不够容易被破解的,毕竟和钱相关,这一步很重要的,⼀般是通过在⼀个密码学安全的随机源中取出⼀⻓串随机字节,对其使⽤SHA256哈希算法进⾏运算,这样就可以⽅便地产⽣⼀个256位的数字。
    通过椭圆曲线算法可以从私钥计算得到公钥,这是不可逆转的过程: K = k * G 。其中 k 是私钥, G 是被称为⽣成点的常数
点,⽽ K 是所得公钥。其反向运算,被称为“寻找离散对数”——已知公钥 K 来求出私钥 k ——是⾮常困难的,就像去试验所
有可能的 k 值,即暴⼒搜索。反向运算困难可以简单的理解成,你知道公钥是1024,1024=k*G,那么你能才出来k是多少吗?当然这个比较简单,如果公钥K是一个非常大的数字呢?你可以在想想结果会怎么样。
    
    比特币地址

    上文说的小张的地址是什么呢,现在就要解释一下他是如果生成的。

1、添加版本的目的是为了明确需要编码的数据类型,数据类型如下:

2、 添加校验码主要是为了检测转录过程中出现的错误;
3、Base58check是什么?
    让我们从进制说起来,
    二进制:0、1
    十进制:0~9
    十六进制:0~9,A~F
    Base64:0~9,a~z,A~F,以及连个符号(例如,-、+)
    Base58:是Base64编码格式的⼦集,同样使⽤⼤⼩写字⺟和10个数字,但舍弃了⼀些容易错读和在特定字体中容易混淆
    的字符。具体地,Base58不含Base64中的0(数字0)、O(⼤写字⺟o)、l(⼩写字⺟L)、I(⼤写字⺟i),以
    及“+”和“/”两个字符。
    Base58Check:是⼀种常⽤在⽐特币中的Base58编码格式,增加了错误校验码来检查数据在转录中出现的错误。校验码⻓4个
    字节,添加到需要编码的数据之后。
最终生成的这个地址,就是你的账号了。

    密钥格式
公钥和私钥的都可以有多种编码格式。⼀个密钥被不同的格式编码后,虽然结果看起来可能不同,但是密钥所编码数字并没
有改变。这些不同的编码格式主要是⽤来⽅便⼈们⽆误地使⽤和识别密钥。
私钥格式
    不同格式之间是可以转换的。
公钥格式
    公钥也可以⽤多种不同格式来表⽰,最重要的是它们分为⾮压缩格式或压缩格式公钥这两种形式。
    公钥是在椭圆曲线上的⼀个点,由⼀对坐标(x,y)组成。公钥通常表⽰为前缀04紧接着两个256⽐特的
数字。其中⼀个256⽐特数字是公钥的x坐标,另⼀个256⽐特数字是y坐标。前缀04是⽤来区分⾮压缩格式公钥,压缩格式
公钥是以02或者03开头。
                                                                        公钥=04xy
    引⼊压缩格式公钥是为了减少⽐特币交易的字节数,从⽽可以节省那些运⾏区块链数据库的节点磁盘空间。根据椭圆曲线公式,可以分析出,只要知道了x就可以推算出y,所以存储公钥可以省略y,这样公钥的大小就减少了256比特了。但是有一个问题是y的值有正负两种可能,对应到椭圆曲线对应y的奇数偶数,因此,为了区分y坐标的两种可能值,我们在⽣成压缩格式公钥时,如果y是偶数,则使⽤02作为前缀;如果y是奇数,则使⽤03作为前缀。这样就可以根据公钥中给定的x值,正确推导出对应的y坐标,从⽽将公钥解压缩为在椭圆曲线上的完整的点坐标。
    

压缩私钥
    公钥转化成⽐特币地址,得到的地址将会不同于由⾮压缩格式公钥产⽣的地址。但是,这两个不同的⽐特币地址的私钥是⼀样的。
    然⽽,并⾮所有的客⼾端都⽀持压缩格式公钥,于是那些较新的⽀持压缩格式公钥的客⼾端就不得不考虑如何处理那些来⾃较⽼的不⽀持压缩格式公钥的客⼾端的交易。⽐特币钱包应该扫描哪个⽐特币地址呢?新客⼾端不知道应该使⽤哪个公钥:因为不论是通过压缩的公钥产⽣的⽐特币地址,还是通过⾮压缩的公钥产⽣的地址,两个都是合法的⽐特币地址,都可以被私钥正确签名,但是他们是完全不同的⽐特币地址。
    为了解决这个问题,当私钥从钱包中被导出时,较新的⽐特币客⼾端将使⽤⼀种不同的钱包导⼊格式(Wallet Import
Format)。私钥被加了后缀01,⽤以表明该私钥是来⾃于⼀个较新的钱包,只能被⽤来⽣成压缩的公钥。私钥是⾮压缩的,也不能被压缩。“压缩的私钥”实际上只是表⽰“⽤于⽣成压缩格式公钥的私钥”,⽽“⾮压缩格式私钥”⽤来表明“⽤于⽣成⾮压缩格式公钥的私钥”。为避免更多误解,应该只可以说导出格式是“WIF压缩格式”或者“WIF”,⽽不能说这个私钥是“压缩”的。
    要注意的是,这些格式并不是可互换使⽤的。在较新的实现了压缩格式公钥的钱包中,私钥只能且永远被导出为WIF压缩格
式(以K或L为前缀)。对于较⽼的没有实现压缩格式公钥的钱包,私钥将只能被导出为WIF格式(以5为前缀)导出。这样做
的⽬的就是为了给导⼊这些私钥的钱包⼀个信号:到底是使⽤压缩格式公钥和⽐特币地址去扫描区块链,还是使⽤⾮压缩格
式公钥和⽐特币地址。

猜你喜欢

转载自blog.csdn.net/xq723310/article/details/80213015