比特币账本记账过程

2018-09-13 14:31:00

农场游戏开发就找领创网络,下面解读:     


    中本聪设计了“区块链”作为比特币交易信息存储的载体,一段交易时间内得到记账

权的矿工被打包到一个区块中。区块是比特币存储的基本单元,比特币每一个数据区块记

录了神奇数、区块大小、区块头(Block Head)、交易计数、交易详情等五项内容,其中

比特币的神奇数“0xD984BEF”是区块之间的分隔符;区块大小反映了区块的实际占用空

间;区块头负责连接到前一个区块(父区块)并为区块链提供完整性;交易计数记录了区

块记录的所有交易的数量;交易详情则记录一段时间内发生的所有交易。为便于理解,通

常将区块分为区块头和区块体,区块体用于记录一段时间内发生的交易和状态结果。图

2.17所示为区块结构(块头+交易详情)。

    (1)区块头。比特币区块头的主要字段(见表2.4)包括版本号、父区块的哈希

值、Met?kle树的根值(以下简称“Merkle”根)、时间戳、难度目标、随机数等字段,其

中难度目标和随机数的主要作用在于控制区块生成的频率,保证无论算力多么强大,比特

币都要维持大致10分钟产生一个区块,以下重点介绍父区块哈希、Met’kle根、时间戳的

工作机制。

    ①基于父区块哈希构建链式关系。区块哈希是根据区块头的版本、父区块哈希、

Merkle根哈希、时间戳、难度目标、随机数等字段连接起来通过双重哈希计算出来的。区

块之间通过父区块哈希建立了非常稳定的链式结构,从一个区块到前一个区块,直到创世

区块。区块哈希可以被视为区块的“精准快照”,增加、修改、删减任何交易数据都会导

致区块的哈希值发生变化。若区块链中某个区块哈希值发生变化,区块链将在此位置发生

断裂,下一个区块将无法链接到本区块,见图2.18。

    ②所有交易的数字指纹“Merkle根”。哈希二叉树又被称为Mer?kle(梅克尔)

树,不同于普通的二叉树,哈希二叉树采用哈希指针连接左右子树/节点。普通指针指向

数据存储的位置,哈希指针不但可以指向数据存储的位置,还可以验证数据是否被篡改

过。梅克尔树的构建过程如下:

    若最初需要由交易A、B、C、D构成一颗Merkle树,首先根据交易数据得到交易哈

希H。、HB、Hc和HD,交易哈希通过双层SHA256哈希算法实现,即Ha=SH.A256

[SHA256(交易A)],串联相邻叶子节点的哈希值然后哈希之,即Ha和Hb、Hc和Hd分

