比特币的区块数据里包含了比特币链上的核心信息,包括比特币如何交易,区块扩容等问题。

比特币从诞生到现在,每10分钟诞生一个区块,访问 https://blockchain.info/ 查看最近的区块信息,可以看到当前的区块大小已经接近或超过中本聪设置的1MB容量。

一、区块链数据结构

一个完整的区块结构主要由以下几部分构成:

数据项 字节 字段 说明
Magic NO 4 魔数 常数0xD9B4BEF9
Blocksize 4 区块大小 用字节表示的该字段之后的区块大小
Blockheader 80 区块头 组成区块头的几个字段
Transaction counter 1-9 交易计数器 该区块包含的交易数量,包含coinbase交易
Transactions 不定 交易 记录在区块里的交易信息,使用原生的交易信息格式,并且交易在数据流中的位置必须与Merkle树的叶子节点顺序一致

二、区块信息解析

我们从 https://webbtc.com 选择一个区块哈希值为000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506的早期区块进行分析。

可以看到该区块中包含了三笔交易信息,下面对区块信息字段进行解析。

1.区块头分析

前80个字节是区块头。

1
2
3
4
5
6
7
8
9
{
    "hash""000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506",
    "ver": 1,
    "prev_block""000000000002d01c1fccc21636b607dfd930d31d01c3a62104612a1719011250",
    "mrkl_root""f3e94742aca4b5ef85488dc37c06c3282295ffec960994b2c0d5ac2a25a95766",
    "time": 1293623863,
    "bits": 453281356,
    "nonce": 274148111
}

  

字节 字段 说明
4 版本 区块版本号,表示本区块遵守的验证规则
32 父区块头哈希值 前一区块的哈希值,使用SHA256(SHA256(父区块头))计算
32 Merkle根 该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算
4 时间戳 该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己2个小时时间戳的区块
4 难度目标 该区块工作量证明算法的难度目标,已经使用特定算法编码
4 Nonce 为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数

说明:

  • 版本、父区块头哈希值和Merkle根采用的是小端格式编码,即低有效位放在前面。
  • 时间戳表示的是自1970年1月1日0时0分0秒以来的秒数

2.Coinbase交易信息分析

一个区块第一个交易规定为coinbase交易,即由挖矿产生的比特币奖励,可以看到目前挖出每个区块的奖励是12.5个比特币,下一次减半会发生在2020年。

除了挖矿奖励,“矿工”的激励还有新增账本记账的手续费,在未来比特币总量不增加之后,后者会成为矿工的主要收入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
    "hash""8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87",
    "ver": 1,
    "vin_sz": 1,
    "vout_sz": 1,
    "lock_time": 0,
    "size": 135,
    "in": [{
        "prev_out": {
            "hash""0000000000000000000000000000000000000000000000000000000000000000",
            "n": 4294967295
        },
        "coinbase""044c86041b020602"
    }],
    "out": [{
        "value""50.00000000",
        "scriptPubKey""041b0e8c2567c12536aa13357b79a073dc4444acb83c4ec7a0e2f99dd7457516c5817242da796924ca4e99947d087fedf9ce467cb9f7c6287078f801df276fdf84 OP_CHECKSIG",
        "next_in": {
            "hash""f3e6066078e815bb24db0dfbff814f738943bddaaa76f8beba360cfe2882480a",
            "n": 12
        }
    }],
    "nid""70ab531a68f973f7d20b8260cb5e7fecba3699c48715b8b44539ff9776d0b88e"
}

  

字节 字段 描述
4 版本 这笔交易参照的规则
1-9 输入计数器 包含的交易输入数量
32 交易哈希 不引用任何一个交易,值全部为0
4 交易输出索引 固定为0xFFFFFFFF
1-9 Coinbase数据长度 coinbase数据长度
不定 Coinbase数据 在V2版本的区块中,除了需要以区块高度开始外,其它数据可以任意填写,用于extra nonce和挖矿标签
4 顺序号 值全部为1,0xFFFFFFFF
1-9 输出计数器 包含的交易输出数量
8 总量 用聪表示的比特币值
1-9 锁定脚本大小 用字节表示的后面的锁定脚本长度
不定 锁定脚本 一个定义了支付输出所需条件的脚本
4 锁定时间 一个区块号或UNIX时间戳

3.交易信息记录

