前言

有快三个月没有写文章了,主要原因是个人思想问题,感觉有点彷徨。但是人可以彷徨一阵子,不能彷徨一辈子。第二个是最近两个多月在做区块链(基于hyperledger-fabric),对于这样一个东西,期间确实也碰到了许多坑,第二个也是还有许多东西还没有搞明白,所以准备重新梳理一下,第二个也是可以集中时间多研究一下其中内容。

后面的文章会是一个系列

区块链介绍
hyperledger-fabric
hyperledger-compose
blockchain-explorer

账本举例

传统账本

假设三个程序员A,B,C住在一起,大家平时生活在一起,生活上难免现金周转不开,出现向别人借钱的状况。大家是将现金交易写在一个黑板上的。经过一个月以后,出现下面的账本。

A借B 100元,2018/09/01
A借C 200元,2018/09/05
A还B 50元, 2018/09/10
C借B 150元,2018/09/15
C还B 100元,2018/09/20

但是有一天,A将第三条记录修改为

A还B 100元, 2018/09/10

这样账本就不够安全。

借鉴数字摘要(Digital Digest)技术

每添加一条记录前,首先计算前面所有历史记录的摘要值,也就是一个hash值。那现在我们将上面的内容改写成带有数字摘要的。 数字摘要的计算方式:首先计算前面所有记录的sha256(前面所有记录)值,然后和将要添加的计算一起写在账本的最下方。 例如:

第一条记录摘要值:括号内为空,因为前面没有记录,sha256() = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
第二天记录摘要值:sha256(e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 A借B 100元,2018/09/01)
第三条记录摘要值:sha256(e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 A借B 100元,2018/09/01
a6a2a7fdeffee901ffbc3a9423036f844b5a8004ff5458aa4e1ff63f1096a248 A借C 200元,2018/09/05)
......

得到结果过如下:

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 A借B 100元,2018/09/01
a6a2a7fdeffee901ffbc3a9423036f844b5a8004ff5458aa4e1ff63f1096a248 A借C 200元,2018/09/05
4f49d2619f653edda7b22e1cfbab5d51961844cfc53adffea4c5ca23f4c6bbc9 A还B 50元, 2018/09/10
878843ca6dd19cae8ed20e515a4e2df5ddd06fcb989129bf8aa68ee8b9a2b0cf C借B 150元,2018/09/15
ebc6d917e3d723386780e3c2489418f0ff52116ca21bd1aa309f42ce0fa3f8f5 C还B 100元,2018/09/20

如果此时A将第三条记录内容修改为A还B 100元, 2018/09/10

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 A借B 100元,2018/09/01
a6a2a7fdeffee901ffbc3a9423036f844b5a8004ff5458aa4e1ff63f1096a248 A借C 200元,2018/09/05
4f49d2619f653edda7b22e1cfbab5d51961844cfc53adffea4c5ca23f4c6bbc9 A还B 100元, 2018/09/10
878843ca6dd19cae8ed20e515a4e2df5ddd06fcb989129bf8aa68ee8b9a2b0cf C借B 150元,2018/09/15
ebc6d917e3d723386780e3c2489418f0ff52116ca21bd1aa309f42ce0fa3f8f5 C还B 100元,2018/09/20

那么我们可以通过计算第四条记录的摘要值里发现前面记录被修改过,因为第四条记录的值为: 8bd9f0621c05578a96ea4c1745cfbb99e2aba54ecb3e003d77e255a1f0cc389a

增量摘要值

上面的方法存在问题,是随着账本的增加,每一次计算都需要将前面所有的记录计算一次,计算成本过高,基于sha256算法的特性。内容上一个字母的变化计算结果都会有很大的区别。所以这里采用下面方式进行计算:

第一条记录为: "", A借B 100元,2018/09/01, sha("", A借B 100元,2018/09/01)
=> "", A借B 100元, f748da464d2693dd9a80febf27b251a8dc3592387ee35741620c9c96cdd71fb7然后将第一条记录得到的摘要值传给第二条记录。
第二条记录为:f748da464d2693dd9a80febf27b251a8dc3592387ee35741620c9c96cdd71fb7, A借C 200元, 2018/09/05, sha(f748da464d2693dd9a80febf27b251a8dc3592387ee35741620c9c96cdd71fb7, A借C 200元)
=> f748da464d2693dd9a80febf27b251a8dc3592387ee35741620c9c96cdd71fb7, A借C 200元, ffaa5c0ccb857fba5019f29e2b12cc6cf395d667f582c735c32be104c171d684