别链接后再做两次哈希得到Hab(Hab=SHA256[SHA256(Ha+Hb)]和Hcd。,重复上

述动作得到HABc。作为.Merkle根,HABc。代表了A、B、c、D等4个交易。区块中用于激励

矿工的新币发行交易将被作为构建Mer。kle树的第一个交易,这个交易又被称为币基

((;oinbase)交易。如果该区块中只有一个发行交易(如创世区块),那么那笔交易的哈希

就是该区块的Met?kle根(见图2.19)。

    Met-kle树要求有偶数个叶子节点,若为奇数个叶子节点,那最后的叶子节点会被复制

一份以构成偶数个叶子节点(见图2.20)。

    上述构造MeI?kle树的方法适用于从任意数量的交易构造Merkle树(见图2.21)。

    比特币体系中采用梅克尔树的方式存储一个区块中所有交易的主要目的如下:一是保

证区块交易的完整性,如果一个恶意用户尝试在树的下部加入一个伪造的交易,所引起的

改动最终将导致根节点的改动以及区块哈希的改动,梅克尔根实际上代表了所有交易,参

与了区块头哈希的生成,保证了交易的完整性和唯一性;二是支持点对点输出,允许区

块的数据可以零散地传送:节点可以从一个源下载区块头,从另外的源下载与其有关的树

的其他部分,而依然能够确认所有的数据都是正确的;三是提供一种校验区块是否存在某

交易的高效途径,为了证明区块中存在某个特定的交易,不需要进行全量搜索,只需要计

算log:N次,就可以确认区块中是否包含该交易,形成一条从特定交易到树根的认证路径

或者Mex’kle路径即可,交易数量越大效果越明显;四是可以在不存储块中完整交易信息的

情况下验证块中的交易,假设节点要验证区块中交易A是否正确,它可以从别的节点那里

获取Hb、Hcd、Habcd。等哈希值,而无须从对方那里下载完整的交易数据。

    这种不需要维护一条完整的区块链的节点,又被称作“简单支付验证(SPV节点”)。

简单支付验证指的是“支付验证”而不是“交易验证”。“交易验证”非常复杂,涉及验

证是否有足够余额可供支出、是否存在双花、脚本能否通过等,通常由运行完全节点的矿

工来完成。“支付验证”则比较简单,只判断用于“支付”的那笔交易是否已经被验证

过,并得到了多少的算力保护(多少确认数),简单支付基于梅克尔树。简单支付节点不

需要下载整个区块,只需保存区块头确认工作量证明,然后下载与其交易相关的梅克尔树

“分支”去验证交易的存在。这使轻节点只要下载整个区块链的一小部分,就可以安全地

确定任何一笔比特币交易的状态和账户的当前余额。未来,大部分用户都不会运行完整节

点,梅克尔树协议对比特币交易的长期持续性可以说是至关重要的。简单支付验证的工作

原理①如下:

  计算该交易的hash值tX―hash;

  从网络上获取并保存最长链的所有block header至本地;

  定位到包含该tx―hash所在的区块,验证block headei?是否包含在已知的最长链中;

  从区块中获取构建merkle tree所需的梅尔克哈希认证路径,对图2.18中的交易H。而

言,梅克尔哈希认证路径包括Hl、Hij、Hmnop、Habcdefgh;

    根据这些hash值依次计算出父节点,最终计算出merkk―root―hash;

    若计算结果与block header中的merkle―root一.hash相等,则交易真实存在。

    根据该block所处的位置,确定该交易已经得到多少个确认。

    简单支付极大地节省了存储空间,减轻终端用户的负担。block header。只有80个字

节,按照每小时6个的出块速度,每年产出52 560个区块。当只保存block header’时,每

年新增的存储需求约为4M字节,100年后累计的存储需求仅为400M,用户使用普通设备

就可以实现SPV支付验证。

    ③分布式的时间机制。对于人类的生产生活来说,有统一的、准确的时间是非常

必要的,互联网的前辈们很早就发明了NTP(Nel’work Time Protocol,网络时间协议)用于

提供国际标准时间。绝大部分的商业机构使用NTP(NetWOElk Time Protocol,网络时间协

议),但是普通用户或者矿机的时间可能并没有这么准确,那么赢得记账权的矿工在打包

时究竟使用哪个时间呢?比特币没有使用国际标准时间,也不放心矿工的本机时间。每个

比特币节点都有多个同伴节点,节点之间交换时间信息,赢得记账权矿工选用同伴节点

(不少于5个)时间的中位数(中位数比平均数更不容易受到极值的影响)作为区块的时

间。比特币对这个时间也进行了一些限制,如大于前11个区块的中位数,中位数和本地

系统时间差别不超过70分钟等。

    该时间戳能够证实特定数据必然于某特定时刻是的确存在的,因为只有在该时刻存

在了才能获取相应的随机散列值,攻击者更难于操控区块链,所以并不需要太精确。同

时,区块头部Nonce字段只有32bits,能生成的随机空间太小,很可能出现无解(没有

符合难度要求的解)的情况,此时可以通过微调时间戳来辅助挖矿hash值的计算,提

高出块的可能性。区块块头的时间戳并非严格准确的时间,甚至也不保证顺序。多次出

现了后一区块时间早于前一区块时间的情况,例如区块139’793的时间戳是1 312 599

459(北京时间2011/8/6 10:57:39),而其父区块的时间戳是1 312 599 808(北京时

间2011/8/6 11:3:28);区块145 045、145 046、145 047、145 048连续出现这种情况。

比特币采用这种分布式方案的一个优点是比特币的时间不受恶意操控,作为存在性证明的

公信力更强。

    (2)交易存储。区块大小不能超过1MB,区块头只有少量概要信息。区块的主要

信息是交易详情,这些交易以原始交易(又称序列化交易)的方式存储,交易存储的顺序

和梅克尔树的构建顺序一样,区块创建的新币发行交易是所有交易中的第一个,由此查询

区块116219中可以看到该区块存储了5条交易的哈希

菏泽领创网络专注于农场游戏开发

相关内容