比特币的数据结构——中山大学软件工程学院区块链第三节课

目录

上节课回顾

SHA256

数字签名

区块“链”

区块头的数据结构

为何区块链可以防篡改?

节点类型

Merkel Proof

如何验证交易存在?

如何证明不存在?

上节课回顾

SHA256

  • 碰撞阻力(Collision Resistance):找到两个不同的输入ab,使得H(a) = H(b)是非常困难的。

  • 隐秘性(Pre-image Resistance):给定一个输出H(a),找出输入a是非常困难的。

  • 谜题友好(Puzzle Friendliness):“矿工公平”,找到一个特定的X以使得H(X)=Y是一个没有捷径的任务。这有助于确保矿工公平竞争。

数字签名

  • 私钥签名:只有拥有私钥的人才能生成一个有效的数字签名。

  • 公钥验证:任何人都可以使用公钥来验证签名是否有效。

区块“链”

是一个单向链表,链表的头是第一个区块。

  • 创始区块(Genesis Block):这是区块链中的第一个区块。

  • 区块结构

    • 区块头(Block Header):包含该区块的元数据,如前一个区块的哈希值、时间戳等。
    • 区块体(Block Body):包含实际的交易数据。
  • 哈希指针:每个新区块都有一个哈希指针,该指针是前一个区块头的哈希值。

    • Hash Pointer *ptr := H(header)ptr是指向前一个区块头哈希的指针。
    • Hash Pointer = { pointer_to_data, hash_value },既包含了指针,又包含了哈希值
  • 为什么只哈希区块头而不是整个区块(Header 和 Body)?

    • 因为区块头中通常包括一个字段,叫做Merkle Tree(默克尔树),它已经考虑了区块体中所有交易的哈希值。这样只需哈希区块头,就能确保整个区块(包括其交易)的完整性。

区块头的数据结构

在区块链中,区块头通常包含以下几个主要元素:

  1. 版本(Version):用于跟踪区块链软件的版本。

  2. 上一个区块的哈希(Previous Block Hash):这确保了区块之间的连续性。

  3. 默克尔树根(Merkle Root):一个用于验证交易集合完整性的数据结构。

  4. 时间戳(Timestamp):标记该区块创建的时间。

  5. 难度目标(Difficulty Target):这与挖矿过程中需要解决的数学问题有关。

  6. 随机数(Nonce):一个随机数,用于挖矿。

默克尔树(32Bytes)

              H(H(H(T1) + H(T2)) + H(H(T3) + H(T4)))
              /                                    \
     H(H(T1) + H(T2))                      H(H(T3) + H(T4))
     /                  \                  /                   \
H(T1)                    H(T2)         H(T3)                   H(T4)

用于储存在区块头里以验证所有交易的完整性。

默克尔根(Merkle Root):上图中的最顶层哈希值。它由下面所有的交易哈希值通过特定的组合和哈希运算得到。

为何区块链可以防篡改?

  1. 原理:碰撞阻力(Collision Resistance)

  2. 不可更改历史记录(Immutability)

  1. 两步发布机制
  • 第一步是广播区块头:这一步已经包括了默克尔根(Merkle Root),确保交易的完整性。

  • 第二步是广播区块体:这一步是在验证区块头后进行的,进一步确保数据的不可篡改性。

节点类型

  1. 全节点(Full Nodes)
  • 有完整的账本:存储整个区块链的所有信息,包括每个区块头和区块体。

  • 更高的安全性:由于全节点存储所有信息,它们能进行更全面的验证。

  1. 轻节点(Light Nodes)
  • 只有所有区块头的信息:不存储区块体的信息,只存储区块头。

  • 资源需求较低:由于只保存区块头,轻节点占用的存储空间和处理能力要远低于全节点。

  • 又叫“手机钱包”,可以支撑手机中的转账。

Merkel Proof

如何验证交易存在?

        例如:别人给我转了五个比特币,我怎么知道他真的转了?

        验证Merkel根是否和手机中的相同即可。

假设交易是随机排列的,所以确认一个交易是否在树中的时间复杂度是O(n)还是O(1)?

        如果找merkel path,那就是(logn),如果逐个比对哈希,那就是O(n),O(1)应该搞不定

如何证明不存在?

        (如果先对下面的交易排序了)

        用默克尔证明(Merkle Proof)。也是找merkel path,详见下面的链接

https://blog.csdn.net/weixin_64123373/article/details/132810549icon-default.png?t=N7T8https://blog.csdn.net/weixin_64123373/article/details/132810549

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值