使用Java开发一个做数据共享的联盟链思路

标签: 区块链 java开发区块链 自己实现区块链
15人阅读 评论(0) 收藏 举报
分类:

起因

公司要开发区块链,原本是想着使用以太坊开发个合约或者是使用个第三方平台来做,后来发现都不符合业务需求。原因很简单,以太坊、超级账本等平台都是做共享账本的,有代币和挖矿等模块。而我们需要的就是数家公司组个联盟,来共同见证、记录一些不可篡改的交互信息,如A公司给B公司发了一个xxx请求,B公司响应了什么什么。其实要的就是一个分布式数据库,而且性能要好,不能像比特币那种10分钟才生成一个区块。我们要的更多的是数据库的性能,和区块链的一些特性。

经过

项目于3月初开始研发,历时一月发布了第一版。主要做了存储模块、加密模块、网络通信、公钥私钥、区块内容解析落地入库等。已经初步具备了区块链的基本特征,但在共识机制、merkle tree、智能合约以及其他的一些细节上,尚不到位。

希望高手不吝赐教,集思广益,提出见解或方案,来做一个区块链平台项目,适合更多的区块链场景,而不仅仅是账本和各种忽悠人的代币。

理想中的区块链平台: 输入图片说明

项目说明

主要有存储模块、网络模块、加密模块、区块解析入库等。

该项目属于"链",非"币"。不涉及虚拟币和挖矿。本质上类似于腾讯区块链项目trustsql。

存储模块

Block内存储的是类Sql语句。联盟间预先设定好符合业务场景需要的数据库表结构,然后设定好各个节点对表的操作权限(ADD,UPDATE,DELETE),将来各个节点就可以按照自己被允许的权限,进行Sql语句的编写,并打包至Block中,再全网广播,等待全网校验签名、权限等信息的合法性。如果Block合法,则允许生成,生成后再全网广播,各节点拉取新区块。新区块生成后,各节点进行区块内容解析,并落地入库的操作。

场景就比较广泛了,可以设定不同的表结构,或者多个表,进而能完成各自类型信息的存储。譬如商品溯源,从生产商、运输、经销商、消费者等,每个环节都可以对某个商品进行ADD信息的操作。

存储采用的是key-value数据库rocksDB,了解比特币的知道,比特币用的是levelDB,都是类似的东西。最近发现在部分Windows下,rocksDB加载失败。也可以替换为levelDB,只需要修改2个类即可。

结构类似于sql的语句,如ADD(增删改) tableName(表名)ID(主键) JSON(该记录的json)。

网络模块

网络层,采用的是各节点互相长连接、断线重连,然后维持心跳包。网络框架使用的是t-io,也是oschina的知名开源项目。t-io采用了AIO的方式,在大量长连接情况下性能优异,资源占用也很少,并且具备group功能,特别适合于做多个联盟链的SaaS平台。并且包含了心跳包、断线重连、retry等优秀功能。

在项目中,每个节点即是server,又是client,作为server则被其他的N-1个节点连接,作为client则去连接其他N-1个节点的server。同一个联盟,设定一个Group,每次发消息,直接调用sendGroup方法即可。

共识模块

分布式共识一直都是个难题。

比特币采用了POW工作量证明,需要耗费大量的资源进行hash运算(挖矿),由矿工来完成生成Block的权利。还有一些是采用选举投票的方式来决定谁来生成Block。分布式共识算法有好几种,具体的可以去查查。共同的特点就是只能特定的节点来生成区块,然后广播给其他人。

而我这里的场景不同,这是一个联盟,各个节点是平等的,而且性能要高。所以我不想让每个节点都生成一个指令后,发给其他节点,再大家选举出一个节点来搜集网络上的指令组合再生成Block,太复杂了。对于学习区块链的新手来说,几乎无法完成这个模块。

那么我这里就简单多了,任何节点都可以构建Block,然后全网广播,只要过半节点校验后同意即可。其他节点需要校验格式、hash、签名、和table的权限,校验通过后,过半同意了,就可以构建Block并广播全网,通知各节点更新Block。

生成Block后,再全网广播,拉取Block,然后执行Block内的sql语句。

区块信息查询

各节点通过执行相同的sql来实现一个同步的sqlite数据库(或mysql等其他关系型数据库),将来对数据的查询都是直接查询sqlite,性能高于传统的区块链项目。

由于各个节点都能生成Block,在高并发下会出现区块不一致的情况。如果因为某些原因导致链分叉了,也提供了回滚机制,sql可以回滚。原理也很简单,你ADD一个数据时,我会在区块里同时记录两个指令,一个是ADD,一个是回滚用的DELETE。同理,UPDATE时也会保存原来的旧数据。区块里的sql落地,譬如顺序执行1-10个指令,回滚时就是从10-1执行回滚指令。

每个节点都会记录自己已经同步了的区块的值,以便随时进行sql落地入库。

对区块链信息的查询,那就简单了,直接做数据库查询即可。相比于比特币需要检索整个区块链的索引树,速度和方便性就大不同了。

简单使用说明

使用方法:先启动md_blockchain_manager项目,然后修改application.yml里的name、appid和managerUrl和manager项目数据库里的一一对应,作为一个节点启动即可。

