主页 > 问什么手机安装不了imtoken > 比特币的区块结构 1
比特币的区块结构 1
写这篇文章主要是为了加强自己的理解,增强记忆。 内容全部来自阅读以下网站文章的理解。 没有原创内容。 理解可能有误,实际代码未验证正确性。 如有错误请指正。
《深入区块链原理》系列连载比特币脚本与交易解析——智能合约原型概述
一个比特币区块可以分为区块头和区块体。 区块头主要记录区块的关键字段信息比特币区块结构解析,而区块体则存储放置在区块中的交易信息。 除了第一个区块之外的任何区块都通过记录前一个区块的哈希值与前一个区块相关联,就像一个只能从后往前走的单向通道,当然也可以描述为链,所以它被称为区块链(Block Chain)。
块(Block)大小字段说明
4字节
块大小
块大小,单位字节
80字节
块头
区块头信息
1–9 字节 (VarInt)
交易
Counter 区块中的交易数量
多变的
交易
区块中所有交易记录的数据
问题:Transaction字段作者解释为区块中所有交易记录的数据,但是交易数据不都是记录在区块体中的吗?
块头大小字段描述
4个
字节版本
区块版本号,目前为2
32字节
上一篇、区块哈希
前块(parent block)的块头哈希,Hash算法为double-SHA256
32字节
默克尔根
区块中的交易 Merkle 树根
4字节
时间戳
块创建 UNIX 时间戳
4字节
难度目标
工作量证明算法难度
4字节
随机数
通过改变计数器来达到工作量证明要求的结果
区块头通过 Merkle Root 字段与区块体链接,Merkle Root 是由区块的交易数据生成的 Merkle Tree 的根节点。 构建过程如下图所示:
Merkle Tree生成过程
Merkle树的优势
对于那些存储空间有限的设备(也称为节点),不需要存储完整的区块链(区块头+区块体),只需要存储区块头来验证一笔交易的存在。 上图为例,验证交易TxA是否存在,节点只需要向那些存储完整区块链的节点发送请求,返回的请求中包含HB、HCD,然后将计算出的根节点Hash与区块中记录的根节点Hash,若相同则交易存在,否则不存在。 防篡改,从Merkle Tree的生成过程可以发现,如果树中的任何交易数据发生变化,都会引起根节点的值发生变化,从而得知树中的交易数据块已更改。 块体
区块体存储打包在区块中的交易信息比特币区块结构解析,每笔交易的存储信息如下表所示:
交易结构
交易的锁定时间定义了可以添加到区块链的最早交易时间。 在大多数事务中,它被设置为 0 以指示立即执行。
如果锁定时间不为0且小于5亿,则视为区块高度,即在指定区块高度之前交易不会被写入区块链。
如果锁定时间大于 5 亿,则将其视为 Unix 纪元时间戳(自 1970 年 1 月 1 日以来的秒数),直到这个指定时间,交易才会被纳入区块链。
交易数据结构没有交易费用字段,交易费用由所有输入之和与所有输出之和之差表示,即:
交易费用 = 总和(所有输入)- 总和(所有输出)
交易输入结构如下表所示:
交易输入结构
不管是解锁脚本(Signature script)还是锁定脚本(PubKey script),其实都是比特币软件下可以执行的一段代码
问题:交易哈希值是如何计算的?
交易输出结构如下表所示:
交易输出结构
问:为什么交易输出只有一个锁定脚本?