java开源区块链初始化创世区块jdchain服务搭建

目录
  • 初始化创世区块
    • 第一步、生成公私钥
    • 第二步、准备配置
    • 第三步、执行初始化脚本
  • 创世区块创建过程
  • 结语

初始化创世区块

搭建区块链服务第一步就是初始化创世区块,创建账本。生成dchain初始化创世区块有两种方式,一种是通过官方提供的区块链部署工具,在页面上操作初始化,一种是通过初始化脚本创建。目前,部署工具初始化账本功能有限,只支持btfsmart共识算法的节点初始化,如果要支持mq的共识,只能使用初始化账本的脚本创建

第一步、生成公私钥

使用部署工具生成公私钥,虽然部署工具不支持mq共识的账本初始化,但是还是可以用部署工具帮我们创建并维护公私钥,这种方式比使用脚本创建要方便很多。

第二步、准备配置

jdchain初始化账本需要三个配置,账本配置 ledger.init,本地节点配置:local.conf ,共识服务配置:bftsmart.config 或mq.config,其中local.conf是每个共识节点特有的配置,账本和共识服务配置需要同步到每个节点。

更多配置详情参考:https://github.com/blockchain-jd-com/jdchain

第三步、执行初始化脚本

配置准备好后,先找到ledger-init.sh脚本,然后修改其中-i 和-l参数,指定第二步配置好的配置地址。然后依次执行。如果配置正确无误,会提示初始化服务已准备好,按任意键开始初始化账本。这时回车即可,初始化成功后,会在config/init目录下生成ledger-binding.conf文件。启动节点服务就需要这个配置文件

创世区块创建过程

假设有四个共识节点node0、node1、node2、node3、参与共识创建区块,那么node0执行初始化的脚本时的行为如下,其他节点行为是一致的:

1、根据-i和-l参数加载配置

2、创建初始化配置实例

3、校验当前节点公私钥是否匹配(使用私钥生成签名,用公钥验签)

4、初始化账本,实例化本地事务上下文,生成创世交易

5、对初始交易签名,生成当前节点的账本初始化许可(使用当前事务上下文对象的哈希和当前节点私钥生成签名);

6、在所有参与者之间进行第一阶段的共识,请求所有其它参与方的账本创建许可,依次请求node1、node2、node3的/legerinit/permission/接口,对方接口会进行签名校验,和过程3的方式一致

7、使用当前节点事务交易上下文作为哈希校验其他节点返回的接入许可签名,此过程如果失败,会重试16次

8、链接数据库,生成当前节点初始账本

9、在所有参与者之间进行第二阶段的共识,开始请求所有成员的账本创建决定,如果都返回决议创建就提交账本,否则就回滚。此过程也会重试16次

上面创世区块两阶段的共识接口定义如下:

public interface LedgerInitConsensusService {
	/**
	 * 请求账本的初始化许可;
	 *
	 * @param requesterId
	 *            发起请求的参与者 id;
	 * @param signature
	 *            请求者的私钥对 “id” + “账本种子” 做出的签名;只有签名合法且参与者是初始化配置中的参与方才能获得有效返回,否则将被拒绝;
	 */
	@HttpAction(path = "/legerinit/permission/{requesterId}", method = HttpMethod.POST, contentType = LedgerInitMessageConverter.CONTENT_TYPE_VALUE, responseConverter = PermissionResponseConverter.class)
	LedgerInitProposal requestPermission(@PathParam(name = "requesterId") int requesterId,
			@RequestBody(converter = SignatureDigestRequestBodyConverter.class) SignatureDigest signature);
	/**
	 * 同步账本初始化决议;
	 *
	 * @param initDecision
	 *            调用者的账本初始化决议;
	 * @return 目标参与方的账本初始化决议;如果目标参与者尚未准备就绪, 则返回 null;
	 */
	@HttpAction(path = "/legerinit/decision", method = HttpMethod.POST, contentType = LedgerInitMessageConverter.CONTENT_TYPE_VALUE, responseConverter = DecisionResponseConverter.class)
	LedgerInitDecision synchronizeDecision(@RequestBody(converter = DecisionRequestBodyConverter.class) LedgerInitDecision initDecision);

}

遇到的问题:在请求其它参与方的账本创建许可时,输出如下异常:

Invalid permission from participant! --[Id=LdeNn8bWuc2DaqAbx3XCQPUf7bdb94PTKFT2E][name=node1.com]
Invalid permission from participant! --[Id=LdeNezcG3rhs31u8UBSwvfMf2BKr1ZkaLKJAG][name=node2.com]
Invalid permission from participant! --[Id=LdeNqxGmBdmEZK6hVeLcnXppW2qnLLKMMiQhN][name=node3.com]

