【区块链】复习Ⅳ

比特币数据结构

  • 1、哈希指针
  • 2、默克尔树
  • 3、默克尔证明
  • 4、双花问题
  • 5、UTXO模型
  • 6、比特币区块
    • 6.1区块头
    • 6.2coinbase transaction
    • 6.3ordinary transaction

1、哈希指针

普通指针:存储结构体在内容中的起始位置,无法检测内容是否被篡改
哈希指针:存储结构体的哈希值,从而可以检测结构体内容是否被篡改
区块链是由哈希值真相连的链表
篡改证明记录,只需要保存最后一个区块的哈希值,就可以检测前面的区块是否被篡改。
也可以用哈希值进行验证其他节点提供的信息是否是正确的。
·哈希指针可以用于链结构、树结构,但是不可以用于环结构。
哈希指针只可以应用于无环结构

2、默克尔树

二叉树:每个节点最富哦只有两个分支的树结构,可以实现高效的搜索和排序
默克尔树:哈希树,树形数据结构,每个叶节点均以数据块的哈希作为标签,除了叶节点以外的节点则以其子节点标签的加密哈希作为标签。
只需要保存默克尔树的根哈希值,就可以检测出树中任意节点的修改。merkle root可看作是区块中所有交易的简短而唯一的“指纹”

3、默克尔证明

比特币中的节点分为:全节点和轻节点
①全节点:存储区块链上全部交易的区块,参与区块链的维护和验证
【区块链】复习Ⅳ_第1张图片
②轻节点:只存储区块头,只是利用区块链进行交易,无法验证双花攻击。如比特币钱包中
区块链上一般大多数节点是轻节点,少部分为全节点

如何证明某个交易已经被写进区块链:
通过默克尔证明:
①向证明方或其他全节点查询默克尔树的部分哈希值
②利用交易数据逐层计算哈希值并验证对比
一次默克尔证明的复杂度为O(log(n)),其中n为数据块的个数。

但是我们只有本地计算的哈希值,没办法验证全节点提供的哈希值

4、双花问题

是指同一笔数字货币可以被花用两次以上
设计加墨数字货币需要解决的2个问题:
货币发行、怎么验证交易的有效性。
比特币中的交易类型
①铸币交易(交易输入:挖矿所得)
②普通交易
比特币中的两种哈希指针
①连接各个区块之间的哈希指针
②指向前面资金来源的某个或者多个交易的哈希指针

A向B转账:
A要知道B的地址;B需要知道A的公钥和签名
但是A不可以查询得到B的地址,只能向B询问

5、UTXO模型

所有未被花费的交易输出的集合称为UTXO,未花费交易输出。
比特币是基于交易的账本模式,没有直观的余额。要想知道一个地址的余额,需要回顾以前所有相关的交易。
比特币交易中只有未被花费的输出才能被用于新的交易。
验证交易是需要验证该交易是否已经被花费。
一个交易可能有多个输入和多个输出,每个交易的总输入金额一般要等于总输出金额,如果不相等,差额就是交易费。其中余额要转给自己的地址。
为什么需要UTXO模型?
·有助于防范双花攻击

6、比特币区块

区块头+区块体

6.1区块头

区块头含有默克尔树的根哈希值,没有交易具体内容
①版本号(只有在协议升级的时候才会改变)
②上一区块哈希值(形成链式结构)
③默克尔树根哈希(可以快速检测交易数据是否被篡改)
④时间戳(区块被创建的时间)(小端序与大端序)
⑤目标值的缩略形式(挖矿的目标值的缩略形式)
指数部分:记录目标值的字节数
系数部分:记录目标值最初三个字节的数值
采用缩略形式可以节约空间,更简洁
⑥随机数nonce
比特币挖矿的过程即为调整nonce的数值使得区块头的哈希值小于预定目标值

区块体:交易列表

6.2coinbase transaction

铸币交易时区块的第一个交易,矿工用其收集区块奖励和交易手续费。
当一个矿工准备一个候选区块时,区块内的第一个交易将被设置为铸币交易。
每个区块必须要有一个coinbase transaction

6.3ordinary transaction

输入总额等于输出总额。
验证交易的合法性里面,是将输入脚本和输出脚本配对后执行来完成。这里的配对是将这个交易里面的输入脚本和前面那个提供币的来源的交易的输出脚本配对,如果将他们拼接在一起,能够顺利执行,那么这个交易就是合法的,也就是验证是否在UTXO中。

你可能感兴趣的:(区块链,区块链)