当前位置: 首页 > article >正文

区块链学习笔记(1)--区块、链和共识 区块链技术入门

  1. 常见的hash算法:
    1. 文件防篡改:MD5
    2. 比特币挖矿:SHA256
    3. 证明数据片段:Merkle root
    4. 文本去重:SimHash

区块

区块(block)由区块头(block header)和交易列表(transaction list,tx list)组成,block之间通过block header的hash连接成了一个链表结构。

block header

  1. 比特币的block header(Github)
int32_t nVersion;
uint256 hashPrevBlock;
uint256 hashMerkleRoot;
uint32_t nTime;
uint32_t nBits;
uint32_t nNonce;
  1. 以太坊的block header(Github)
ParentHash  common.Hash    `json:"parentHash"       gencodec:"required"`
UncleHash   common.Hash    `json:"sha3Uncles"       gencodec:"required"`
Coinbase    common.Address `json:"miner"            gencodec:"required"`
Root        common.Hash    `json:"stateRoot"        gencodec:"required"`
TxHash      common.Hash    `json:"transactionsRoot" gencodec:"required"`
ReceiptHash common.Hash    `json:"receiptsRoot"     gencodec:"required"`
Bloom       Bloom          `json:"logsBloom"        gencodec:"required"`
Difficulty  *big.Int       `json:"difficulty"       gencodec:"required"`
Number      *big.Int       `json:"number"           gencodec:"required"`
GasLimit    uint64         `json:"gasLimit"         gencodec:"required"`
GasUsed     uint64         `json:"gasUsed"          gencodec:"required"`
Time        uint64         `json:"timestamp"        gencodec:"required"`
Extra       []byte         `json:"extraData"        gencodec:"required"`
MixDigest   common.Hash    `json:"mixHash"`
Nonce       BlockNonce     `json:"nonce"`

// BaseFee was added by EIP-1559 and is ignored in legacy headers.
BaseFee *big.Int `json:"baseFeePerGas" rlp:"optional"`
  1. 当前我们只需要关注其中两个字段(其他字段会在后续课程中解释)
    1. hashPrevBlock /ParentHash,上一个block header的hash
    2. hashMerkleRoot/TxHash,tx list的hash

block body

block body

  1. block body就是tx list,block header通过TxHash指向唯一的tx list
  2. 从tx hash list得到TxHash的hash算法叫做默克尔树(Merkle tree),相比其他的hash算法有特殊的性质(可以简洁地证明tx存在其中)

默克尔树,也被称为哈希树,是一种典型的二叉树结构。它有一个根节点、一组中间节点和一组叶节点组成。叶节点包含存储数据或其哈希值,而非叶子节点(包括中间节点和根节点)则是它的两个孩子节点内容的哈希值。这种结构使得默克尔树具有一些独特的性质。

首先,任何底层数据的变动,都会传递到其父节点,一层层沿着路径一直到树根。这意味着根的值实际上代表了对底层所有数据的“数字摘要”。这种性质使得默克尔树成为快速归纳和校验区块数据存在性和完整性的理想选择。

其次,默克尔树的生成过程是将一个大数据块拆分成更多小的数据块,然后对每个数据块进行哈希运算,得到所有数据块的哈希值之后,再获得一个哈希列表。重复这个过程,最终得到一个哈希值,被称为根哈希。这个根哈希值可以用来快速验证整个区块数据的完整性和存在性。

在区块链中,默克尔树主要用于高效地验证大量数据的完整性和存在性。以比特币为例,每个区块都包含一个默克尔树,该树的根哈希值被包含在区块头中。这样,当一个节点想要验证某个交易是否被包含在某个区块中时,它只需要检查该交易的哈希值是否被包含在默克尔树的叶子节点中,以及该哈希值是否最终指向根哈希值。这种方式大大提高了验证效率,降低了不必要的计算量。

此外,默克尔树还有助于提高区块链的可扩展性和去中心化程度。由于每个节点都可以独立地验证其他节点的数据完整性和存在性,这使得区块链可以更好地适应大规模的应用场景。同时,由于默克尔树的生成过程是分布式的,它不需要中心化的第三方机构进行干预,从而提高了区块链的去中心化程度。

Nakamoto consensus

  1. 为什么:对block的有效性达成一致
    1. 决定每个高度上使用哪个block
      1. tx list
      2. block reward
  2. 怎么做:PoW(Proof of Work)算法
    1. 调节block header:NonceTxHash
    2. 让block header的hash小于Target
      1. 可以看到比特币的block hash都是一堆0开头的(btc.com)
      2. nBits会随着nTime调整,保持区块间隔时间为10分钟
    3. 多个block时的选择
      1. 谁的块先出用谁的
      2. 谁的链更长用谁的

  1. 分叉的缓解(Etherscan):
    1. 一个block能包含最多2个(Github)叔块(uncle block)在UncleHash
    2. 奖励
      1. 每包含一个叔块,能增加少量的block reward
      2. 被包含的叔块,能获得大部分的block reward
    3. 激励节点切换到被更多人所共识的链上
      1. 你出的块我已经给你算上了,赶紧切换到最长链吧


http://www.kler.cn/a/409772.html

相关文章:

  • 【C++】C++11新特性详解:可变参数模板与emplace系列的应用
  • Java 基于SpringBoot+Vue的家政服务管理平台
  • MySQL面试-1
  • 微信小程序与公众号关联(同一主体),获取unionId并关联公众号openid
  • mayo介绍和QTqmake编译基于Opencascade开发的mayo工程-小白配置
  • docker镜像源配置、换源、dockerhub国内镜像最新可用加速源(仓库)
  • 【分治】--- 快速选择算法
  • 【优选算法】前缀和
  • C++入门学习基础
  • C++ 编程指南06 - 不要泄漏任何资源
  • 蓝桥杯每日真题 - 第23天
  • 【C++】C++11新特性详解:可变参数模板与emplace系列的应用
  • World of Warcraft /script SetRaidTarget(“target“, n, ““) n=8,7,6,5,4,3,2,1,0
  • 深入探讨异步 API 的设计与实现
  • [C++]了解内置类型升级
  • Qt 开发笔记
  • 提供html2canvas+jsPDF将HTML页面以A4纸方式导出为PDF后,内容分页时存在截断的解决思路
  • 人工智能学习框架:理论与实践的结合
  • JavaScript网页设计案例:动态交互与用户体验提升
  • 音频档案批量拷贝:专业SD拷贝机解决方案
  • C 语言复习总结记录六
  • Top 10 Tools to Level Up Your Prompt Engineering Skills
  • TCP快速重传机制为啥出现重复ACK?
  • 安全加固方案
  • opencv读写文件操作
  • 谈谈微服务的常用组件