block headers

2024-04-28 00:38
文章标签 block headers

本文主要是介绍block headers,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

block headers

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

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

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

block header的消息示例如下:

02000000 ........................... Block version: 2b6ff0b1b1680a2862a30ca44d346d9e8
910d334beb48ca0c0000000000000000 ... Hash of previous block's header
9d10aa52ee949386ca9385695f04ede2
70dda20810decd12bc9b048aaab31471 ... Merkle root24d95a54 ........................... 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,并在块高度为 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,否则块无效。下面介绍的所有字段均按序列化的大小计算

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

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

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

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


这篇关于block headers的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941923

相关文章

[Linux Kernel Block Layer第一篇] block layer架构设计

目录 1. single queue架构 2. multi-queue架构(blk-mq)  3. 问题 随着SSD快速存储设备的发展,内核社区越发发现,存储的性能瓶颈从硬件存储设备转移到了内核block layer,主要因为当时的内核block layer是single hw queue的架构,导致cpu锁竞争问题严重,本文先提纲挈领的介绍内核block layer的架构演进,然

block对变量捕获的方式

之前见很多文章对block捕获变量的方法,会进行诸如此类的描述:“block会捕获被引用的变量, 并对其进行copy操作, 因此, 可能会导致其引用计数加1,如果处理不好, 可能因循环引用导致内存泄漏。” 实际上, 这种说法并不严谨。block对变量的捕获, 根据变量类型的不同,会采用不同的捕获方式。 (1)静态或者全局变量, 在block中直接是指针传递的方式传入block中,对其进行的操作

Linux block_device gendisk和hd_struct到底是个啥关系

本文的源码版本是Linux 5.15版本,有图有真相: 1.先从块设备驱动说起 安卓平台有一个非常典型和重要的块设备驱动:zram,我们来看一下zram这个块设备驱动加载初始化和swapon的逻辑,完整梳理完这个逻辑将对Linux块设备驱动模型有深入的理解。 zram驱动加载的时候会调用zram_add函数,源码如下: 1887/*1888 * Allocate and initia

Oracle - ORA-01789: Query block has incorrect number of result columns

一、原因     这个错误一般是在执行表之间的相加(union),相减(minus)等SQL语句时,两个个查询块具有不一致的结果列数所导致的。 二、方案     只要将两段SQL语句的列数调整为一致就可以解决。使用union时,要注意数据库字段的格式要一致,如varchar和nvarchar是不一样的。

ARC下的block导致的循环引用问题解析

引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题:【小测试】你真的知道blocks在Objective-C中是怎么工作的吗?,发现竟然做错了几道,才知道自己想当然的理解是错误的,所以抽时间学习了下,并且通过一些测试代码进行测试,产生这篇博客。 Block简介(copy一段) Block作为C语言的扩展,并不是高新

前端面试:对BFC规范(块级格式化上下文:block formatting context)的理解

块级格式化上下文(BFC)是一个独立的渲染区域,具有特定的布局规则。理解BFC对于前端开发非常重要,因为它影响元素的布局和定位。以下是对BFC的一些关键理解: 定义:BFC是一个HTML文档中的部分区域,内部的元素在该区域内独立于外部元素进行布局。BFC的创建可以通过特定的CSS属性,如overflow(非visible)、display: flow-root、position: absolut

猫猫学iOS 之BLOCK的妙用_利用block实现链式编程

猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:场景 我们有个对象人,他有两个方法,一个是学习study,一个是跑步run, 这个人有个怪癖,跑完步之后必须学习,为了实现这个方法并且能调用方便,我们让跑步和学习都回返回自己这个对象作为下一次调用的快捷方式,代码如下: 调用: int main(

iOS CoreAnimation专题——原理篇(二) UIView block动画实现原理

前言CALayer的可动画属性UIView的block动画 注意 再次深入总结 前言 上一章中我们深入研究了UIView和它持有的那个CALayer之间的关系,知道了我们对UIView的各种属性的操作实际上都是间接的操作了CALayer对应的属性。 这一章中我们将进一步探究iOS动画,看看UIView是如何将CoreAnimation封装成block动画的。 CALaye

OceanBase block_file与log过大 的问题

一、说明 block_file 是存放sstable的数据文件,由datafile_disk_percentage 参数与datafile_size参数决定,两个参数同时配置,以datafile_size为主。 datafile_disk_percentage 默认值是90 datafile_size 默认值是0M到正无穷 因为block_file 的大小是预分配的,支持调大,也支持参数调小,但是