这样做的原因是因为,如果第一条记录内容有任何一个字母更改,得到的摘要值都会有很大的变化,从第一条记录中就会发现当前的摘要值不对,有人更改了内容。如果连摘要值都修改了,那么第二条记录也可以发现与前一条记录的摘要值不相等,就会发现第一条记录的内容改了,而且摘要值也被改了。所以我们这种那前一个记录计算的摘要值和当前记录内容一起生成行的摘要值也是可以达到(2)的效果,而且计算起来很方便。

这里有一个问题就是如果修改记录的人把所有的摘要值都重新计算一遍,那么所有人都没法发现了。这个问题先抛出来,后面再谈。

区块链底层结构

区块链网络底层结构类似上面第三种。但是有点不同,现在我们将上面的方式换一下。 就是每一天的所有记录为一个单位计算摘要值,而不是每一条记录都记录摘要值。这样我们得到的结论就是若干个记录会在一起进行摘要值的计算,并且其中会带有前一个单位的摘要值和当前单位的摘要值。然后就可以开始类比区块链网络结构了。

概念

首先来看三个基本概念:

交易(Transaction):一次对账本的操作,导致账本状态的一次改变,如添加一条转账记录;
区块(Block):记录一段时间内发生的所有交易和状态结果等,是对当前账本状态的一次共识;
链(Chain):由区块按照发生顺序串联而成,是整个账本状态变化的日志记录。

区块结构体定义

type Block struct {Index int64TimeStamp int64PrevBlockHash stringHash stringData string
}
区块链结构体定义
type BlockChain struct {Block []*Block
}
计算区块的 Hash 值
func calculateHash(block Block) string {data := string(block.Index) + string(block.TimeStamp) + block.PrevBlockHash + block.DatablockInBytes := sha256.Sum256([]byte(data))return hex.EncodeToString(blockInBytes[:])
}    

底层结构

如果把区块链系统作为一个状态机,则每次交易意味着一次状态改变;生成的区块,就是参与者对其中交易导致状态改变结果的共识。区块链的目标是实现一个分布的数据记录账本,这个账本只允许添加、不允许删除。账本底层的基本结构是一个线性的链表。链表由一个个“区块”串联组成(如下图所示),后继区块中记录前导区块的哈希(Hash)值。某个区块(以及块里的交易)是否合法,可通过计算哈希值的方式进行快速检验。

区块链实现上面实例

源代码地址:https://github.com/rodchen-king/Hyperledger-Fabric/tree/master/blockchain

运行

// 进入目录
$ cd $GOPATH/src/BlockChain// 执行命令
$ go run ./cmd/main.goIndex: 0
PrevBlockHash:
CurrHash: 0d8845eb2da42f75aef4ee920f644975d73347e0331d17b37209c4f32ef4867f
Data: Genesis Block
Timestamp: 1539874076Index: 1
PrevBlockHash: 0d8845eb2da42f75aef4ee920f644975d73347e0331d17b37209c4f32ef4867f
CurrHash: b11305449703848e79f02f0ba7f7db6bdd085a4a5ea50382ea4cca77644c376b
Data: A借B 100元,2018/09/01
Timestamp: 1539874076Index: 2
PrevBlockHash: b11305449703848e79f02f0ba7f7db6bdd085a4a5ea50382ea4cca77644c376b
CurrHash: 751c3793ee3492f5e050c6b662f4d832bc125dde0aae813147e5459abc23f29a
Data: A借C 200元,2018/09/05
Timestamp: 1539874076Index: 3
PrevBlockHash: 751c3793ee3492f5e050c6b662f4d832bc125dde0aae813147e5459abc23f29a
CurrHash: fe1b5200d9c079f8533f5c5cb0b80ca6438adb9cb5fe3756d6a03910ca50fd1f
Data: A还B 50元, 2018/09/10
Timestamp: 1539874076Index: 4
PrevBlockHash: fe1b5200d9c079f8533f5c5cb0b80ca6438adb9cb5fe3756d6a03910ca50fd1f
CurrHash: 717abf4372e4530adec052e048f75eae4b95f1072d2e66fa4e28ba25112e544e
Data: C借B 150元,2018/09/15
Timestamp: 1539874076Index: 5
PrevBlockHash: 717abf4372e4530adec052e048f75eae4b95f1072d2e66fa4e28ba25112e544e
CurrHash: ae658dd10062bd4034c661ff3423186c4af729de2ab4968f245fcc898b3fe6bb
Data: C还B 100元,2018/09/20
Timestamp: 1539874076