可以通过访问localhost:8080/block?content=1来生成一个区块,至少要启动2个节点才行,生成Block时需要除自己外的至少过半同意才行。生成Block后就会发现别的节点也会自动同步自己新生成的Block。目前代码里默认设置了一张表message,里面也只有一个字段content,相当于一个简单的区块链记事本了。

可以通过localhost:8080/sqlite来查看sqlite里存的数据,就是根据Block里的sql语句执行后的结果。

我把项目部署到docker里了,共启动4个节点,如图: 输入图片说明

manager就是md_blockchain_manager项目,主要功能就是提供联盟链内各节点ip 输入图片说明

四个节点ip都写死了,都启动后,它们会相互全部连接起来,并维持住长连接和心跳包。 输入图片说明

我调用一下block项目的生成区块接口,http://ip:port/block?content=1

输入图片说明

别的节点会是这样,收到block项目请求生成区块的请求、并开始校验,回复是否同意 输入图片说明

当block项目收到过半的同意后,就开始生成区块,并广播给其他节点自己的新区块,其他节点开始拉取新块,校验通过了则更新到本地。

这个生成区块的接口是写好用来测试的,正常走的流程是调用instuction接口,先生产符合自己需求的指令,然后组合多个指令,调用BlockController里的生成区块接口。


项目开源地址:https://gitee.com/tianyalei/md_blockchain

查看评论

公司该如何创建适合自己的区块链产品、联盟链、私链

现在区块链是非常火的,很多公司都想蹭一把区块链,不管实际作用大不大,也要往区块链上靠一靠。那么这就难为了广大的技术开发人员,如何在完全不了解区块链的情况下,迅速为公司开发出区块链产品呢?区块链基础架构...
  • tianyaleixiaowu
  • tianyaleixiaowu
  • 2018-02-11 11:27:13
  • 589

私有链 vs 公有链 vs 联盟链

在过去的一年,“私有区块链”(private blockchains)的概念在区块链技术讨论中成了热门词汇。从本质上而言,相较于完全公开、不受控制,并通过加密经济来保证网络安全的系统(例如,工作量证明...
  • jeason29
  • jeason29
  • 2016-06-07 17:13:17
  • 15777

以太坊平台评估 私有链和联盟链的机会与挑战

以太坊平台评估 私有链和联盟链的机会与挑战 作者:Vitalik Buterin  翻译:万向区块链实验室/ChinaLedger 联盟  排版/校对:区块链铅笔(ChainB.com) (注...
  • sportshark
  • sportshark
  • 2016-07-24 22:18:53
  • 8019

零起点玩转基于以太坊的联盟链Quorum系列01

Quorum是由美国的金融机构摩根大通推出的企业级区块链平台 Quorum是一个联盟链 Quorum基于以太坊, 在基础结构上保持与以太坊的同步, 增强的部分集中在隐私控制、权限控制、共识机制,以及提...
  • about_blockchain
  • about_blockchain
  • 2017-12-11 10:06:28
  • 503

公有链和联盟链的道法术器

目前已经有不少文章针对区块链中公有链和联盟链两种形态的讨论,里面跟我的了解有些差异,Elwin这里尝试从道法术器的角度对此进行分析,涵盖信念价值、产生背景、技术特点、维护治理、发展趋势等方面进行讨论,...
  • elwingao
  • elwingao
  • 2017-02-15 13:57:47
  • 4362

公有链、联盟链、私有链及网络配置介绍

以太坊网络 去中心化共识的基础是参与节点的点对点网络,节点维护并保证区块链网络的安全。参见挖矿。 以太坊网络数据统计 EthStats.net是以太坊网络实时数据的仪表板,这个仪表板...
  • u012974916
  • u012974916
  • 2016-11-03 18:40:58
  • 2512

联盟链多链与跨链的思考

源于数字加密货币在公众中的广泛流行,其背后的区块链技术也逐渐得到了公众广泛关注与主流机构的研究。当下区块链行业发展方兴未艾,各种技术发展迅速。目前对区块链技术的主流划分主要有公有链、联盟链、私有链。以...
  • weixin_41545330
  • weixin_41545330
  • 2018-02-27 09:20:29
  • 211

【区块链开发】从零构建基于POA算法的以太坊联盟链

1、什么是联盟链 2、POW、POA对比 3、Parity钱包介绍 4、联盟链创世区块链Spec文件配置 5、联盟链节点创建的两种方法 6、node0、node1节点创建以及权益账号创建 7、多节点连接、交易、互通
  • 2017年11月09日 09:58

区块链开发(十二)公有链、联盟链、私有链及网络配置介绍

去中心化共识的基础是参与节点的点对点网络,节点维护并保证区块链网络的安全。参见挖矿。 以太坊网络数据统计 EthStats.net是以太坊网络实时数据的仪表板,这个仪表板展示重要信息,诸如现在的区块,...
  • jambeau
  • jambeau
  • 2017-12-14 17:27:36
  • 1942

5分钟快速从无到有建立Ethereum联盟链

5分钟快速从无到有建立Ethereum联盟链 开发Ethereum Dapp的过程中,需要一个测试用的chain,之前是使用testrpc或直接连到Ethereum testnet (Ropsten...
  • weixin_41714277
  • weixin_41714277
  • 2018-02-28 16:00:42
  • 243
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 45万+
    积分: 5530
    排名: 6036
    博客专栏
    友情链接
    最新评论