感觉这本书是从比特币客户端的代码讲起,很详细,包含一些细节,如地址的生成、交易的进行,以一个钱包的角度去讲解比特币。比特币的网络上的各个节点也可以看成是钱包。所以,在比特币网络中的挖矿节点、全节点、轻量化钱包,都是比特币网络中的具体的载体。所以,通过钱包来探究比特币的代码也是合情合理的。
第四章 秘钥和地址
数字密钥实际上并不存储在网络中,而是由用户生成之后,存储在一个叫做钱包的文件或简单的数据库中。存储在用户钱包中的数字密钥完全独立于比特币协议,可由用户的钱包软件生成并管理,而无需参照区块链或访问网络。密钥实现了比特币的许多有趣特性,包括去中心化信任和控制、所 有权认证和基于密码学证明的安全模型。
[注] 现实的使用中,由于钱包来管理秘钥,所以用户很少接触,除了创建钱包的时候备份助记词或秘钥,还有就是导入秘钥到钱包中。不过,由于数字货币中,谁控制秘钥,谁就控制了对应的数字资产。所以,能不能拿到秘钥是一个很重要的标准。比如很多交易所,我们是没有对应的账号的秘钥的,这是因为实际上这些交易所是中心化的,数字货币在他们的手里,我们只是被分配了他们虚拟出来的一个交易所的中心化的账户。也就是他可以控制我们在交易所中的数字货币,而我们只是能看到我们在交易所中的一个货币的符号。
密钥是成对出现的,由一个私钥和一个公钥所组成。
[注] 后面介绍的双重签名地址、压缩公钥和非压缩公钥、分层确定性钱包,看起来违背了一个公钥对应一个私钥。如一个私钥可以对应一个压缩格式的公钥和非压缩格式的公钥,但本质上压缩格式的公钥和非压缩格式的公钥是可以相互转换的,是同一个公钥的不同的格式;分层确定性钱包中虽然一个父私钥可以派生出子私钥和孙私钥,但是子私钥会对应子公钥,孙私钥会对应孙公钥;双重签名地址只是地址是一个脚本,本章中没有仔细展开,这里还不确定细节。
比特币的当前所有者需要在交易中提交其公钥和签名(每次交易的签名都不同,但均从同一个私钥生 成)。
[问题] 为什么签名均不一样?是否包含时间?
由私钥产生比特币地址[总结] 私钥(随机产生)通过椭圆曲线相乘得到公钥;公钥通过SHA256和rIPEMD160双重哈希得到地址原型(还需要进行Bash58check);椭圆曲线相乘和哈希计算都是单向的,不可逆向推导的。也就是无法通过地址推导出私钥。
比特币密钥的生成点都是相同的:
{K = k * G}
其中k是私钥,G是生成点,在该曲线上所得的点K是公钥。因为所有比特币用户的生成点是相同的,一个私钥k乘以G将得到相同的公钥K。k和K之间的关系是固定的,但只能单向运算,即从k得到K。这就是可以把比特币地址(K的衍生) 与任何人共享而不会泄露私钥(k)的原因。
[注] 椭圆曲线是密码学中的内容,两个值相加(即乘以2),是这点的切线与曲线的交点再X轴映射得到。
公钥K 被定义为一个点 K = (x, y):
K = (x, y)
[注] x和y都是256比特,公钥有两种格式:非压缩格式:前缀04紧接着两个256比特的数字,即04 x y;
以公钥 K 为输入,计算其SHA256哈希值,并以此结果计算RIPEMD160 哈希值,得到一个长度为160位(20字节)的数字:
A = RIPEMD160(SHA256(K))
公式中,K是公钥,A是生成的比特币地址。
[注] 这里的比特币地址并不是常见的比特币地址。常见的比特币地址还需要通过后面的Base58来重新编码
公钥到比特币地址从公钥到比特币地址Base58不含Base64中的0(数字0)、O(大写字母o)、l(小写字母 L)、I(大写字母i),以及“+”和“/”两个字符。简而言之,Base58就是由不包括(0,O,l,I)的大小写字母和数字组成。
[问题] 这里的Payload是指什么?
[解答] 是指公钥经过两次哈希计算之后的值。所以,在进行base58编码之前还要进行两次的SHA256的计算(进行两次SHA256运算只是为了得到校验码,而不是使用计算之后的值作为地址)。
公钥的压缩格式:如果我们知道了公钥的x坐标,就可以通过解方程y2 mod p = (x3 + 7) mod p得到y坐标。为了区分y坐标的两种可能值,我们在生成压缩格式公钥时,如果y是偶数,则使用02作为前缀;如果y是奇数,则使用03作为前缀。
这种结果会让人迷惑,因为一个私钥可以生成两种不同格式的公钥——压缩格式和非压缩格式,而这两种格式的公钥可以生成两个不同的比特币地址。但是,这两个不同的比特币地址的私钥是一样的。
[注] 压缩格式是为了节省磁盘空间。为了应对一些新钱包不支持非压缩格式的公钥,钱包还引入了WIF格式。
“压缩的私钥”实际上只是表示“用于生成压缩格式公钥的私钥”,而“非压缩格式私钥”用来表明“用于生成非压缩格式公钥的私钥”。
十六进制压缩私钥格式在末尾有一个额外的字节(十六进制为01)
加密私钥(BIP0038)相当于对原始的私钥又加了一层密码。
靓号的计算时间[注] 这里从另一个角度说明了私钥到公钥(或者说地址)的单向性,仅仅11个字符就需要250万年,那么完整的破解一个地址,远远不止这些时间,因为随着地址确定位数的增加,难道呈指数级增加。
网友评论