通过 RPC 接口访问数据

启动服务
// 进入目录
$ cd $GOPATH/src/BlockChain// 开启http服务监听
$ go run rpc/Server.go

查看数据

打开浏览器输入 URL 地址:http://localhost:8000/blockchain/get{"Block": [{"Index": 0,"TimeStamp": 1539490490,"PrevBlockHash": "","Hash": "0d8845eb2da42f75aef4ee920f644975d73347e0331d17b37209c4f32ef4867f","Data": "Genesis Block"}]
}

写入区块链数据

打开浏览器输入 URL 地址:http://localhost:8000/blockchain/write?data=A借B 100元,2018/09/01{"Block": [{"Index": 0,"TimeStamp": 1539874242,"PrevBlockHash": "","Hash": "0d8845eb2da42f75aef4ee920f644975d73347e0331d17b37209c4f32ef4867f","Data": "Genesis Block"}, {"Index": 1,"TimeStamp": 1539874384,"PrevBlockHash": "0d8845eb2da42f75aef4ee920f644975d73347e0331d17b37209c4f32ef4867f","Hash": "b11305449703848e79f02f0ba7f7db6bdd085a4a5ea50382ea4cca77644c376b","Data": "A借B 100元,2018/09/01"}]
}
写入所有交易
{"Block": [{"Index": 0,"TimeStamp": 1539874242,"PrevBlockHash": "","Hash": "0d8845eb2da42f75aef4ee920f644975d73347e0331d17b37209c4f32ef4867f","Data": "Genesis Block"}, {"Index": 1,"TimeStamp": 1539874384,"PrevBlockHash": "0d8845eb2da42f75aef4ee920f644975d73347e0331d17b37209c4f32ef4867f","Hash": "b11305449703848e79f02f0ba7f7db6bdd085a4a5ea50382ea4cca77644c376b","Data": "A借B 100元,2018/09/01"}, {"Index": 2,"TimeStamp": 1539874483,"PrevBlockHash": "b11305449703848e79f02f0ba7f7db6bdd085a4a5ea50382ea4cca77644c376b","Hash": "751c3793ee3492f5e050c6b662f4d832bc125dde0aae813147e5459abc23f29a","Data": "A借C 200元,2018/09/05"}, {"Index": 3,"TimeStamp": 1539874498,"PrevBlockHash": "751c3793ee3492f5e050c6b662f4d832bc125dde0aae813147e5459abc23f29a","Hash": "fe1b5200d9c079f8533f5c5cb0b80ca6438adb9cb5fe3756d6a03910ca50fd1f","Data": "A还B 50元, 2018/09/10"}, {"Index": 4,"TimeStamp": 1539874504,"PrevBlockHash": "fe1b5200d9c079f8533f5c5cb0b80ca6438adb9cb5fe3756d6a03910ca50fd1f","Hash": "717abf4372e4530adec052e048f75eae4b95f1072d2e66fa4e28ba25112e544e","Data": "C借B 150元,2018/09/15"}, {"Index": 5,"TimeStamp": 1539874511,"PrevBlockHash": "717abf4372e4530adec052e048f75eae4b95f1072d2e66fa4e28ba25112e544e","Hash": "ae658dd10062bd4034c661ff3423186c4af729de2ab4968f245fcc898b3fe6bb","Data": "C还B 100元,2018/09/20"}]
}

