Block结构实现

数据准备

prepare_hash_data:

  • 把待哈希内容序列化
  • 注:由于时间戳一开始就被计算出来,故并不是挖矿成功的时间戳

验证机制

validate:

  • 调用prepare获取数据
  • 注:每次要重新调用prepare是因为nonce每次都变化了
  • 判断是否哈希值符合要求

工作量证明执行

run_proof_of_work:

  • 循环调用validata
  • 每次把nonce+1,成功了则把self.hash赋值

区块创建

new_block:

  • 获取当前时间戳
  • 新创建block,赋值好前哈希,data,时间戳
  • 调用run_proof赋值哈希

创世块生成

new_genesis_block:

  • 直接生成

Blockchain结构实现

成员变量

  • 删除blockchains
  • tip最新区块的哈希值
  • db
  • currentHash(用于迭代器)当前哈希
  • 从尾到头部返回

构造函数

new():

  • 返回blockchain
  • 打开db
  • 调用get(“last”)查询
    • last为存储的最后一个哈希值
    • 若不存在
      • 创建创世块并insert
      • 为last字段也insert赋值
      • 初始化blockchain并flush返回
    • 若存在
      • 把tip和currentHash都赋值为这个哈希
      • 赋值db之后返回

区块添加

add_block:

  • 从last获取新块的前哈希
  • 调用new_block(data, prev.get_hash())
  • 每个块都是一个键值对存储key为hash,value是块的序列化
  • 插入db,并更新last和tip和curretHash

迭代器实现

Iterator:

  • next
    • 调用currentHash来get块
    • 返回这个块,并且把curretHash赋值为前hash

CLI实现

结构定义

  • 就一个blockchain成员

初始化

new:

  • 调用blockchain构造函数

命令行运行

run:

  • 注册命令行app
  • 判断是否输入了对应命令
    • 执行addblock
    • 执行print_chain

主程序实现

main.rs

  • 初始化日志系统
  • 创建cli
  • 调用run