Skip to content

理论部分

什么是区块链

  • 区块链的分类
    1. 公有链(比如:比特币、以太坊、EOS等)
      1. 任何人都可读取的
      2. 任何人都能发起交易并且交易能得到有效确认的
      3. 任何人都能参与其共识过程的
    2. 私有链
      1. 企业内部自己搭建
      2. 开发节点
      3. 测试节点
    3. 联盟链(有竞争 又需要合作的场景)
      1. 共识过程受到预选节点控制的区块链
      2. 只有获得准入联盟的节点,才可以参与其中(比如:Fabric、R3联盟、EEA以太坊企业联盟、阳光链)
  • 要解决的问题
    1. 价值传递
      1. 转让方(不会再拥有价值)
      2. 受让方(拥有价值)
  • 一种特殊的分布式数据库
    1. 没有中心、没有管理员
    2. 全民记账
    3. 只能增查、不能改删
  • 区块链的特点
    1. 不可篡改
    2. 可追溯
    3. 去中心化

区块链架构模型

  • 网络层级(自下往上。a b c是构建区块链的必要元素,缺一不可。d e f并不是构建区块链的必要因素)
    1. 数据层
      • 封装了底层数据的链式结构,以及相关的公私钥非对称加密技术,和时间戳技术。这是区块链中最底层的数据结构。
    2. 网络层
      • P2P主网机制、数据传播机制、数据验证机制
    3. 共识层
      • 封装了网络层各类共识机制的算法,共识机制算法是区块链的核心技术。
        • 比较流行的共识算法有
          1. 工作量证明机制 POW
          2. 权益证明机制 POS
          3. 股份授权证明机制 DPOS
          4. 拜占庭容错共识 PBFT
    4. 激励层
      • 将经济因素集中到区块链体系中来,包括经济激励的发行机制和分配机制等,主要应用在公有链当中,在公有链当中必须激励遵守规则参与记账的节点,并且惩罚不遵守规则的节点,才能让整个系统朝着良性循环的方式发展。在私有或者联盟链中不一定要激励。
    5. 合约层
      • 封装各类脚本、算法和智能合约,是区块链可编程特性的基础,可以理解为一份简单的电子合同,并且在达到约束条件自动触发条件,不需要人工干预,也可以在不满足条件的时候自动解约。理论上可以自动触发之前自行约定好的一切条款,这也是区块链能够解放信用体系最核心的技术之一。
    6. 应用层
      • RPC远程调用
      • 封装了区块链各种应用场景和案例

区块链的链式结构

  • 链式结构
    • 区块链中最主要的是数据层,而数据层最重要的就是链式结构
    • 链式结构中最基本的构成单位就是区块
      • 区块

        Image title
        区块结构图例

        1. 区块体存储了相关的交易数据
        2. 区块头中最重要的是 父区块hash
          Image title
          区块细节描述
        3. 每一个区块含有一个父区块的hash,相当于有了一个指向父区块的指针。把一个一个的区块联系起来就形成了区块链这种链式结构
          Image title
          区块链的联系
        4. 对于链式结构或者树形结构,总会有第一个节点,在区块链中把第一个节点区块叫 创世区块,在 创世区块 中,没有父区块hash值,只有数据
          Image title
          区块链的联系

hash函数介绍

  • 什么是hash函数
    1. 一种算法
    2. 任意长度的二进制数据映射为固定长度的二进制数据
  • hash函数的特点
    1. 确定性
      • 对于同样的数据,不论通过多少次计算,最后都会得到相同的结果。
    2. 单项性
      • 类非对称加密,无法进行反推解析
    3. 隐秘性
      • 类非对称加密,无法进行反推解析
    4. 抗篡改
      • 对于输入值一个 byte 的改动,都会对hash产生很大的变动
    5. 抗碰撞
      • 对于两个不同的值产生的hash值相同的可能性极小
  • hash 函数的实现
    1. MD系列
    2. SHA系列,推荐SHA256、SHA3
  • 代码实现

    package main
    
    import (
        "crypto/sha256"
        "encoding/hex"
        "fmt"
        "log"
    )
    
    func caculateHash(toBeHashed string) string {
        // []byte(toBeHashed)  toBeHashed 字符串 -> 字符串转字节切片
        hashInByte := sha256.Sum256([]byte(toBeHashed))
    
        // 转换成16进制的字符串  hashInByte 字节数组 -> hashInByte[:] 字节数组转字节切片
        hashInStr := hex.EncodeToString(hashInByte[:])
        log.Printf("%s, %s", toBeHashed, hashInStr)
        return hashInStr
    }
    
    func main() {
        fmt.Println(caculateHash("你好色彩"))
    }
    
    
    // 输出
    /private/var/folders/7w/0j7vff4j1kz5_g43cf_vqlg00000gp/T/GoLand/___go_build_hash_go
    2023/02/23 15:06:11 你好色彩, a1049234d14b64e5089b1bd0cc42dbd56ecb634c22334676d71f439797a17dc9
    a1049234d14b64e5089b1bd0cc42dbd56ecb634c22334676d71f439797a17dc9
    
    Process finished with the exit code 0
    

  • 总结

Image title

区块链
  • 父区块hash(区块3) = hash(父区块hash(区块2) + 数据(区块2))
  • 父区块hash(区块2) = hash(父区块hash(区块1) + 数据(区块1))