[译] block headers

block headers 以80字节的格式进行序列化,然后作为比特币工作量验证算法的一部分进行哈希处理,使序列化头部格式成为共识规则的一部分。

bytes name 数据类型 描述
4 version int32_t block version 指示要遵循哪一组块验证规则
32 previous block header hash char[32] SHA256(SHA256())hash,以前面 block 的 header 的内部字节顺序排列。这确保在不改变该块的头部的情况下不能改变先前的块。
32 merkle root hash char[32] SHA256(SHA256())是按照内部字节排序的hash。 merkle root 源自该块中包含的所有交易的hash值,确保在不修改头部的情况下不会修改这些交易。
4 time uint32_t 块时间是矿工开始散列头部时的Unix纪元时间(根据矿工)。 必须严格大于前11个block的平均时间。 根据其时钟,全节点将不会接受超过两个小时的headers。
4 nBits uint32_t 此块的header hash 的目标阈值的编码版本必须小于或等于。
4 nonce uint32_t 任意数量的矿工都可以修改头部 hash 来确保能够产生小于或等于目标阈值的hash。 如果所有32位值都经过测试,则可以更新时间或更改coinbase交易并更新merkle根。

哈希按内部字节顺序排列; 其他值都是小端顺序。

block header的消息示例如下:

02000000 ........................... Block version: 2

b6ff0b1b1680a2862a30ca44d346d9e8
910d334beb48ca0c0000000000000000 ... Hash of previous block's header
9d10aa52ee949386ca9385695f04ede2
70dda20810decd12bc9b048aaab31471 ... Merkle root

24d95a54 ........................... Unix time: 1415239972
30c31b18 ........................... Target: 0x1bc330 * 256**(0x18-3)
fe9f0864 ........................... Nonce

Block Versions

  • Version 1:在创世区块中被引入(January 2009)
  • Version 2:在Bitcoin Core 0.7.0(2012年9月)中通过软分叉被引入。如BIP34所述,有效的 version2 block 需要 block height parameter in the coinbase。 在BIP34中还描述了拒绝某些块的规则; 根据这些规则,Bitcoin Core 0.7.0及更高版本在 block height 为224,412 处开始拒绝在 coinbase 中没有 version2 的 block height,并在块高度为224,412 的三周后,也就是 227,930 开始拒绝新生成的 version1 的块。
  • version3:在Bitcoin Core 0.10.0(2015年2月)中通过软分叉被引入。当 fork 达到全面执行(2015年7月)时,它需要严格按照 BIP66 中所描述的对新块中的所有ECDSA签名进行DER编码。 自从Bitcoin Core 0.8.0(2012年2月)以来,不使用严格DER编码的交易是非标准的。
  • version4:在 BIP65 中指定并在 Bitcoin Core 0.11.2(2015年11月)中引入的区块,通过软分叉开始启动(2015年12月)。这些块现在支持该BIP中描述的新OP_CHECKLOCKTIMEVERIFY操作码。

用于 version2、3和4 升级的机制通常称为IsSuperMajority(),该功能添加到Bitcoin Core 中以管理这些软分支更改。有关此方法的完整说明,请参阅BIP34

Merkle Trees

merkle root 是使用此块中所有交易的TXID构建的,但首先需要按照共识规则的要求排列TXID:

  • coinbase 交易的 TXID 总是排在第一位。
  • 此块中的任何输入都可以使用同时出现在此块中的输出(假设花费是有效的)。但是,对应于输出的TXID必须放置在与输入对应的TXID之前的某个点。 这可以确保整个区块链的交易在输入之前都有与之对应的输出。

如果一个块只有一个 coinbase 交易,coinbase TXID将会被用作merkle root 的hash。

如果一个块只有一个coinbase交易和一个其他交易,那么这两个交易的TXID按顺序排列,连接成64个原始字节,然后SHA256(SHA256())hash在一起最终形成 merkle root。

