什么是比特币私钥,公钥和地址?
这是比特币中经常出现的三个词,那么他们分别是什么意思呢?他们之间又有什么样的关系呢?
先说说私钥,例如这样的一段字符串:
5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss,就是一个私钥。只要是正确支持比特币协议的应用都可以把这段字符串识别为私钥,转换成公钥,再转换为地址,如果对应的地址上面有比特币,就可以使用这个私钥花费上面的比特币。公钥和地址的生成都依赖私钥,所以私钥才是比特币世界里面最重要的,有了私钥就能生成公钥和地址,就能够花费对应地址上面的比特币。私钥花费比特币的方式就是对这个私钥拥有的未花费的交易进行签名(加密)。
私钥本质上是32个byte组成的数组,1个byte等于8位二进制,一个二进制只有两种可能性0或者1,所以私钥的总数就是2^(8*32)=2^256个,这个数量已经超过了宇宙中原子的总数,想要遍历所有的私钥,耗尽整个太阳的能量也是不可能成功的。我们所说的比特币私钥的是密码学上面安全的,并不是不可能出现重复的私钥,而是说不可能通过遍历所有的私钥方式,或者其它的方式,找到上面有比特币的私钥,所以私钥是密码学上安全的。
私钥的总数量很大,但是私钥的生成却是要依赖随机,不依赖随机就会大大的降低生成私钥的概率空间,密码学上面安全的随机是指,是指随机是不可预测的,随机的结果是不可遍历的。密码学上安全的随机生成的私钥才能用来存比特币,如果随机不安全,你得到的私钥有可能会和别人的相同,那么你的比特币就有丢失的可能。
32个byte组成的数组是由256个0或者1组成的,如果显示出来,不仅仅是识别率太差,而且太长。因此私钥就会被转换成上面的样子,上面私钥的样子是对32个byte的数组做了Base58的转换,Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址和私钥。相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。主要就是为了肉眼容易识别,在输入的时候不容易打错,不过我更倾向于使用二维码的方式扫描私钥,毕竟上面那段没有规律的字符串输入起来还是挺费劲的。
我们看到的私钥除了以5开头的以外,还有以”L”和”K”开头的私钥,为什么会出现这样的情况呢?5,L,K又带代表什么呢?关于这部分的内容就是说到公钥了。
公钥是由私钥生成的,通过椭圆曲线(ECPoint)生成,一个私钥经过椭圆曲线变换之后会生成一个65个byte的数组,一般我们会看到这样的一个公钥:04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235,公钥一般是把byte数组是经过hex(16进制)的处理之后显示出来的,不同于私钥的Base58,公钥是用来解开私钥签名的数据,使用私钥签名交易之后,会把自己的公钥一起发送,私钥签名的数据可以使用公钥解密,发送公钥之后旷工才能验证私钥的签名的正确性(能不能解开),私钥和公钥是成对出现的,一个私钥签名的数据,只有对应的公钥才能解开,而地址也是从公钥生成的,这样就可以验证花费的交易是不是属于这个地址的。
至于为什么会出现5开头或者L,K开头的私钥,问题就是在公钥上面,例子中的私钥不仅仅包含了32个byte数组的信息,还是私钥version的信息和公钥是否压缩的信息,早期的比特币开发者并不知道生成的公钥是可以压缩的,压缩的公钥只有33个byte,而未压缩的公钥有65个byte。压缩的公钥对比特币的意义更大,因为比特币是去中心化的p2p加密货币,每个节点都会拥有完整的交易记录,除了coinbase(挖矿得到的比特币)以外,每个交易都会发送公钥,支持压缩格式的公钥,交易数据就会减少32个字节,这对整个比特币网络是非常有意义的,整个比特币网络的数据就会因此而减少不少。
而对私钥进行Base58编码的时候,支持未压缩公钥的私钥其实是33位byte数组,第一位存放版本信息,当前值为128。支持压缩公钥的私钥是34位,同样是第一位是version信息,它的值也是128,而多出来的一位是最后一个byte是用来存放是否压缩信息,1就表示是支持压缩格式的公钥,5开头的私钥都是不支持压缩格式的私钥,而L和K开头的都是支持压缩格式的私钥。
公钥是否压缩除了对私钥的显示有影响以外,还是地址有影响。地址是由公钥产生的,看到的地址都是Base58编码处理的,地址的生成比较复杂,说地址之前不得不先说下hash160,地址是由公钥生成的的,但是公钥生成地址的时候会先生成一个hash160。
生成的过程是,先对公钥做一次SHA256,再对得到的结果做一次RIPEMD160,再从结果中取20个byte的数组,这个得到的数组就是得到的hash160,例如:9a1c78a507689f6f54b847ad1cef1e614ee23f1e,在这个20位的byte数组前面再加上一个byte,就是地址的version信息(当前为0)得到一个21位的byte数组,对它进行Base58转换就是我们看到的地址的样子,也就是说hash160和是可以和地址相互转换的。
一个私钥可以有一个压缩的公钥,和一个未压缩的公钥,每个公钥都会生成一个地址,上面私钥就会有两个地址分别为:1HZwkjkeaoZfTSaJxDw6aKkxp45agDiEzN(未压缩公钥),1F3sAm6ZtwLAUnj7d38pGFxtP3RVEvtsbV(压缩公钥),这两个地址都是这一个私钥的地址,每个地址上面的钱都可以用这个私钥花费。但是目前大多数的应用都是支持压缩格式的私钥。
这样就给大家简单的介绍了一个私钥,公钥和地址。
专访 Mable Jiang:复盘 Multicoin 投资方法论与 DeFi 洞察
原文标题:《对话 Mable:复盘 Multicoin Capital 的投资方法论与 DeFi 观察 | 链捕手》受访者:Mable Jiang,Multicoin Capital 执行董事撰文:王...
信标链、PoS、分片……接触以太坊 2.0 得先理解这些术语
原文标题:《以太坊 2.0 术语库》整理:ETH 中文网Attestation 证明证明是指验证者所发起的投票,由验证者的签名聚合而成,用以证明区块的有效性,投票通过验证者的余额进行加权。Attest...
手把手教你搭建 IPFS 私有网络
在联盟链的场景下,IPFS 作为去中心化存储的首选方案,本文将介绍如何使用 go-ipfs 搭建一个私有网络并进行简单使用。...