当前位置:   article > 正文

区块链通识——数据层

区块链通识——数据层

一丶数据层

  • 狭义的区块链即是去中心化系统各节点共享的数据账本
  • 每个分布式节点都可以通过特定的哈希算法Merkle 树数据结构,将一段时间内接收到的交易数据和代码封装到一个带有时间戳数据区块中,并链接到当前最长的主区块链上,形成最新的区块,该过程涉及区块,链式结构,哈希算法,Merkle树和时间等技术
  • 在这里插入图片描述

二丶哈希函数

  • Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值
  • 这种转换是一种压缩映射,也就是,散列值得空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值
  • 简单的来说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数
  • 性质
    • collision-free 防碰撞(避免不同输入值产生相同哈希值)等
    • hiding 信息隐藏(防止破解出来)
    • 还具有巨大的散列空间(eg:sha256:2256)
    • 正向求解很高效
  • 在这里插入图片描述
  • 在这里插入图片描述

三丶账户模型

  • 账户保存了余额的状态,与银行账户很像
  • 优点
    • 合约以代码形式保存在Account中,并且Account拥有自身状态
    • 这种模型具有更好的可编程性,容易开发人员理解,场景更广泛
    • 批量交易的成本较低
    • 设想矿池向矿工支付手续费,UTXO中因为每个Input和Out都需要单独Witness script 或者Locking script,交易本身会非常大,签名验证和交易存储都需要消耗链上宝贵的资源
    • 而Account模型可以通过合约的方式极大的降低成本
  • 缺点
    • Account模型交易之间没有依赖性,需要解决重放问题
    • 对于实现闪电网络/雷电网络,Plasma等,用户举证需要更复杂的Proof证明机制,子链向主链进行状态迁移需要更复杂的协议

四丶UTXO账户模型

  • UTXO —— Unspent Transation Output 未支出的交易输出
  • 上一笔交易将比特币汇至某一地址,这笔比特币可长期存储,直到该地址的主人要将款项汇至下一个收款人
  • 在某笔款项尚未被提出汇至下一个地址之前,这笔款项被称为UTXO
  • 不可再分的最小交易单元
  • 优点
    • 原子性,或成功,或失败,无中间状态
    • 可并发
    • 消耗存储空间较小
  • 缺点
    • 查询余额需要遍历所有交易数据
    • UTXO无状态,若账户中需要存放复杂状态(如智能合约),则无法支持
    • 当Input较多时,见证脚本也会增加
    • 而签名本身是比较消耗CPU和存储空间
  • 在这里插入图片描述

五丶地址

  • 比特币里面的地址其实就是收款人公钥的哈希值前面加一个0x00字节,后面加4字节的校验和
  • 整个地址以Base58编码
  • Address = Base58(0x00+RIPEMD-160(SHA256(Publickey))+checksum)
  • 例如:地址1Dorian4RoXcnBv9hnQ4Y2C1an6NJ4Urjx,如果把它解码为HEX编码,是这样的:008c7e252f8d64b0b6e313985915110fcfefc4a2d675f6d4e
  • 中间绿色的20字节,就是这个地址所有者公钥的哈希值
  • 在这里插入图片描述

六丶交易

  • 每个比特币交易都有一个交易Hash(txhash),此Hash的值是针对整个交易内容计算得到唯一指向此条交易

  • 因此,在比特币追那个交易Hash通常作为交易ID

  • 交易的正文包括2部分:输入地址信息和输出地址信息

  • 输入地址信息:记录此次交易发送方的账户信息

    • 并不是记录发送者的账号,而是记录输入资金的来源(pre-txhash),即通过来源交易Hash指定全局账本中的一条交易,并通过索引信息(index)来指定交易中对应的输出地址,并通过签名信息(sign)证明用户对这笔资金的所有权
  • 输出地址信息:记录此次交易接受方的账户信息

    • 包括输出地址account输出金额(amount)
    • 输出地址是由用户自行生成的公钥信息经过字符变换得到的一串字符串,输出地址经过反向变换后可以得到公钥的Hash,用于验证签名
  • 在这里插入图片描述

  • 交易具体例子

    • 交易实例部分介绍了2条交易
    • 其中编号为“10002”的交易中第“0”个输入地址中的来源交易Hash是同时索引为“1”
    • 因此,可以确定此输入地址的真实账户是编号“10001”交易中第“1”个输出地址“1 A 1 R m b b V o L 4 p n M Z f”
    • 在这里插入图片描述
  • 一个真实的比特币交易

    • 在这里插入图片描述

七丶时间戳

  • 时间戳:上一个区块的hash
  • 人类历史上第一次实现非物理时钟
  • 区块链技术要求获得记账权的节点必须在当前数据区块头中加盖时间戳,表明区块数据的写入时间
  • 因此,主链上各区块是按照时间顺序(区块高度)依次排列的
  • 时间戳技术本身并不复杂,但其在区块链技术中的应用是具有重要意义的创新
    • 区块数据的存在性证明(Proof of existence)
    • 有助于形成不可篡改和不可伪造的区块链数据库
  • 从而为区块链应用公证,知识产权注册等时间敏感的领域奠定了基础
  • 更为重要的是,时间戳为未来基于区块链的互联网和大数据增加了时间维度,使得通过区块数据和时间戳来重现历史成为可能

八丶数据区块

  • 每个数据区块一般包含:
    • 区块头(Header)和区块体(Body)两部分
  • 区块头封装了:
    • 当前版本号(Version)
    • 前一区块的目标地址(Prev-block)
    • 当前区块的目标哈希值(Bits)
    • 当前区块POW共识过程的解随机数(Nonce)
    • Merkle根(Merkle-root)
    • 时间戳(TimeStamp)等信息
  • 比特币网络可以可以动态调整POW共识过程的难度值,首先找到正确的解随机数Nonce并经过全体矿工验证的矿工将会获得当前区块的记账权
  • 区块体则包括当前区块的交易数量以及经过验证的,区块创建过程中生成的所有交易记录,这些记录通过Merkle树的哈希过程生成唯一的Merkle根并记入区块头
  • 在这里插入图片描述

九丶Merkle Tree(默克尔树)

  • 默克尔树是一种二叉树,由一组叶节点,一组中间节点和一个根节点构成
  • 优点
    • 节约存储空间(已经花费过的交易,如果时间很久就可以丢弃)
    • 可以只保留根节点的hash,即Merkle根,放到区块头里,便于支付验证,即==“简化支付验证”==
    • 比特币中没有交易的区块头只有80bytes
  • 在这里插入图片描述

十丶链式结构

  • 取得记账权的矿工将当前区块链接到前一区块,形成最新的区块主链,各个区块依次环环相接,形成从创世区块到当前区块的一条最长主链
  • 它记录了区块链数据的完整历史
  • 优点
    • 能够提供区块链数据的溯源定位功能
    • 任意数据都可以通过此链式结构顺藤摸瓜,追本溯源
  • 分叉:如果短时间内有两个矿工==同时“挖出”==两个新的区块加以链接的话,区块主链可能会出现暂时的“分叉”现象
  • 分叉解决方法
    • 约定矿工总是选择延长累计工作量证明最大的区块链
    • 因此,当主链分叉后,后续区块的矿工将通过计算和比较,将其区块链接到当前累计工作量证明最大化的备选链上,形成更长的新主链,从而解决分叉问题
  • 在这里插入图片描述

十一丶总结

  • 从技术角度讲,比特币账本可以被认为是一个状态转换系统
  • 该系统包括所有现存的比特币所有权状态状态转换函数
  • 在这里插入图片描述
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/435236
推荐阅读
相关标签
  

闽ICP备14008679号