这是比特币中经常出现的三个词,那么他们分别是什么意思呢?他们之间又有什么样的关系呢? 先说说私钥,例如这样的一段字符串: 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。 (责任编辑:admin) |