账本进化-了解区块链相关推荐

  1. 用Kubernetes部署超级账本Fabric的区块链即服务(1)

    用Kubernetes部署超级账本Fabric的区块链即服务(1) 2017年08月13日 00:00:00 阅读数:937 题图摄于旧金山市区:云海中的 Twin Peaks 不久前,我们发表了如何 ...

  2. 用Kubernetes部署超级账本Fabric的区块链即服务

    关注微信公众号 区块链大本营,学习更多区块链技术及应用知识. 区块链行业投稿,请邮件联系 jiawd@csdn.net 本文将探讨如何把 Fabric v1.0自动化部署在现今最流行的 Kuberne ...

  3. hyperledger部署java_Hyperledger Fabric(超级账本) Java 开发区块链 部署运行智能合约

    部署并运行 Java 链代码示例 您已经定义并启动了本地区块链网络,而且已构建 Java shim 客户端 JAR 并安装到本地 Maven 存储库中,现在已准备好在之前下载的 Hyperledger ...

  4. 【问链财经-区块链基础知识系列】 第二十七课 区块链与分布式账本的异同

    编者按:在加密货币和区块链领域,有一个业内人士常挂在嘴边的新术语:分布式账本技术(简称DLT).但具有讽刺意味的是,恰恰是比特币和各种区块链试图颠覆的实体们,例如银行,政府和大公司,对分布式账本技术情 ...

  5. 区块链≠分布式账本,别再傻傻分不清

    今天来聊两个基本概念,区块链与分布式账本.区块链是一种分布式账本,但是它又不完全等同超级账本,人们有时会交替使用"区块链"和"分布式账本",到底他们的区别在哪里 ...

  6. 区块链学习7:超级账本项目Hyperledger与Fabric以及二者的关系

    ☞ ░ 前往老猿Python博文目录 ░ 一.超级账本(hyperledger) 超级账本(hyperledger)是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目,成员包括 ...

  7. 阿里云成为Hyperledger超级账本全球会员,发力区块链生态建设

    2018年12月12日在瑞士巴塞尔的2018Hyperledger全球峰会上,阿里云正式加入Hyperledger超级账本项目并成为标准会员.阿里云将会与Hyperledger社区共同推进全球区块链技 ...

  8. 【BSV资讯】图瓦卢国家数字账本:赋能于全球首批区块链公民

    发表时间:2021年5月4日 信息来源:BitcoinAssociation.net 图瓦卢是南太平洋的一个小型岛国,该国居民可能成为世界上首批区块链公民,即公民的身份.国籍和金融数据都将安全地存储于 ...

  9. 超级账本与区块链应用场景

    文章目录 区块链3.0 去中心化应用的新需求 区块链技术在行业应用中的条件 区块链3.0架构与超级账本 区块链3.0架构 超级账本(Hyperledger Fabric) 超级账本的项目 Fabric ...

最新文章

  1. 苹果裁员逾200人,拿无人驾驶“开刀”
  2. 用nodejs搭建最简单、轻量化的http server
  3. Marketing Cloud的语音输入功能
  4. 前端开发中游览器的兼容问题总结
  5. Sublime 安装包时出现的 There are no packages available for installation
  6. JDBC简单连接MySQL
  7. web开发 开发一个能发送邮件的应用
  8. Ubuntu18.04误删分区表,无法挂载U盘解决
  9. 升级后可能遇到的故障- -从Windows 2012升级到2016案例之3
  10. 智能图形开发板SmartGLCD
  11. Excel数据分析项目——电商数据分析实战
  12. C# 图片预览打印方法
  13. linux文件夹的执行权限不够怎么解决
  14. 线性代数之行列式(1) ——行列式的定义以及二阶行列式
  15. 《数据挖掘》学习框架
  16. blender使用小技巧
  17. LeetCode-70. 爬楼梯(java)
  18. 提升html5的性能体验系列之一避免切页白屏
  19. Luogu P3385 【模板】负环 - 题解
  20. python爬取地表水水质监测数据(爬虫)

热门文章

  1. 客运行业发展现状分析
  2. FLTK的UI设计工具FLUID使用方法总结
  3. 老头怎么打边惩程咬金?
  4. 背包算法设计(参考学习)
  5. html字体颜色字号,(前端)html与css,css 5、颜色、字体、字号量取方式
  6. 7 张图带你搞懂二层和三层交换机之间的区别
  7. Git报错:remote: HTTP Basic: Access denied的解决方法
  8. tp6查询某个字段不等于null
  9. [一键CV] Blazor 拖放上传文件转换格式并推送到浏览器下载
  10. 002 常见量化交易平台使用