区块链技术与应用 - 记录

138 阅读5分钟

课程简介

课程基本信息

  • 假设在本科阶段学过基本的数据结构和算法,掌握编程的基本技能
    • 数组、链表、二叉树、哈希函数
  • 参考资料
    • BitCoin and Cryptocurrency Technologies: A comprehensive Introduction
    • 以太坊白皮书、黄皮书、源代码
    • Solidity 文档

课程大纲:比特币

  • 比特币
    • 密码学基础
    • 比特币的数据结构
    • 共识协议和系统实现
    • 挖矿算法和难度调整
    • 比特币脚本
    • 软分叉和硬分叉
    • 匿名和隐私保护

课程大纲:以太坊

  • 以太坊
    • 概述:基于账户的分布式账本
    • 数据结构:状态树、交易树、收据树
    • GHOST协议
    • 挖矿:memory-hard mininig puzzle
    • 挖矿难度调整
    • 权益证明
      • Casper the Friendly Finality Gadget (FFG)
    • 智能合约
  • 总结与展望

比特币中的密码学原理

1. 概述

  • 比特币:被称为 “加密货币”,实际上是不加密的,转账金额是公开的。
  • 密码学功能:比特币主要使用了两个密码学功能:哈希(Hash)和签名(Signature)。

2. 哈希函数

  • 定义:密码学中使用的哈希函数称为 cryptographic hash function。

  • 主要性质

    • Collision Resistance:无法高效地找到两个不同的输入使其哈希值相同。

      • 碰撞是客观存在的,因为输入空间远大于输出空间。
      • 没有高效的方法找到两个不同的输入,使它们的哈希值相等。
    • Hiding:哈希值的计算过程是单向的,无法从哈希值反推出原始输入。

      • 需要输入空间足够大,才能确保暴力求解的方法不可行。
    • Puzzle Friendly:哈希值的计算过程是不可预测的,没有捷径,只能一个一个尝试输入。

      • 在比特币挖矿过程中尤为重要,作为工作量证明(Proof of Work)的基础。
  • 常见哈希函数:SHA-256,满足上述三个性质。

3. 哈希函数的应用

  • 检测信息篡改

    • 对信息求哈希值,作为信息摘要(digest)。
    • 改变信息内容会导致哈希值变化,无法找到相同哈希值的不同信息。
  • 实现数字信封(Digital Envelope)

    • 预测结果公开问题:预测结果不能提前公开,但需要验证其准确性。
    • 哈希值应用:将预测结果作为输入计算哈希值并公开哈希值。第二天公布预测结果,利用 collision resistance 和 hiding 性质验证其真实性。

4. 签名

  • 定义:通过公钥和私钥对对消息进行签名和验证。

  • 非对称加密体系:公钥加密,私钥解密。

    • 生成账户:生成一对公钥和私钥,公钥公开,相当于银行账号;私钥保密,相当于账户密码。
    • 签名验证:私钥签名,公钥验证签名。

5. 比特币系统中的账户管理

  • 去中心化:无需任何人批准,本地生成公钥和私钥对即代表一个账户。

  • 交易验证

    • 交易签名:发布交易时用私钥签名。
    • 签名验证:其他人用公钥验证签名的正确性。

6. 随机源的重要性

  • 随机源质量:生成公私钥和每次签名时都需使用高质量的随机源。
  • 攻击风险:如果随机源不够好,可能出现相同的公私钥对,增加被攻击的风险。

7. 哈希和签名的结合

  • 操作流程

    • 先对消息进行哈希处理。
    • 再对哈希值进行签名,确保消息完整性和真实性。

比特币中的数据结构

哈希指针

  • 概念: 哈希指针不仅存储某个结构体在内存中的地址,还保存这个结构体的哈希值。
  • 好处:
    • 定位结构体的位置
    • 检测结构体内容是否被篡改
  • 链表实现: 用哈希指针代替普通指针,每个区块包含前一区块的哈希值和数据。
    • 创世纪块 (Genesis block): 系统中产生的第一个区块。
    • 最后区块: 最近产生的区块。
哈希指针 = 前一区块的哈希值 + 当前区块的数据

哈希指针的优点

  • 篡改检测: 任何一个区块内容被改动,所有后续区块的哈希值都会变化,从而使得保存的最后哈希值也发生变化。
  • 安全性: 保留最后的哈希值可以检测到整个链表中任何位置的改动。

Merkle树

  • 结构:
    • 叶节点: 数据块的哈希值。
    • 内部节点: 两个子节点的哈希值拼接再取哈希值。
根哈希值 = 叶节点1的哈希值 + 叶节点2的哈希值
  • 优点:
    • 只需记住根哈希值,就能检测出对树中任何部位的修改。

比特币中的区块

  • 区块头 (Block header):
    • 包含根哈希值,不包含具体交易信息。
  • 区块体 (Block body):
    • 包含交易的具体列表。

Merkle Proof

  • 概念: 验证某个交易是否在区块中的证明。
  • 过程:
    • 通过传递交易至根节点的路径上的哈希值,清节点可以验证交易是否包含在区块中。
验证步骤:
1. 清节点收到Merkle Proof。
2. 验证路径上每个节点的哈希值。
3. 对比根哈希值和区块头中的根哈希值。

证明交易不存在

  • 无序叶节点: 没有高效的方法证明不存在。
  • 有序叶节点: 按照哈希值排序后,可以提供证明。
证明步骤:
1. 找到应在的叶节点位置。
2. 验证相邻两个节点到根节点的路径。

哈希指针的应用

  • 无环数据结构: 只要数据结构无环,都可以用哈希指针代替普通指针。
  • 有环数据结构: 会出现循环依赖问题,无法使用哈希指针。

总结

  • 哈希指针和Merkle树是比特币中最基本的数据结构,保证了区块链的安全性和篡改检测能力。
  • Merkle Proof提供了验证交易包含性的方法,支持全节点和轻节点之间的数据验证。