如果一个块有三个或更多的交易,则会形成中间的Merkle树行。 TXID按顺序排列并配对,从coinbase交易的TXID开始。 每个对连接在一起作为64个原始字节和SHA256(SHA256())hash形成第二行hash。 如果有一个奇数(非偶数)的TXID,则将最后一个TXID与其自身的副本连接并进行hash。 如果第二行中有两个以上的hash,则重复该过程以创建第三行(并且,如有必要,可以进一步重复以创建附加行)。 一旦获得一行只有两个hash值,这些hash值被连接并哈希来产生merkle root。

上面逻辑有点绕,我们通过一张图来直观感受一下:


merlke.png

串联时,TXID和中间hash总是以内部字节顺序排列,并且当它放入block header时,生成的merkle root也按照内部字节顺序排列。

Target nBits

target threshold 是一个256位无符号整数,header hash 必须等于或低于该header 才能成为块链的有效部分。 然而,header 字段 nBits仅提供32位空间,因此目标号码使用一些称为“紧凑”的精确格式,其工作方式类似于科学记数法的基本256版本:

nBits.png

作为一个 base-256 的数字,nBits可以像字节一样快速地解析,这与解析10进制科学记数法中的小数相同:

serailize.png

尽管 target threshold 应该是一个无符号整数,但原始 nBits 实现继承了已签名数据类的属性,如果设置了有效数的高位,则target threshold为负值。 这是无用的 - header hash被视为无符号数,因此它永远不会等于或低于负目标阈值。 Bitcoin Core以两种方式处理这个问题:

  1. 在解析nBits时,Bitcoin Core 将负目标阈值转换为零目标,该header hash可以等于(理论上至少)。
  2. 当为nBits创建一个值时,Bitcoin Core 会检查它是否会产生nBits,这会被解释为负值; 如果是这样,它将有效位数除以256,并将指数增加1以产生具有不同编码的相同数字。

难度1,允许的最小难度,在mainnet和当前testnet上由nBits值0x1d00ffff表示。 Regtest模式使用不同的难度值1-0x207fffff,uint32_max以下可以编码的最高值; 这允许在regtest模式下几乎立即构建块。

Serialized Blocks

根据当前的共识规则,除非序列化大小小于或等于1 MB,否则块无效。下面介绍的所有字段均按序列化的大小计算

bytes name 数据类型 描述
80 block header block_header block header 部分中描述的格式。
Varies txn_count compactSize uint 此区块中的交易总数,包括coinbase交易。
Varies txns raw transaction 此块中的每笔交易都是原始交易格式。交易必须与他们的TXID出现在merkle树的第一行中相同的顺序出现在数据流中。

在一个区块中的第一笔交易必须是一个coinbase交易,该交易应收集并消费本区块交易支付的任何交易费用。

block height低于6,930,000的所有 block 都有权获得新创建的比特币价值的区块补贴,这也应该用于coinbase交易。 (区块补贴从50比特币开始,每210,000块减半 - 大约每四年一次,截至2017年11月,为12.5比特币。)

交易费和区块补贴一起被称为区块奖励。如果它试图花费比块奖励可用的更多价值,则coinbase交易是无效的。


本文由copernicus 团队 冉小龙 翻译,转载无需授权!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 一、快速术语检索 比特币地址:(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串...
    不如假如阅读 15,849评论 4 88
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    保川阅读 5,934评论 1 13
  • 膨胀罐使用时该注意哪些事项呢?捷登小编以我司wozi膨胀罐为例为您整理如下: 1.wozi膨胀罐出厂时预充压力已设...
    捷登阅读 538评论 0 0
  • 是否黑夜只懂得绚烂寂寞 清醒着放逐冰冷每个段落 倒不如天空瞬间花火 用不着揣测感情脉络 期待通常隐含错过 后来没记...
    晓歌阅读 163评论 0 0