下面来看下普通的交易记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
    "hash""fff2525b8931402dd09222c50775608f75787bd2b87e56995a7bdd30f79702c4",
    "ver": 1,
    "vin_sz": 1,
    "vout_sz": 2,
    "lock_time": 0,
    "size": 259,
    "in": [{
        "prev_out": {
            "hash""87a157f3fd88ac7907c05fc55e271dc4acdc5605d187d646604ca8c0e9382e03",
            "n": 0
        },
        "scriptSig""3046022100c352d3dd993a981beba4a63ad15c209275ca9470abfcd57da93b58e4eb5dce82022100840792bc1f456062819f15d33ee7055cf7b5ee1af1ebcc6028d9cdb1c3af774801 04f46db5e9d61a9dc27b8d64ad23e7383a4e6ca164593c2527c038c0857eb67ee8e825dca65046b82c9331586c82e0fd1f633f25f87c161bc6f8a630121df2b3d3"
    }],
    "out": [{
            "value""5.56000000",
            "scriptPubKey""OP_DUP OP_HASH160 c398efa9c392ba6013c5e04ee729755ef7f58b32 OP_EQUALVERIFY OP_CHECKSIG",
            "address""1JqDybm2nWTENrHvMyafbSXXtTk5Uv5QAn",
            "next_in": {
                "hash""5aa8e36f9423ee5fcf17c1d0d45d6988b8a5773eae8ad25d945bf34352040009",
                "n": 6
            }
        },
        {
            "value""44.44000000",
            "scriptPubKey""OP_DUP OP_HASH160 948c765a6914d43f2a7ac177da2c2f6b52de3d7c OP_EQUALVERIFY OP_CHECKSIG",
            "address""1EYTGtG4LnFfiMvjJdsU7GMGCQvsRSjYhx",
            "next_in": {
                "hash""220ebc64e21abece964927322cba69180ed853bb187fbc6923bac7d010b9d87a",
                "n": 0
            }
        }
    ],
    "nid""fc7704fdd7ec5e69163e51b827fea2133990a26defee2b475408b3c16fd9a968"
}

  

三、扩容问题如何解决

在比特币诞生初期,中本聪为了比特币系统的安全和稳定,防止比特币系统被攻击而把区块大小设置为1M。在当时比特币用户量少,比特币交易是不存在拥堵问题的。

随着比特币网络的发展,单个区块存储的交易信息越来越多,1MB区块仅能容纳2000条左右交易,

交易量大时需要排队等待区块写入确认,交易网络拥堵问题越来越严重,为此也出现了解决容量问题的几个方案。

1.区块扩容

解决区块过小问题,最直接的办法就是扩容。区块体积中位数在2015年里得到了翻番,从1月份的292KB快速增长至12月份的749KB。
2015 年12月比特币香港扩容会议由Pieter Wuille提出了隔离见证(Segregated Witness)之后,扩容问题甚至已经简化为仅升级至2MB。

为什么不把区块设置的更大一些,比如30MB?
区块存储的是交易信息,若提高区块体积限制至30MB,最大的问题不是CPU计算能力瓶颈,而是块的传播与存储。

30MB的块可能会导致全网孤块率和空块率大幅上升,一年产出1.5TB的区块链数据也超出大部分节点机器的硬盘容量。

基于这1.5TB的数据,区块链浏览器、钱包服务商等则可能膨胀10倍达到15TB,对于目前来说已经远超普通机器/数据库的磁盘容量。

除了扩容,还有另外的解决方案就是隔离见证和闪电网络。

2.隔离见证和闪电网络

隔离见证(SegWit)是把交易的签名数据从交易数据中剥离出来,用于解决延展性攻击。

比特币交易主要是由两部分数据组成。其中一部分为交易数据,它负责记录比特币的来源和去处。

而另外一部分则是见证数据,这部分数据由一些加密数据组成,用于证明这些交易请求是真实可信的。

中本聪在设计比特币的时候直接把这两部分信息都放在了区块内,所以一个区块就承载不了更多的交易信息。

如果隔离了“见证数据”,那么区块链只记录交易数据,那么一个区块可承载更多的交易。

闪电网络(Lightning Network)方案是在比特币网络上再外加一个「闪电网络(Lightning Network)」,

把原有比特币链上金额较少的交易,转移到这个闪电网络来处理,完成后再记录到原链上。
这是一种链外交易(Off-chain transaction),目的是解决加快交易速度,以太坊(Ethereum)也有类似的方案叫Raiden Network。

用搭乘公共汽车的来假设,试想像比特币的区块是一辆公共汽车,每隔十分钟,固定时间发车,

当要乘车的人超过公共汽车容量,不能上车的人就要等待下一班。我们的目的就是让更多的人可以乘车,即承载更多的交易。

比特币区块链本身是可以根据交易费率来优先完成交易的,如果你想快速完成转账等功能,可以设置较高的手续费。

这就类似公共汽车让出更高价格买票的人先上车,不愿付高车票的人就要一直等下去,直到坐车的人变少。

隔离见证就是我们在公共汽车后面加挂一个货车(SegWit车箱),所有乘车的人都要把背包和行李放到这个货车上面,

因为少了随身物品,每个人占的空间变少了,公共汽车就可以多载一些人,乘载量就变多了。

闪电网络可以理解为在公交车路线旁边再架一条铁路,让挤不上公共汽车的人直接去坐火车,解决掉太多人要搭乘车(交易),而汽车太小的问题。