看到这个输出,就代表可以排除公私钥的问题的。因为这个是最后一步许可,交易哈希许可签名验证失败输出的。而交易哈希是根据当前账本上下文创建的,当前账本上下文是根据初始化账本配置装载的,所以最后的问题出在初始化账本的配置上面。我是因为理解错了下面的配置:

# 当前账本交易发送队列主题(不同账本需不同主题)
system.msg.queue.topic.tx=node3-topic

结语

jdchain的各组件设计的比较灵活,如共识实现可以使用bftsmart、RabbitMQ等,底层存储也可以使用本地的rocksdb也可以使用redis等。

如果有特殊的需求也可以自己实现定义的api接口。博主第一天使用的都是默认的的提供者实现,安装部署都比较顺利,今天尝试使用RabbitMQ的共识时遇到了好几个问题,首先是上面的交易许可验签的问题,然后目前官方的基于RabbitMQ的共识,RabbitMQ的链接器不支持带用户认证的mq的配置。不过问题都已解决了,支持amqp的配置代码也已给官方仓库提交pr了,算正式踏入区块链研究之路了

以上就是java开源区块链初始化创世区块jdchain服务搭建的详细内容,更多关于java开源区快联初始化创世区块jdchain的资料请关注我们其它相关文章!

(0)

相关推荐

  • 使用Java实现简单的区块链程序的方法

    在本文中,我们将学习区块链技术的基本概念.我们还将用Java实现一个基本的应用程序,重点介绍这些概念. 此外,我们还将讨论该技术的一些先进概念和实际应用. 什么是区块链? 那么,让我们先来了解一下区块链到底是什么- 好吧,它的起源可以追溯到Satoshi Nakamoto在2008年发表的关于比特币的白皮书. 区块链是一个分散的信息分类帐.它由通过使用密码学连接的数据块组成.它属于通过公共网络连接的节点网络.当我们稍后尝试构建一个基本教程时,我们将更好地理解这一点. 我们必须了解一些重要的属性,

  • 区块链常用数据库leveldb用java来实现常规操作的方法

    前言 LevelDB 是一种Key-Value存储数据库百度百科上介绍 性能非常强悍 可以支撑十亿级这段时间在研究区块链的时候发现的这个数据库.LevelDB 是单进程的服务,性能非常之高,在一台4核Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w. 此处随机读是完全命中内存的速度,如果是不命中 速度大大下降,LevelDB 只是一个 C/C++ 编程语言的库, 不包含网络服务封装, 所以无法像一般意义的存储服务器(如 MySQL)那样, 用客户端来连接它. Le

  • Spring Boot 整合 Fisco Bcos的案例分析(区块链)

    目录 简介 本地环境 主要流程: 1.Fisco Bcos环境搭建与验证 1.1.搭建单群组4节点联盟链: 1.2.检查证书 1.3.使用证书验证节点正确性 2.创建SpringBoot工程并配置依赖 2.1.创建SpringBoot工程: 2.2.配置pom.xml 3.2.配置节点证书: 3.3.编写controller 3.4.DemoBcosApplication默认不做修改 3.5.application.properties什么也没配置 4.生成jar包.部署服务器验证 4.1.本地

  • 基于Java编写第一个区块链项目

    前言 区块链是数字加密货币比特币的核心技术. 区块链是一个称为块的记录列表,这些记录使用链表链接在一起并使用加密技术. 每个数据块都包含自己的数字指纹(称为散列).前一个数据块的散列.时间戳和所做事务的数据,使其在任何类型的数据泄露时都更加安全. 因此,如果一个块的数据被改变,那么它的散列也会改变.如果散列被更改,那么它的散列将不同于下一个块,下一个块包含前一个块的散列,影响它之后的所有块的散列.更改哈希值,然后将其与其他块进行比较,这允许我们检查区块链. 区块链实施:以下是区块链实施中使用的功

  • java开源区块链jdchain入门

    目录 前言 部署组件 傻瓜式部署 获取部署包 效果预览 部署遇到的问题: 网关里的异常 结语 前言 jdchain是京东数科开源的区块链平台,目标是实现一个面向企业应用场景的通用区块链框架系统,能够作为企业级基础设施,为业务创新提供高效.灵活和安全的解决方案. 之所以选择jdchain研究是因为jdchain是为数不多的底层也是采用java实现的一个区块链平台 项目地址:https://github.com/blockchain... 文档地址:https://gitee.com/jdchain

  • java开源区块链初始化创世区块jdchain服务搭建

    目录 初始化创世区块 第一步.生成公私钥 第二步.准备配置 第三步.执行初始化脚本 创世区块创建过程 结语 初始化创世区块 搭建区块链服务第一步就是初始化创世区块,创建账本.生成dchain初始化创世区块有两种方式,一种是通过官方提供的区块链部署工具,在页面上操作初始化,一种是通过初始化脚本创建.目前,部署工具初始化账本功能有限,只支持btfsmart共识算法的节点初始化,如果要支持mq的共识,只能使用初始化账本的脚本创建 第一步.生成公私钥 使用部署工具生成公私钥,虽然部署工具不支持mq共识的

  • 如何用120行Java代码写一个自己的区块链

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区块链的原理! "用不到120行 Java 代码就能实现一个自己的区块链!" 听起来不可思议吧?有什么能比开发一个自己的区块链更好的学习实践方法呢?那我们就一起来实践下! 因为我们是一家从事互联网金融的科技公司,所以我们采用虚拟资产金额作为这篇文章中的示例数据.大家可以先为自己想一个数字,后

  • 利用Java代码实现区块链技术

    目录 不变性 块散列 Chain 链 添加事务 Merkle树 采矿工作证明 单元测试 最后的想法 前言: 比特币很热门——这是多么轻描淡写的说法啊.虽然加密货币的未来有些不确定,但用于驱动比特币的区块链技术也非常流行. 区块链的应用范围几乎无穷无尽.可以说,它还有可能破坏企业自动化. 本文将重点关注区块链体系结构,特别是演示“不可变.仅附加”分布式账本如何与简化的代码示例一起工作. 作为开发人员,与简单地阅读技术文章相比,在理解代码的工作原理时,从代码中看到东西要有用得多.至少对我来说是这样.

  • JavaScript实现区块链

    几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术.在这篇文中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的.我将会称之为SavjeeCoin! 全文分为三个部分: part1:实现一个基本的区块链 part2:实现POW part3:交易与挖矿奖励 Part1:实现一个基本的区块链 区块链 区块链是由一个个任何人都可以访问的区块构成的公共数据库.这好像没什么特别的,不过它们有一个有趣的属性:它们是不可变的.一旦一个区

  • Go语言开发区块链只需180行代码(推荐)

    区块链开发用什么语言?通过本文你将使用Go语言开发自己的区块链(或者说用go语言搭建区块链).理解哈希函数是如何保持区块链的完整性.掌握如何用Go语言编程创造并添加新的块.实现多个节点通过竞争生成块.通过浏览器来查看整个链.了解所有其他关于区块链的基础知识. 但是,文章中将不会涉及工作量证明算法(PoW)以及权益证明算法(PoS)这类的共识算法,同时为了让你更清楚得查看区块链以及块的添加,我们将网络交互的过程简化了,关于 P2P 网络比如"全网广播"这个过程等内容将在后续文章中补上.

  • python实现简单区块链结构

    区块链 比特币从诞生到现在已经10年了,最近接触到了区块链相关的技术,为了揭开其背后的神秘面纱,我就从头开始构建一个简单的区块链. 从技术上来看:区块是一种记录交易的数据结构,反映了一笔交易的资金流向.系统中已经达成的交易的区块连接在一起形成了一条主链,所有参与计算的节点都记录了主链或主链的一部分. 一.比特币内部结构 比特币内部结构有四部分: previous hash: 上一个区块的hash data:交易数据 time stamp:区块生成的时间戳 nonce:挖矿计算次数 二.实现的比特

  • 详解python实现简单区块链结构

    区块链 比特币从诞生到现在已经10年了,最近接触到了区块链相关的技术,为了揭开其背后的神秘面纱,我就从头开始构建一个简单的区块链. 从技术上来看:区块是一种记录交易的数据结构,反映了一笔交易的资金流向.系统中已经达成的交易的区块连接在一起形成了一条主链,所有参与计算的节点都记录了主链或主链的一部分. 一.比特币内部结构 比特币内部结构有四部分: previous hash: 上一个区块的hash data:交易数据 time stamp:区块生成的时间戳 nonce:挖矿计算次数 二.实现的比特

  • Python区块链块的添加教程

    目录 添加第一个区块 添加更多块 转储整个区块链 每个矿工将从先前创建的交易池中获取交易.要跟踪已挖掘的消息数量,我们必须创建一个全局变量 : last_transaction_index = 0 我们现在让我们的第一个矿工在区块链中添加一个区块. 添加第一个区块 到添加一个新块,我们首先创建一个 Block 类的实例 block = Block() 我们从队列中选取前3个交易并减去; for i in range(3):    temp_transaction = transactions[l

随机推荐