区块链V3版本实现思路

当前版本问题:

  1. 区块在内存中,每次执行完程序就释放,无法重用
  2. 创建区块不灵活,在main中写死,无法随意添加区块

 

V3版本思路:

  1. Bolt数据库介绍:轻量级、开源、go语言实现、key->value进行读取(map)[ ]byteè[ ]byte
  2. BlockChain结构重写
  3. NewBlockChain函数重写:由对数组操作改为对数据库操作,创建数据库
  4. AddBlock函数重写:对数据库的读取和写入
  5. 打印数据:对数据库的遍历(迭代器Iterator)
  6. 命令行:命令行介绍及编写;添加区块命令;打印区块命令;创建区块链’

 

Bolt数据库:

数据储存格式分析:

  key唯一;

  把所有的区块都写到一个bucket中:key -> value: []byte -> []byte

  在bucket存储两种数据:

    1. 区块,区块的哈希值作为key,区块的字节流作为value

      block.Hash -> block.toBytes()

    2.最后一个区块的哈希值

      key使用固定的字符串:[]byte("lastHashKey"),value就是最后一个区块的哈希存储区块,使用的key必须唯一,所以使用区块的hash值作为key,block的字节流作为value.

具体存储格式:

添加一个新区块要做两件事情:

  1. 添加区块
  2. 更新last这个key对应的值,这个值就是最后一个区块的哈希值,用于新区块的创建添加。

部分代码(boltdemo.go文件中创建一个demo):

1 package main 2  3 import ( 4    "beijing_go_term2/bolt" //这个库在github上下载并导入就行 5    "fmt" 6    "log" 7 ) 8  9 func main() {10    db, err := bolt.Open("test.db", 0600, nil)11    //向数据库中写入数据12    //从数据库中读取数据13 14    if err != nil {15       log.Panic(err)16    }17 18    defer db.Close()19 20    db.Update(func(tx *bolt.Tx) error {21       //所有的操作都在这里22 23       b1 := tx.Bucket([]byte("bucketName1"))24 25       if b1 == nil {26          //如果b1为空,说明名字为"buckeName1"这个桶不存在,我们需要创建之27          fmt.Printf("bucket不存在,准备创建!\n")28          b1, err = tx.CreateBucket([]byte("bucketName1"))29 30          if err != nil {31             log.Panic(err)32          }33       }34 35       //bucket已经创建完成,准备写入数据36       //写数据使用Put,读数据使用Get37       err = b1.Put([]byte("name1"), []byte("Lily1111"))38       if err != nil {39          fmt.Printf("写入数据失败name1 : Lily!\n")40       }41 42       err = b1.Put([]byte("name2"), []byte("Jim1111"))43       if err != nil {44          fmt.Printf("写入数据失败name2 : Jim!\n")45       }46 47       //读取数据48 49       name1 := b1.Get([]byte("name1"))50       name2 := b1.Get([]byte("name2"))51       name3 := b1.Get([]byte("name3"))52 53       fmt.Printf("name1: %s\n", name1)54       fmt.Printf("name2: %s\n", name2)55       fmt.Printf("name3: %s\n", name3)56 57 58       return nil59    })60 61 }

显示效果:

来源:https://www.icode9.com/content-4-772851.html

(0)

相关推荐

  • Go - httpclient 常用操作

    httpclient 模块介绍 httpclient 是基于 net/http  封装的 Go HTTP 客户端请求包,支持常用的请求方式.常用设置,比如: 支持设置 Mock 信息 支持设置失败时告 ...

  • 深入理解 Golang Map

    Map 是一种常见的数据结构,通常用于存储无序的键值对.在主流的编程语言中,默认就自带它的实现. 但是, Map 在编程语言内部是如何实现的呢? 同时我们可能还有以下一系列疑问: 如何判断 Map 中 ...

  • 真实案例(万字长文):Bad Code vs Good Code in Golang

    预计阅读时间: 23分钟 建议收藏后阅读 近来,经常有人问我在Go 语言的项目里,什么样的代码算好代码,什么样的代码算坏代码. 我发现这个练习很有趣.嗯,这个项目太有趣了,所以我决定写一篇博客和大家分 ...

  • GO 语言 RSA 加密解密

    Go开发大全 20篇原创内容 公众号 [导读]什么是对称加密?Go 语言做对称加密怎么做?本文作者从加密原理到代码实现带你上车. 对称加密中,加密和解密使用相同的密钥,因此必须向解密者配送密钥,即密钥 ...

  • 尼古拉斯:Pi节点已更新至0.44版本,Pi主网后成为真正的区块链(重磅消息)

    派学营 35篇原创内容 公众号 2021.5.6日凌晨1点里,Pi项目方趁着我们中国Pi友熟睡的时候又悄悄更新了APP主页面消息:Pi节点更新至0.44版本.小尼太不厚道了,老是干这种事情.节点对Pi ...

  • 一文轻松看懂区块链的工作原理

    作者注:这篇文章是写给非计算机专业的朋友的科普文,尽量避开了比较专业的细节.如果你是计算机相关专业,或者具备一定数据结构.算法.密码学的知识,建议直接看文末参考资料中的三篇博文,或者更专业的资料. 区 ...

  • UC头条:区块链技术可能被大规模采用吗? 区块链技术的关键是什么

    花火网报道,区块链技术是当今时代最有前途的技术之一,其核心概念非常简单.从本质上讲,这是一个公共分类账或数据库,我认为关于区块链实际上是什么的公众教育可能是其大规模采用的关键.区块链技术可能被大规模采 ...

  • “区块链”实应译为“部落城”| 施展札记37

    最近这大半年来互联网上发生的一系列事件,给我一种强烈的感觉,我们似乎又一次航行在通往未来的船上,没有人知道前方究竟是什么,但它很可能是一片新大陆,在地理大发现之后,人类很可能即将进入一次空间大发现. ...

  • 默克尔区块链 打破区块链三元悖论

    (2021年5月4日,伦敦) –随着区块链技术发展,不同的技术路径也不断出现并演化:独立运作的各种区块链急需跨链操作性能,才能实现规模化.默克尔区块链(Merkle Blockchain)的互操作技术 ...

  • 了解区块链,从此不做韭菜

    三马路小强2021-03-25 09:48:51 近期由于国家也开始重视区块链技术以及相关产业的创新发展,使得沉寂许久的区块链技术再次成为人们关注的焦点.但是网络上关于区块链的解释太过专业,这就让许多 ...

  • 区块链电子合同应用平台开发解决方案

    随着社会的飞速发展,各种行业数字化转型,数字化服务行业越来越多,导致传统的纸质合同已逐渐跟不上数字化社会的发展,而在国家政策的支持下,企业和政府之间正在缓慢引入电子合同,以加快产业的渗透. 纸质合同具 ...

  • 区块链,一场始料未及的革命!

    区块链并不是新概念 区块链(Blockchain)的概念最早可以追溯到2008年末,化名为"中本聪"的神秘人士在论坛中发表了一篇论文<比特币:一种点对点的电子现金系统> ...

  • 区块链去中心化多币种钱包APP搭建(现有案例)

    我们知道在区块链中,"钱包"是用于存储和使用数字货币的工具,并且一种货币对应于钱包.它用于存储货币或"交易"货币.简单地说,"冷钱包"是一个 ...