使用Java开发一个自己的区块链产品、联盟链
开源地址:https://gitee.com/tianyalei/md_blockchain
https://gitee.com/tianyalei/md_blockchain_manager
Java区块链平台,基于Springboot开发的区块链平台。
公司要开发区块链,原本是想着使用以太坊开发个合约或者是使用个第三方平台来做,后来发现都不符合业务需求。原因很简单,以太坊、超级账本等平台都是做共享账本的,有代币和挖矿等模块。而我们需要的就是数家公司组个联盟,来共同见证、记录一些不可篡改的交互信息,如A公司给B公司发了一个xxx请求,B公司响应了什么什么。其实要的就是一个分布式数据库,而且性能要好,不能像比特币那种10分钟才生成一个区块。我们要的更多的是数据库的性能,和区块链的一些特性。
项目于18年3月初开始研发,历时一月发布了第一版。主要做了存储模块、加密模块、网络通信、PBFT共识算法、公钥私钥、区块内容解析落地入库等。已经初步具备了区块链的基本特征,但在merkle tree、智能合约以及其他的一些细节上,尚不到位。
希望高手不吝赐教,集思广益,提出见解或方案,来做一个区块链平台项目,适合更多的区块链场景,而不仅仅是账本和各种忽悠人的代币。
主要有存储模块、网络模块、PBFT共识算法、加密模块、区块解析入库等。
该项目属于"链",非"币"。不涉及虚拟币和挖矿。
Block内存储的是类Sql语句。联盟间预先设定好符合业务场景需要的数据库表结构,然后设定好各个节点对表的操作权限(ADD,UPDATE,DELETE),将来各个节点就可以按照自己被允许的权限,进行Sql语句的编写,并打包至Block中,再全网广播,等待全网校验签名、权限等信息的合法性。如果Block合法,则进入PBFT共识算法机制,各节点开始按照PrePrepare、Prepare、Commit等状态依次执行,直到2f+1个commit后,开始进行本地生成新区块。新区块生成后,各节点进行区块内容解析,并落地入库的操作。
场景就比较广泛了,可以设定不同的表结构,或者多个表,进而能完成各自类型信息的存储。譬如商品溯源,从生产商、运输、经销商、消费者等,每个环节都可以对某个商品进行ADD信息的操作。
存储采用的是key-value数据库rocksDB,了解比特币的知道,比特币用的是levelDB,都是类似的东西。可以通过修改yml中db.levelDB为true,db.RocksDB为false来动态切换使用哪个数据库。
结构类似于sql的语句,如ADD(增删改) tableName(表名)ID(主键) JSON(该记录的json)。这里设置了回滚的逻辑,也就是当你做了一个ADD操作时,会同时存储一条Delete语句,以用于将来可能的回滚操作。
网络层,采用的是各节点互相长连接、断线重连,然后维持心跳包。网络框架使用的是t-io,也是oschina的知名开源项目。t-io采用了AIO的方式,在大量长连接情况下性能优异,资源占用也很少,并且具备group功能,特别适合于做多个联盟链的SaaS平台。并且包含了心跳包、断线重连、retry等优秀功能。
在项目中,每个节点即是server,又是client,作为server则被其他的N-1个节点连接,作为client则去连接其他N-1个节点的server。同一个联盟,设定一个Group,每次发消息,直接调用sendGroup方法即可。
但仍需要注意的是,由于项目采用了pbft共识算法,在达到共识的过程中,会产生N的3次方数量的网络通信,当节点数量较多,如已达到100时,每次共识将会给网络带来沉重的负担。这是算法本身的限制。
分布式共识算法是分布式系统的核心,常见的有Paxos、pbft、bft、raft、pow等。区块链中常见的是POW、POS、DPOS、pbft等。
比特币采用了POW工作量证明,需要耗费大量的资源进行hash运算(挖矿),由矿工来完成生成Block的权利。其他多是采用选举投票的方式来决定谁来生成Block。共同的特点就是只能特定的节点来生成区块,然后广播给其他人。
区块链分如下三类:
私有链:这是指在企业内部部署的区块链应用,所有节点都是可以信任的,不存在恶意节点;
联盟链:半封闭生态的交易网络,存在不对等信任的节点,可能存在恶意节点;
公有链:开放生态的交易网络,为联盟链和私有链等提供全球交易网络。
由于私有链是封闭生态的存储系统,因此采用Paxos类共识算法(过半同意)可以达到最优的性能;联盟链有半公开半开放特性,因此拜占庭容错是适合选择之一,例如IBM超级账本项目;对于公有链来说,这种共识算法的要求已经超出了普通分布式系统构建的范畴,再加上交易的特性,因此需要引入更多的安全考虑。所以比特币的POW是个非常好的选择。
我们这里可选的是raft和pbft,分别做私链和联盟链,项目中我使用了修改过的pbft共识算法。
先来简单了解pbft:
(1)从全网节点选举出一个主节点(Leader),新区块由主节点负责生成。
(2)每个节点把客户端发来的交易向全网广播,主节点将从网络收集到需放在新区块内的多个交易排序后存入列表,并将该列表向全网广播。
(3)每个节点接收到交易列表后,根据排序模拟执行这些交易。所有交易执行完后,基于交易结果计算新区块的哈希摘要,并向全网广播。
(4)如果一个节点收到的2f(f为可容忍的拜占庭节点数)个其它节点发来的摘要都和自己相等,就向全网广播一条commit消息。
(5)如果一个节点收到2f+1条(包括自己)commit消息,即可提交新区块到本地的区块链和状态数据库。
(6)客户端收到f + 1个成功(即便有f个失败、再f个恶意返回的错误信息,f + 1个正确的也是多数派)的返回,即可认为该次写入请求是成功的。
可以看到,传统的pbft是需要先选举出leader的,然后由leader来搜集交易,并打包,然后广播出去。然后各个节点开始对新Block进行校验、投票、累积commit数量,最后落地。
而我这里对pbft做了修改,这是一个联盟,各个节点是平等的,而且性能要高。所以我不想让每个节点都生成一个指令后,发给其他节点,再大家选举出一个节点来搜集网络上的指令组合再生成Block,太复杂了,而且又存在了leader节点的故障隐患。
我对pbft的修改是,不需要选择leader,任何节点都可以构建Block,然后全网广播。其他节点收到该Block请求时即进入Pre-Prepare状态,校验格式、hash、签名、和table的权限,校验通过后,进入Prepare状态,并全网广播状态。待自己累积的各节点Prepare的数量大于2f+1时,进入commit状态,并全网广播该状态。待自己累积的各节点Commit的数量大于2f+1时,认为已达成共识,将Block加入区块链中,然后执行Block中sql语句。
很明显,和有leader时相比,缺少了顺序的概念。有leader时能保证Block的顺序,当有并发生成Block的需求时,leader能按照顺序进行广播。譬如大家都已经到number=5的区块了,然后需要再生成2个,有leader时,则会按照6、7的顺序来生成。而没有leader时,则可能发生多节点同时生成6的情况。为了避免分叉,我做了一些处理,具体的可以在代码里看实现逻辑。
各节点通过执行相同的sql来实现一个同步的sqlite数据库(或mysql等其他关系型数据库),将来对数据的查询都是直接查询sqlite,性能高于传统的区块链项目。
由于各个节点都能生成Block,在高并发下会出现区块不一致的情况。如果因为某些原因导致链分叉了,也提供了回滚机制,sql可以回滚。原理也很简单,你ADD一个数据时,我会在区块里同时记录两个指令,一个是ADD,一个是回滚用的DELETE。同理,UPDATE时也会保存原来的旧数据。区块里的sql落地,譬如顺序执行1-10个指令,回滚时就是从10-1执行回滚指令。
每个节点都会记录自己已经同步了的区块的值,以便随时进行sql落地入库。
对区块链信息的查询,那就简单了,直接做数据库查询即可。相比于比特币需要检索整个区块链的索引树,速度和方便性就大不同了。
使用方法:先下载 md_blockchain_manager项目,然后导入工程里的sql数据库文件,修改application.yml数据库配置,最后启动manager项目。
然后修改md_blockchain中application.yml里的name、appid和manager项目数据库里的某个值对应,作为一个节点。如果有多个节点,则某个节点都和数据库里对应,填写各节点的ip。managerUrl就是manager项目的url,让该项目能访问到manager项目。
在md_blockchian项目启动时,在ClientStarter类中可见,启动时会从manager项目拉取所有节点的数据,并进行连接。如果自己的ip和appId等不在manager数据库中,则无法启动。
可以通过访问localhost:8080/block?content=1来生成一个区块。正常使用时至少要启动4个节点才行,否则无法达成共识,PBFT要求2f+1个节点同意才能生成Block。为了方便测试,可以直接修改pbftSize的返回值为0,这样就能自己一个节点玩起来了。如果有多个节点,在生成Block后就会发现别的节点也会自动同步自己新生成的Block。目前代码里默认设置了一张表message,里面也只有一个字段content,相当于一个简单的区块链记事本。当有4个节点时,可以通过并发访问其中的几个来同时生成Block进行测试,看是否会分叉。还可以关停其中的一个,看其他的三个是否能达成共识(拜占庭最多容许f个节点故障,4个节点允许1个故障),恢复故障的那个,看是否能够同步其他正常节点的Block。可以进行各种测试,欢迎提bug。
可以通过localhost:8080/block/sqlite来查看sqlite里存的数据,就是根据Block里的sql语句执行后的结果。
我把项目部署到docker里了,共启动4个节点,如图:
此外还有高并发情况下,各节点同时生成Block,系统处理共识、保证区块链不分叉的一些测试。
这个生成区块的接口是写好用来测试的,正常走的流程是调用instuction接口,先生产符合自己需求的指令,然后组合多个指令,调用BlockController里的生成区块接口。
作者:京东零售 武伟峰
深入探讨数字经济:两大本质、三大特征及基础技术——区块链
区块链技术自2008年比特币问世以来,迅速发展并被广泛关注和应用,创新型的分布式数据存储和信任机制为其赢得了众多追随者。与此同时,区块链技术在不同国家和地区也呈现出差异性。本文将从国内外区块链关键技术现状及差异两方面进行详细分析。
一、国内外区块链关键技术现状
1.国内区块链技术现状
随着国内区块链技术的普及和应用,我国的区块链技术已经进入了快速发展阶段。目前,国内的区块链技术可以分为公有链和联盟链两种。公有链旨在通过去中心化的方式实现数字货币和价值传递,代表作品是比特币、以太坊等。联盟链则是一种半中心化的方式,多用于企业或组织内部的数据共享和流转,目前已经广泛应用于各行业领域。
目前,国内已经有很多知名企业和机构开始关注区块链技术,包括阿里巴巴、腾讯、百度等互联网公司,以及工商银行、建设银行等大型金融机构,还有清华大学、中国科技大学等知名高校。这些机构纷纷开展了自己的区块链研究,包括底层架构设计、共识算法、智能合约等。
2.国外区块链技术现状
与国内相比,国外的区块链技术发展更加成熟。目前,国外的区块链技术主要被应用于数字货币、金融行业、物联网和智能合约等领域,各大金融机构和企业也将其作为数字转型的重要组成部分,大力推进区块链技术的研究和创新。
比特币和以太坊是目前最为知名的数字货币,它们采用的是公有链的方式,维护去中心化的数字货币生态。在联盟链方面,国外同样有很多知名企业和组织在积极探索,包括IBM、微软、谷歌等科技巨头,它们将区块链技术应用于供应链管理、数字身份等领域,实现了数据共享和流转的数字化转型。
二、国内外区块链关键技术差异
1.底层技术差异
国内的区块链技术主要采用比特币和以太坊的底层技术架构,相对来说较为单一。而国外则不同,IBM旗下的Hyperledger Fabric和R3的Corda等技术则更加多样化,适用于不同的领域和应用场景。
2.企业应用场景差异
虽然区块链技术建立在数据共享和流通之上,但不同的应用场景和行业需求下,企业实施区块链技术时需要的技术解决方案和技术体系也会有所不同。国内在大数据和金融领域的应用较为广泛,而国外则涉及到了更多的领域,如物流、医疗、供应链管理等。因此,企业在实施区块链技术时需要考虑以下几个方面:
总之,区块链技术是一种具有广泛应用前景的新兴技术,企业在实施区块链技术时需要综合考虑技术架构、智能合约、数据安全、监管合规、生态建设和应用场景等多方面因素。
微信搜索“春秋壹号"公众号查看更多相关资讯
区块链基本特性及其与电子档案管理的契合点
作为一种多技术融合创新的产物,区块链在诞生之初就就引入了密码技术等多种安全技术来允许其拥有包括多中心、防篡改、抗伪造、可追溯等多种安全功能。随着对区块链技术研究的深入,近年来区块链中越来越多的安全问题逐渐暴露出来,因此一些新的安全技术也被开发和引入到区块链系统设计中,为区块链的未来发展提供了可靠而灵活的安全保障。
下面主要介绍为保证区块链多种安全功能而使用的基本安全技术以及为区块链提供更多安全保障而开发和引入的安全增强技术。
1、混合加密
在实际系统应用中极少仅使用对称加密或公钥加密算法来保护数据机密性,而通常会采用融合了对称和公钥加密算法两者优点的混合加密方式。由于区块链系统自身的特点,其计算和存储能力都是受限制的,因此不可能直接使用运算开销较大的公钥加密算法来保护链上的数据信息,区块链上存储的也仅能是一些非常重要的数据而非用户数据的全部。由此可见,混合加密方式尤其适用在区块链场景下保护用户数据机密性。一个混合加密算法可由下图表示。
2、可搜索加密
区块链是一种去中心化的、分布式的数据存储技术,其存储信息一般对区块链节点是公开的,在基于区块链的数字货币系统中,交易记录的数据通常也是公开的,没有额外的数据保护方法。为了保护用户的隐私数据,需要对隐私数据进行加密处理,以减少隐私泄露的风险,要求攻击者无法从被泄密的加密隐私数据中得出明文信息;同时,考虑数据的可用性,要求加密后的数据依然可以被其合法使用者所检索、获取和解密。为此,需要基于可搜索加密技术构造区块链数据隐私保护机制。该机制利用可搜索加密技术实现对存储在区块链数据库中的关键数据的加密及密文搜索,提高了区块链数据隐私保护能力,同时也保证了加密数据的可用性。
作为一种新型的密码原语,可搜索加密技术允许用户在密文域上进行关键词搜索。当数据以密文方式存储在云服务器上时,云服务器可以利用其强大计算能力对密文进行关键词的检索,且云服务器无法获取除了密文是否包含搜素关键字以外的其他任何关于密文的信息。这种方式不仅仅使用户的隐私得到了有效保护,而且检索效率也在服务器的帮助下得到了大幅度提升。
3、安全多方计算
区块链技术发展至今,特别是对于公有链而言,面临着两大困扰:一是公开数据带来的隐私问题;二是链上无法进行高效计算处理的性能问题。隐私问题不但包括区块链上记录的交易信息的隐私,还包括区块链上记录以及传递的其他数据的隐私;高性能的计算一直都是区块链发展的一个瓶颈,在公有网络中,大量节点需要对计算任务进行处理,以保证计算任务处理结果的准确性和不可修改性,但这样做造成了严重的资源浪费和低效,同时,为了取得去中心化的效果,搭建节点的要求又不能太高,这一点又进一步影响了单个节点处理任务的能力。
4、差分隐私
差分隐私是一种比较强的隐私保护技术,满足差分隐私的数据集能够抵抗任何对隐私数据的分析,因为它具有信息论意义上的安全性。差分隐私的基本思想是对原始数据、原始数据的转换或是对原始数据的统计结果添加噪音来达到隐私保护效果。相比于传统的隐私保护模型,差分隐私具有一些独特的有点。首先,差分隐私不关心攻击者所具有的背景知识;其次,差分隐私具有严谨的统计学模型,能够提供可量化的隐私保证。
5、同态加密
使用同态加密技术可以允许运行在区块链上的智能合约可以处理密文,而无法获知真实数据,极大地提高了隐私安全性。对于区块链网络用户来说,希望提交到区块链网络中的数据安全性能得以保证,尤其是重要敏感数据的安全性,应避免恶意的信息泄露和篡改。同态加密技术能够使用户的密文数据在区块链智能合约中密文运算,而非传统的明文运算。这样的优点是,用户将交易数据提交到区块链网络之前,可使用相应的加密算法对交易数据进行加密,数据以密文的形式存在,即使被攻击者获取,也不会泄露用户的任何隐私信息,同时密文运算结果与明文运算结果一致。
6 、访问控制
在区块链系统中,通常是不希望系统数据是可以被所有用户获取和使用的,否则可能引发数据滥用问题;其次,如果数据是面向区块链所有节点开放的,数据访问引发的广播洪泛会对系统自身的数据处理带来压力,影响区块链系统整体性能,而访问控制技术的引入恰好可以通过提前过滤不符合系统预设的访问控制策略的访问请求的方法解决上述问题。因此,无论是从数据安全性还是从系统效能的角度出发,访问控制都是必须使用的一种技术。
访问控制是对信息资源进行保护的一种重要手段。它主要通过对访问行为的主体进行授权来控制主体对客体即资源的可操作属性。一般情况下访问控制模型由主体、客体(资源〉、权限构成。主体可以是用户或程序;权限就是对资源的操作;资源就是信息系统中的网络、数据。访问控制主要目的是保护信息或网络资源不被非授权的进行访问。