区块链网站|NFTS BTC教学指南 向老廖学习区块链(廖雪峰)(5)教程:公钥和地址

向老廖学习区块链(廖雪峰)(5)教程:公钥和地址

广告位

跟老廖(廖雪峰)学习区块链(5)教程:公钥和地址

公钥比特币的公钥是从私钥计算出来的。

私钥本质上是一个256位的整数,标记为k,根据比特币采用的ECDSA算法,我们可以推导出两个256位的整数,称为(x,y),这两个256位的整数是未压缩格式的公钥。

由于ECC曲线的特性,实际上可以从未压缩格式的公钥(X,Y)的X计算出Y,但是需要知道Y的奇偶性,所以可以从(X,Y)计算出X '作为压缩格式的公钥。

压缩格式的公钥实际上只保存256位整数X,但需要根据Y的奇偶性加上02或03作为前缀,Y为偶数时加02,否则加03,这样就得到一个1 ^ 32=33字节的压缩公钥数据,记为X’。

注意,压缩格式的公钥和未压缩格式的公钥可以相互转换,但私钥不能反向推导。

未压缩格式的公钥目前很少使用,因为未压缩格式的公钥签名的脚本数据会比较长。

让我们看看如何从私钥计算公钥:

const bit coin=require(' bitcoinjs-lib ');设wif=' kwdmajgmeryanjeui 5 SHS 7 jkmpzvvipyvb 2 ljgu 1 zxjwyvp 98617 'ecPair=比特币。EC pair . from wif(wif);//导入私钥//计算公钥:让pubkey=ecpair。getpublickybuffer();//返回缓冲区对象console . log(pubkey . tostring(' hex '));//02或03开头的压缩公钥

构造完ECPair对象后,可以通过getPublicKeyBuffer()将公钥数据作为缓冲区对象返回。

应特别注意地址。比特币的地址不是公钥,而是公钥的哈希,即可以从公钥推导出地址,但不能从地址推导出公钥,因为哈希函数是单向函数。

以压缩格式的公钥为例,从公钥计算地址的方法是用1 ^ 32=33字节对公钥数据进行Hash160(即先计算SHA256,再计算RipeMD160),得到一个20字节的Hash。然后加上0x00前缀得到1 ^ 20=21字节的数据,再计算4个字节的校验码放在一起得到1 ^ 20 ^ 4=25字节的数据:

Base58对上述25个字节的数据进行编码,得到一个总是以1开头的字符串,这个字符串就是比特币地址。整个过程如下:

使用JavaScript实现公钥到地址的编码如下:

const bit coin=require(' bitcoinjs-lib ');let public key=' 02d 0 de 0 aaeaefad 02 b 8 BDC 8 a 01 a 1 b 8 b 11 c 696 BD 3d 66 a2 C5 f 10780d 95 b 7 df 42645 c 'ecPair=比特币。EC pair . frompublickeybuffer(buffer . from(public key,' hex '));//导入公钥//计算地址:let address=EC pair . get address();console.log(地址);//1计算地址时,不需要知道私钥,可以直接从公钥计算地址,也就是通过ECPair.fromPublicKeyBuffer构造一个没有私钥的ECPair就可以计算地址。

需要注意的是,非压缩格式的公钥和压缩格式的公钥哈希得到的地址都是从1开始的,所以从地址本身无法区分使用的是压缩格式的公钥还是非压缩格式的公钥。

以1开头的字符串地址是比特币收款地址,可以安全地向任何人公开。

仅提供地址不会让其他人知道公钥。一般来说,公开公钥没有安全风险。事实上,如果在一个地址有相应的基金,你需要提供一个公钥来花费该基金。如果一个地址的资金至少被使用过一次,则该地址的公钥实际上是公开的。

私钥、公钥和地址的推导如下:

总结比特币的公钥是根据私钥用ECDSA算法计算出来的。公钥有两种表示:压缩的和未压缩的,这两种表示可以相互转换。

比特币的地址是公钥哈希的代码,而不是公钥本身,可以从公钥推导出地址。

不能从地址推导出公钥,也不能从公钥推导出私钥。

要在线运行代码,请使用浏览器查看以下链接。

https://www . Liao Xuefeng . com/wiki/1207298049439968/121021535

广告位
本文来自网络,不代表区块链网站|NFTS立场,转载请注明出处:https://www.qklwz.com/btb/btbjiaoxue/61654.html

作者: 董方卓

上一篇
下一篇

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部