隔离见证和闪电网络在技术上有可行性,但是同样有许多质疑。
依赖于隔离见证的闪电网络等二层网络并不能被认为是比特币的扩容方案,因为闪电网络的交易并不等价于比特币的点对点的链上交易,大部分比特币交易的场景并不适用于闪电网络。

假设闪电网络部署成功,也会存在大型支付中心的问题,这违背了比特币做为点对点支付系统的初衷。

参考

Master Bitcoin 精通比特币 
《区块链:从数字货币到信用社会》

比特币的区块结构解析相关推荐

  1. Fabric Block区块结构解析

    Fabric Block区块结构解析 作者: AlexTan CSDN: http://blog.csdn.net/alextan_ Github: https://github.com/AlexTa ...

  2. 比特币base58源码解析_中本聪源码早期版本流出:区块链原名时间链,比特币内置虚拟扑克游戏...

    本文来自 Bitcoin.com,原文作者:Jamie Redman Odaily 星球日报译者 | Moni 本周,一个比特币源代码早期版本浮出水面,立刻引起了加密货币社区的热议.根据"中 ...

  3. 讲讲我对比特币和区块链的认知,挖矿不难,挖到难

    比特币的概念 众所周知,比特币是数字货币 比特币相比我们的纸质货币,有以下优点: 1.财产可控,不像银行可以冻结你的账户,比特币不受他人控制 2.无通胀烦恼.银行可以根据经济情况,去印刷更多的钱,但比 ...

  4. 【区块链基础】4——ETH区块结构

    账户 与BTC不同,ETH使用的是基于账户的账本(account-based ledger),账本中记录了各个用户的的余额,交易时不必追溯币的来源. 基于账户的账本对双花攻击(duoble spend ...

  5. 区块链之区块结构-学习笔记

    目录 一.区块结构 二.区块头 三.区块体 四.交易类型 (1)生产交易 (2)通用地址交易 (3)合成地址交易 一.区块结构 数据区块是区块链的基本元素.比特币系统的每个数据区块主要由区块头(Blo ...

  6. 区块链 以太坊 区块结构详解

    一.结构 区块由两部分组成,分别是 区块头(header) 区块体(body) 1. 结构图 2. 区块头(header) 区块头存储了区块的元信息,用来对区块内容进行一些标识,校验,说明等. 通用字 ...

  7. 全球比特币和区块链领域创业企业全景图

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 全球比特币和区块链创业企业中,美国的数量占全球55%,其次为英国占6%,新加坡占3%,中国仅占2%! 荷兰的BitFur ...

  8. docker存储结构解析

    2019独角兽企业重金招聘Python工程师标准>>> docker存储结构解析 博客分类: docker 由于aufs并未并入内核,故而目前只有Ubuntu系统上能够使用aufs作 ...

  9. 《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1

    <ASP.NET Core In Action>读书笔记系列五 ASP.NET Core 解决方案结构解析1 参考文章: (1)<ASP.NET Core In Action> ...

最新文章

  1. 如何解决从数据库里面取出的时间晚了8个小时
  2. 百分点认知智能实验室:NLP模型开发平台在舆情分析中的设计和实践(下)
  3. ubuntu中安装sublime text3用于python编程
  4. JavaScript编写了一个计时器
  5. python读取sqlserver的数据_Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例...
  6. 搜狗浏览器怎么保存账号密码 搜狗浏览器保存账号密码教程
  7. 【一起学爬虫】PyQuery详解
  8. int indexs=(int)(_v+0.5);
  9. JAVA项目开发之文档篇
  10. 关于java分包原则
  11. OPPO R9sPlus MIFlash线刷TWRP Recovery ROOT详细教程
  12. 雅虎邮箱2022年2月28日起停止中国大陆服务后的收信方法
  13. RTMP 两种方式推流:推H.264、ACC和推FLV封装格式
  14. r语言中残差与回归值的残差图_独家 | 手把手教你用R语言做回归后的残差分析(附代码)-阿里云开发者社区...
  15. E11000 duplicate key error collection
  16. 人们为什么把电子计算机叫电脑,《计算机王国》.pdf
  17. chrome浏览器使用js导出Excel出现网络错误
  18. 如何使用转义字符 \a 在C++中输出响铃
  19. JS实现网站悬浮广告
  20. catv系统主要有哪三部分组成_数控系统主要由哪几部分组成

热门文章

  1. stm32串口通信(初学者对于串口通信的理解)
  2. 利用matlab对xml文件进行批量处理
  3. [云炬创业管理笔记]第三章打造优秀创业团队讨论4
  4. DIscuz论坛上传附件2M限制修改
  5. 终章 | 机器学习笔试题精选
  6. DeepMatching文献总结:图像拼接、图像匹配、图像检索
  7. 64bit win7+VS2013+opencv2.4.9配置
  8. 拖动窗体的任意区域移动窗体
  9. 实验三 图的操作与实现
  10. 递归函数反向显示单链表