《区块链底层设计Java实战》之第一章区块链简介
第1 章 区块链简介
与君初相识 犹如故人归
1.1 戏说区块链
当笔者奉调出任区块链研发负责人之初,加班相对之前又多了些。加班多了,
自然陪家里小宝宝玩儿的时间就少了。为此,小宝宝有点儿不开心。
家里三岁的小宝宝和笔者有过这样一段对话。
小宝宝:“爸爸,你怎么不回来陪我玩儿啊,我睡觉的时候你还没回来!”
笔者:“宝宝,爸爸去做区块链了。事情很多,所以加班多啦。”
小宝宝:“什么是区块链啊?好玩不?”
笔者:“区块链是一个游戏,这个游戏可好玩了!”
小宝宝:“我也想玩,怎么玩啊?”
笔者:“比如,过年的时候,你会收到什么呀?”
小宝宝:“压岁钱!”
笔者:“对,那爸爸妈妈还会说什么呢?”
小宝宝:“爸爸妈妈先把毛爷爷帮我收起来,我长大了再花!”
笔者:“对。可是,如果等你长大了,爸爸妈妈没给你曾经收到的这么多压岁钱
花,你怎么办?”
小宝宝:……
笔者:“有了区块链就不会出现这种假设的问题啦。比如过年的时候,爷爷给了
你1000 块压岁钱,爷爷就在自己的小本本上写:今天给了宝宝1000 块压岁钱。然
后爷爷大声告诉奶奶、爸爸、妈妈:‘我今天给了宝宝1000 块压岁钱。’奶奶、爸爸、
妈妈听到之后都在自己的小本本上写:爷爷今天给了宝宝1000 块压岁钱。”
“然后奶奶给了你2000 块压岁钱,奶奶就在自己的小本本上写:今天给了宝宝
2000 块压岁钱。然后奶奶大声告诉爷爷、爸爸、妈妈:‘我今天给了宝宝2000 块压
岁钱。’爷爷、爸爸、妈妈听到之后都在自己的小本本上写:奶奶今天给了宝宝2000
块压岁钱。”
“之后爸爸给了你3000 块压岁钱,爸爸就在自己的小本本上写:今天给了宝宝
3000 块压岁钱。然后爸爸大声告诉爷爷、奶奶、妈妈:‘我今天给了宝宝3000 块压
岁钱。’爷爷、奶奶、妈妈听到之后都在自己的小本本上写:爸爸今天给了宝宝3000
块压岁钱。”
“最后妈妈给了你4000 块压岁钱,妈妈就在自己的小本本上写:今天给了宝宝
4000 块压岁钱。然后妈妈大声告诉爷爷、奶奶、爸爸:‘我今天给了宝宝4000 块压
岁钱。’爷爷、奶奶、爸爸听到之后都在自己的小本本上写:妈妈今天给了宝宝4000
块压岁钱。”
“每年过年大家给完宝宝压岁钱之前后都这样写在小本本上,然后告诉其他人也
写在自己的小本本上,这就是区块链。”
“我们还可以约定宝宝10 岁时就可以拿出1000 块钱买好吃的,到你10 岁的时
候呢,1000 块钱就会送到你手上。这就是智能合约。”
小宝宝:“区块链这个游戏真好玩,快给我拿纸和笔,我也要写!”
1.2 正说区块链
2018 年年初以来,区块链一词火遍了大街小巷,出租车司机、程序员、培训机
构等都在谈论区块链。区块链在网络上也成了热门搜索词汇,在百度指数上搜索区
块链可以看到,区块链从2018 年1 月陡然成为热词,之后持续保持“网红”趋势,
搜索指数居高不下,如图1-1 所示。
什么是区块链呢?
区块链一词最早出现在中本聪(Satoshi Nakamoto)的“比特币:一种点对点的
电子现金系统(Bitcoin: A Peer-to-Peer Electronic Cash System)”一文中。
在比特币系统中,区块链作为存储底层,承载了上层众多认同比特币相关协议
并严格遵守及维护协议的节点(个人或组织)的记录各类信息的行为。
区块链的存储是一种链式存储,区块按照生成的时间顺序前后链接,区块的链
接基于区块存储内容的哈希值构建。区块生成后会在区块链系统的各个节点(个人
或组织)中同步,因此各个节点最终均保存了一份完整且一致的数据。也就是说,
区块链系统会保持最终一致性,但不保证实时一致性。
比特币系统中理论上不支持数据的删除和修改。数据的删除和修改意味着其修
改所在区块的哈希值也需要随之修改,而该区块之后的所有区块的前向链接哈希值
均需改变。随着比特币系统中节点(个人或组织)数量的增多,前向哈希值的修改
和同步工作会愈发繁重。在比特币全网络中对数据删除和修改变得愈发困难,因此
比特币系统中区块数据的不可篡改性就体现了出来。
由于加入比特币网络的节点(个人或组织)严格遵守比特币协议,因此区块链
从理论上具备了承载信用的特性。
从技术上来说,区块链技术并非凭空产生,而是基于已有技术演变而来的。
区块链的链式构成和我们上学时所学的《数据结构和算法》这类书籍中的单链
表有一定的相似性,链表中的各部分内容均通过指针(哈希值也是泛化指针的一种
形式)相连。不同之处在于,单链表是从前向后构建关联关系,即新插入一个内容
时,需从链表的表头开始移动指针至链表尾部,再将尾部的指针指向新建的内容,
新建的内容自动成为链表的尾部。而区块链是从后向前构建关联关系,即新生成的
区块通过前面区块的哈希值与前面区块建立连接。
区块中header+body 的结构设计与Web 开发中常见的HTTP 协议有一定的相似
性。HTTP 协议的request 和response 均由三部分组成:request/response line、
request/response body、request/response header。
区块内容的加密就更常见了,无论是对称加密,抑或是非对称加密,在MySQL
敏感数据存储、接口参数加密、OAuth 授权等无处不在。而区块内容中多条交易信
息对应的Merkle 树源于《数据结构和算法》中的二叉树。
区块链中P2P 网络是区块链系统的基础。共识的达成、数据的同步均依赖于高
效的P2P 网络系统。P2P 网络的构建源于少见的Java 网络编程部分。在生活中,QQ、
微信、微博等场景均有类似应用。如果读者研究过ElasticSearch、Redis 集群、Kafka
集群等数据同步的代码,对开发和构建P2P 网络应该更有信心。不过随着技术的发
展,Java 开发小伙伴可以不再基于原始的Socket 进行开发,可以选用WebSocket 或
t-io 等组件进行开发。
区块链上共识的达成基于共识算法。共识算法的起源算法很多读者都熟知,如
Paxos 一致性算法,分布式数据库的二、三阶段提交协议、ZooKeeper 的快速选举算
法等。当然,不同的公链、联盟链的共识算法在不同场景有不同的选择,但算法基
础都是一脉相承的。
区块的存储和常见的分布式应用开发略有不同。在分布式应用开发中,我们熟
悉的分库分表、分布式缓存集群等并不适用。区块链的每个节点是一个单机,存储
也随本机进行。因此,区块的存储往往选用高性能的文件系统或高性能的单机版
SQL/NoSQL 数据库,如SQLite、LevelDB、RocksDB 等。当然,单机的存储空间始
终是有限的,随着存储承载压力的增加,后续区块链存储的扩容也可能成为区块链
领域的另一种创新。
看到这么多相似的技术,是不是已经觉得区块链底层的研发不再高不可攀了
呢?来吧,笔者将带你走进区块链底层开发世界,曾经以为的高门槛将不再遥不可及!
1.3 区块链的未来:联盟链
2018 年伊始,区块链在国内开始火热起来。各个行业各个领域都开始寻找自身
业务和区块链的结合,不断有一些尝试性的落地应用上线,其中以金融、游戏领域
为主,内容、房产信息、商品溯源等场景也开始引入区块链。
不同场景下,区块链类型的选型也不尽相同。
在区块链世界中,一般划分为公链、联盟链、私链。从技术视角而言,公链、
联盟链、私链的底层技术大抵相同,但适用场景则大相径庭。我们可以从不同的视
角来看待公链、联盟链、私链。
从去中心化这一区块链系统最大的特色来说,公链是完全去中心化的,公链网
络的各个节点都可以读取和写入数据;联盟链则是部分去中心化,节点由联盟内成
员部署,读写权限也可以根据联盟内的协议来定制;私链本质上还是中心化的,数
据的写入由私链所属组织控制,数据的读取和使用则由私链所属组织的应用场景来
定。
从代码开源程度而言,公链的开放程度最大,全世界的个人和组织均可获取其
完整代码,个人和组织可以直接部署,亦可修改为己所用。联盟链则是对联盟内部
用户开源其最核心代码,代码的写权限可以在联盟内部分级管理。私链的代码归属
于个人或组织,一般不对外开放源码。
从激励体系角度而言,激励体系是公链的灵魂,不可或缺;联盟链可以根据场
景选择是否使用激励体系;私链则更加灵活。
那么公链、联盟链、私链谁代表了区块链未来的发展方向呢?特别是谁代表了
企业级区块链的未来呢?笔者判断是联盟链。
激励体系作为公链的灵魂,其对应的优秀经济模型的设计比较困难。同时,激
励体系往往是为了吸引更多的节点进入公链挖矿,挖矿在现有的共识算法体系下是
一种耗费计算资源的低效行为,并不经济。而且企业相关的业务信息往往私密性较
强,不适合进入公链,即便有部分信息可以在公链落地,数据落地的经济成本也不
便宜,毕竟矿工打包数据是需要付费的。
而私链既可以使用公链开源代码,也可以基于联盟链开源代码实现,只是节点
数量要少得多。私链的应用往往是在组织内部,并不会对外产生多大影响。
联盟链则不然。各个联盟链组建之初往往都立足于行业,着眼于解决行业共性
问题,是能促进行业效率和发展的底层支撑技术。由于企业级应用往往涉及业务逻
辑甚至商业机密,因此公链目前并不太适合企业级区块链的应用场景,而联盟链给
业务逻辑和商业信息限定了范围,使得区块链技术应用的普适性大大增加。
作为研发,在学会驳接各类公链、联盟链、私链的同时,更应知晓区块链的底
层实现技术。本书以联盟链为主线,以区块链底层技术为支撑展开内容,一步步引
导读者构建区块链底层平台。
书籍二维码如下
上一篇: 融资租赁与经营租赁的区别 sapFICO
下一篇: 融资租赁与经营租赁的区别 sapFICO