解析的过程是这样的,首先定义了一系列的宏, 我们只叙述用到的宏:
测试了生成包含 15 笔交易的
测试了生成包含 32 笔交易的
比特币系统中的 Merkle 树的计算其实包含有一些很隐晦的细节,这些细节很重要,它们会影响到整个计算结果的正确性, 但是比特币的文档好像没有对这些细节做出描述,当然比特币庞杂的源代码中肯定包含了这些细节,于是我画了一张图用于描述比特币系统中 Merkle 树的计算过程, 图中包含了那些隐晦的细节。
下图是包含三笔交易的 Merkle 树的计算过程,其中涉及到了孤节点的复制细节,
在比特币系统中, Merkle 树的叶子节点存储的是交易 ID 即 Txid, 所谓的叶子节点即没有分支的,通过对单个 Tx 进行 Hash 计算得到的那个节点, 它们属于 Merkle 树的第一层(从下往上数, root 节点属于顶层)。 通过比对 Root 节点和叶子节点我们能够验证交易数据是否正确可信, 那么为什么 Merkly 树能够验证数据正确可信呢? 要知道比特币是去中心化的,每个人都可以冒充成一个可信节点发送伪造的交易数据。为了回答这个问题,我们要好好聊聊比特币区块链的不可篡改性. 在 2017年8月1日发布了一种新的加密货币叫 BCC, 全称 Bitcoin Cash, 从名字来看这种货币和比特币很有关系, 事实上也是如此, 下面对 BCC 的简介摘录于 :
简单来说,BCC是比特币的一种硬分叉产生的币,它修改了比特币的代码,支持大区块,并且不包含Segwit。BCC的前世就是比特币,分叉之前它存储的区块链中的数据以及运行的软件是和所有比特币节点兼容的,而到了分叉那一刻以后,它开始执行新的代码,打包大区块,这样就在链上形成了一个硬分叉。目前BCC还是一个期货,将于8月1日正式分叉成为一个新币种。——BCC是根据Bitcoin ABC方案产生的区块链资产,Bitcoin ABC方案为保持协议稳定简单,去除了Segwit功能,支持将区块大小提升至8M,是链上扩容的技术路线。Bitcoin ABC代码基于比特币协议的稳定版本进行了改进,其认为不包含Segwit将具有更大的稳定性、安全性、鲁棒性,是现行比特币协议和比特币系统的备份,BCC将从2017年8月1日20:20开始挖矿。
ABC方案指的是增加了一些和原来比特币不同的特性, 矿场背书
指的是要有大型的矿场为这种新币生成新区块。
由于 BCC 只是继承了比特币原有的区块链,它并没有改动比特币区块链的任何数据(其实也没有办法改),所以 BCC 发布后,原先拥有比特币的人都可以在 BCC 的区块链上自动拥有相同数量的 BCC 币, BCC 网络继承了比特币网络的数据,但是两个网络是互相独立的,BCC 网络不会接受比特币的交易, 比特币网络也不会接受 BCC 的交易.
在比特币的世界里做出一种新的货币比较容易, 但是把新货币做成功很难.
我们可以把上面的公式改下,让它更抽象化: 大佬背书 + X 方案 + 金主背书 = X 币
, 现在我要做一种新的货币叫它 VoidCoin, 我认识很多大佬,但是大佬都不认识我,所以我请中本聪背书, VoidCoin 的方案设定为: coinbase 的首个单词必须为 Void, 最后一步就是找土豪来支持这种货币了(推广,开矿等等),
当然如果你真的能够实现一种非常优秀的能够改变游戏规则的方案,金主会自动找上门来的。一句话总结:
比特币区块链上的每一个字节都凝聚了真金白银.
在比特币区块链上哪怕是有一个字节做了改变,都会引起连锁反应, 需要把区块链上的每一个区块的 Hash 都重新计算一遍, 这是需要花费巨大的算力才能做到的,在前面我已经论述了 比特币区块链上的每一个字节都凝聚了真金白银
, 所以你也必须花费巨大的真金白银才能改变整条链,
并且这个”改变”貌似对你没有任何好处,因为比特币的非对称加密机制可以阻止你盗窃别人的比特币, 你只能开一条不被其他矿场认可的新链。这样的话即使你拥有巨大的算力,如果你稍微有理性的,你就不会去篡改比特币区块链, 所以说比特币从技术和动机两个方面打消了别人篡改比特币数据的念头。
前面我们已经论述了比特币区块链的不可篡改性, 我们把它当作一个定理:
比特币的区块链只能在链尾由矿工添加区块,如果比特币区块链被篡改了,我们就认为它不是比特币的区块链了,而是变成了另外一种区块链,当然如果有人破解了 SHA256 算法,那么比特币的区块链就被破坏了, 由此我们升级上面的定理为:
比特币区块链要么被破坏,但是不可被篡改
从比特币区块链的不可篡改定理出发,我们来论述 Merkle 树的作用。
在比特币网络中有一种 SPV 节点, 这种节点有下面的特性:
简单地来说 SPV 节点并不会下载全部的区块链数据,而只是下载区块头, 这些区块头组成的链我们称它为区块头链,这条链并不包括交易数据. 当前的某个时刻比特币区块链的高度是 489330, 一个区块头的大小是 80 个字节, 那么由区块头组成的链的大小大概是 37 M, 这和整个区块链动辄上几百 G 的数据相比少了很多很多。
由区块头组成的链在一定程度上和全节点上的区块链是等价的, 区块头组成的链同样遵守 比特币区块链不可篡改
的定理, 虽然区块头组成的链缺少了详细的交易数据,但是这些交易数据通过计算成 Merkle 树被归纳成了区块头中的 Merkle Root. 不可篡改定理保证了区块头中的 Merkle Root 是合法的。
场景一: SPV 节点下载某个区块的全部交易数据
因为比特币系统是一个去中心化的系统,它并没有一个所谓的中心服务器或中心节点, 所以我用比特币网络代替服务器或者中心这一术语.
当 SPV 节点请求比特币网络下载某个区块的交易数据时, 它首先会从比特币网络下载这个区块的 Merkle 树, SPV 节点会对这棵 Merkle 树做两步工作:
上面两步通过后,就可以下载交易数据了, 对下载的每一笔交易数据可以求出它的 Txid, 然后验证 Txid 是否和 Merkle 树的叶子节点相匹配, 如果某个叶子节点没有匹配,可以单独下载这个叶子节点对应的交易,而不需要重新下载全部的交易.
场景二: SPV 节点验证区块中存在某笔交易
比特币网络是一个去中心化的网络,这个网络和我们日常生活中经常接触的网络有很大的不同,比如我们通过某个电商网站购买了一件商品, 我们购买这件商品的订单信息都存储在这个电商网站的数据库里, 假设我们要查询自己是否购买了这件商品,电商网站只需返回是或否就行了,当然实际的情况可能会返回这个订单的详情,但是本质是一样的. 也就是说在一个中心化的网络里,服务器是不需要向请求者证明自己响应的真实性,响应的真实性由自己的权威背书。比特币网络是一个去中心化的网络,它并没有一个权威中心,它对请求者的响应是需要自证真实性的. 假设 SPV 节点向比特币网络请求验证交易 Tx1 是否存在于区块中,这时候比特币网络不能简单地返回是或者否,如果 Tx1 不存在,可以返回否, 如果 Tx1 存在, 则要返回一支 Merkle 树的路径, SPV 节点可以通过这支 Merkle 路径自行验证交易是否存在, 这里的意思是: 我告诉你 Tx1 是存在的,并且你可以通过我发给你的 Merkle 路径验证我确实没有骗你.
画一张图说说什么是 Merkle 路径.
上图中绿色的部分表示 Merkle 树的一支路径,如果 SPV 节点向比特币网络请求验证交易 c2b2a2
是否存在于区块中,如果答案为是, 比特币网络会向 SPV 节点返回如上图的一支路径, SPV 节点接收到这支路径后会做如下两个工作:
上面两个场景的验证都是基于下面的定理, 并且受益于 Merkle 树, 如果只是简单的将所有交易合并然后计算 Hash 值是满足不了上面的两个场景的。
比特币区块链要么被破坏,但是不可被篡改
我们在前面已经完成了下面的工作:
将上面的三步工作组合起来,就可以生成创世区块了. 比特币创世区块的难度为 1 的 target 是: 0x1d00ffff
, 这个难度对于我们家用的电脑还是有难度的, 如果想缩短生成创世区块的时间可以将其增大为: 0x1e00ffff
甚至 0x1f00ffff
,
后者花的时间更短,如果使用后者, 创建区块的时间在我的家用电脑上大概是 10 秒, 详细的代码可以通过 访问,
上面的代码从上到下,基本上是按照下面的步骤进行的:
进行难度计算,算出 nonce, 这时候创世区块就已经做出来了
比特币中绝大部分的数据是以 Little-Endian 形式存储的, 我在第1节的文章中描述解析交易的时候经常直接使用 fread
读取数据, 比如:
如果考虑到跨平台运行,就一定要考虑到目标主机的 Endianness.
汇编语言复习题(带答案)
1、在汇编语言程序的开发过程中使用宏功能的顺序是(C)。DX
C、宏定义,宏调用,宏展开
D、宏定义,宏展开,宏调用
2、汇编语言源程序中,每个语句由四项组成,如语句要完成一定功能,那么该语句
中不可省略的项是(B)。DX
3、可屏蔽中断就是它的请求是否被CPU响应要受(IF)的控制。DX
4、使用LINK连接命令,执行后可生成文件的扩展名为(EXE)。DX
5、在寄存器间接寻址中,如果指令中指定的寄存器为BP,则操作数在段中,段地址
6、注释项用于说明程序段或是一条和几条指令的功能,一般用;(或分号)表示注释
7、DOS系统功能调用方式为:(1)置入口参数;(2)中断程序编号送AH寄存器后执行INT21H。TK
8、通常主程序和子程序间参数传送的方法有三种:用寄存器传递、用存储单元传递、用堆栈传递(顺序可调换)。TK
9、CPU暂停当前程序的执行,转而执行处理紧急事务的程序,并在该事务处理完后能自动恢复执行原先程序的过程。在此,称引起紧急事务的事件为中断源。TK
10、在字符串操作指令中,DS∶SI指向源串,ES∶DI指向目的串。TK
11、计算机系统通过接口与外围设备通信。TK
12、键盘I/O、显示I/O和打印I/O分别对应、和号中断。TK
13、字符显示模式缓冲区中的一个字对应于屏幕上的一个字符。每个字的第一个字节
为显示字符的ASCII码,第二个字节为显示字符的属性。TK
14、简述上机运行汇编语言程序的过程。JD
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。