diff --git a/README.md b/README.md index 6b98db84..675472d0 100644 --- a/README.md +++ b/README.md @@ -1,626 +1,120 @@ [TOC] #JD区块链 - [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) +[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.jd.blockchain/sdk-pack/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.jd.blockchain/sdk-pack/) +[![Build Status](https://travis-ci.com/blockchain-jd-com/jdchain.svg?branch=master)](https://travis-ci.org/blockchain-jd-com/jdchain) ------------------------------------------------------------------------- -### 版本修订历史 - - - - - - - - - - - - - - - - - - - - - - - - - -
版本号作 者修改日期备 注
0.0.6黄海泉2017-11-10 - 定义JD区块链项目的目标与关键能力;
- 定义JD区块链的核心对象模型;
- 定义“账户”的生成算法和“区块/交易/操作/账户”的关键属性;
- 描述了编程接口的示例代码; -
0.0.7黄海泉2017-11-17 - 丰富了对“节点共识”、“节点分区”两项关键能力的详细描述; -
0.0.8黄海泉2018-07-17 - 增加部署图;增加智能合约开发的示例; -
------------------------------------------------------------------------ -## 一、概述 -JD区块链项目的目标是提供一个面向广泛的应用场景、满足企业核心需求的灵活和易用的区块链系统。 -以下是 JD 区块链用以满足企业核心需求的关键能力,也是显著区别于其它区块链的重要特征: - - - 快速共识 - - 节点分区 - - 并行多账本 - - 大数据伸缩存储 - - 条件检索 - - 面向对象的合约代码编程模型 - - 节点快速部署 - - 多终端灵活接入 - - 分布式自治的账户权限管理模型 - -JD区块链对于关键能力的定义是建立在深入理解和抽象各种多样化需求的基础上的。 - - - 快速共识(Efficient Consensus) - 我们认为,“快速”不仅仅体现在“用更短时间”达成共识,还要体现在交易(Transaction)要得到可靠地执行。 - 需要在算法和实现层面做出保障,确保所有提交的合法的交易会被系统在一个“确定性”和“足够短”的时间之内被严格地执行,系统不主动作出随机性地丢弃(不包括系统故障因素)。注:POW类算法产生的链分叉处理是一种系统随机性地丢弃交易的行为。 - 从使用者的视角来看,这种能力就是区块链系统的“可靠性”,这对于企业、金融场景而言尤其重要。 - - - 节点分区(Peer Partition) - “分区”是一种分布式系统架构原则,通过将大范围目标按照某种相似特征分隔为一个个小范围目标,分别进行更高效地处理,这能从整体上提升整个系统的处理能力。 - 区块链系统也是一种分布式系统,沿用“分区”的思想这点来自以往的系统架构实践的经验,是有可能让区块链系统获得可媲美现有系统的处理能力。这种能力将可以无障碍地把区块链在应用于广泛的企业场景中。 - 在此,我们所说的“节点分区(Peer Partition)” 是共识过程中的物理通讯层面的分区,在共识过程中只有相关的物理节点才会建立通讯链路并复制和存储共识的状态数据。在一个区块链系统中,可以从节点全集中选择一个或多个节点子集,分别组成一个或多个节点分区(Peer Partition) - - - 并行多账本 - 账本(Ledger) - - 大数据伸缩存储 - - 条件检索 - - 面向对象的合约代码编程模型 - - 节点快速部署 - - 多终端灵活接入 - - 分布式自治的账户权限管理模型 - -## 二、对象模型 -JD区块链的核心对象包括: - - - 账本(Ledger) - 一份账本(Ledger)实质上是由两部分组成: - - 一组以“账户(Account)”表示的状态数据; - - 以“区块的链条(Block-chain)”表示的状态数据的变更历史; - - JD区块链的“账本(Ledger)”是一个最顶层的管理数据的逻辑单元。在一个区块链节点构成的共识网络中,可以维护多套并行的“账本(Ledger)”。 - - - 账户(Account) - - 在JD区块链中,账户(Account)被设计为包含“身份(Identity)”、“权限(Privilege)”、“状态(State)”、“控制规则(Control Rule)” 这4种属性的对象。 - - 其中,“身份(Identity)”、“权限(Privilege)”这两种属性是一个面向应用的系统的基本功能; - - “状态(State)”、“控制规则(Control Rule)” 这两种属性这是一个具备“图灵完备性”的系统的基本属性,使系统可以处理任意多样化的任务; - - 在这里,“身份(Identity)”是一个抽象表述,其形式上就是一个“区块链地址(Address)”和相应的“非对称秘钥钥对(KeyPair)”/证书。 简单来说,一个“账户(Account)”就是一个区块链地址、公私钥对以及一套的权限配置. - - 一个“账户(Account)”的“状态(State)”、“控制规则(Control Rule)” 这2种属性则是可选的,这提供了不同于其它区块链的账户/合约的一种新的使用方式,即一种数据和逻辑分离的应用设计思路(这在传统的web应用编程中被称为“贫血模型”)。同时,也意味着一个特定“账户”中的数据状态是可以跨账户/合约代码进行共享访问的。 - - 从应用的视角来看,对“账户”的使用方式可以有几种模式: - - 用于表示业务角色/用户: - - 用于表示业务数据:仅有“状态(State)”没有“控制规则(Control Rule)”的账户,可称为数据账户,就有些类似于关系数据库中的“表(Table)”的作用,不同业务类别的数据则使用不同的账户来管理。 - - 用于表示业务逻辑:仅有“控制规则(Control Rule)”没有“状态(State)”的账户,即所谓的合约账户,可表示某种用于处理数据的通用逻辑,可被授权访问特定的数据账户。 - - - 区块(Block) - 在概念上,与通常所说的区块的概念是一致的。 - 在实现上,一个区块的主要内容是包含了某一时刻提交的所有交易以及交易执行之后的状态数据的快照的hash,而不存储具体的交易操作和状态数据。 - - - 交易(Transaction) - 在概念上,与通常所说的Transaction的概念是一致的,表示一组需要原子执行的操作。 - - - 操作(Operation) - 操作是针对“账户(Account)”的“写”指令,包括以下几类: - - 注册账户 - - 更新账户的状态数据 - - 更新账户的合约代码定义 - - 调用账户的合约代码 - - - 合约代码(Contract Code) - 合约代码是一段用于对“账户(Account)”的状态数据执行操作的代码程序。 - -## 三、部署模型 - - 1. 总体部署 -![deployment architecture](docs/images/deployment.png) - - 2. 系统组件 - - 共识节点 - - 复制节点 - - SDK - - 网关 - - 终端 - - 3. 配置和管理 - -## 四、账本结构 - -### 1. 账户生成算法 - - - 公私钥对 - - 算法:默认ED25519 ,支持 SM2、CA; - - 公钥存储格式:版本 + 算法标识 + 公私钥原始内容 + 校验码 - - 字符编码方式:Base64 - - 地址 - - 算法 - - 给定公钥 P (或由私钥 R 算出公钥 P) - - 中间值 H1 = SHA256( P ) - - 中间值 H2 = RIPEMD-160( H1 ) - - 中间值 X = 版本 + 公钥算法标识 + H2 - - 校验和 C = 前4字节( SHA256( SHA256( X )) ) - - 地址 Address = Base58( X + C ) - -### 2. 区块 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
属性名称说明
BlockHash当前区块 hash对区块中除此之外的其它所有属性一起进行哈希运算生成
BlockVersion 区块版本表示区块-交易的属性结构的版本号;
PreviousBlockHash上一区块 hash
BlockNumber区块高度区块高度是一个区块在链中的序号;
创始区块的高度为 0,每个新区块的高度依次递增;
AccountHash账户树hash账户的 Merkle Tree 根的 hash
AccountCount账户数量区块生成时账本中的全部账户的总数
TxTreeHash交易树 hash本区块的交易集合的 Merkle Tree 根的 hash
TxCount区块交易数量当前区块包含的交易的数量;
TxTotalCount账本交易总数截止到当前区块为止当前账本的所有交易的总数量;
CloseTime区块关闭时间生成当前区块时的区块链节点的网络时间;
- -### 3. 交易 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
属性名称说明
Hash当前交易 hash对交易中除此之外的其它所有属性一起进行哈希运算生成
LedgerNumber区块高度交易被包含的区块高度
BlobHash交易数据块hash交易的数据块是交易的原始数据,包含客户端提交的交易的全部操作及其参数; -
交易的参与者需要使用私钥对交易数据块进行签名;
Operations操作列表交易的操作列表;
Sponsor交易发起人交易发起人的账户地址;
SequenceNumber交易序号交易序号记录了一个特定的发起人的交易的顺序号,等同于该发起人历史上发起的交易的总数;
Signatures签名列表由交易发起人和其它参与者对交易数据块的签名的列表;
Result交易结果0 - 表示执行成功;非零表示执行失败;
注:最终的账本只包含成功的交易;
- -### 4. 操作 - - - - - - - - - - - - - - - - - - - - - -
属性名称说明
OpType操作类型 - 一级操作类型包括:注册账户、配置权限、写入键值数据、写入对象数据、定义合约代码、调用合约代码;
- “键值数据写入”操作的子操作类型包括:填入键值、移除键、数值增加、数值减少;
- “对象数据写入”操作的自操作类型包括:插入对象、更新对象、移除对象; -
Args参数列表与操作类型相对应的参数列表;
SubOps子操作列表“子操作”是“操作”的递归定义,由“操作类型”来标识;
- -### 5. 账户 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
属性名称说明
Address地址账户的唯一标识
RegNumber注册号账户被注册到区块链的区块高度;
TxSquenceNumber交易序列号由账户发起的交易的序列号,初始为 0,账户每发起一个交易则增加1;
ModelVersion账户模型版本表示构成一个账户结构的属性模型的程序版本号;
Version账户版本初始为 0,对账户的每一次变更(包括对权限设置、状态和合约代码的变更)都会使账户状态版本增加 1 ;
注:交易序号的改变不会导致账户版本的增加;
PrivilegeHash权限 hash权限树的根hash;
PrivilegeVersion权限版本初始为 0, 每次对权限的变更都导致版本号加 1;
StateType状态类型账户的状态类型有3种:空类型(NIL);键值类型;对象类型;
StateVersion状态版本账户的状态类型有3种:空类型(NIL);键值类型;对象类型;
StateHash状态哈希数据状态的 merkle tree 的根hash;
CodeHash合约代码哈希由“账户地址+合约代码版本号+合约代码内容”生成的哈希;
CodeVersion代码版本初始为 0,每次对代码的变更都使版本加 1 ;
- -## 五、编程接口 - -### 1. 服务连接 - - -```java - //创建服务代理 - public static BlockchainKeyPair CLIENT_CERT = BlockchainKeyGenerator.getInstance().generate(); - final String GATEWAY_IP = "127.0.0.1"; - final int GATEWAY_PORT = 80; - final boolean SECURE = false; - GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IP, GATEWAY_PORT, SECURE, - CLIENT_CERT); - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); -``` +## 一、项目介绍 +JD Chain 的目标是实现一个面向企业应用场景的通用区块链框架系统,能够作为企业级基础设施,为业务创新提供高效、灵活和安全的解决方案。 -### 2. 用户注册 +## 二、部署模型 +JD Chain 主要部署组件包括以下几种: -```java - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); - // 在本地定义注册账号的 TX; - TransactionTemplate txTemp = service.newTransaction(ledgerHash); - SignatureFunction signatureFunction = asymmetricCryptography.getSignatureFunction(CryptoAlgorithm.ED25519); - CryptoKeyPair cryptoKeyPair = signatureFunction.generateKeyPair(); - BlockchainKeyPair user = new BlockchainKeyPair(cryptoKeyPair.getPubKey(), cryptoKeyPair.getPrivKey()); - - txTemp.users().register(user.getIdentity()); +- 共识节点 - // TX 准备就绪; - PreparedTransaction prepTx = txTemp.prepare(); - // 使用私钥进行签名; - CryptoKeyPair keyPair = getSponsorKey(); - prepTx.sign(keyPair); + 共识节点即参与共识的节点,这是系统的核心组件,承担了运行共识协议、管理账本数据、运行智能合约的职责。 - // 提交交易; - prepTx.commit(); -``` + 一个区块链网络由多个共识节点组成,共识节点的数量范围由选择的共识协议决定。 + 共识节点和账本是两个不同的概念,共识节点是个物理上的概念,账本是个逻辑上的概念。JD Chain 是一个多账本区块链系统,一个共识节点上可以装载运行多个账本。账本是数据维度的独立管理单元。共识节点和账本的关系,就像关系数据库系统中,数据库服务器和数据库实例的关系。 -### 3. 数据账户注册 + 共识节点通常都部署在参与方的内部网络中,通过由网络管理员指定的安全的网络出口与其它的共识节点建立通讯连接。 + 共识节点在形态上是服务器中的一个处理进程,背后需要连接一个本地或者内网的NoSQL数据库系统作为账本的存储。当前版本,共识节点目前是单进程的,未来版本将实现多进程以及多服务器集群模式。 -```java - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); - // 在本地定义注册账号的 TX; - TransactionTemplate txTemp = service.newTransaction(ledgerHash); - SignatureFunction signatureFunction = asymmetricCryptography.getSignatureFunction(CryptoAlgorithm.ED25519); - CryptoKeyPair cryptoKeyPair = signatureFunction.generateKeyPair(); - BlockchainKeyPair dataAccount = new BlockchainKeyPair(cryptoKeyPair.getPubKey(), cryptoKeyPair.getPrivKey()); - - txTemp.dataAccounts().register(dataAccount.getIdentity()); - - // TX 准备就绪; - PreparedTransaction prepTx = txTemp.prepare(); - // 使用私钥进行签名; - CryptoKeyPair keyPair = getSponsorKey(); - prepTx.sign(keyPair); - - // 提交交易; - prepTx.commit(); -``` +- 网关节点 -### 4. 写入数据 + 网关节点是负责终端接入的节点,负责终端连接、协议转换、交易准入、本地密码运算、密钥管理等职责。 -```java - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); - - HashDigest ledgerHash = getLedgerHash(); - // 在本地定义注册账号的 TX; - TransactionTemplate txTemp = service.newTransaction(ledgerHash); - - // -------------------------------------- - // 将商品信息写入到指定的账户中; - // 对象将被序列化为 JSON 形式存储,并基于 JSON 结构建立查询索引; - String commodityDataAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; - Commodity commodity1 = new Commodity(); - txTemp.dataAccount(commodityDataAccount).set("ASSET_CODE", commodity1.getCode().getBytes(), -1); - - // TX 准备就绪; - PreparedTransaction prepTx = txTemp.prepare(); - - String txHash = ByteArray.toBase64(prepTx.getHash().toBytes()); - // 使用私钥进行签名; - CryptoKeyPair keyPair = getSponsorKey(); - prepTx.sign(keyPair); - - // 提交交易; - prepTx.commit(); -``` + 网关节点是一种轻量节点,需要绑定一个特定参与方的密钥对,连接到一个或多个共识节点。 - -### 5. 查询数据 + 网关节点向共识节点的连接是需要通过认证的,绑定的参与方的密钥对必须事先已经注册到区块链账本中,且得到接入授权。 -> 注:详细的查询可参考模块sdk-samples中SDK_GateWay_Query_Test_相关测试用例 +- 终端 -```java - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); - - // 查询区块信息; - // 区块高度; - long ledgerNumber = service.getLedger(LEDGER_HASH).getLatestBlockHeight(); - // 最新区块; - LedgerBlock latestBlock = service.getBlock(LEDGER_HASH, ledgerNumber); - // 区块中的交易的数量; - long txCount = service.getTransactionCount(LEDGER_HASH, latestBlock.getHash()); - // 获取交易列表; - LedgerTransaction[] txList = service.getTransactions(LEDGER_HASH, ledgerNumber, 0, 100); - // 遍历交易列表 - for (LedgerTransaction ledgerTransaction : txList) { - TransactionContent txContent = ledgerTransaction.getTransactionContent(); - Operation[] operations = txContent.getOperations(); - if (operations != null && operations.length > 0) { - for (Operation operation : operations) { - operation = ClientOperationUtil.read(operation); - // 操作类型:数据账户注册操作 - if (operation instanceof DataAccountRegisterOperation) { - DataAccountRegisterOperation daro = (DataAccountRegisterOperation) operation; - BlockchainIdentity blockchainIdentity = daro.getAccountID(); - } - // 操作类型:用户注册操作 - else if (operation instanceof UserRegisterOperation) { - UserRegisterOperation uro = (UserRegisterOperation) operation; - BlockchainIdentity blockchainIdentity = uro.getUserID(); - } - // 操作类型:账本注册操作 - else if (operation instanceof LedgerInitOperation) { - - LedgerInitOperation ledgerInitOperation = (LedgerInitOperation)operation; - LedgerInitSetting ledgerInitSetting = ledgerInitOperation.getInitSetting(); - - ParticipantNode[] participantNodes = ledgerInitSetting.getConsensusParticipants(); - } - // 操作类型:合约发布操作 - else if (operation instanceof ContractCodeDeployOperation) { - ContractCodeDeployOperation ccdo = (ContractCodeDeployOperation) operation; - BlockchainIdentity blockchainIdentity = ccdo.getContractID(); - } - // 操作类型:合约执行操作 - else if (operation instanceof ContractEventSendOperation) { - ContractEventSendOperation ceso = (ContractEventSendOperation) operation; - } - // 操作类型:KV存储操作 - else if (operation instanceof DataAccountKVSetOperation) { - DataAccountKVSetOperation.KVWriteEntry[] kvWriteEntries = - ((DataAccountKVSetOperation) operation).getWriteSet(); - if (kvWriteEntries != null && kvWriteEntries.length > 0) { - for (DataAccountKVSetOperation.KVWriteEntry kvWriteEntry : kvWriteEntries) { - BytesValue bytesValue = kvWriteEntry.getValue(); - DataType dataType = bytesValue.getType(); - Object showVal = ClientOperationUtil.readValueByBytesValue(bytesValue); - System.out.println("writeSet.key=" + kvWriteEntry.getKey()); - System.out.println("writeSet.value=" + showVal); - System.out.println("writeSet.type=" + dataType); - System.out.println("writeSet.version=" + kvWriteEntry.getExpectedVersion()); - } - } - } - } - } - } - - // 根据交易的 hash 获得交易;注:客户端生成 PrepareTransaction 时得到交易hash; - HashDigest txHash = txList[0].getTransactionContent().getHash(); - Transaction tx = service.getTransactionByContentHash(LEDGER_HASH, txHash); - // 获取数据; - String commerceAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; - String[] objKeys = new String[] { "x001", "x002" }; - KVDataEntry[] kvData = service.getDataEntries(LEDGER_HASH, commerceAccount, objKeys); - - long payloadVersion = kvData[0].getVersion(); - - // 获取数据账户下所有的KV列表 - KVDataEntry[] kvData = service.getDataEntries(ledgerHash, commerceAccount, 0, 100); - if (kvData != null && kvData.length > 0) { - for (KVDataEntry kvDatum : kvData) { - System.out.println("kvData.key=" + kvDatum.getKey()); - System.out.println("kvData.version=" + kvDatum.getVersion()); - System.out.println("kvData.type=" + kvDatum.getType()); - System.out.println("kvData.value=" + kvDatum.getValue()); - } - } -``` + 终端泛指可以提交交易的客户端,典型来说,包括人、自动化设备、链外的信息系统等。 + 终端只能通过网关节点来提交交易。终端提交的交易需要用体现该终端身份的私钥来签署,产生一份电子签名。随后当交易提交给网关节点时,网关节点需要在把交易提交到共识节点之前,对交易请求以网关节点绑定的私钥追加一项“节点签名”。 -### 6. 合约发布 +- 备份节点 -```java - - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); - - // 在本地定义TX模板 - TransactionTemplate txTemp = service.newTransaction(ledgerHash); + 仅对账本数据提供备份,但不参与交易共识的节点。(注:目前版本中尚未实现,将在后续版本中提供) - // 合约内容读取 - byte[] contractBytes = FileUtils.readBytes(new File(CONTRACT_FILE)); - // 生成用户 - BlockchainIdentityData blockchainIdentity = new BlockchainIdentityData(getSponsorKey().getPubKey()); +![](docs/images/deployment.jpg) - // 发布合约 - txTemp.contracts().deploy(blockchainIdentity, contractBytes); - // TX 准备就绪; - PreparedTransaction prepTx = txTemp.prepare(); +## 三、编译源代码 - // 使用私钥进行签名; - CryptoKeyPair keyPair = getSponsorKey(); + 1. 安装 Maven 环境 - prepTx.sign(keyPair); + JD Chain 当前版本以 Java 语言开发,需要安装配置 JVM 和 Maven,JDK 版本不低于1.8 。(没有特殊要求,请按标准方法安装,此处不赘述) + + 2. 安装 Git 工具 + + 为了能够执行 git clone 命令获取代码仓库。 (没有特殊要求,请按标准方法安装,此处不赘述) + + 3. 工程代码 - // 提交交易; - TransactionResponse transactionResponse = prepTx.commit(); + JD Chain 源代码包括 3 个代码仓库 - assertTrue(transactionResponse.isSuccess()); + - jdchain + - 这是当前仓库,也是核心仓库,包含了共识节点、网关节点、SDK等一切部署组件。依赖于 explorer 和 bftsmart 这两个仓库先进行编译安装; + + - explorer + - 这是区块链浏览器的前端Web页面的工程,需要编译成静态资源包,由网关节点集成到一起部署。 + - 地址:git@github.com:blockchain-jd-com/explorer.git - // 打印合约地址 - System.out.println(blockchainIdentity.getAddress().toBase58()); + - bftsmart + - 这是bftsmart共识协议的工程,需要先编译安装到本地 maven 仓库; -``` -### 7. 合约执行 +4. 命令操作 -```java +- 编译安装 explorer 到本地 maven 仓库; +```sh + $ git clone git@github.com:blockchain-jd-com/explorer.git explorer - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); + $ cd explorer - // 在本地定义TX模板 - TransactionTemplate txTemp = service.newTransaction(ledgerHash); + $ git checkout master - // 合约地址 - String contractAddressBase58 = ""; - - // 使用接口方式调用合约 - TransferContract transferContract = txTpl.contract(contractAddress, TransferContract.class); - - // 使用decode方式调用合约内部方法(create方法) - // 返回GenericValueHolder可通过get方法获取结果,但get方法需要在commit调用后执行 - GenericValueHolder result = ContractReturnValue.decode(transferContract.create(address, account, money)); - - PreparedTransaction ptx = txTpl.prepare(); - - ptx.sign(adminKey); - - TransactionResponse transactionResponse = ptx.commit(); + $ mvn clean install - String cotractExecResult = result.get(); - - // TransactionResponse也提供了可供查询结果的接口 - OperationResult[] operationResults = transactionResponse.getOperationResults(); +``` +- 编译安装 bftsmart 到本地 maven 仓库; + - 需要手动先安装一个第三方包,位于仓库根目录下 lib/core-0.1.4.jar +```sh + $ git clone git@github.com:blockchain-jd-com/bftsmart.git bftsmart + + $ cd bftsmart + + $ git checkout master - // 通过OperationResult获取结果 - for (int i = 0; i < operationResults.length; i++) { - OperationResult opResult = operationResults[i]; - System.out.printf("Operation[%s].result = %s \r\n", - opResult.getIndex(), BytesValueEncoding.decode(opResult.getResult())); - } + $ mvn install:install-file -Dfile=lib/core-0.1.4.jar -DgroupId=com.yahoo.ycsb -DartifactId=core -Dversion=0.1.4 -Dpackaging=jar + + $ mvn clean install +``` +- 编译 jdchain 工程; + - 当编译完成后,共识节点的安装包位于 "仓库根目录"/source/deployment/deployment-peer/target/jdchain-peer-1.0.1.RELEASE.zip + - 当编译完成后,网关节点的安装包位于 "仓库根目录"/source/deployment/deployment-gateway/target/jdchain-gateway-1.0.1.RELEASE.zip -``` \ No newline at end of file +```sh + $ git clone git@github.com:blockchain-jd-com/jdchain.git jdchain + + $ cd jdchain/source + + $ git checkout master + + $ mvn clean package + +``` diff --git a/README.zip b/README.zip deleted file mode 100644 index 7484f742..00000000 Binary files a/README.zip and /dev/null differ diff --git a/docs/images/deployment.jpg b/docs/images/deployment.jpg new file mode 100644 index 00000000..aec66f03 Binary files /dev/null and b/docs/images/deployment.jpg differ diff --git a/docs/readme.zip b/docs/readme.zip deleted file mode 100644 index 7484f742..00000000 Binary files a/docs/readme.zip and /dev/null differ diff --git a/source/base/pom.xml b/source/base/pom.xml index 0e0b7299..4e5bc72a 100644 --- a/source/base/pom.xml +++ b/source/base/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT base diff --git a/source/binary-proto/pom.xml b/source/binary-proto/pom.xml index ace2ff38..2eb6482c 100644 --- a/source/binary-proto/pom.xml +++ b/source/binary-proto/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT binary-proto diff --git a/source/consensus/consensus-bftsmart/pom.xml b/source/consensus/consensus-bftsmart/pom.xml index 3a6f14a5..39743832 100644 --- a/source/consensus/consensus-bftsmart/pom.xml +++ b/source/consensus/consensus-bftsmart/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain consensus - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT consensus-bftsmart diff --git a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java index 7e8a5bb9..48c85f79 100644 --- a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java +++ b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java @@ -5,7 +5,13 @@ import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; + +import bftsmart.consensus.app.BatchAppResultImpl; import bftsmart.tom.*; +import com.jd.blockchain.binaryproto.BinaryProtocol; +import com.jd.blockchain.consensus.service.*; +import com.jd.blockchain.ledger.*; +import com.jd.blockchain.transaction.TxResponseMessage; import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,18 +21,11 @@ import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider; import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusSettings; import com.jd.blockchain.consensus.bftsmart.BftsmartNodeSettings; import com.jd.blockchain.consensus.bftsmart.BftsmartTopology; -import com.jd.blockchain.consensus.service.MessageHandle; -import com.jd.blockchain.consensus.service.NodeServer; -import com.jd.blockchain.consensus.service.ServerSettings; -import com.jd.blockchain.consensus.service.StateHandle; -import com.jd.blockchain.consensus.service.StateMachineReplicate; -import com.jd.blockchain.ledger.TransactionState; import com.jd.blockchain.utils.PropertiesUtils; import com.jd.blockchain.utils.concurrent.AsyncFuture; import com.jd.blockchain.utils.io.BytesUtils; import bftsmart.reconfiguration.util.HostsConfig; import bftsmart.reconfiguration.util.TOMConfiguration; -import bftsmart.tom.core.messages.TOMMessage; import bftsmart.tom.server.defaultservices.DefaultRecoverable; public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer { @@ -189,94 +188,243 @@ public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer return messageHandle.processUnordered(bytes).get(); } - @Override - public byte[][] appExecuteBatch(byte[][] commands, MessageContext[] msgCtxs, boolean fromConsensus) { - return appExecuteBatch(commands, msgCtxs, fromConsensus, null); + /** + * + * Only block, no reply, used by state transfer when peer start + * + */ + private void block(List manageConsensusCmds) { + + String batchId = messageHandle.beginBatch(realmName); + try { + int msgId = 0; + for (byte[] txContent : manageConsensusCmds) { + AsyncFuture asyncFuture = messageHandle.processOrdered(msgId++, txContent, realmName, batchId); + } + messageHandle.completeBatch(realmName, batchId); + messageHandle.commitBatch(realmName, batchId); + } catch (Exception e) { + // todo 需要处理应答码 404 + LOGGER.error("Error occurred while processing ordered messages! --" + e.getMessage(), e); + messageHandle.rollbackBatch(realmName, batchId, TransactionState.CONSENSUS_ERROR.CODE); + } + } - @Override - public byte[][] appExecuteBatch(byte[][] commands, MessageContext[] msgCtxs, boolean fromConsensus, List replyList) { + /** + * + * Local peer has cid diff with remote peer, used by state transfer when peer start + * + */ + private byte[][] appExecuteDiffBatch(byte[][] commands, MessageContext[] msgCtxs) { - if (replyList == null || replyList.size() == 0) { - throw new IllegalArgumentException(); - } - // todo 此部分需要重新改造 - /** - * 默认BFTSmart接口提供的commands是一个或多个共识结果的顺序集合 - * 根据共识的规定,目前的做法是将其根据msgCtxs的内容进行分组,每组都作为一个结块标识来处理 - * 从msgCtxs可以获取对应commands的分组情况 - */ int manageConsensusId = msgCtxs[0].getConsensusId(); List manageConsensusCmds = new ArrayList<>(); - List manageReplyMsgs = new ArrayList<>(); int index = 0; for (MessageContext msgCtx : msgCtxs) { if (msgCtx.getConsensusId() == manageConsensusId) { manageConsensusCmds.add(commands[index]); - manageReplyMsgs.add(replyList.get(index)); } else { // 达到结块标准,需要进行结块并应答 - blockAndReply(manageConsensusCmds, manageReplyMsgs); + block(manageConsensusCmds); // 重置链表和共识ID manageConsensusCmds = new ArrayList<>(); - manageReplyMsgs = new ArrayList<>(); manageConsensusId = msgCtx.getConsensusId(); manageConsensusCmds.add(commands[index]); - manageReplyMsgs.add(replyList.get(index)); } index++; } // 结束时,肯定有最后一个结块请求未处理 if (!manageConsensusCmds.isEmpty()) { - blockAndReply(manageConsensusCmds, manageReplyMsgs); + block(manageConsensusCmds); } return null; + } + /** + * + * Invoked by state transfer when peer start + * + */ + @Override + public byte[][] appExecuteBatch(byte[][] commands, MessageContext[] msgCtxs, boolean fromConsensus) { + + // Not from consensus outcomes, from state transfer + if (!fromConsensus) { + return appExecuteDiffBatch(commands, msgCtxs); + } + + return null; + } + + /** + * + * From consensus outcomes, do nothing now + * The operation of executing the batch was moved to the consensus stage 2 and 3, in order to guaranteed ledger consistency + */ + @Override + public byte[][] appExecuteBatch(byte[][] commands, MessageContext[] msgCtxs, boolean fromConsensus, List replyList) { + +// if (replyList == null || replyList.size() == 0) { +// throw new IllegalArgumentException(); +// } +// // todo 此部分需要重新改造 +// /** +// * 默认BFTSmart接口提供的commands是一个或多个共识结果的顺序集合 +// * 根据共识的规定,目前的做法是将其根据msgCtxs的内容进行分组,每组都作为一个结块标识来处理 +// * 从msgCtxs可以获取对应commands的分组情况 +// */ +// int manageConsensusId = msgCtxs[0].getConsensusId(); +// List manageConsensusCmds = new ArrayList<>(); +// List manageReplyMsgs = new ArrayList<>(); +// +// int index = 0; +// for (MessageContext msgCtx : msgCtxs) { +// if (msgCtx.getConsensusId() == manageConsensusId) { +// manageConsensusCmds.add(commands[index]); +// manageReplyMsgs.add(replyList.get(index)); +// } else { +// // 达到结块标准,需要进行结块并应答 +// blockAndReply(manageConsensusCmds, manageReplyMsgs); +// // 重置链表和共识ID +// manageConsensusCmds = new ArrayList<>(); +// manageReplyMsgs = new ArrayList<>(); +// manageConsensusId = msgCtx.getConsensusId(); +// manageConsensusCmds.add(commands[index]); +// manageReplyMsgs.add(replyList.get(index)); +// } +// index++; +// } +// // 结束时,肯定有最后一个结块请求未处理 +// if (!manageConsensusCmds.isEmpty()) { +// blockAndReply(manageConsensusCmds, manageReplyMsgs); +// } + return null; + } + + /** + * + * Block and reply are moved to consensus completion stage + * + */ private void blockAndReply(List manageConsensusCmds, List replyList) { +// consensusBatchId = messageHandle.beginBatch(realmName); +// List> asyncFutureLinkedList = new ArrayList<>(manageConsensusCmds.size()); +// try { +// int msgId = 0; +// for (byte[] txContent : manageConsensusCmds) { +// AsyncFuture asyncFuture = messageHandle.processOrdered(msgId++, txContent, realmName, consensusBatchId); +// asyncFutureLinkedList.add(asyncFuture); +// } +// messageHandle.completeBatch(realmName, consensusBatchId); +// messageHandle.commitBatch(realmName, consensusBatchId); +// } catch (Exception e) { +// // todo 需要处理应答码 404 +// LOGGER.error("Error occurred while processing ordered messages! --" + e.getMessage(), e); +// messageHandle.rollbackBatch(realmName, consensusBatchId, TransactionState.CONSENSUS_ERROR.CODE); +// } +// +// // 通知线程单独处理应答 +// notifyReplyExecutors.execute(() -> { +// // 应答对应的结果 +// int replyIndex = 0; +// for(ReplyContextMessage msg : replyList) { +// msg.setReply(asyncFutureLinkedList.get(replyIndex).get()); +// TOMMessage request = msg.getTomMessage(); +// ReplyContext replyContext = msg.getReplyContext(); +// request.reply = new TOMMessage(replyContext.getId(), request.getSession(), request.getSequence(), +// request.getOperationId(), msg.getReply(), replyContext.getCurrentViewId(), +// request.getReqType()); +// +// if (replyContext.getNumRepliers() > 0) { +// bftsmart.tom.util.Logger.println("(ServiceReplica.receiveMessages) sending reply to " +// + request.getSender() + " with sequence number " + request.getSequence() +// + " and operation ID " + request.getOperationId() + " via ReplyManager"); +// replyContext.getRepMan().send(request); +// } else { +// bftsmart.tom.util.Logger.println("(ServiceReplica.receiveMessages) sending reply to " +// + request.getSender() + " with sequence number " + request.getSequence() +// + " and operation ID " + request.getOperationId()); +// replyContext.getReplier().manageReply(request, msg.getMessageContext()); +// } +// replyIndex++; +// } +// }); + } + + /** + * + * Used by consensus write phase, pre compute new block hash + * + */ + public BatchAppResultImpl preComputeAppHash(byte[][] commands) { String batchId = messageHandle.beginBatch(realmName); - List> asyncFutureLinkedList = new ArrayList<>(manageConsensusCmds.size()); + List> asyncFutureLinkedList = new ArrayList<>(commands.length); + List responseLinkedList = new ArrayList<>(); try { int msgId = 0; - for (byte[] txContent : manageConsensusCmds) { + for (byte[] txContent : commands) { AsyncFuture asyncFuture = messageHandle.processOrdered(msgId++, txContent, realmName, batchId); asyncFutureLinkedList.add(asyncFuture); } - messageHandle.completeBatch(realmName, batchId); - messageHandle.commitBatch(realmName, batchId); + StateSnapshot stateSnapshot = messageHandle.completeBatch(realmName, batchId); + byte[] blockHashBytes = stateSnapshot.getSnapshot(); + + for (int i = 0; i< asyncFutureLinkedList.size(); i++) { + responseLinkedList.add(asyncFutureLinkedList.get(i).get()); + } + + + return new BatchAppResultImpl(responseLinkedList, blockHashBytes, batchId); + } catch (Exception e) { // todo 需要处理应答码 404 - LOGGER.error("Error occurred while processing ordered messages! --" + e.getMessage(), e); - messageHandle.rollbackBatch(realmName, batchId, TransactionState.CONSENSUS_ERROR.CODE); + LOGGER.error("Error occurred while processing ordered messages! --" + e.getMessage(), e); + messageHandle.rollbackBatch(realmName, batchId, TransactionState.IGNORED_BY_CONSENSUS_PHASE_PRECOMPUTE_ROLLBACK.CODE); } - // 通知线程单独处理应答 - notifyReplyExecutors.execute(() -> { - // 应答对应的结果 - int replyIndex = 0; - for(ReplyContextMessage msg : replyList) { - msg.setReply(asyncFutureLinkedList.get(replyIndex).get()); - TOMMessage request = msg.getTomMessage(); - ReplyContext replyContext = msg.getReplyContext(); - request.reply = new TOMMessage(replyContext.getId(), request.getSession(), request.getSequence(), - request.getOperationId(), msg.getReply(), replyContext.getCurrentViewId(), - request.getReqType()); - - if (replyContext.getNumRepliers() > 0) { - bftsmart.tom.util.Logger.println("(ServiceReplica.receiveMessages) sending reply to " - + request.getSender() + " with sequence number " + request.getSequence() - + " and operation ID " + request.getOperationId() + " via ReplyManager"); - replyContext.getRepMan().send(request); - } else { - bftsmart.tom.util.Logger.println("(ServiceReplica.receiveMessages) sending reply to " - + request.getSender() + " with sequence number " + request.getSequence() - + " and operation ID " + request.getOperationId()); - replyContext.getReplier().manageReply(request, msg.getMessageContext()); - } - replyIndex++; - } - }); + return null; + } + + /** + * + * Consensus write phase will terminate, new block hash values are inconsistent, update batch messages execute state + * + */ + public List updateAppResponses(List asyncResponseLinkedList) { + List updatedResponses = new ArrayList<>(); + + for(int i = 0; i < asyncResponseLinkedList.size(); i++) { + TransactionResponse txResponse = BinaryProtocol.decode(asyncResponseLinkedList.get(i)); + TxResponseMessage resp = new TxResponseMessage(txResponse.getContentHash()); + resp.setExecutionState(TransactionState.IGNORED_BY_CONSENSUS_PHASE_PRECOMPUTE_ROLLBACK); + updatedResponses.add(BinaryProtocol.encode(resp, TransactionResponse.class)); + } + + return updatedResponses; + } + + /** + * + * Decision has been made at the consensus stage, commit block + * + */ + public void preComputeAppCommit(String batchId) { + + messageHandle.commitBatch(realmName, batchId); + + } + + /** + * + * Consensus write phase will terminate, new block hash values are inconsistent, rollback block + * + */ + public void preComputeAppRollback(String batchId) { + messageHandle.rollbackBatch(realmName, batchId, TransactionState.IGNORED_BY_CONSENSUS_PHASE_PRECOMPUTE_ROLLBACK.CODE); + LOGGER.debug("Rollback of operations that cause inconsistencies in the ledger"); } //notice diff --git a/source/consensus/consensus-framework/pom.xml b/source/consensus/consensus-framework/pom.xml index 22831dbe..9d4fbef4 100644 --- a/source/consensus/consensus-framework/pom.xml +++ b/source/consensus/consensus-framework/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain consensus - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT consensus-framework diff --git a/source/consensus/consensus-mq/pom.xml b/source/consensus/consensus-mq/pom.xml index 4f44c1a9..7b0f3431 100644 --- a/source/consensus/consensus-mq/pom.xml +++ b/source/consensus/consensus-mq/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain consensus - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT consensus-mq diff --git a/source/consensus/pom.xml b/source/consensus/pom.xml index 7bd570b9..98a52f47 100644 --- a/source/consensus/pom.xml +++ b/source/consensus/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT consensus pom diff --git a/source/contract/contract-framework/pom.xml b/source/contract/contract-framework/pom.xml index 43406825..7fa67cf1 100644 --- a/source/contract/contract-framework/pom.xml +++ b/source/contract/contract-framework/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain contract - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT contract-framework diff --git a/source/contract/contract-jvm/pom.xml b/source/contract/contract-jvm/pom.xml index c73dedc1..338282ea 100644 --- a/source/contract/contract-jvm/pom.xml +++ b/source/contract/contract-jvm/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain contract - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT contract-jvm diff --git a/source/contract/contract-maven-plugin/pom.xml b/source/contract/contract-maven-plugin/pom.xml index 47dab944..064d2155 100644 --- a/source/contract/contract-maven-plugin/pom.xml +++ b/source/contract/contract-maven-plugin/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain contract - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT contract-maven-plugin maven-plugin diff --git a/source/contract/contract-samples/pom.xml b/source/contract/contract-samples/pom.xml index 3935abe5..982dd45f 100644 --- a/source/contract/contract-samples/pom.xml +++ b/source/contract/contract-samples/pom.xml @@ -5,7 +5,7 @@ contract com.jd.blockchain - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT 4.0.0 diff --git a/source/contract/contract-samples/src/main/java/com/jd/blockchain/contract/RandomContract.java b/source/contract/contract-samples/src/main/java/com/jd/blockchain/contract/RandomContract.java new file mode 100644 index 00000000..3df56f82 --- /dev/null +++ b/source/contract/contract-samples/src/main/java/com/jd/blockchain/contract/RandomContract.java @@ -0,0 +1,11 @@ +package com.jd.blockchain.contract; + +@Contract +public interface RandomContract { + + @ContractEvent(name = "random-put") + void put(String address, String key, String value); + + @ContractEvent(name = "random-putAndGet") + String putAndGet(String address, String key, String value); +} diff --git a/source/contract/contract-samples/src/main/java/com/jd/blockchain/contract/RandomContractImpl.java b/source/contract/contract-samples/src/main/java/com/jd/blockchain/contract/RandomContractImpl.java new file mode 100644 index 00000000..55f49661 --- /dev/null +++ b/source/contract/contract-samples/src/main/java/com/jd/blockchain/contract/RandomContractImpl.java @@ -0,0 +1,43 @@ +package com.jd.blockchain.contract; + +import com.jd.blockchain.crypto.HashDigest; + +import java.util.Random; + +public class RandomContractImpl implements RandomContract, EventProcessingAware { + + private static final Random RANDOM_TIME = new Random(); + + private ContractEventContext eventContext; + + private HashDigest ledgerHash; + + @Override + public void beforeEvent(ContractEventContext eventContext) { + this.eventContext = eventContext; + this.ledgerHash = eventContext.getCurrentLedgerHash(); + } + + @Override + public void postEvent(ContractEventContext eventContext, Exception error) { + + } + + @Override + public void put(String address, String key, String value) { + + String saveVal = value + "-" + RANDOM_TIME.nextInt(1024); + + eventContext.getLedger().dataAccount(address).setText(key, saveVal, -1L); + } + + @Override + public String putAndGet(String address, String key, String value) { + + String saveVal = value + "-" + RANDOM_TIME.nextInt(1024); + + eventContext.getLedger().dataAccount(address).setText(key, saveVal, -1L); + + return address; + } +} diff --git a/source/contract/pom.xml b/source/contract/pom.xml index 5cf4bfb4..7e7415b1 100644 --- a/source/contract/pom.xml +++ b/source/contract/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT contract pom diff --git a/source/crypto/crypto-adv/pom.xml b/source/crypto/crypto-adv/pom.xml index 70d8e850..c54e45d6 100644 --- a/source/crypto/crypto-adv/pom.xml +++ b/source/crypto/crypto-adv/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain crypto - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT crypto-adv diff --git a/source/crypto/crypto-classic/pom.xml b/source/crypto/crypto-classic/pom.xml index 02dabc04..451c815e 100644 --- a/source/crypto/crypto-classic/pom.xml +++ b/source/crypto/crypto-classic/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain crypto - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT crypto-classic diff --git a/source/crypto/crypto-framework/pom.xml b/source/crypto/crypto-framework/pom.xml index 1ac22e61..04a196dc 100644 --- a/source/crypto/crypto-framework/pom.xml +++ b/source/crypto/crypto-framework/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain crypto - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT crypto-framework diff --git a/source/crypto/crypto-pki/pom.xml b/source/crypto/crypto-pki/pom.xml index 51f653de..61bde981 100644 --- a/source/crypto/crypto-pki/pom.xml +++ b/source/crypto/crypto-pki/pom.xml @@ -5,7 +5,7 @@ crypto com.jd.blockchain - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT 4.0.0 diff --git a/source/crypto/crypto-sm/pom.xml b/source/crypto/crypto-sm/pom.xml index cda82277..390e9661 100644 --- a/source/crypto/crypto-sm/pom.xml +++ b/source/crypto/crypto-sm/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain crypto - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT crypto-sm diff --git a/source/crypto/pom.xml b/source/crypto/pom.xml index c747be96..87f6eeac 100644 --- a/source/crypto/pom.xml +++ b/source/crypto/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT crypto pom diff --git a/source/deployment/deployment-gateway/pom.xml b/source/deployment/deployment-gateway/pom.xml index 575a9e53..8a6908c8 100644 --- a/source/deployment/deployment-gateway/pom.xml +++ b/source/deployment/deployment-gateway/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain deployment - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT deployment-gateway diff --git a/source/deployment/deployment-gateway/src/main/resources/config/gateway.conf b/source/deployment/deployment-gateway/src/main/resources/config/gateway.conf index 1fc0594c..7d4915d5 100644 --- a/source/deployment/deployment-gateway/src/main/resources/config/gateway.conf +++ b/source/deployment/deployment-gateway/src/main/resources/config/gateway.conf @@ -20,6 +20,7 @@ peer.providers=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider #若该值不配置或配置不正确,则浏览器模糊查询部分无法正常显示 #数据检索服务模块(Argus)需单独部署,若不部署其他功能仍可正常使用 data.retrieval.url=http://127.0.0.1:10001 +schema.retrieval.url=http://192.168.151.40:8082 #默认公钥的内容(Base58编码数据); keys.default.pubkey= diff --git a/source/deployment/deployment-gateway/src/main/resources/scripts/startup.sh b/source/deployment/deployment-gateway/src/main/resources/scripts/startup.sh index 44a1a528..915c33f3 100644 --- a/source/deployment/deployment-gateway/src/main/resources/scripts/startup.sh +++ b/source/deployment/deployment-gateway/src/main/resources/scripts/startup.sh @@ -5,5 +5,5 @@ GATEWAY=$(ls $HOME/lib | grep deployment-gateway-) if [ ! -n "$GATEWAY" ]; then echo "GateWay Is Null !!!" else - nohup java -jar -server -Dgateway.log=$HOME $HOME/lib/$GATEWAY -c $HOME/config/gateway.conf $* >$HOME/bin/gw.out 2>&1 & + nohup java -jar -server -Djdchain.log=$HOME $HOME/lib/$GATEWAY -c $HOME/config/gateway.conf $* >$HOME/bin/gw.out 2>&1 & fi \ No newline at end of file diff --git a/source/deployment/deployment-peer/pom.xml b/source/deployment/deployment-peer/pom.xml index 7d94202b..fcdbc5b7 100644 --- a/source/deployment/deployment-peer/pom.xml +++ b/source/deployment/deployment-peer/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain deployment - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT deployment-peer @@ -25,11 +25,11 @@ runtime-modular-booter ${project.version} - + com.jd.blockchain storage-composite diff --git a/source/deployment/deployment-peer/src/main/resources/assembly.xml b/source/deployment/deployment-peer/src/main/resources/assembly.xml index 0fc4ddf5..881c0aef 100644 --- a/source/deployment/deployment-peer/src/main/resources/assembly.xml +++ b/source/deployment/deployment-peer/src/main/resources/assembly.xml @@ -39,6 +39,18 @@ com.jd.blockchain:deployment-peer + + false + true + manager + + com.jd.blockchain:manager-booter + com.jd.blockchain:manager-model + com.jd.blockchain:manager-service + com.jd.blockchain:manager-web + com.jd.blockchain:ump-explorer + + false true @@ -53,6 +65,11 @@ com.jd.blockchain:runtime-modular-booter com.jd.blockchain:peer com.jd.blockchain:deployment-peer + com.jd.blockchain:manager-booter + com.jd.blockchain:manager-model + com.jd.blockchain:manager-service + com.jd.blockchain:manager-web + com.jd.blockchain:ump-explorer diff --git a/source/deployment/deployment-peer/src/main/resources/scripts/ledger-init.sh b/source/deployment/deployment-peer/src/main/resources/scripts/ledger-init.sh index 660676e8..eebc689b 100644 --- a/source/deployment/deployment-peer/src/main/resources/scripts/ledger-init.sh +++ b/source/deployment/deployment-peer/src/main/resources/scripts/ledger-init.sh @@ -5,5 +5,5 @@ boot_file=$(ls $HOME/libs | grep tools-initializer-booter-) if [ ! -n "$boot_file" ]; then echo "tools-initializer-booter is null" else - java -jar -server -Dinit.log=$HOME $HOME/libs/$boot_file -l $HOME/config/init/local.conf -i $HOME/config/init/ledger.init $* + java -jar -server -Djdchain.log=$HOME $HOME/libs/$boot_file -l $HOME/config/init/local.conf -i $HOME/config/init/ledger.init $* fi \ No newline at end of file diff --git a/source/manager/ump-booter/src/main/resources/scripts/jump-stop.sh b/source/deployment/deployment-peer/src/main/resources/scripts/manager-shutdown.sh similarity index 51% rename from source/manager/ump-booter/src/main/resources/scripts/jump-stop.sh rename to source/deployment/deployment-peer/src/main/resources/scripts/manager-shutdown.sh index b7155c88..e5f6b292 100644 --- a/source/manager/ump-booter/src/main/resources/scripts/jump-stop.sh +++ b/source/deployment/deployment-peer/src/main/resources/scripts/manager-shutdown.sh @@ -4,13 +4,13 @@ BOOT_HOME=$(cd `dirname $0`;cd ../; pwd) #获取进程PID -PID=`ps -ef | grep $BOOT_HOME/ext/ump-booter | grep -v grep | awk '{print $2}'` +PID=`ps -ef | grep $BOOT_HOME/manager/manager-booter | grep -v grep | awk '{print $2}'` #通过Kill命令将进程杀死 if [ -z "$PID" ]; then - echo "Unable to find UMP PID. stop aborted." + echo "Unable to find JDChain Manager PID. stop aborted." else echo "Start to kill PID = $PID ..." kill -9 $PID - echo "Unified Management Platform has been stopped ..." + echo "JDChain Manager has been stopped ..." fi \ No newline at end of file diff --git a/source/deployment/deployment-peer/src/main/resources/scripts/manager-start.sh b/source/deployment/deployment-peer/src/main/resources/scripts/manager-start.sh deleted file mode 100644 index 6c1f44af..00000000 --- a/source/deployment/deployment-peer/src/main/resources/scripts/manager-start.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -HOME=$(cd `dirname $0`;cd ../; pwd) -UMP=$(ls $HOME/ext | grep ump-booter-) -if [ ! -n "UMP" ]; then - echo "Unified Management Platform Is Null !!!" -else - nohup java -jar -server -Djump.log=$HOME $HOME/ext/$UMP -p 8000 $* >$HOME/bin/jump.out 2>&1 & -fi \ No newline at end of file diff --git a/source/deployment/deployment-peer/src/main/resources/scripts/manager-startup.sh b/source/deployment/deployment-peer/src/main/resources/scripts/manager-startup.sh new file mode 100644 index 00000000..790dfdfd --- /dev/null +++ b/source/deployment/deployment-peer/src/main/resources/scripts/manager-startup.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +HOME=$(cd `dirname $0`;cd ../; pwd) +UMP=$(ls $HOME/manager | grep manager-booter-) +if [ ! -n "UMP" ]; then + echo "JDChain Manager Is Null !!!" +else + nohup java -jar -server -Djdchain.log=$HOME $HOME/manager/$UMP -home $HOME -p 8000 $* >$HOME/bin/jump.out 2>&1 & +fi \ No newline at end of file diff --git a/source/deployment/deployment-peer/src/main/resources/scripts/manager-stop.sh b/source/deployment/deployment-peer/src/main/resources/scripts/manager-stop.sh deleted file mode 100644 index b7155c88..00000000 --- a/source/deployment/deployment-peer/src/main/resources/scripts/manager-stop.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -#启动Home路径 -BOOT_HOME=$(cd `dirname $0`;cd ../; pwd) - -#获取进程PID -PID=`ps -ef | grep $BOOT_HOME/ext/ump-booter | grep -v grep | awk '{print $2}'` - -#通过Kill命令将进程杀死 -if [ -z "$PID" ]; then - echo "Unable to find UMP PID. stop aborted." -else - echo "Start to kill PID = $PID ..." - kill -9 $PID - echo "Unified Management Platform has been stopped ..." -fi \ No newline at end of file diff --git a/source/deployment/deployment-peer/src/main/resources/scripts/peer-startup.sh b/source/deployment/deployment-peer/src/main/resources/scripts/peer-startup.sh index c316ed7d..bbdf3aa7 100644 --- a/source/deployment/deployment-peer/src/main/resources/scripts/peer-startup.sh +++ b/source/deployment/deployment-peer/src/main/resources/scripts/peer-startup.sh @@ -5,5 +5,5 @@ PEER=$(ls $HOME/system | grep deployment-peer-) if [ ! -n "$PEER" ]; then echo "Peer Is Null !!!" else - nohup java -jar -server -Xmx512m -Xms512m -Dpeer.log=$HOME $HOME/system/$PEER -home=$HOME -c $HOME/config/ledger-binding.conf -p 7080 $* >$HOME/bin/peer.out 2>&1 & + nohup java -jar -server -Xmx2g -Xms2g -Djdchain.log=$HOME $HOME/system/$PEER -home=$HOME -c $HOME/config/ledger-binding.conf -p 7080 $* >$HOME/bin/peer.out 2>&1 & fi \ No newline at end of file diff --git a/source/deployment/pom.xml b/source/deployment/pom.xml index 1e64a419..9967e8bc 100644 --- a/source/deployment/pom.xml +++ b/source/deployment/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT deployment pom diff --git a/source/gateway/pom.xml b/source/gateway/pom.xml index 2df3c7af..fe6f798a 100644 --- a/source/gateway/pom.xml +++ b/source/gateway/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT gateway @@ -45,7 +45,7 @@ com.jd.blockchain - explorer + data-explorer diff --git a/source/gateway/src/main/java/com/jd/blockchain/gateway/GatewayConfigProperties.java b/source/gateway/src/main/java/com/jd/blockchain/gateway/GatewayConfigProperties.java index ba16e829..5a836a41 100644 --- a/source/gateway/src/main/java/com/jd/blockchain/gateway/GatewayConfigProperties.java +++ b/source/gateway/src/main/java/com/jd/blockchain/gateway/GatewayConfigProperties.java @@ -32,6 +32,7 @@ public class GatewayConfigProperties { // 数据检索服务URL地址 public static final String DATA_RETRIEVAL_URL="data.retrieval.url"; + public static final String SCHEMA_RETRIEVAL_URL="schema.retrieval.url"; // 密钥相关配置项的键的前缀; public static final String KEYS_PREFIX = "keys."; @@ -54,6 +55,7 @@ public class GatewayConfigProperties { private NetworkAddress masterPeerAddress; private String dataRetrievalUrl; + private String schemaRetrievalUrl; private KeysConfig keys = new KeysConfig(); @@ -73,6 +75,14 @@ public class GatewayConfigProperties { this.dataRetrievalUrl = dataRetrievalUrl; } + public String getSchemaRetrievalUrl() { + return schemaRetrievalUrl; + } + + public void setSchemaRetrievalUrl(String schemaRetrievalUrl) { + this.schemaRetrievalUrl = schemaRetrievalUrl; + } + public ProviderConfig providerConfig() { return providerConfig; } @@ -120,6 +130,9 @@ public class GatewayConfigProperties { String dataRetrievalUrl = getProperty(props, DATA_RETRIEVAL_URL, true); configProps.dataRetrievalUrl = dataRetrievalUrl; + String schemaRetrievalUrl = getProperty(props, SCHEMA_RETRIEVAL_URL, true); + configProps.schemaRetrievalUrl = schemaRetrievalUrl; + String providers = getProperty(props, PEER_PROVIDERS, true); if (providers == null || providers.length() <= 0) { throw new IllegalArgumentException("Miss peer providers!"); diff --git a/source/gateway/src/main/java/com/jd/blockchain/gateway/GatewayServerBooter.java b/source/gateway/src/main/java/com/jd/blockchain/gateway/GatewayServerBooter.java index bdc8e881..18866f76 100644 --- a/source/gateway/src/main/java/com/jd/blockchain/gateway/GatewayServerBooter.java +++ b/source/gateway/src/main/java/com/jd/blockchain/gateway/GatewayServerBooter.java @@ -129,6 +129,7 @@ public class GatewayServerBooter { ConsoleUtils.info("\r\n\r\nStart connecting to peer ...."); BlockBrowserController blockBrowserController = appCtx.getBean(BlockBrowserController.class); blockBrowserController.setDataRetrievalUrl(config.dataRetrievalUrl()); + blockBrowserController.setSchemaRetrievalUrl(config.getSchemaRetrievalUrl()); PeerConnector peerConnector = appCtx.getBean(PeerConnector.class); peerConnector.connect(config.masterPeerAddress(), defaultKeyPair, config.providerConfig().getProviders()); ConsoleUtils.info("Peer[%s] is connected success!", config.masterPeerAddress().toString()); diff --git a/source/gateway/src/main/java/com/jd/blockchain/gateway/service/DataRetrievalService.java b/source/gateway/src/main/java/com/jd/blockchain/gateway/service/DataRetrievalService.java index d891bf83..522f8a20 100644 --- a/source/gateway/src/main/java/com/jd/blockchain/gateway/service/DataRetrievalService.java +++ b/source/gateway/src/main/java/com/jd/blockchain/gateway/service/DataRetrievalService.java @@ -18,4 +18,5 @@ package com.jd.blockchain.gateway.service; public interface DataRetrievalService { String retrieval(String url) throws Exception; + String retrievalPost(String url, String queryString) throws Exception; } \ No newline at end of file diff --git a/source/gateway/src/main/java/com/jd/blockchain/gateway/service/DataRetrievalServiceHandler.java b/source/gateway/src/main/java/com/jd/blockchain/gateway/service/DataRetrievalServiceHandler.java index d7dd0baf..79d9ebe3 100644 --- a/source/gateway/src/main/java/com/jd/blockchain/gateway/service/DataRetrievalServiceHandler.java +++ b/source/gateway/src/main/java/com/jd/blockchain/gateway/service/DataRetrievalServiceHandler.java @@ -8,6 +8,7 @@ */ package com.jd.blockchain.gateway.service; +import com.alibaba.fastjson.JSONObject; import com.jd.blockchain.utils.http.agent.HttpClientPool; import org.springframework.stereotype.Component; @@ -24,4 +25,9 @@ public class DataRetrievalServiceHandler implements DataRetrievalService { public String retrieval(String url) throws Exception { return HttpClientPool.get(url); } + + @Override + public String retrievalPost(String url, String queryString) throws Exception { + return HttpClientPool.jsonPost(url,queryString); + } } \ No newline at end of file diff --git a/source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java b/source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java index a6ef2f9b..50f528ba 100644 --- a/source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java +++ b/source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java @@ -56,6 +56,7 @@ public class BlockBrowserController implements BlockchainExtendQueryService { private DataRetrievalService dataRetrievalService; private String dataRetrievalUrl; + private String schemaRetrievalUrl; private static final long BLOCK_MAX_DISPLAY = 3L; @@ -511,6 +512,37 @@ public class BlockBrowserController implements BlockchainExtendQueryService { return result; } + /** + * querysql; + * @param request + * @return + */ + @RequestMapping(method = RequestMethod.POST, value = "schema/querysql") + public Object queryBySql(HttpServletRequest request,@RequestBody String queryString) { + String result; + if (schemaRetrievalUrl == null || schemaRetrievalUrl.length() <= 0) { + result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}"; + } else { + String queryParams = request.getQueryString() == null ? "": request.getQueryString(); + String fullQueryUrl = new StringBuffer(schemaRetrievalUrl) + .append(request.getRequestURI()) + .append(BaseConstant.DELIMETER_QUESTION) + .append(queryParams) + .toString(); + try { + result = dataRetrievalService.retrievalPost(fullQueryUrl,queryString); + ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result); + } catch (Exception e) { + result = "{'message':'error','data':'" + e.getMessage() + "'}"; + } + } + return result; + } + + public void setSchemaRetrievalUrl(String schemaRetrievalUrl) { + this.schemaRetrievalUrl = schemaRetrievalUrl; + } + public void setDataRetrievalUrl(String dataRetrievalUrl) { this.dataRetrievalUrl = dataRetrievalUrl; } diff --git a/source/gateway/src/main/resources/gateway.conf b/source/gateway/src/main/resources/gateway.conf index c0caa7c9..6b1a723e 100644 --- a/source/gateway/src/main/resources/gateway.conf +++ b/source/gateway/src/main/resources/gateway.conf @@ -19,6 +19,7 @@ peer.providers=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider #数据检索服务对应URL,格式:http://{ip}:{port},例如:http://127.0.0.1:10001 #若该值不配置或配置不正确,则浏览器模糊查询部分无法正常显示 data.retrieval.url=http://127.0.0.1:10001 +schema.retrieval.url=http://192.168.151.39:8082 #默认公钥的内容(Base58编码数据); keys.default.pubkey=3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9 diff --git a/source/gateway/src/main/resources/log4j2.xml b/source/gateway/src/main/resources/log4j2.xml index 6b49c3e9..9a3b1d39 100644 --- a/source/gateway/src/main/resources/log4j2.xml +++ b/source/gateway/src/main/resources/log4j2.xml @@ -13,12 +13,12 @@ - + - + @@ -27,8 +27,8 @@ - + @@ -38,8 +38,8 @@ - + diff --git a/source/gateway/src/test/java/test/com/jd/blockchain/gateway/GatewayConfigPropertiesTest.java b/source/gateway/src/test/java/test/com/jd/blockchain/gateway/GatewayConfigPropertiesTest.java index 5bcb142c..1ab1340a 100644 --- a/source/gateway/src/test/java/test/com/jd/blockchain/gateway/GatewayConfigPropertiesTest.java +++ b/source/gateway/src/test/java/test/com/jd/blockchain/gateway/GatewayConfigPropertiesTest.java @@ -23,19 +23,20 @@ public class GatewayConfigPropertiesTest { ClassPathResource gatewayConfigResource = new ClassPathResource("gateway.conf"); try (InputStream in = gatewayConfigResource.getInputStream()) { GatewayConfigProperties configProps = GatewayConfigProperties.resolve(in); - assertEquals("192.168.10.108", configProps.http().getHost()); - assertEquals(80, configProps.http().getPort()); + assertEquals("0.0.0.0", configProps.http().getHost()); + assertEquals(8081, configProps.http().getPort()); assertNull(configProps.http().getContextPath()); - assertEquals("10.1.6.61", configProps.masterPeerAddress().getHost()); - assertEquals(7100, configProps.masterPeerAddress().getPort()); + assertEquals("127.0.0.1", configProps.masterPeerAddress().getHost()); + assertEquals(12000, configProps.masterPeerAddress().getPort()); assertTrue(configProps.masterPeerAddress().isSecure()); - assertEquals("http://192.168.1.1:10001", configProps.dataRetrievalUrl()); - - assertEquals("keys/default.priv", configProps.keys().getDefault().getPrivKeyPath()); - assertEquals("64hnH4a8n48LeEmNxUPcaZ1J", configProps.keys().getDefault().getPrivKeyValue()); - assertEquals("a8n48LeEP", configProps.keys().getDefault().getPrivKeyPassword()); + assertEquals("http://127.0.0.1:10001", configProps.dataRetrievalUrl()); + + assertEquals("3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9", configProps.keys().getDefault().getPubKeyValue()); + assertNull(configProps.keys().getDefault().getPrivKeyPath()); + assertEquals("177gjzHTznYdPgWqZrH43W3yp37onm74wYXT4v9FukpCHBrhRysBBZh7Pzdo5AMRyQGJD7x", configProps.keys().getDefault().getPrivKeyValue()); + assertEquals("DYu3G8aGTMBW1WrTw76zxQJQU4DHLw9MLyy7peG4LKkY", configProps.keys().getDefault().getPrivKeyPassword()); } catch (IOException e) { throw new IllegalStateException(e.getMessage(), e); diff --git a/source/gateway/src/test/resources/gateway.conf b/source/gateway/src/test/resources/gateway.conf index b99068a2..e112bf72 100644 --- a/source/gateway/src/test/resources/gateway.conf +++ b/source/gateway/src/test/resources/gateway.conf @@ -1,29 +1,31 @@ - #网关的HTTP服务地址; -http.host=192.168.10.108 +http.host=0.0.0.0 #网关的HTTP服务端口; -http.port=80 +http.port=8081 #网关的HTTP服务上下文路径,可选; #http.context-path= -#共识节点的服务地址; -peer.host=10.1.6.61 -#共识节点的服务端口; -peer.port=7100 +#共识节点的服务地址(与该网关节点连接的Peer节点的IP地址); +peer.host=127.0.0.1 +#共识节点的服务端口(与该网关节点连接的Peer节点的端口); +peer.port=12000 #共识节点的服务是否启用安全证书; peer.secure=true #共识节点的服务提供解析器 +#BftSmart共识Provider:com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider +#简单消息共识Provider:com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider peer.providers=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider -#数据检索服务对应URL +#数据检索服务对应URL,格式:http://{ip}:{port},例如:http://127.0.0.1:10001 #若该值不配置或配置不正确,则浏览器模糊查询部分无法正常显示 -data.retrieval.url=http://192.168.1.1:10001 +data.retrieval.url=http://127.0.0.1:10001 +schema.retrieval.url=http://192.168.151.39:8082 #默认公钥的内容(Base58编码数据); -keys.default.pubkey=64hnNxUPcH4a8NxUPc +keys.default.pubkey=3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9 #默认私钥的路径;在 pk-path 和 pk 之间必须设置其一; -keys.default.privkey-path=keys/default.priv +keys.default.privkey-path= #默认私钥的内容(加密的Base58编码数据);在 pk-path 和 pk 之间必须设置其一; -keys.default.privkey=64hnH4a8n48LeEmNxUPcaZ1J +keys.default.privkey=177gjzHTznYdPgWqZrH43W3yp37onm74wYXT4v9FukpCHBrhRysBBZh7Pzdo5AMRyQGJD7x #默认私钥的解码密码; -keys.default.privkey-password=a8n48LeEP \ No newline at end of file +keys.default.privkey-password=DYu3G8aGTMBW1WrTw76zxQJQU4DHLw9MLyy7peG4LKkY \ No newline at end of file diff --git a/source/ledger/ledger-core/pom.xml b/source/ledger/ledger-core/pom.xml index e7bfe29e..861249a4 100644 --- a/source/ledger/ledger-core/pom.xml +++ b/source/ledger/ledger-core/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain ledger - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT ledger-core diff --git a/source/ledger/ledger-model/pom.xml b/source/ledger/ledger-model/pom.xml index 6bfbf903..1fcc2240 100644 --- a/source/ledger/ledger-model/pom.xml +++ b/source/ledger/ledger-model/pom.xml @@ -6,7 +6,7 @@ com.jd.blockchain ledger - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT ledger-model diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java index 27eaa098..a5a6bc0a 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java @@ -2,7 +2,6 @@ package com.jd.blockchain.ledger; import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.utils.net.NetworkAddress; -import org.omg.CORBA.PUBLIC_MEMBER; /** * 即将要注册的参与方的信息 diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionState.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionState.java index 029ccbab..f7ef4a4e 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionState.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionState.java @@ -88,6 +88,13 @@ public enum TransactionState { */ IGNORED_BY_BLOCK_FULL_ROLLBACK((byte) 0x44), + /** + * + * 共识阶段加入新区块哈希预计算功能, 如果来自其他Peer的新区块哈希值不一致,本批次整体回滚 + * + */ + IGNORED_BY_CONSENSUS_PHASE_PRECOMPUTE_ROLLBACK((byte) 0x45), + /** * 系统错误; */ diff --git a/source/ledger/ledger-rpc/pom.xml b/source/ledger/ledger-rpc/pom.xml index 765c837c..25153901 100644 --- a/source/ledger/ledger-rpc/pom.xml +++ b/source/ledger/ledger-rpc/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain ledger - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT ledger-rpc diff --git a/source/ledger/pom.xml b/source/ledger/pom.xml index 4544f273..42f6e4e4 100644 --- a/source/ledger/pom.xml +++ b/source/ledger/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT ledger pom diff --git a/source/manager/ump-booter/pom.xml b/source/manager/manager-booter/pom.xml similarity index 76% rename from source/manager/ump-booter/pom.xml rename to source/manager/manager-booter/pom.xml index 392cb3b9..65668cc6 100644 --- a/source/manager/ump-booter/pom.xml +++ b/source/manager/manager-booter/pom.xml @@ -5,13 +5,13 @@ manager com.jd.blockchain - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT 4.0.0 - ump-booter + manager-booter - ump-booter + manager-booter UTF-8 @@ -34,27 +34,22 @@ com.jd.blockchain - ump-web + manager-web ${project.version} com.jd.blockchain - ump-service + manager-service ${project.version} com.jd.blockchain - ump-model + manager-model ${project.version} - - com.jd.blockchain - ump-explorer - - org.springframework.boot spring-boot-starter-log4j2 @@ -82,6 +77,33 @@ + + + org.apache.maven.plugins + maven-jar-plugin + + + src/main/resources/META-INF/MANIFEST.MF + + com.jd.blockchain.ump.UmpBooter + false + false + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + + + diff --git a/source/manager/manager-booter/src/main/java/com/jd/blockchain/ump/UmpBooter.java b/source/manager/manager-booter/src/main/java/com/jd/blockchain/ump/UmpBooter.java new file mode 100644 index 00000000..bf13fa58 --- /dev/null +++ b/source/manager/manager-booter/src/main/java/com/jd/blockchain/ump/UmpBooter.java @@ -0,0 +1,322 @@ +package com.jd.blockchain.ump; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Properties; + + +public class UmpBooter { + + private static final String ARG_HOME = "-home"; + + private static final String ARG_PORT = "-p"; + + private static final String ARG_HOST = "-h"; + + private static final String PROTOCOL_FILE = "file:"; + + private static final String TOOLS_JAR = "tools.jar"; + + private static final String PATH_INNER_JARS = "/"; + + private static final String CONFIG = "config.properties"; + + private static final String CONFIG_APPLICATION = "application.properties"; + + private static final String CONFIG_PROP_HOST = "server.host"; + + private static final String CONFIG_PROP_HOST_DEFAULT = "0.0.0.0"; + + private static final String CONFIG_PROP_PORT = "server.port"; + + private static final String CONFIG_PROP_PORT_DEFAULT = "8080"; + + private static final String CONFIG_PROP_DB_URL = "db.url"; + + private static final String CONFIG_PROP_DB_URL_DEFAULT = "rocksdb://#project#/jumpdb"; + + private static final String UMP_START_CLASS = "com.jd.blockchain.ump.UmpApplicationStarter"; + + private static String HOME_DIR = null; + + public static void main(String[] args) { + try { + // 设置相关参数 + Server server = server(args); + // 加载libs/manager下的jar包 + loadJars(); + // 启动Server + startServer(server); + System.out.println("JDChain Manager Server Start SUCCESS !!!"); + } catch (Exception e) { + System.err.println(e); + } + } + + /** + * 启动Server + * + * @param server + * @throws Exception + */ + private static void startServer(Server server) throws Exception { + + List argList = new ArrayList<>(); + argList.add(String.format("--server.address=%s", server.host)); + argList.add(String.format("--server.port=%s", server.port)); + argList.add(String.format("--db.url=%s", server.dbUrl)); + + String[] args = argList.toArray(new String[argList.size()]); + + InputStream inputStream = UmpBooter.class.getResourceAsStream(PATH_INNER_JARS + CONFIG_APPLICATION); + if (inputStream == null) { + System.err.printf("File [%s]' inputStream is NULL !!! \r\n", CONFIG_APPLICATION); + } + Properties props = new Properties(); + try { + props.load(inputStream); + } catch (IOException e) { + System.err.println(e); + } + + /** + * 通过ClassLoader调用如下方法 + * {@link UmpApplicationStarter#start(String[], Properties)} + * + */ + Class applicationClass = Thread.currentThread().getContextClassLoader() + .loadClass(UMP_START_CLASS); + + Method startMethod = applicationClass.getDeclaredMethod("start", String[].class, Properties.class); + + startMethod.invoke(null, args, props); + } + + /** + * 根据入参加载Server对象(配置) + * + * @param args + * @return + * @throws Exception + */ + private static Server server(String[] args) throws Exception { + Server defaultServer = serverFromConfig(); + if (args == null || args.length == 0) { + + // 获取当前Class所在路径 + HOME_DIR = UmpBooter.class.getResource("").toURI().getPath(); + return defaultServer; + } + String host = null; + + int port = 0; + + // 读取参数列表 + for (int i = 0; i < args.length; i++) { + String arg = args[i]; + if (arg.equals(ARG_HOST)) { + host = args[i + 1]; + } else if (arg.equals(ARG_PORT)) { + port = Integer.parseInt(args[i + 1]); + } else if (arg.equals(ARG_HOME)) { + HOME_DIR = args[i + 1]; + } + } + + // 参数列表中的数据不完整,则剩余部分数据从配置文件中获取 + if (host == null) { + host = defaultServer.host; + } + if (port == 0) { + port = defaultServer.port; + } + + return new Server(host, port, defaultServer.dbUrl); + } + + /** + * 配置文件中加载Server对象 + * + * @return + */ + private static Server serverFromConfig() { + try { + InputStream inputStream = UmpBooter.class.getResourceAsStream(PATH_INNER_JARS + CONFIG); + if (inputStream == null) { + System.err.printf("File [%s]' inputStream is NULL !!! \r\n", CONFIG); + } + Properties props = new Properties(); + props.load(inputStream); + String host = props.getProperty(CONFIG_PROP_HOST, CONFIG_PROP_HOST_DEFAULT); + int port = Integer.parseInt( + props.getProperty(CONFIG_PROP_PORT, CONFIG_PROP_PORT_DEFAULT)); + String dbUrl = props.getProperty(CONFIG_PROP_DB_URL, CONFIG_PROP_DB_URL_DEFAULT); + return new Server(host, port, dbUrl); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + /** + * 自定义ClassLoader加载Jar包 + * + */ + private static void loadJars() throws Exception { + // 获取两个路径下所有的正确的Jar包 + URL[] totalJars = totalURLs(); + + // 自定义URLClassLoader + URLClassLoader totalClassLoader = new URLClassLoader(totalJars, + Thread.currentThread().getContextClassLoader().getParent()); + + // 设置当前线程ClassLoader + Thread.currentThread().setContextClassLoader(totalClassLoader); + } + + /** + * 获取指定路径下的所有Jar + * + * @return + */ + public static URL[] totalURLs() throws Exception { + List totalURLs = new ArrayList<>(); + totalURLs.addAll(libsPathURLs()); + totalURLs.addAll(managerPathURLs()); + URL toolsJarURL = toolsJarURL(); + if (toolsJarURL != null) { + totalURLs.add(toolsJarURL); + System.out.printf("Loaded tools.jar[%s]! \r\n", toolsJarURL); + } + URL[] totalURLArray = new URL[totalURLs.size()]; + return totalURLs.toArray(totalURLArray); + } + + /** + * 加载JAVA_HOME下的tools.jar文件 + * + * @return + */ + public static URL toolsJarURL() throws Exception { + // tools.jar位于JAVA_HOME/....../lib/tools.jar + // 首先从classpath下进行加载 + String classPath = System.getProperty("java.class.path"); + String[] paths = classPath.split(":"); + for (String path : paths) { + if (path.endsWith("/" + TOOLS_JAR)) { + // 当前路径即为tools.jar所在路径 + return new URL(PROTOCOL_FILE + path); + } + } + + // 获取其JAVA_HOME路径 + String javaHome = System.getenv("JAVA_HOME"); + if (javaHome != null && javaHome.length() > 0) { + String toolsJarPath = javaHome + File.separator + "lib" + File.separator + TOOLS_JAR; + File toolsJar = new File(toolsJarPath); + if (toolsJar.exists()) { + return new URL(PROTOCOL_FILE + toolsJarPath); + } + } + + return null; + } + + /** + * 获取libs目录下的相关Jar + * 排除JDChain项目中默认的其他booter对应的Jar包 + * + * @return + */ + public static List libsPathURLs() { + try { + File libsDir = new File(HOME_DIR + File.separator + "libs"); + File[] jars = libsDir.listFiles(f -> + f.getName().endsWith(".jar") && + f.isFile() && + !f.getName().contains("-booter-") && + !f.getName().contains("tools-initializer") + ); + List libsPathURLs = new ArrayList<>(); + if (jars != null && jars.length > 0) { + for (int i = 0; i < jars.length; i++) { + URL jarURL = jars[i].toURI().toURL(); + libsPathURLs.add(jarURL); + System.out.printf("Loaded libsPath Jar[%s]! \r\n", jarURL); + } + } + return libsPathURLs; + } catch (MalformedURLException e) { + throw new IllegalStateException(e.getMessage(), e); + } + } + + /** + * 加载manager下的所有Jar + * + * @return + */ + public static List managerPathURLs() { + try { + File managerDir = new File(HOME_DIR + File.separator + "manager"); + File[] jars = managerDir.listFiles(f -> f.getName().endsWith(".jar") && f.isFile()); + List managerPathURLs = new ArrayList<>(); + if (jars != null && jars.length > 0) { + for (int i = 0; i < jars.length; i++) { + URL jarURL = jars[i].toURI().toURL(); + managerPathURLs.add(jarURL); + System.out.printf("Loaded ManagerPath Jar[%s]! \r\n", jarURL); + } + } + return managerPathURLs; + } catch (MalformedURLException e) { + throw new IllegalStateException(e.getMessage(), e); + } + } + + private static class Server { + + private String host; + + private int port; + + private String dbUrl; + + public Server(String host, int port, String dbUrl) { + this.host = host; + this.port = port; + this.dbUrl = dbUrl; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public String getDbUrl() { + return dbUrl; + } + + public void setDbUrl(String dbUrl) { + this.dbUrl = dbUrl; + } + } +} diff --git a/source/manager/manager-booter/src/main/resources/META-INF/MANIFEST.MF b/source/manager/manager-booter/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 00000000..b08cf0d7 --- /dev/null +++ b/source/manager/manager-booter/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Created-By: 1.8.0 +Built-By: shaozhuguang@jd.com +Extension-Name: JDChain +Specification-Title: JDChain +Specification-Vendor: JD Software Foundation +Implementation-Vendor: JD Software Foundation +Implementation-URL: http://ledger.jd.com +Build-Jdk: 1.8.0 + diff --git a/source/manager/manager-booter/src/main/resources/application.properties b/source/manager/manager-booter/src/main/resources/application.properties new file mode 100644 index 00000000..c64be53e --- /dev/null +++ b/source/manager/manager-booter/src/main/resources/application.properties @@ -0,0 +1,8 @@ +server.tomcat.uri-encoding=utf-8 + +spring.mvc.favicon.enabled=false + +logging.config=classpath:log4j2-jump.xml + +retrieval.schemaUrl=http://192.168.151.40:8082 +retrieval.taskUrl=http://192.168.151.40:10005 \ No newline at end of file diff --git a/source/manager/ump-booter/src/main/resources/assembly.xml b/source/manager/manager-booter/src/main/resources/assembly.xml similarity index 100% rename from source/manager/ump-booter/src/main/resources/assembly.xml rename to source/manager/manager-booter/src/main/resources/assembly.xml diff --git a/source/manager/ump-booter/src/main/resources/banner.txt b/source/manager/manager-booter/src/main/resources/banner.txt similarity index 100% rename from source/manager/ump-booter/src/main/resources/banner.txt rename to source/manager/manager-booter/src/main/resources/banner.txt diff --git a/source/manager/ump-booter/src/main/resources/config.properties b/source/manager/manager-booter/src/main/resources/config.properties similarity index 52% rename from source/manager/ump-booter/src/main/resources/config.properties rename to source/manager/manager-booter/src/main/resources/config.properties index deaf015e..ac5a026f 100644 --- a/source/manager/ump-booter/src/main/resources/config.properties +++ b/source/manager/manager-booter/src/main/resources/config.properties @@ -5,4 +5,7 @@ server.host=0.0.0.0 server.port=8080 # 本地数据库存储位置 -db.url=rocksdb://#project#/jumpdb \ No newline at end of file +db.url=rocksdb://#project#/jumpdb + +schema.retrieval.url=http://192.168.151.40:8082 +task.retrieval.url=http://192.168.151.40:10005 \ No newline at end of file diff --git a/source/manager/ump-booter/src/main/resources/log4j2-jump.xml b/source/manager/manager-booter/src/main/resources/log4j2-jump.xml similarity index 85% rename from source/manager/ump-booter/src/main/resources/log4j2-jump.xml rename to source/manager/manager-booter/src/main/resources/log4j2-jump.xml index 6b19f527..7ea93dbd 100644 --- a/source/manager/ump-booter/src/main/resources/log4j2-jump.xml +++ b/source/manager/manager-booter/src/main/resources/log4j2-jump.xml @@ -13,8 +13,8 @@ - + @@ -23,8 +23,8 @@ - + diff --git a/source/manager/ump-model/pom.xml b/source/manager/manager-model/pom.xml similarity index 95% rename from source/manager/ump-model/pom.xml rename to source/manager/manager-model/pom.xml index 67436cc0..f4d69518 100644 --- a/source/manager/ump-model/pom.xml +++ b/source/manager/manager-model/pom.xml @@ -5,13 +5,13 @@ manager com.jd.blockchain - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT 4.0.0 - ump-model + manager-model - ump-model + manager-model UTF-8 diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/DBConnection.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/DBConnection.java similarity index 80% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/DBConnection.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/DBConnection.java index eea65d3f..a90248cc 100644 --- a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/DBConnection.java +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/DBConnection.java @@ -12,5 +12,9 @@ public interface DBConnection { String get(String key); + T get(String key, Class type); + + void delete(String key); + boolean exist(String dbUrl); } diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/DBConnectionProvider.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/DBConnectionProvider.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/DBConnectionProvider.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/DBConnectionProvider.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/MemoryDBConnection.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/MemoryDBConnection.java similarity index 80% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/MemoryDBConnection.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/MemoryDBConnection.java index ac9e5755..49fe9857 100644 --- a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/MemoryDBConnection.java +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/MemoryDBConnection.java @@ -44,4 +44,15 @@ public class MemoryDBConnection implements DBConnection { } return false; } + + @Override + public T get(String key, Class type) { + String record = memory.get(key); + return JSON.parseObject(record,type); + } + + @Override + public void delete(String key) { + memory.remove(key); + } } diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/RocksDBConnection.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/RocksDBConnection.java similarity index 86% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/RocksDBConnection.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/RocksDBConnection.java index ed32c519..893f6e67 100644 --- a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/RocksDBConnection.java +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/RocksDBConnection.java @@ -73,6 +73,32 @@ public class RocksDBConnection implements DBConnection { return null; } + @Override + public T get(String key, Class type) { + try { + byte[] value = this.rocksDB.get(key.getBytes(UTF_8)); + if (value != null && value.length > 0) { + String strObj = new String(value, UTF_8); + return JSON.parseObject(strObj,type); + } + } catch (Exception e) { + throw new IllegalStateException(e); + } + return null; + } + + @Override + public void delete(String key) { + try { + byte[] value = this.rocksDB.get(key.getBytes(UTF_8)); + if (value != null && value.length > 0) { + this.rocksDB.delete(value); + } + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + @Override public boolean exist(String dbUrl) { // 首先该dbUrl是Rocksdb diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/UmpDao.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/UmpDao.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/UmpDao.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/UmpDao.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/UmpDaoHandler.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/UmpDaoHandler.java similarity index 94% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/UmpDaoHandler.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/UmpDaoHandler.java index 62cce01d..3e261577 100644 --- a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/dao/UmpDaoHandler.java +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/dao/UmpDaoHandler.java @@ -68,6 +68,16 @@ public class UmpDaoHandler implements UmpDao, CommandLineRunner, DBConnection { return dbConnection.get(key); } + @Override + public T get(String key, Class type) { + return dbConnection.get(key,type); + } + + @Override + public void delete(String key) { + dbConnection.delete(key); + } + @Override public boolean exist(String dbUrl) { try { diff --git a/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/ApiResult.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/ApiResult.java new file mode 100644 index 00000000..4632bc04 --- /dev/null +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/ApiResult.java @@ -0,0 +1,73 @@ +package com.jd.blockchain.ump.model; + +/** + * @author zhaogw + * date 2019/7/10 15:31 + */ +public class ApiResult { + /** + * 错误码,对应{@link ErrorCode},表示一种错误类型 + * 如果是成功,则code为1 + */ + private int code; + /** + * 具体解释 + */ + private String message; + /** + * 返回的结果包装在value中,value可以是单个对象 + */ + private Object value; + + public ApiResult (){ } + + public ApiResult (Object obj){ + this.value = obj; + } + + public ApiResult (int code, String message){ + this.code = code; + this.message = message; + } + + public ApiResult(ErrorCode errorCode){ + this.code = errorCode.getCode(); + this.message = errorCode.getMsg(); + } + + public ApiResult(ErrorCode errorCode, Object obj){ + this.code = errorCode.getCode(); + this.message = errorCode.getMsg(); + this.value = obj; + } + + public ApiResult (int code, String message, Object value){ + this.code = code; + this.message = message; + this.value = value; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } +} diff --git a/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/ErrorCode.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/ErrorCode.java new file mode 100644 index 00000000..1e0031d6 --- /dev/null +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/ErrorCode.java @@ -0,0 +1,33 @@ +package com.jd.blockchain.ump.model; + +/** + * @author zhaogw + * date 2019/7/10 15:32 + */ +public enum ErrorCode { + SUCCESS(1,"成功"), + NO_PERMISSION(2,"权限不足"), + SERVER_ERROR(3,"服务器异常"), + AUTH_ERROR(4,"认证失败"), + PARAMS_ERROR(5,"参数错误"), + JSON_PARSE_ERROR(6,"Json解析错误"), + ILLEAGAL_STRING(7,"非法字符串"), + GEN_KEY_INPUT_LACK(8,"缺少必要的输入参数:name/randomSeed/basePath/password"), + UNKNOW_ERROR(10000,"未知错误"); + + private int code; + private String msg; + + ErrorCode(int code,String msg){ + this.code = code; + this.msg = msg; + } + + public int getCode() { + return code; + } + + public String getMsg() { + return msg; + } +} diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/MasterAddr.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/MasterAddr.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/MasterAddr.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/MasterAddr.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/PartiNode.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/PartiNode.java similarity index 89% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/PartiNode.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/PartiNode.java index 9281d408..574f1ee2 100644 --- a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/PartiNode.java +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/PartiNode.java @@ -17,7 +17,7 @@ public class PartiNode { private boolean isSecure; - public List toConfigChars() { + public List toConfigChars(List partiRoleConfigs) { List configCharList = new ArrayList<>(); @@ -25,6 +25,10 @@ public class PartiNode { configCharList.add(formatConfig(UmpConstant.PARTINODE_PUBKEY_FORMAT, pubKey)); + if (partiRoleConfigs != null && !partiRoleConfigs.isEmpty()) { + configCharList.addAll(partiRoleConfigs); + } + configCharList.add(formatConfig(UmpConstant.PARTINODE_INIT_HOST_FORMAT, initHost)); configCharList.add(formatConfig(UmpConstant.PARTINODE_INIT_PORT_FORMAT, initPort)); diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/PeerSharedConfigs.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/PeerSharedConfigs.java similarity index 96% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/PeerSharedConfigs.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/PeerSharedConfigs.java index 63251967..75675709 100644 --- a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/PeerSharedConfigs.java +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/PeerSharedConfigs.java @@ -139,13 +139,15 @@ public class PeerSharedConfigs { } } - public synchronized LedgerInitConfig ledgerInitConfig(String seed, String createTime) { + public synchronized LedgerInitConfig ledgerInitConfig(String seed, String createTime, + List securityConfigs, List partiRoleConfigs) { if (ledgerInitConfig != null) { return ledgerInitConfig; } // 处理该ledgerInitConfig - ledgerInitConfig = new LedgerInitConfig(seed, ledgerName, createTime, consensusProvider, waitNodeSize); + ledgerInitConfig = new LedgerInitConfig(seed, ledgerName, createTime, consensusProvider, waitNodeSize, + securityConfigs, partiRoleConfigs); // 添加参与方 for (int i = 0; i < sharedConfigs.size(); i++) { diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/UmpConstant.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/UmpConstant.java similarity index 67% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/UmpConstant.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/UmpConstant.java index 5f383e02..216a1e85 100644 --- a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/UmpConstant.java +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/UmpConstant.java @@ -32,6 +32,10 @@ public class UmpConstant { public static final String PARTINODE_PUBKEY_FORMAT = PARTINODE_FORMAT + ".pubkey"; + public static final String PARTINODE_ROLES_FORMAT = PARTINODE_FORMAT + ".roles"; + + public static final String PARTINODE_ROLES_POLICY_FORMAT = PARTINODE_FORMAT + ".roles-policy"; + public static final String PARTINODE_INIT_FORMAT = PARTINODE_FORMAT + ".initializer"; public static final String PARTINODE_INIT_HOST_FORMAT = PARTINODE_INIT_FORMAT + ".host"; @@ -48,14 +52,32 @@ public class UmpConstant { public static final String CREATE_TIME_PREFIX = "created-time"; + public static final String SECURITY_PREFIX = "security"; + + public static final String SECURITY_ROLES = SECURITY_PREFIX + ".roles"; + + public static final String SECURITY_ROLES_PRIVILEGES_LEDGER_FORMAT = SECURITY_ROLES + ".%s.ledger-privileges"; + + public static final String SECURITY_ROLES_PRIVILEGES_TX_FORMAT = SECURITY_ROLES + ".%s.tx-privileges"; + + public static final String SECURITY_PARTI_PREFIX = "participant.default"; + + public static final String SECURITY_PARTI_ROLES = SECURITY_PARTI_PREFIX + ".roles"; + + public static final String SECURITY_PARTI_ROLES_POLICY = SECURITY_PARTI_PREFIX + ".roles-policy"; + + public static final String CRYPTO_PREFIX = "crypto"; + + public static final String CRYPTO_HASH_VERIFY = CRYPTO_PREFIX + ".verify-hash"; + + public static final String CRYPTO_HASH_ALGORITHM = CRYPTO_PREFIX + ".hash-algorithm"; + public static final String CONSENSUS_PREFIX = "consensus"; public static final String CONSENSUS_PROVIDER_PREFIX = CONSENSUS_PREFIX + ".service-provider"; public static final String CONSENSUS_CONF_PREFIX = CONSENSUS_PREFIX + ".conf"; - public static final String CRYPTO_PREFIX = "crypto"; - public static final String CRYPTO_PROVIDERS_PREFIX = CRYPTO_PREFIX + ".service-providers"; public static final String LOCAL_PREFIX = "local"; @@ -84,7 +106,7 @@ public class UmpConstant { public static final String PATH_LEDGER_INIT_BIN = PATH_BIN + File.separator + "ledger-init.sh"; - public static final String PATH_STARTUP_BIN = PATH_BIN + File.separator + "startup.sh"; + public static final String PATH_PEER_STARTUP_BIN = PATH_BIN + File.separator + "peer-startup.sh"; public static final String PATH_LIBS = File.separator + "libs"; @@ -101,4 +123,17 @@ public class UmpConstant { public static final String PATH_LOCAL_CONFIG = PATH_CONFIG_INIT + File.separator + "local.conf"; public static final String PATH_LEDGER_INIT_CONFIG = PATH_CONFIG_INIT + File.separator + "ledger.init"; + + public static final String PEER_HOST_IP = "peerHostIp"; + public static final String INIT_PORT = "iPort"; + public static final String CONSENSUS_PORT = "cPort"; + public static final String DELIMETER_QUESTION = "?"; //逗号分隔符; + public static final String LEDGER_LIST = "ledger_list"; //the key that save all the ledger hash in the rocksdb; + public static final int MEMORY_MAP_MAX_COUNT=10000; + public static final int MEMORY_MAP_REMOVE_COUNT=50; + public static final String ALL_LEDGER="all_ledger"; + public static final String DELIMETER_MINUS = "-"; + public static final String SCHEMA_PREFIX = "schema_"; + public static final String SCHEMA_RETRIEVAL_URL = "retrieval.schemaUrl"; + public static final String TASK_RETRIEVAL_URL = "retrieval.taskUrl"; } diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/UmpQueue.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/UmpQueue.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/UmpQueue.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/UmpQueue.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/ConsensusConfig.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/ConsensusConfig.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/ConsensusConfig.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/ConsensusConfig.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerConfig.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerConfig.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerConfig.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerConfig.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerIdentification.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerIdentification.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerIdentification.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerIdentification.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerInitConfig.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerInitConfig.java similarity index 86% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerInitConfig.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerInitConfig.java index f31d84fe..476ff1e3 100644 --- a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerInitConfig.java +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/LedgerInitConfig.java @@ -22,18 +22,25 @@ public class LedgerInitConfig { "com.jd.blockchain.crypto.service.classic.ClassicCryptoService, " + "com.jd.blockchain.crypto.service.sm.SMCryptoService"; + List securityConfigs = null; + + List partiRolesConfigs = null; + private List partiNodes = new ArrayList<>(); public LedgerInitConfig() { } - public LedgerInitConfig(String seed, String name, String createTime, String consensusProvider, int nodeSize) { + public LedgerInitConfig(String seed, String name, String createTime, String consensusProvider, int nodeSize, + List securityConfigs, List partiRolesConfigs) { this.seed = seed; this.name = name; this.createTime = createTime; this.consensusProvider = consensusProvider; this.nodeSize = nodeSize; + this.securityConfigs = securityConfigs; + this.partiRolesConfigs = partiRolesConfigs; } public List toConfigChars(String consensusConf) { @@ -54,8 +61,12 @@ public class LedgerInitConfig { configChars.add(toConfigChars(UmpConstant.PARTINODE_COUNT, partiNodes.size())); + if (securityConfigs != null && !securityConfigs.isEmpty()) { + configChars.addAll(securityConfigs); + } + for (PartiNode partiNode : partiNodes) { - configChars.addAll(partiNode.toConfigChars()); + configChars.addAll(partiNode.toConfigChars(this.partiRolesConfigs)); } return configChars; diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/MasterConfig.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/MasterConfig.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/MasterConfig.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/MasterConfig.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/PeerLocalConfig.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/PeerLocalConfig.java similarity index 98% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/PeerLocalConfig.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/PeerLocalConfig.java index 21ba3220..bb4778f7 100644 --- a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/PeerLocalConfig.java +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/PeerLocalConfig.java @@ -16,7 +16,7 @@ public class PeerLocalConfig extends PeerSharedConfig { private String peerPath; - private String consensusConf = "bftsmart.config"; // 默认为bftsmart配置 + private String consensusConf = "bftsmart.default.config"; // 默认为bftsmart配置 private String privKey; diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/PeerSharedConfig.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/PeerSharedConfig.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/PeerSharedConfig.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/PeerSharedConfig.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/PeerSharedConfigVv.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/PeerSharedConfigVv.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/config/PeerSharedConfigVv.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/config/PeerSharedConfigVv.java diff --git a/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/DataAccountSchema.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/DataAccountSchema.java new file mode 100644 index 00000000..a2b43d70 --- /dev/null +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/DataAccountSchema.java @@ -0,0 +1,47 @@ +package com.jd.blockchain.ump.model.penetrate; + +import java.util.List; + +/** + * 数据账户信息 + * @author zhaogw + * date 2019/7/26 14:49 + */ +public class DataAccountSchema { + private String ledgerHash; + private String dataAccount; + private String memo; + private List fieldSchemaList; + + public String getLedgerHash() { + return ledgerHash; + } + + public void setLedgerHash(String ledgerHash) { + this.ledgerHash = ledgerHash; + } + + public String getDataAccount() { + return dataAccount; + } + + public void setDataAccount(String dataAccount) { + this.dataAccount = dataAccount; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + + public List getFieldSchemaList() { + return fieldSchemaList; + } + + public void setFieldSchemaList(List fieldSchemaList) { + this.fieldSchemaList = fieldSchemaList; + } +} diff --git a/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/FieldSchema.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/FieldSchema.java new file mode 100644 index 00000000..40605128 --- /dev/null +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/FieldSchema.java @@ -0,0 +1,46 @@ +package com.jd.blockchain.ump.model.penetrate; + +/** + * ump中记录的字段信息; + * @author zhaogw + * date 2019/7/26 14:50 + */ +public class FieldSchema { + private String code; + private String fieldType; + private boolean isPrimary; + //备注; + private String memo; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getFieldType() { + return fieldType; + } + + public void setFieldType(String fieldType) { + this.fieldType = fieldType; + } + + public boolean isPrimary() { + return isPrimary; + } + + public void setPrimary(boolean primary) { + isPrimary = primary; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } +} diff --git a/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/LeaderDomain.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/LeaderDomain.java new file mode 100644 index 00000000..cfb5ed58 --- /dev/null +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/LeaderDomain.java @@ -0,0 +1,79 @@ +package com.jd.blockchain.ump.model.penetrate; + +import com.alibaba.fastjson.annotation.JSONField; + +import java.util.List; + +/** + * mediator's domain; + * @author zhaogw + * date 2019/7/2 18:02 + */ +public class LeaderDomain { + + @JSONField(name="host") + private String host; + + @JSONField(name="port") + private String port; + + @JSONField(name="createTime") + private String createTime; + + @JSONField(name="ledgerSeed") + private String ledgerSeed; + + @JSONField(name="peerDomainList") + private List peerDomainList; + + @JSONField(name="ledgerHash") + private String ledgerHash; + + public List getPeerDomainList() { + return peerDomainList; + } + + public void setPeerDomainList(List peerDomainList) { + this.peerDomainList = peerDomainList; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getLedgerSeed() { + return ledgerSeed; + } + + public void setLedgerSeed(String ledgerSeed) { + this.ledgerSeed = ledgerSeed; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + public String getLedgerHash() { + return ledgerHash; + } + + public void setLedgerHash(String ledgerHash) { + this.ledgerHash = ledgerHash; + } +} diff --git a/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/PeerDomain.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/PeerDomain.java new file mode 100644 index 00000000..96379e15 --- /dev/null +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/PeerDomain.java @@ -0,0 +1,177 @@ +package com.jd.blockchain.ump.model.penetrate; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * @author zhaogw + * date 2019/7/2 10:10 + */ +public class PeerDomain { + @JSONField(name="peerId") + private int peerId; + + private String basePath; + + @JSONField(name="peerName") + private String peerName; + + @JSONField(name="host") + private String host; + + private String serverPort; + + @JSONField(name="initPort") + private String initPort; + + @JSONField(name="consensusPort") + private String consensusPort; + + @JSONField(name="visitPort") + private String visitPort; + + @JSONField(name="mediatorUrl") + private String mediatorUrl; + + private String dbUri; + + private boolean gatewayBindPeer; + + //the random String from front input by mouse device; + private String randomSeed; + + @JSONField(name="peerPubKey") + private String peerPubKey; + + private String peerPrivKey; + + private String peerRawPasswd; + private String peerPasswd; + + public int getPeerId() { + return peerId; + } + + public void setPeerId(int peerId) { + this.peerId = peerId; + } + + public String getBasePath() { + return basePath; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + } + + public String getPeerName() { + return peerName; + } + + public void setPeerName(String peerName) { + this.peerName = peerName; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getServerPort() { + return serverPort; + } + + public void setServerPort(String serverPort) { + this.serverPort = serverPort; + } + + public String getInitPort() { + return initPort; + } + + public void setInitPort(String initPort) { + this.initPort = initPort; + } + + public String getConsensusPort() { + return consensusPort; + } + + public void setConsensusPort(String consensusPort) { + this.consensusPort = consensusPort; + } + + public String getVisitPort() { + return visitPort; + } + + public void setVisitPort(String visitPort) { + this.visitPort = visitPort; + } + + public String getMediatorUrl() { + return mediatorUrl; + } + + public void setMediatorUrl(String mediatorUrl) { + this.mediatorUrl = mediatorUrl; + } + + public String getDbUri() { + return dbUri; + } + + public void setDbUri(String dbUri) { + this.dbUri = dbUri; + } + + public boolean isGatewayBindPeer() { + return gatewayBindPeer; + } + + public void setGatewayBindPeer(boolean gatewayBindPeer) { + this.gatewayBindPeer = gatewayBindPeer; + } + + public String getRandomSeed() { + return randomSeed; + } + + public void setRandomSeed(String randomSeed) { + this.randomSeed = randomSeed; + } + + public String getPeerPubKey() { + return peerPubKey; + } + + public void setPeerPubKey(String peerPubKey) { + this.peerPubKey = peerPubKey; + } + + public String getPeerPrivKey() { + return peerPrivKey; + } + + public void setPeerPrivKey(String peerPrivKey) { + this.peerPrivKey = peerPrivKey; + } + + public String getPeerRawPasswd() { + return peerRawPasswd; + } + + public void setPeerRawPasswd(String peerRawPasswd) { + this.peerRawPasswd = peerRawPasswd; + } + + public String getPeerPasswd() { + return peerPasswd; + } + + public void setPeerPasswd(String peerPasswd) { + this.peerPasswd = peerPasswd; + } +} diff --git a/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/SchemaDomain.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/SchemaDomain.java new file mode 100644 index 00000000..2e9d986c --- /dev/null +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/SchemaDomain.java @@ -0,0 +1,90 @@ +package com.jd.blockchain.ump.model.penetrate; + +import com.alibaba.fastjson.annotation.JSONField; +import com.jd.blockchain.ump.model.UmpConstant; +import org.springframework.util.CollectionUtils; + +import java.util.List; + +/** + * @author zhaogw + * date 2019/7/19 11:33 + */ +public class SchemaDomain { + + @JSONField(serialize = false) + private String schemaId; + + @JSONField(serialize = false) + private String schemaAllId; + + @JSONField(name="ledger") + private String ledgerHash; + + @JSONField(name="associate_account") + private String dataAccount; + + @JSONField(serialize = false) + private List fieldSchemaList; + + private String content; + + public String getSchemaId() { + return schemaId; + } + + public void setSchemaId(String schemaId) { + this.schemaId = schemaId; + } + + public String getLedgerHash() { + return ledgerHash; + } + + public void setLedgerHash(String ledgerHash) { + this.ledgerHash = ledgerHash; + } + + public String getDataAccount() { + return dataAccount; + } + + public void setDataAccount(String dataAccount) { + this.dataAccount = dataAccount; + } + + public String getContent() { + if(CollectionUtils.isEmpty(fieldSchemaList)){ + throw new IllegalStateException("content is empty! you must choose the field first!"); + } + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append("type "+this.schemaId).append("{").append(" "); + for(FieldSchema fieldSchema : fieldSchemaList){ + if(fieldSchema.isPrimary()){ + stringBuffer.append(fieldSchema.getCode()+"(isPrimaryKey: Boolean = true):"+fieldSchema.getFieldType()).append(" "); + }else { + stringBuffer.append(fieldSchema.getCode()+":"+fieldSchema.getFieldType()).append(" "); + } + } + stringBuffer.append("}"); + return stringBuffer.toString(); + } + + public void setContent(String content) { + this.content = content; + } + + public List getFieldSchemaList() { + return fieldSchemaList; + } + + public void setFieldSchemaList(List fieldSchemaList) { + this.fieldSchemaList = fieldSchemaList; + } + + public String getSchemaAllId() { + this.schemaAllId = schemaId+ UmpConstant.DELIMETER_MINUS+ledgerHash.substring(0,6)+ + UmpConstant.DELIMETER_MINUS+ dataAccount.substring(0,6); + return schemaAllId; + } +} diff --git a/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/store/MemQueue.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/store/MemQueue.java new file mode 100644 index 00000000..315b6ba5 --- /dev/null +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/store/MemQueue.java @@ -0,0 +1,70 @@ +package com.jd.blockchain.ump.model.penetrate.store; + +import com.jd.blockchain.ump.model.UmpConstant; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +/** + * 通过枚举的方式来实现内存队列;避免大并发时引起的不必要的多次实例化; + * + * @author zhaoguangwei + * + */ +public enum MemQueue { + instance; + private BlockingQueue queue = null; + + private MemQueue() { + queue = new LinkedBlockingQueue(); + } + + /** + * 记录放入内存队列; + * @param key + * @return + */ + public boolean put(String key) { + boolean rtn = false; + try { + while (queue.size() >= UmpConstant.MEMORY_MAP_MAX_COUNT) { + queue.remove(); + } + queue.add(key); + rtn = true; + } catch (Exception e) { + e.printStackTrace(); + } + return rtn; + } + + /** + * 从内存队列取出一条记录; + * + * @return + */ + public String get() { + String record = null; + try { + record = queue.take(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return record; + } + + /** + * 内存队列清除; + */ + public void clear() { + queue.clear(); + } + + /** + * 获得记录数; + * + * @return + */ + public int size() { + return queue.size(); + } +} diff --git a/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/store/MemStore.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/store/MemStore.java new file mode 100644 index 00000000..99d2a06c --- /dev/null +++ b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/penetrate/store/MemStore.java @@ -0,0 +1,49 @@ +package com.jd.blockchain.ump.model.penetrate.store; + +import com.jd.blockchain.ump.model.UmpConstant; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import static com.jd.blockchain.ump.model.UmpConstant.MEMORY_MAP_MAX_COUNT; +import static com.jd.blockchain.ump.model.UmpConstant.MEMORY_MAP_REMOVE_COUNT; + +/** + * @author zhaogw + * date 2019/7/17 17:10 + */ +public enum MemStore { + instance; + + private Map records = null; + + MemStore(){ + records = new ConcurrentHashMap(); + } + + public Object get(String key){ + return records.get(key); + } + + public Object remove(String key){ + return records.remove(key); + } + + public boolean put(String key, Object obj){ + boolean rtn = false; + MemQueue.instance.put(key); + if(records.size()>MEMORY_MAP_MAX_COUNT){ + //clear 50 records; + for(int i=0; i< MEMORY_MAP_REMOVE_COUNT; i++){ + String _key = MemQueue.instance.get(); + if(_key.equals(UmpConstant.ALL_LEDGER)){ + //don't remove the all_ledger; + continue; + } + records.remove(_key); + } + } + records.put(key,obj); + return true; + } +} diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/InstallProcess.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/InstallProcess.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/InstallProcess.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/InstallProcess.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/InstallSchedule.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/InstallSchedule.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/InstallSchedule.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/InstallSchedule.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerBindingConf.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerBindingConf.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerBindingConf.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerBindingConf.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerInited.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerInited.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerInited.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerInited.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerMasterInstall.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerMasterInstall.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerMasterInstall.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerMasterInstall.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerPeerInited.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerPeerInited.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerPeerInited.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerPeerInited.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerPeerInstall.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerPeerInstall.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerPeerInstall.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/LedgerPeerInstall.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/PeerInstallSchedule.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/PeerInstallSchedule.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/PeerInstallSchedule.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/PeerInstallSchedule.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/PeerInstallSchedules.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/PeerInstallSchedules.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/PeerInstallSchedules.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/PeerInstallSchedules.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/PeerStartupSchedules.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/PeerStartupSchedules.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/PeerStartupSchedules.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/PeerStartupSchedules.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/ScheduleState.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/ScheduleState.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/ScheduleState.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/ScheduleState.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/StartupState.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/StartupState.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/state/StartupState.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/state/StartupState.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeyBuilder.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeyBuilder.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeyBuilder.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeyBuilder.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeys.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeys.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeys.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeys.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeysVv.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeysVv.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeysVv.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/user/UserKeysVv.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/web/ErrorCode.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/web/ErrorCode.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/web/ErrorCode.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/web/ErrorCode.java diff --git a/source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/web/WebResponse.java b/source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/web/WebResponse.java similarity index 100% rename from source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/web/WebResponse.java rename to source/manager/manager-model/src/main/java/com/jd/blockchain/ump/model/web/WebResponse.java diff --git a/source/manager/ump-service/pom.xml b/source/manager/manager-service/pom.xml similarity index 93% rename from source/manager/ump-service/pom.xml rename to source/manager/manager-service/pom.xml index b01c60cc..8ee81999 100644 --- a/source/manager/ump-service/pom.xml +++ b/source/manager/manager-service/pom.xml @@ -5,13 +5,13 @@ manager com.jd.blockchain - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT 4.0.0 - ump-service + manager-service - ump-service + manager-service UTF-8 @@ -83,7 +83,7 @@ com.jd.blockchain - ump-model + manager-model ${project.version} @@ -107,7 +107,7 @@ tools 1.8 system - ${project.basedir}/../ump-booter/libs/tools.jar + ${java.home}/../lib/tools.jar diff --git a/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataAccountUmpService.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataAccountUmpService.java new file mode 100644 index 00000000..2f1a8457 --- /dev/null +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataAccountUmpService.java @@ -0,0 +1,26 @@ +/** + * Copyright: Copyright 2016-2020 JD.COM All Right Reserved + * FileName: com.jd.blockchain.gateway.service.DataRetrievalService + * Author: shaozhuguang + * Department: 区块链研发部 + * Date: 2019/1/15 下午3:08 + * Description: + */ +package com.jd.blockchain.ump.service; + +import com.jd.blockchain.ump.model.penetrate.DataAccountSchema; + +/** + * data account ump store; + */ +public interface DataAccountUmpService { + /** + * 整体新增dataAccountSchema,单独某个field不会更新;如果原先库中有记录,则更新为最新内容; + * @param dataAccountSchema + */ + boolean addDataAccountSchema(DataAccountSchema dataAccountSchema); + + void deleteDataAcccountSchema(String ledgerHash, String dataAccount); + + DataAccountSchema findDataAccountSchema(String ledgerHash, String dataAccount); +} \ No newline at end of file diff --git a/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataAccountUmpServiceImpl.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataAccountUmpServiceImpl.java new file mode 100644 index 00000000..4940c663 --- /dev/null +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataAccountUmpServiceImpl.java @@ -0,0 +1,41 @@ +package com.jd.blockchain.ump.service; + +import com.jd.blockchain.ump.dao.DBConnection; +import com.jd.blockchain.ump.model.penetrate.DataAccountSchema; +import com.jd.blockchain.ump.model.penetrate.store.MemStore; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import static com.jd.blockchain.ump.model.UmpConstant.SCHEMA_PREFIX; +import static com.jd.blockchain.utils.BaseConstant.DELIMETER_UNDERLINE; + +/** + * @author zhaogw + * date 2019/7/26 15:14 + */ +@Service +public class DataAccountUmpServiceImpl implements DataAccountUmpService { + @Autowired + private DBConnection dbConnection; + + @Override + public boolean addDataAccountSchema(DataAccountSchema dataAccountSchema) { + dbConnection.put(SCHEMA_PREFIX+dataAccountSchema.getLedgerHash()+ + DELIMETER_UNDERLINE+dataAccountSchema.getDataAccount(),dataAccountSchema,DataAccountSchema.class); + return true; +// return MemStore.instance.put(SCHEMA_PREFIX+dataAccountSchema.getLedgerHash()+ +// DELIMETER_UNDERLINE+dataAccountSchema.getDataAccount(),dataAccountSchema); + } + + @Override + public void deleteDataAcccountSchema(String ledgerHash, String dataAccount) { + dbConnection.delete(SCHEMA_PREFIX+ledgerHash+ DELIMETER_UNDERLINE+dataAccount); +// MemStore.instance.remove(SCHEMA_PREFIX+ledgerHash+ DELIMETER_UNDERLINE+dataAccount); + } + + @Override + public DataAccountSchema findDataAccountSchema(String ledgerHash, String dataAccount) { + return dbConnection.get(SCHEMA_PREFIX+ledgerHash+ DELIMETER_UNDERLINE+dataAccount,DataAccountSchema.class); +// return (DataAccountSchema)MemStore.instance.get(SCHEMA_PREFIX+ledgerHash+ DELIMETER_UNDERLINE+dataAccount); + } +} diff --git a/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataRetrievalService.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataRetrievalService.java new file mode 100644 index 00000000..8a335872 --- /dev/null +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataRetrievalService.java @@ -0,0 +1,28 @@ +/** + * Copyright: Copyright 2016-2020 JD.COM All Right Reserved + * FileName: com.jd.blockchain.gateway.service.DataRetrievalService + * Author: shaozhuguang + * Department: 区块链研发部 + * Date: 2019/1/15 下午3:08 + * Description: + */ +package com.jd.blockchain.ump.service; + +import com.alibaba.fastjson.JSONObject; + +import java.util.Map; + +/** + * + * @author shaozhuguang + * @create 2019/1/15 + * @since 1.0.0 + */ + +public interface DataRetrievalService { + + String retrieval(String url) throws Exception; + String retrievalPost(String url, JSONObject jsonObject) throws Exception; + String retrievalPost(String url, String queryString) throws Exception; + String delete(String url) throws Exception; +} \ No newline at end of file diff --git a/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataRetrievalServiceHandler.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataRetrievalServiceHandler.java new file mode 100644 index 00000000..55e05470 --- /dev/null +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/DataRetrievalServiceHandler.java @@ -0,0 +1,45 @@ +/** + * Copyright: Copyright 2016-2020 JD.COM All Right Reserved + * FileName: com.jd.blockchain.gateway.service.DeepQueryServiceImpl + * Author: shaozhuguang + * Department: 区块链研发部 + * Date: 2019/1/15 下午3:09 + * Description: + */ +package com.jd.blockchain.ump.service; + +import com.alibaba.fastjson.JSONObject; +import com.jd.blockchain.ump.util.HttpClientPool; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * + * @author shaozhuguang + * @create 2019/1/15 + * @since 1.0.0 + */ +@Component +public class DataRetrievalServiceHandler implements DataRetrievalService { + + @Override + public String retrieval(String url) throws Exception { + return HttpClientPool.get(url); + } + + @Override + public String retrievalPost(String url, JSONObject jsonObject) throws Exception { + return HttpClientPool.jsonPost(url,jsonObject.toJSONString()); + } + + @Override + public String delete(String url) throws Exception { + return HttpClientPool.delete(url); + } + + @Override + public String retrievalPost(String url, String queryString) throws Exception { + return HttpClientPool.jsonPost(url,queryString); + } +} \ No newline at end of file diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/LedgerService.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/LedgerService.java similarity index 100% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/LedgerService.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/LedgerService.java diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/LedgerServiceHandler.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/LedgerServiceHandler.java similarity index 99% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/LedgerServiceHandler.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/LedgerServiceHandler.java index f78aef42..7ff587d7 100644 --- a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/LedgerServiceHandler.java +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/LedgerServiceHandler.java @@ -84,7 +84,7 @@ public class LedgerServiceHandler implements LedgerService { @Override public String peerStartCommand(String peerPath) { return String.format(UmpConstant.CMD_START_UP_FORMAT, - peerPath + UmpConstant.PATH_STARTUP_BIN); + peerPath + UmpConstant.PATH_PEER_STARTUP_BIN); } @Override diff --git a/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/SecurityService.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/SecurityService.java new file mode 100644 index 00000000..af560deb --- /dev/null +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/SecurityService.java @@ -0,0 +1,12 @@ +package com.jd.blockchain.ump.service; + +import java.util.List; + +public interface SecurityService { + + List securityConfigs(); + + List participantRoleConfigs(); + + void init(); +} diff --git a/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/SecurityServiceHandler.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/SecurityServiceHandler.java new file mode 100644 index 00000000..d65a06da --- /dev/null +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/SecurityServiceHandler.java @@ -0,0 +1,96 @@ +package com.jd.blockchain.ump.service; + +import com.jd.blockchain.ump.model.UmpConstant; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +@Service +public class SecurityServiceHandler implements SecurityService { + + private static final String PATH_INNER = "/"; + + private static final Logger LOGGER = LoggerFactory.getLogger(SecurityServiceHandler.class); + + static final String SECURITY_FILE = "security.default.config"; + + private List securityConfigs = new ArrayList<>(); + + private List participantRoleConfigs = new ArrayList<>(); + + public SecurityServiceHandler() { + init(); + } + + @Override + public List securityConfigs() { + return securityConfigs; + } + + @Override + public List participantRoleConfigs() { + return participantRoleConfigs; + } + + @Override + public void init() { + + try { + // 读取配置文件中的内容 + InputStream currentFileInputStream = SecurityServiceHandler.class.getResourceAsStream( + PATH_INNER + SECURITY_FILE); + + Properties currentProps = new Properties(); + + currentProps.load(currentFileInputStream); + + // 将配置文件内容写入securityConfigs + write(currentProps); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + private void write(Properties currentProps) { + // 获取ROLES + String roles = currentProps.getProperty(UmpConstant.SECURITY_ROLES, ""); + + if (roles.length() > 0) { + + securityConfigs.add(propBuild(UmpConstant.SECURITY_ROLES, roles)); + + String[] rolesArray = roles.split(","); + for (String role : rolesArray) { + String roleRealm = role.trim(); + String roleLedgerKey = String.format(UmpConstant.SECURITY_ROLES_PRIVILEGES_LEDGER_FORMAT, roleRealm); + String roleLedgerValue = currentProps.getProperty(roleLedgerKey, ""); + securityConfigs.add(propBuild(roleLedgerKey, roleLedgerValue)); + + String roleTxKey = String.format(UmpConstant.SECURITY_ROLES_PRIVILEGES_TX_FORMAT, roleRealm); + String roleTxValue = currentProps.getProperty(roleTxKey, ""); + securityConfigs.add(propBuild(roleTxKey, roleTxValue)); + } + + // 将参与方信息写入 + String partiRolesValue = currentProps.getProperty(UmpConstant.SECURITY_PARTI_ROLES, ""); + String partiRolesPolicyValue = currentProps.getProperty(UmpConstant.SECURITY_PARTI_ROLES_POLICY, ""); + + participantRoleConfigs.add(propBuild(UmpConstant.SECURITY_PARTI_ROLES, partiRolesValue)); + participantRoleConfigs.add(propBuild(UmpConstant.SECURITY_PARTI_ROLES_POLICY, partiRolesPolicyValue)); + + } else { + // 打印日志即可 + LOGGER.error("Can not find Properties from {}", SECURITY_FILE); + } + } + + private String propBuild(String key, String value) { + return key + "=" + value; + } +} diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpService.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpService.java similarity index 100% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpService.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpService.java diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpServiceHandler.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpServiceHandler.java similarity index 99% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpServiceHandler.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpServiceHandler.java index c17cc309..54ed8a9e 100644 --- a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpServiceHandler.java +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpServiceHandler.java @@ -60,6 +60,9 @@ public class UmpServiceHandler implements UmpService { @Autowired private UmpStateService umpStateService; + @Autowired + private SecurityService securityService; + @Override public synchronized PeerSharedConfigs loadPeerSharedConfigs(PeerLocalConfig sharedConfig) { @@ -117,7 +120,8 @@ public class UmpServiceHandler implements UmpService { // 所有数据到达之后生成返回的应答 LedgerInitConfig initConfig = sharedConfigs.ledgerInitConfig( - ledgerService.randomSeed(), ledgerService.currentCreateTime()); + ledgerService.randomSeed(), ledgerService.currentCreateTime(), + securityService.securityConfigs(), securityService.participantRoleConfigs()); // 生成共识文件 String consensusConfig = consensusService.initConsensusConf( diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpSimulateService.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpSimulateService.java similarity index 100% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpSimulateService.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpSimulateService.java diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpSimulateServiceHandler.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpSimulateServiceHandler.java similarity index 100% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpSimulateServiceHandler.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpSimulateServiceHandler.java diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpStateService.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStateService.java similarity index 96% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpStateService.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStateService.java index 161ed867..18ae5662 100644 --- a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpStateService.java +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStateService.java @@ -59,4 +59,8 @@ public interface UmpStateService { List readLedgerIniteds(String search); String readLedgerHash(String ledgerAndNodeKey); + + int peerPort(String peerPath); + + int peerPort(); } diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpStateServiceHandler.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStateServiceHandler.java similarity index 97% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpStateServiceHandler.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStateServiceHandler.java index 5ed51aca..935e3e9e 100644 --- a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpStateServiceHandler.java +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStateServiceHandler.java @@ -519,6 +519,31 @@ public class UmpStateServiceHandler implements UmpStateService, Closeable { return dbConnection.get(ledgerHashKey); } + @Override + public int peerPort(String peerPath) { + + String peerVerify = ledgerService.peerVerifyKey(peerPath); + + try { + if (!CommandUtils.isActive(peerVerify)) { + // 进程不存在 + LOGGER.info("Can not find Peer Process {} !!!", peerVerify); + return 0; + } + return listenPort(peerVerify); + } catch (Exception e) { + // 进程处理错误打印日志即可 + LOGGER.error(String.format("Peer Port Check %s !!!", peerVerify), e); + } + + return 0; + } + + @Override + public int peerPort() { + return peerPort(UmpConstant.PROJECT_PATH); + } + @Override public void close() throws IOException { // writeRunner.close(); @@ -643,7 +668,7 @@ public class UmpStateServiceHandler implements UmpStateService, Closeable { if (listenPort > 0) { - int maxSize = 5, checkIndex = 1; + int maxSize = 3, checkIndex = 1; boolean isRead = false; @@ -670,7 +695,7 @@ public class UmpStateServiceHandler implements UmpStateService, Closeable { } // 6秒休眠 - Thread.sleep(6000); + Thread.sleep(3000); } catch (Exception e) { LOGGER.error(String.format("Request LedgerHashs from PeerNode [%s]", checkIndex++), e); } diff --git a/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStoreService.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStoreService.java new file mode 100644 index 00000000..658a6017 --- /dev/null +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStoreService.java @@ -0,0 +1,51 @@ +/** + * Copyright: Copyright 2016-2020 JD.COM All Right Reserved + * FileName: com.jd.blockchain.gateway.service.DataRetrievalService + * Author: shaozhuguang + * Department: 区块链研发部 + * Date: 2019/1/15 下午3:08 + * Description: + */ +package com.jd.blockchain.ump.service; + +import com.jd.blockchain.ump.model.penetrate.LeaderDomain; + +import java.util.List; + +/** + * data store; + */ +public interface UmpStoreService { + /** + * get ledger info by ledgerHash; + * @param ledgerHash + * @return + */ + LeaderDomain findLedgerInfo(String ledgerHash); + + /** + * get all ledgers; + * @return + */ + List findAllLedgers(); + + /** + * get all states by seed; + * @param seed + * @return + */ + List findStates(String seed); + + /** + * get value by key; + * @param key + * @return + */ + Object findRecord(String key); + + void saveLedgerInfo(LeaderDomain leaderDomain); + + void saveRecord(String key, Object obj); + + void saveState4Seed(String key, String state); +} \ No newline at end of file diff --git a/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStoreServiceImpl.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStoreServiceImpl.java new file mode 100644 index 00000000..a601765f --- /dev/null +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UmpStoreServiceImpl.java @@ -0,0 +1,76 @@ +/** + * Copyright: Copyright 2016-2020 JD.COM All Right Reserved + * FileName: com.jd.blockchain.gateway.service.DataRetrievalService + * Author: shaozhuguang + * Department: 区块链研发部 + * Date: 2019/1/15 下午3:08 + * Description: + */ +package com.jd.blockchain.ump.service; + +import com.jd.blockchain.ump.model.UmpConstant; +import com.jd.blockchain.ump.model.penetrate.LeaderDomain; +import com.jd.blockchain.ump.model.penetrate.store.MemStore; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * data store; + */ +@Service +public class UmpStoreServiceImpl implements UmpStoreService{ + @Override + public LeaderDomain findLedgerInfo(String ledgerHash) { + return (LeaderDomain) MemStore.instance.get(ledgerHash); + } + + @Override + public List findAllLedgers() { + return (List)MemStore.instance.get(UmpConstant.ALL_LEDGER); + } + + @Override + public List findStates(String seed) { + return (List)MemStore.instance.get(seed); + } + + @Override + public Object findRecord(String key) { + return MemStore.instance.get(key); + } + + @Override + public void saveLedgerInfo(LeaderDomain leaderDomain) { + MemStore.instance.put(leaderDomain.getLedgerHash(),leaderDomain); + //also put it into ALL_LEDGER; + Object obj = MemStore.instance.get(UmpConstant.ALL_LEDGER); + List leaderDomains = null; + if(obj == null){ + leaderDomains = new ArrayList<>(); + }else { + leaderDomains = (List)obj; + } + leaderDomains.add(leaderDomain); + MemStore.instance.put(UmpConstant.ALL_LEDGER,leaderDomains); + } + + @Override + public void saveRecord(String key, Object obj) { + MemStore.instance.put(key,obj); + } + + @Override + public void saveState4Seed(String key, String state) { + Object obj = MemStore.instance.get(key); + List states = null; + if(obj == null){ + states = new ArrayList<>(); + }else { + states = (List)obj; + } + states.add(state); + MemStore.instance.put(key,states); + } +} \ No newline at end of file diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UtilService.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UtilService.java similarity index 100% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UtilService.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UtilService.java diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UtilServiceHandler.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UtilServiceHandler.java similarity index 94% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UtilServiceHandler.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UtilServiceHandler.java index 3abf5bb4..3a2b3eee 100644 --- a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UtilServiceHandler.java +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/UtilServiceHandler.java @@ -17,8 +17,8 @@ import org.springframework.stereotype.Service; import java.nio.charset.Charset; -import static com.jd.blockchain.tools.keygen.KeyGenCommand.encodePrivKey; -import static com.jd.blockchain.tools.keygen.KeyGenCommand.encodePubKey; +import static com.jd.blockchain.crypto.KeyGenUtils.encodePrivKey; +import static com.jd.blockchain.crypto.KeyGenUtils.encodePubKey; @Service public class UtilServiceHandler implements UtilService { diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusProvider.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusProvider.java similarity index 100% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusProvider.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusProvider.java diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusService.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusService.java similarity index 100% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusService.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusService.java diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusServiceHandler.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusServiceHandler.java similarity index 95% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusServiceHandler.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusServiceHandler.java index 50cdb00f..7745eb97 100644 --- a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusServiceHandler.java +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/ConsensusServiceHandler.java @@ -16,6 +16,8 @@ import java.util.concurrent.ConcurrentHashMap; @Service public class ConsensusServiceHandler implements ConsensusService { + private static final String PATH_INNER = "/"; + private static final Map CONSENSUS_PROVIDERS = new ConcurrentHashMap<>(); static { @@ -60,7 +62,7 @@ public class ConsensusServiceHandler implements ConsensusService { // 根据value读取配置文件中的内容 InputStream currentFileInputStream = ConsensusServiceHandler.class.getResourceAsStream( - File.separator + provider.configFilePath()); + PATH_INNER + provider.configFilePath()); Properties currentProps = new Properties(); diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/BftsmartConsensusProvider.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/BftsmartConsensusProvider.java similarity index 99% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/BftsmartConsensusProvider.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/BftsmartConsensusProvider.java index acb89a84..e7179501 100644 --- a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/BftsmartConsensusProvider.java +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/BftsmartConsensusProvider.java @@ -12,7 +12,7 @@ public class BftsmartConsensusProvider implements ConsensusProvider { public static final String BFTSMART_PROVIDER = "com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider"; - public static final String BFTSMART_CONFIG_FILE = "bftsmart.config"; + public static final String BFTSMART_CONFIG_FILE = "bftsmart.default.config"; private static final int MIN_PARTI_SIZE = 4; diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/BftsmartConstant.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/BftsmartConstant.java similarity index 100% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/BftsmartConstant.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/BftsmartConstant.java diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/MsgQueueConsensusProvider.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/MsgQueueConsensusProvider.java similarity index 92% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/MsgQueueConsensusProvider.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/MsgQueueConsensusProvider.java index d4b197e7..31ab2f20 100644 --- a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/MsgQueueConsensusProvider.java +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/service/consensus/providers/MsgQueueConsensusProvider.java @@ -10,7 +10,7 @@ public class MsgQueueConsensusProvider implements ConsensusProvider { private static final String MSGQUEUE_PROVIDER = "com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider"; - private static final String MSGQUEUE_CONFIG_FILE = "mq.config"; + private static final String MSGQUEUE_CONFIG_FILE = "mq.default.config"; private Properties msgQueueProps; diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/util/Base58Utils.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/Base58Utils.java similarity index 100% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/util/Base58Utils.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/Base58Utils.java diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/util/CommandUtils.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/CommandUtils.java similarity index 100% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/util/CommandUtils.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/CommandUtils.java diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/util/HttpClientPool.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/HttpClientPool.java similarity index 92% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/util/HttpClientPool.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/HttpClientPool.java index dd575d0d..d3ee0541 100644 --- a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/util/HttpClientPool.java +++ b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/HttpClientPool.java @@ -8,14 +8,13 @@ */ package com.jd.blockchain.ump.util; +import com.alibaba.fastjson.JSONObject; import org.apache.http.*; +import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpRequestRetryHandler; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.client.methods.*; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; @@ -29,14 +28,14 @@ import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicNameValuePair; +import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import javax.net.ssl.SSLException; import javax.net.ssl.SSLHandshakeException; -import java.io.IOException; -import java.io.InterruptedIOException; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.net.UnknownHostException; import java.nio.charset.Charset; import java.util.ArrayList; @@ -286,4 +285,19 @@ public class HttpClientPool { EntityUtils.consume(entity); return result; } + + public static String delete(String url) throws IOException { + HttpDelete httpDelete = new HttpDelete(url); + config(httpDelete); + try (CloseableHttpResponse response = httpDelete(url, httpDelete)) { + return parseResponse(response); + } + } + + private static CloseableHttpResponse httpDelete(String url, HttpDelete httpDelete) throws IOException { + return getHttpClient(url) + .execute(httpDelete, HttpClientContext.create()); + } + + } \ No newline at end of file diff --git a/source/manager/ump-service/src/main/java/com/jd/blockchain/ump/util/HttpJsonClientUtils.java b/source/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/HttpJsonClientUtils.java similarity index 100% rename from source/manager/ump-service/src/main/java/com/jd/blockchain/ump/util/HttpJsonClientUtils.java rename to source/manager/manager-service/src/main/java/com/jd/blockchain/ump/util/HttpJsonClientUtils.java diff --git a/source/manager/ump-service/src/main/resources/bftsmart.config b/source/manager/manager-service/src/main/resources/bftsmart.default.config similarity index 100% rename from source/manager/ump-service/src/main/resources/bftsmart.config rename to source/manager/manager-service/src/main/resources/bftsmart.default.config diff --git a/source/manager/ump-service/src/main/resources/mq.config b/source/manager/manager-service/src/main/resources/mq.default.config similarity index 100% rename from source/manager/ump-service/src/main/resources/mq.config rename to source/manager/manager-service/src/main/resources/mq.default.config diff --git a/source/manager/manager-service/src/main/resources/security.default.config b/source/manager/manager-service/src/main/resources/security.default.config new file mode 100644 index 00000000..c90e730c --- /dev/null +++ b/source/manager/manager-service/src/main/resources/security.default.config @@ -0,0 +1,21 @@ +#security.roles=DEFAULT, ADMIN, MANAGER, GUEST + +security.role.DEFAULT.ledger-privileges=REGISTER_USER, REGISTER_DATA_ACCOUNT + +security.role.DEFAULT.tx-privileges=DIRECT_OPERATION, CONTRACT_OPERATION + +security.role.ADMIN.ledger-privileges=CONFIGURE_ROLES, AUTHORIZE_USER_ROLES, SET_CONSENSUS, SET_CRYPTO, REGISTER_PARTICIPANT, REGISTER_USER + +security.role.ADMIN.tx-privileges=DIRECT_OPERATION + +security.role.MANAGER.ledger-privileges=CONFIGURE_ROLES, AUTHORIZE_USER_ROLES, REGISTER_USER, REGISTER_DATA_ACCOUNT, REGISTER_CONTRACT, UPGRADE_CONTRACT, SET_USER_ATTRIBUTES, WRITE_DATA_ACCOUNT + +security.role.MANAGER.tx-privileges=DIRECT_OPERATION, CONTRACT_OPERATION + +security.role.GUEST.ledger-privileges= + +security.role.GUEST.tx-privileges=CONTRACT_OPERATION + +participant.default.roles=ADMIN, MANAGER + +participant.default.roles-policy=UNION \ No newline at end of file diff --git a/source/manager/ump-web/pom.xml b/source/manager/manager-web/pom.xml similarity index 90% rename from source/manager/ump-web/pom.xml rename to source/manager/manager-web/pom.xml index 658f3205..b9172eed 100644 --- a/source/manager/ump-web/pom.xml +++ b/source/manager/manager-web/pom.xml @@ -5,13 +5,13 @@ manager com.jd.blockchain - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT 4.0.0 - ump-web + manager-web - ump-web + manager-web UTF-8 @@ -53,13 +53,13 @@ com.jd.blockchain - ump-service + manager-service ${project.version} com.jd.blockchain - ump-model + manager-model ${project.version} @@ -71,7 +71,7 @@ com.jd.blockchain - ump-explorer + manager-explorer diff --git a/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/UmpApplicationStarter.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/UmpApplicationStarter.java new file mode 100644 index 00000000..fedb5ec7 --- /dev/null +++ b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/UmpApplicationStarter.java @@ -0,0 +1,29 @@ +package com.jd.blockchain.ump; + +import com.jd.blockchain.ump.web.RetrievalConfigListener; +import org.springframework.boot.SpringApplication; + +import java.util.Properties; + +/** + * JDChain Manager 应用启动器 + * + * @author shaozhuguang + * @date 2019-09-20 + * + */ +public class UmpApplicationStarter { + + /** + * 启动SpringBoot + * 使用自定义ClassLoader加载该类及方法调用 + * + * @param args + * @param props + */ + public static void start(String[] args, Properties props) { + SpringApplication springApplication = new SpringApplication(UmpConfiguration.class); + springApplication.addListeners(new RetrievalConfigListener(props)); + springApplication.run(args); + } +} diff --git a/source/manager/ump-booter/src/main/java/com/jd/blockchain/ump/UmpConfiguration.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/UmpConfiguration.java similarity index 55% rename from source/manager/ump-booter/src/main/java/com/jd/blockchain/ump/UmpConfiguration.java rename to source/manager/manager-web/src/main/java/com/jd/blockchain/ump/UmpConfiguration.java index f1e86f12..e25fde13 100644 --- a/source/manager/ump-booter/src/main/java/com/jd/blockchain/ump/UmpConfiguration.java +++ b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/UmpConfiguration.java @@ -1,12 +1,14 @@ package com.jd.blockchain.ump; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.ComponentScan; +@SpringBootApplication +@EnableAutoConfiguration @EnableConfigurationProperties -@SpringBootApplication(exclude = { - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class} - ) +@ComponentScan public class UmpConfiguration { -} +} \ No newline at end of file diff --git a/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/RetrievalController.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/RetrievalController.java new file mode 100644 index 00000000..cde46f20 --- /dev/null +++ b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/RetrievalController.java @@ -0,0 +1,297 @@ +package com.jd.blockchain.ump.controller; + +import com.alibaba.fastjson.JSONObject; +import com.jd.blockchain.ump.model.ApiResult; +import com.jd.blockchain.ump.model.ErrorCode; +import com.jd.blockchain.ump.model.UmpConstant; +import com.jd.blockchain.ump.model.penetrate.DataAccountSchema; +import com.jd.blockchain.ump.model.penetrate.SchemaDomain; +import com.jd.blockchain.ump.service.DataAccountUmpService; +import com.jd.blockchain.ump.service.DataRetrievalService; +import com.jd.blockchain.ump.service.UmpStateService; +import com.jd.blockchain.ump.web.RetrievalConfig; +import com.jd.blockchain.utils.ConsoleUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; + +/** + * @Author zhaogw + * date 2019/07/18 17:01 + */ +@RestController +@RequestMapping(path = "/schema") +public class RetrievalController { + private static final Log log = LogFactory.getLog(RetrievalController.class); + + @Autowired + private DataRetrievalService dataRetrievalService; + + @Autowired + private DataAccountUmpService dataAccountUmpService; + + @Autowired + private UmpStateService umpStateService; + + /** + * add schema by web; + * @param request + * @return + */ + @RequestMapping(method = RequestMethod.POST, value = "") + public Object addSchema4Web(HttpServletRequest request, @RequestBody SchemaDomain schemaDomain) { + String result; + if (RetrievalConfig.getSchemaUrl() == null || RetrievalConfig.getSchemaUrl().length() <= 0) { + result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}"; + } else { + String queryParams = request.getQueryString() == null ? "": request.getQueryString(); + String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl()) + .append(request.getRequestURI()) + .append(UmpConstant.DELIMETER_QUESTION) + .append(queryParams) + .toString(); + try { + + result = dataRetrievalService.retrievalPost(fullQueryUrl,JSONObject.toJSONString(schemaDomain)); + ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result); + } catch (Exception e) { + result = "{'message':'error','data':'" + e.getMessage() + "'}"; + } + } + return JSONObject.parse(result); + } + + /** + * add schema; + * @param request + * @return + */ +// @RequestMapping(method = RequestMethod.POST, value = "") + @Deprecated + public Object addSchema(HttpServletRequest request,@RequestBody JSONObject jsonObject) { + String result; + if (RetrievalConfig.getSchemaUrl() == null || RetrievalConfig.getSchemaUrl().length() <= 0) { + result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}"; + } else { + String queryParams = request.getQueryString() == null ? "": request.getQueryString(); + String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl()) + .append(request.getRequestURI()) + .append(UmpConstant.DELIMETER_QUESTION) + .append(queryParams) + .toString(); + try { + result = dataRetrievalService.retrievalPost(fullQueryUrl,jsonObject); + ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result); + } catch (Exception e) { + result = "{'message':'error','data':'" + e.getMessage() + "'}"; + } + } + return JSONObject.parse(result); + } + + /** + * list schema; + * @param request + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/list") + public Object listSchema(HttpServletRequest request) { + String result; + if (RetrievalConfig.getSchemaUrl() == null || RetrievalConfig.getSchemaUrl().length() <= 0) { + result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}"; + } else { + String queryParams = request.getQueryString() == null ? "": request.getQueryString(); + String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl()) + .append(request.getRequestURI()) + .append(UmpConstant.DELIMETER_QUESTION) + .append(queryParams) + .toString(); + try { + result = dataRetrievalService.retrieval(fullQueryUrl); + ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result); + } catch (Exception e) { + result = "{'message':'error','data':'" + e.getMessage() + "'}"; + } + } + return JSONObject.parse(result); + } + + /** + * delete schema; + * @param request + * @return + */ + @RequestMapping(method = RequestMethod.DELETE, value = "/{schemaId}") + public Object deleteSchema(HttpServletRequest request) { + String result; + if (RetrievalConfig.getSchemaUrl() == null || RetrievalConfig.getSchemaUrl().length() <= 0) { + result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}"; + } else { + String queryParams = request.getQueryString() == null ? "": request.getQueryString(); + String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl()) + .append(request.getRequestURI()) + .append(UmpConstant.DELIMETER_QUESTION) + .append(queryParams) + .toString(); + try { + result = dataRetrievalService.delete(fullQueryUrl); + ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result); + } catch (Exception e) { + result = "{'message':'error','data':'" + e.getMessage() + "'}"; + } + } + return JSONObject.parse(result); + } + + /** + * start schema; + * @param request + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/start/{schemaId}") + public Object startSchema(HttpServletRequest request) { + String result; + if (RetrievalConfig.getSchemaUrl()==null || RetrievalConfig.getSchemaUrl().length() <= 0) { + result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}"; + } else { + String queryParams = request.getQueryString() == null ? "": request.getQueryString(); + String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl()) + .append(request.getRequestURI()) + .append(UmpConstant.DELIMETER_QUESTION) + .append(queryParams) + .toString(); + try { + result = dataRetrievalService.retrieval(fullQueryUrl); + ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result); + } catch (Exception e) { + result = "{'message':'error','data':'" + e.getMessage() + "'}"; + } + } + return JSONObject.parse(result); + } + + /** + * stop schema; + * @param request + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/stop/{schemaId}") + public Object stopSchema(HttpServletRequest request) { + String result; + if (RetrievalConfig.getSchemaUrl() == null || RetrievalConfig.getSchemaUrl().length() <= 0) { + result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}"; + } else { + String queryParams = request.getQueryString() == null ? "": request.getQueryString(); + String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl()) + .append(request.getRequestURI()) + .append(UmpConstant.DELIMETER_QUESTION) + .append(queryParams) + .toString(); + try { + result = dataRetrievalService.retrieval(fullQueryUrl); + ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result); + } catch (Exception e) { + result = "{'message':'error','data':'" + e.getMessage() + "'}"; + } + } + return JSONObject.parse(result); + } + + /** + * querysql; + * @param request + * @return + */ + @RequestMapping(method = RequestMethod.POST, value = "/querysql") + public Object queryBySql(HttpServletRequest request,@RequestBody String queryString) { + String result; + if (RetrievalConfig.getSchemaUrl() == null || RetrievalConfig.getSchemaUrl().length() <= 0) { + result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}"; + } else { + String queryParams = request.getQueryString() == null ? "": request.getQueryString(); + String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl()) + .append(request.getRequestURI()) + .append(UmpConstant.DELIMETER_QUESTION) + .append(queryParams) + .toString(); + try { + result = dataRetrievalService.retrievalPost(fullQueryUrl,queryString); + ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result); + } catch (Exception e) { + result = "{'message':'error','data':'" + e.getMessage() + "'}"; + } + } + return JSONObject.parse(result); + } + + /** + * add dataAccountSchema; + * @return + */ + @RequestMapping(method = RequestMethod.POST, value = "/addDataAccountSchema") + public ApiResult addDataAccountSchema( @RequestBody DataAccountSchema dataAccountSchema) { + try { + dataAccountUmpService.addDataAccountSchema(dataAccountSchema); + return new ApiResult(ErrorCode.SUCCESS); + } catch (Exception e) { + return new ApiResult(ErrorCode.SERVER_ERROR,e.getMessage()); + } + } + + /** + * delete dataAccountSchema; + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/delDataAccountSchema/ledger/{ledgerHash}/account/{dataAccount}") + public ApiResult deleteDataAccountSchema(@PathVariable(name = "ledgerHash") String ledgerHash, + @PathVariable(name = "dataAccount") String dataAccount) { + try { + dataAccountUmpService.deleteDataAcccountSchema(ledgerHash, dataAccount); + return new ApiResult(ErrorCode.SUCCESS); + } catch (Exception e) { + return new ApiResult(ErrorCode.SERVER_ERROR,e.getMessage()); + } + } + + /** + * find dataAccountSchema; + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/findDataAccountSchema/ledger/{ledgerHash}/account/{dataAccount}") + public ApiResult findDataAccountSchema(@PathVariable(name = "ledgerHash") String ledgerHash, + @PathVariable(name = "dataAccount") String dataAccount) { + try { + DataAccountSchema dataAccountSchema = dataAccountUmpService.findDataAccountSchema(ledgerHash, dataAccount); + return new ApiResult(ErrorCode.SUCCESS,dataAccountSchema); + } catch (Exception e) { + return new ApiResult(ErrorCode.SERVER_ERROR,e.getMessage()); + } + } + + @RequestMapping(method = RequestMethod.GET, value = "/ledgers") + public String getAllLedgers() { + //generate the url; + int peerPort = umpStateService.peerPort(); + String url = "http://localhost:"+peerPort+"/ledgers"; + try { + return dataRetrievalService.retrieval(url); + } catch (Exception e) { + return "{'success':false,'data':'" + e.getMessage() + "'}"; + } + } + + @RequestMapping(method = RequestMethod.GET, value = "/ledger/{ledgerHash}") + public String getAllDataAccounts(@PathVariable(name = "ledgerHash") String ledgerHash) { + //generate the url; + int peerPort = umpStateService.peerPort(); + String url = "http://localhost:"+peerPort+"/ledgers/"+ledgerHash+"/accounts"; + try { + return dataRetrievalService.retrieval(url); + } catch (Exception e) { + return "{'success':false,'data':'" + e.getMessage() + "'}"; + } + } +} \ No newline at end of file diff --git a/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/TaskRetrievalController.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/TaskRetrievalController.java new file mode 100644 index 00000000..d1262c0b --- /dev/null +++ b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/TaskRetrievalController.java @@ -0,0 +1,59 @@ +package com.jd.blockchain.ump.controller; + +import com.alibaba.fastjson.JSONObject; +import com.jd.blockchain.ump.model.UmpConstant; +import com.jd.blockchain.ump.service.DataRetrievalService; +import com.jd.blockchain.ump.web.RetrievalConfig; +import com.jd.blockchain.utils.ConsoleUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +/** + * @Author zhaogw + * date 2019/07/18 17:01 + */ +@RestController +@RequestMapping(path = "/tasks") +public class TaskRetrievalController { + private static final Log log = LogFactory.getLog(TaskRetrievalController.class); + +// @Value("${task.retrieval.url}") +// private String taskRetrievalUrl; + + @Autowired + private DataRetrievalService dataRetrievalService; + + /** + * get the nums of all tasks; + * @param request + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "") + public Object listSchema(HttpServletRequest request) { + String result; + if (RetrievalConfig.getTaskUrl() == null || RetrievalConfig.getTaskUrl().length() <= 0) { + result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}"; + } else { + String queryParams = request.getQueryString() == null ? "": request.getQueryString(); + String fullQueryUrl = new StringBuffer(RetrievalConfig.getTaskUrl()) + .append(request.getRequestURI()) + .append(UmpConstant.DELIMETER_QUESTION) + .append(queryParams) + .toString(); + try { + result = dataRetrievalService.retrieval(fullQueryUrl); + ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result); + } catch (Exception e) { + result = "{'message':'error','data':'" + e.getMessage() + "'}"; + } + } + return JSONObject.parse(result); + } + +} \ No newline at end of file diff --git a/source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/UmpDBController.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpDBController.java similarity index 100% rename from source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/UmpDBController.java rename to source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpDBController.java diff --git a/source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/UmpKeyController.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpKeyController.java similarity index 100% rename from source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/UmpKeyController.java rename to source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpKeyController.java diff --git a/source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/UmpMasterController.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpMasterController.java similarity index 100% rename from source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/UmpMasterController.java rename to source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpMasterController.java diff --git a/source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/UmpPeerController.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpPeerController.java similarity index 100% rename from source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/UmpPeerController.java rename to source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpPeerController.java diff --git a/source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/UmpPeerSimulateController.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpPeerSimulateController.java similarity index 100% rename from source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/UmpPeerSimulateController.java rename to source/manager/manager-web/src/main/java/com/jd/blockchain/ump/controller/UmpPeerSimulateController.java diff --git a/source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/ControllerConfigurer.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/ControllerConfigurer.java similarity index 100% rename from source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/ControllerConfigurer.java rename to source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/ControllerConfigurer.java diff --git a/source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/ExceptionResponseAdvice.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/ExceptionResponseAdvice.java similarity index 100% rename from source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/ExceptionResponseAdvice.java rename to source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/ExceptionResponseAdvice.java diff --git a/source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/JsonResponseAdvice.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/JsonResponseAdvice.java similarity index 86% rename from source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/JsonResponseAdvice.java rename to source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/JsonResponseAdvice.java index 822aee64..9c9505e1 100644 --- a/source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/JsonResponseAdvice.java +++ b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/JsonResponseAdvice.java @@ -1,5 +1,7 @@ package com.jd.blockchain.ump.web; +import com.jd.blockchain.ump.controller.RetrievalController; +import com.jd.blockchain.ump.controller.TaskRetrievalController; import com.jd.blockchain.ump.model.config.LedgerConfig; import com.jd.blockchain.ump.model.web.WebResponse; import org.springframework.core.MethodParameter; @@ -20,6 +22,11 @@ public class JsonResponseAdvice implements ResponseBodyAdvice { if (MappingJackson2HttpMessageConverter.class == converterType && (returnType.getContainingClass().getName().startsWith("com.jd.blockchain.ump") || returnType.getDeclaringClass().getName().startsWith("com.jd.blockchain.ump"))) { + + if (returnType.getContainingClass() == RetrievalController.class || returnType.getContainingClass() == TaskRetrievalController.class) { + return false; + } + return true; } return false; diff --git a/source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/LogPrintInterceptor.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/LogPrintInterceptor.java similarity index 100% rename from source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/LogPrintInterceptor.java rename to source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/LogPrintInterceptor.java diff --git a/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/RetrievalConfig.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/RetrievalConfig.java new file mode 100644 index 00000000..8c254f02 --- /dev/null +++ b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/RetrievalConfig.java @@ -0,0 +1,62 @@ +package com.jd.blockchain.ump.web; + +import org.springframework.beans.BeansException; +import org.springframework.core.io.support.PropertiesLoaderUtils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import static com.jd.blockchain.ump.model.UmpConstant.SCHEMA_RETRIEVAL_URL; +import static com.jd.blockchain.ump.model.UmpConstant.TASK_RETRIEVAL_URL; + +public class RetrievalConfig { + + private static Map propertiesMap = new HashMap<>(); + + private String schemaUrl; + private String taskUrl; + + public static void processProperties(Properties props) throws BeansException { + propertiesMap = new HashMap(); + for (Object key : props.keySet()) { + String keyStr = key.toString(); + try { + // PropertiesLoaderUtils的默认编码是ISO-8859-1,在这里转码一下 + propertiesMap.put(keyStr, new String(props.getProperty(keyStr).getBytes("ISO-8859-1"), "utf-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (java.lang.Exception e) { + e.printStackTrace(); + } + } + } + + public static void loadAllProperties(String propertyFileName) { + try { + Properties properties = PropertiesLoaderUtils.loadAllProperties(propertyFileName); + processProperties(properties); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static String getProperty(String name) { + return propertiesMap.get(name).toString(); + } + + public static Map getAllProperty() { + return propertiesMap; + } + + public static String getSchemaUrl() { + return propertiesMap.get(SCHEMA_RETRIEVAL_URL); + } + + public static String getTaskUrl() { + return propertiesMap.get(TASK_RETRIEVAL_URL); + } + +} diff --git a/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/RetrievalConfigListener.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/RetrievalConfigListener.java new file mode 100644 index 00000000..7ab9a75e --- /dev/null +++ b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/RetrievalConfigListener.java @@ -0,0 +1,20 @@ +package com.jd.blockchain.ump.web; + + +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; + +import java.util.Properties; + +public class RetrievalConfigListener implements ApplicationListener { + private Properties props; + + public RetrievalConfigListener(Properties props){ + this.props = props; + } + + @Override + public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { + RetrievalConfig.processProperties(props); + } +} diff --git a/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/UmpSecurityConfiguration.java b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/UmpSecurityConfiguration.java new file mode 100644 index 00000000..5a50b7e4 --- /dev/null +++ b/source/manager/manager-web/src/main/java/com/jd/blockchain/ump/web/UmpSecurityConfiguration.java @@ -0,0 +1,18 @@ +package com.jd.blockchain.ump.web; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +public class UmpSecurityConfiguration extends WebSecurityConfigurerAdapter { + + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests().anyRequest().permitAll(); + http.csrf().disable(); + } +} diff --git a/source/manager/pom.xml b/source/manager/pom.xml index 9972ceaf..dbbcf67b 100644 --- a/source/manager/pom.xml +++ b/source/manager/pom.xml @@ -2,16 +2,16 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - + + manager-booter + manager-web + manager-service + manager-model + com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT manager pom diff --git a/source/manager/ump-booter/src/main/java/com/jd/blockchain/ump/UmpBooter.java b/source/manager/ump-booter/src/main/java/com/jd/blockchain/ump/UmpBooter.java deleted file mode 100644 index 4bf8d7ae..00000000 --- a/source/manager/ump-booter/src/main/java/com/jd/blockchain/ump/UmpBooter.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.jd.blockchain.ump; - -import org.springframework.boot.SpringApplication; - -import java.io.File; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - - -public class UmpBooter { - - private static final String ARG_PORT = "-p"; - - private static final String ARG_HOST = "-h"; - - private static final String CONFIG = "BOOT-INF" + File.separator + "classes" + File.separator + "config.properties"; - - private static final String CONFIG_PROP_HOST = "server.host"; - - private static final String CONFIG_PROP_HOST_DEFAULT = "0.0.0.0"; - - private static final String CONFIG_PROP_PORT = "server.port"; - - private static final String CONFIG_PROP_PORT_DEFAULT = "8080"; - - private static final String CONFIG_PROP_DB_URL = "db.url"; - - private static final String CONFIG_PROP_DB_URL_DEFAULT = "rocksdb://#project#/jumpdb"; - - public static void main(String[] args) { - startServer(server(args)); - System.out.println("Unified Management Platform Server Start SUCCESS !!!"); - } - - private static void startServer(Server server) { - - List argList = new ArrayList<>(); - argList.add(String.format("--server.address=%s", server.host)); - argList.add(String.format("--server.port=%s", server.port)); - argList.add(String.format("--db.url=%s", server.dbUrl)); - - String[] args = argList.toArray(new String[argList.size()]); - - // 启动服务器; - SpringApplication.run(UmpConfiguration.class, args); - } - - private static Server server(String[] args) { - Server defaultServer = serverFromConfig(); - if (args == null || args.length == 0) { - return defaultServer; - } - String host = null; - - int port = 0; - - // 读取参数列表 - for (int i = 0; i < args.length; i++) { - String arg = args[i]; - if (arg.equals(ARG_HOST)) { - host = args[i + 1]; - } else if (arg.equals(ARG_PORT)) { - port = Integer.parseInt(args[i + 1]); - } - } - - // 参数列表中的数据不完整,则剩余部分数据从配置文件中获取 - if (host == null) { - host = defaultServer.host; - } - if (port == 0) { - port = defaultServer.port; - } - - return new Server(host, port, defaultServer.dbUrl); - } - - private static Server serverFromConfig() { - try { - InputStream inputStream = UmpBooter.class.getResourceAsStream(File.separator + CONFIG); - if (inputStream == null) { - System.err.println("InputStream is NULL !!!"); - } - Properties props = new Properties(); - props.load(inputStream); - String host = props.getProperty(CONFIG_PROP_HOST, CONFIG_PROP_HOST_DEFAULT); - int port = Integer.parseInt( - props.getProperty(CONFIG_PROP_PORT, CONFIG_PROP_PORT_DEFAULT)); - String dbUrl = props.getProperty(CONFIG_PROP_DB_URL, CONFIG_PROP_DB_URL_DEFAULT); - return new Server(host, port, dbUrl); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - private static class Server { - - private String host; - - private int port; - - private String dbUrl; - - public Server(String host, int port, String dbUrl) { - this.host = host; - this.port = port; - this.dbUrl = dbUrl; - } - - public String getHost() { - return host; - } - - public void setHost(String host) { - this.host = host; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - this.port = port; - } - } -} diff --git a/source/manager/ump-booter/src/main/resources/application.properties b/source/manager/ump-booter/src/main/resources/application.properties deleted file mode 100644 index b5ef6943..00000000 --- a/source/manager/ump-booter/src/main/resources/application.properties +++ /dev/null @@ -1,5 +0,0 @@ -server.tomcat.uri-encoding=utf-8 - -spring.mvc.favicon.enabled=false - -logging.config=classpath:log4j2-jump.xml \ No newline at end of file diff --git a/source/manager/ump-booter/src/main/resources/scripts/jump-start.sh b/source/manager/ump-booter/src/main/resources/scripts/jump-start.sh deleted file mode 100644 index a31a5b28..00000000 --- a/source/manager/ump-booter/src/main/resources/scripts/jump-start.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -HOME=$(cd `dirname $0`;cd ../; pwd) -UMP=$(ls $HOME/ext | grep ump-booter-) -if [ ! -n "UMP" ]; then - echo "Unified Management Platform Is Null !!!" -else - nohup java -jar -server -Djump.log=$HOME $HOME/ext/$UMP $* >$HOME/bin/jump.out 2>&1 & -fi \ No newline at end of file diff --git a/source/peer/pom.xml b/source/peer/pom.xml index f428d188..20cc29f1 100644 --- a/source/peer/pom.xml +++ b/source/peer/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT peer diff --git a/source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java b/source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java index be312e44..7a3ba62f 100644 --- a/source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java +++ b/source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java @@ -245,6 +245,9 @@ public class ConsensusMessageDispatcher implements MessageHandle { realmLock.lock(); try { batchResultHandle.cancel(TransactionState.valueOf((byte)reasonCode)); + currBatchId = null; + txResponseMap = null; + txBatchProcess = null; } finally { realmLock.unlock(); } diff --git a/source/peer/src/main/resources/log4j2.xml b/source/peer/src/main/resources/log4j2.xml index 3f7b9d7a..2ee82e89 100644 --- a/source/peer/src/main/resources/log4j2.xml +++ b/source/peer/src/main/resources/log4j2.xml @@ -13,12 +13,12 @@ - + - + @@ -27,8 +27,8 @@ - + @@ -38,8 +38,8 @@ - + diff --git a/source/pom.xml b/source/pom.xml index 77e8149b..c48e5aeb 100644 --- a/source/pom.xml +++ b/source/pom.xml @@ -11,7 +11,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT pom jdchain @@ -35,10 +35,9 @@ - 0.8.1-SNAPSHOT - 0.0.8.RELEASE - 0.7.0.RELEASE - 1.0.0-SNAPSHOT + 0.2.0.RELEASE + 1.1.0.RELEASE + 1.1.0.RELEASE 2.4 3.3.0 1.2.2 @@ -111,14 +110,14 @@ com.jd.blockchain - explorer - ${explorer.version} + data-explorer + ${data-explorer.version} com.jd.blockchain - ump-explorer - ${ump-explorer.version} + manager-explorer + ${manager-explorer.version} diff --git a/source/runtime/pom.xml b/source/runtime/pom.xml index c98998e9..03c60442 100644 --- a/source/runtime/pom.xml +++ b/source/runtime/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT runtime pom diff --git a/source/runtime/runtime-context/pom.xml b/source/runtime/runtime-context/pom.xml index e3fe06a5..ee955aa2 100644 --- a/source/runtime/runtime-context/pom.xml +++ b/source/runtime/runtime-context/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain runtime - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT runtime-context diff --git a/source/runtime/runtime-modular-booter/pom.xml b/source/runtime/runtime-modular-booter/pom.xml index 8194444e..bb812b18 100644 --- a/source/runtime/runtime-modular-booter/pom.xml +++ b/source/runtime/runtime-modular-booter/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain runtime - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT runtime-modular-booter \ No newline at end of file diff --git a/source/runtime/runtime-modular/pom.xml b/source/runtime/runtime-modular/pom.xml index 0fadf062..afccee46 100644 --- a/source/runtime/runtime-modular/pom.xml +++ b/source/runtime/runtime-modular/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain runtime - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT runtime-modular diff --git a/source/sdk/pom.xml b/source/sdk/pom.xml index 96bd4eb5..177972f5 100644 --- a/source/sdk/pom.xml +++ b/source/sdk/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT sdk pom diff --git a/source/sdk/sdk-base/pom.xml b/source/sdk/sdk-base/pom.xml index cd184f2f..35f3d418 100644 --- a/source/sdk/sdk-base/pom.xml +++ b/source/sdk/sdk-base/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain sdk - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT sdk-base diff --git a/source/sdk/sdk-client/pom.xml b/source/sdk/sdk-client/pom.xml index 3817f948..6cca87b7 100644 --- a/source/sdk/sdk-client/pom.xml +++ b/source/sdk/sdk-client/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain sdk - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT sdk-client diff --git a/source/sdk/sdk-samples/pom.xml b/source/sdk/sdk-samples/pom.xml index 221ff852..11b66a9f 100644 --- a/source/sdk/sdk-samples/pom.xml +++ b/source/sdk/sdk-samples/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain sdk - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT sdk-samples diff --git a/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_Contract_Random_Demo.java b/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_Contract_Random_Demo.java new file mode 100644 index 00000000..c73a7f91 --- /dev/null +++ b/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_Contract_Random_Demo.java @@ -0,0 +1,120 @@ +package com.jd.blockchain.sdk.samples; + +import com.jd.blockchain.contract.RandomContract; +import com.jd.blockchain.contract.TransferContract; +import com.jd.blockchain.ledger.*; +import com.jd.blockchain.transaction.GenericValueHolder; +import com.jd.blockchain.transaction.LongValueHolder; +import com.jd.blockchain.utils.Bytes; + +import java.util.Random; + +import static com.jd.blockchain.sdk.samples.SDKDemo_Constant.readChainCodes; +import static com.jd.blockchain.transaction.ContractReturnValue.decode; + +public class SDK_Contract_Random_Demo extends SDK_Base_Demo { + + public static void main(String[] args) throws Exception { + new SDK_Contract_Random_Demo().executeContract(); + } + + public void executeContract() throws Exception { + + // 发布jar包 + // 定义交易模板 + TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); + + // 将jar包转换为二进制数据 + byte[] contractCode = readChainCodes("random.jar"); + + // 生成一个合约账号 + BlockchainKeypair contractDeployKey = BlockchainKeyGenerator.getInstance().generate(); + + // 生成发布合约操作 + txTpl.contracts().deploy(contractDeployKey.getIdentity(), contractCode); + + // 生成预发布交易; + PreparedTransaction ptx = txTpl.prepare(); + + // 对交易进行签名 + ptx.sign(adminKey); + + // 提交并等待共识返回; + TransactionResponse txResp = ptx.commit(); + + // 获取合约地址 + Bytes contractAddress = contractDeployKey.getAddress(); + + // 打印交易返回信息 + System.out.printf("Tx[%s] -> BlockHeight = %s, BlockHash = %s, isSuccess = %s, ExecutionState = %s \r\n", + txResp.getContentHash().toBase58(), txResp.getBlockHeight(), txResp.getBlockHash().toBase58(), + txResp.isSuccess(), txResp.getExecutionState()); + + // 打印合约地址 + System.out.printf("ContractAddress = %s \r\n", contractAddress.toBase58()); + + String result = create("LdeNzfhZd2qiBRk3YrEX6GZgiVRZJaf3MKJAY", "zhangshuang", "jingdong", contractAddress); + + + Thread.sleep(5000); + System.out.println(result); + } + + private String readAll(String address, String account, Bytes contractAddress) { + TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); + // 使用合约创建 + TransferContract transferContract = txTpl.contract(contractAddress, TransferContract.class); + GenericValueHolder result = decode(transferContract.readAll(address, account)); + commit(txTpl); + return result.get(); + } + + private long readByContract(String address, String account, Bytes contractAddress) { + TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); + // 使用合约创建 + TransferContract transferContract = txTpl.contract(contractAddress, TransferContract.class); + LongValueHolder result = decode(transferContract.read(address, account)); + commit(txTpl); + return result.get(); + } + + private long readByKvOperation(String address, String account) { + KVDataEntry[] kvDataEntries = blockchainService.getDataEntries(ledgerHash, address, account); + if (kvDataEntries == null || kvDataEntries.length == 0) { + throw new IllegalStateException(String.format("Ledger %s Service inner Error !!!", ledgerHash.toBase58())); + } + KVDataEntry kvDataEntry = kvDataEntries[0]; + if (kvDataEntry.getVersion() == -1) { + return 0L; + } + return (long) (kvDataEntry.getValue()); + } + + private String transfer(String address, String from, String to, long money, Bytes contractAddress) { + TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); + // 使用合约创建 + TransferContract transferContract = txTpl.contract(contractAddress, TransferContract.class); + GenericValueHolder result = decode(transferContract.transfer(address, from, to, money)); + commit(txTpl); + return result.get(); + } + + private BlockchainKeypair createDataAccount() { + // 首先注册一个数据账户 + BlockchainKeypair newDataAccount = BlockchainKeyGenerator.getInstance().generate(); + + TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); + txTpl.dataAccounts().register(newDataAccount.getIdentity()); + commit(txTpl); + return newDataAccount; + } + + private String create(String address, String account, String value, Bytes contractAddress) { + TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); + // 使用合约创建 + RandomContract randomContract = txTpl.contract(contractAddress, RandomContract.class); + GenericValueHolder result = decode(randomContract.putAndGet(address, account, value)); + commit(txTpl); + return result.get(); + } +} diff --git a/source/storage/pom.xml b/source/storage/pom.xml index 13351c79..ce1595a4 100644 --- a/source/storage/pom.xml +++ b/source/storage/pom.xml @@ -3,7 +3,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT storage pom diff --git a/source/storage/storage-composite/pom.xml b/source/storage/storage-composite/pom.xml index 3badb3e6..b6b9cf50 100644 --- a/source/storage/storage-composite/pom.xml +++ b/source/storage/storage-composite/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain storage - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT storage-composite diff --git a/source/storage/storage-redis/pom.xml b/source/storage/storage-redis/pom.xml index 2b3b78dd..cd48ebbb 100644 --- a/source/storage/storage-redis/pom.xml +++ b/source/storage/storage-redis/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain storage - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT storage-redis diff --git a/source/storage/storage-redis/src/main/java/com/jd/blockchain/storage/service/impl/redis/JedisConnection.java b/source/storage/storage-redis/src/main/java/com/jd/blockchain/storage/service/impl/redis/JedisConnection.java index 0494b53f..27ff22f4 100644 --- a/source/storage/storage-redis/src/main/java/com/jd/blockchain/storage/service/impl/redis/JedisConnection.java +++ b/source/storage/storage-redis/src/main/java/com/jd/blockchain/storage/service/impl/redis/JedisConnection.java @@ -18,7 +18,7 @@ public class JedisConnection implements DbConnection { @Override public void close() { - jedisPool.close(); +// jedisPool.close(); } @Override diff --git a/source/storage/storage-rocksdb/pom.xml b/source/storage/storage-rocksdb/pom.xml index e644c873..53cd8071 100644 --- a/source/storage/storage-rocksdb/pom.xml +++ b/source/storage/storage-rocksdb/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain storage - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT storage-rocksdb diff --git a/source/storage/storage-service/pom.xml b/source/storage/storage-service/pom.xml index 3ef91ed0..c6672b83 100644 --- a/source/storage/storage-service/pom.xml +++ b/source/storage/storage-service/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain storage - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT storage-service diff --git a/source/test/pom.xml b/source/test/pom.xml index 14bf30e9..75594838 100644 --- a/source/test/pom.xml +++ b/source/test/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT test pom diff --git a/source/test/test-consensus-client/pom.xml b/source/test/test-consensus-client/pom.xml index 1fbfa8aa..9a202d4d 100644 --- a/source/test/test-consensus-client/pom.xml +++ b/source/test/test-consensus-client/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain test - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT test-consensus-client diff --git a/source/test/test-consensus-node/pom.xml b/source/test/test-consensus-node/pom.xml index 671ecd50..49362e12 100644 --- a/source/test/test-consensus-node/pom.xml +++ b/source/test/test-consensus-node/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain test - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT test-consensus-node @@ -38,7 +38,7 @@ com.jd.blockchain consensus-bftsmart - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT org.springframework.boot diff --git a/source/test/test-integration/pom.xml b/source/test/test-integration/pom.xml index 7a5d7eb2..37e3a382 100644 --- a/source/test/test-integration/pom.xml +++ b/source/test/test-integration/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain test - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT test-integration diff --git a/source/test/test-integration/src/main/resources/ledger_init_test_web2.init b/source/test/test-integration/src/main/resources/ledger_init_test_web2.init index 5d64bdb6..00fc9da1 100644 --- a/source/test/test-integration/src/main/resources/ledger_init_test_web2.init +++ b/source/test/test-integration/src/main/resources/ledger_init_test_web2.init @@ -2,7 +2,7 @@ ledger.seed=932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323ffe #账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途; -#ledger.name= +ledger.name= #共识服务提供者;必须; consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider diff --git a/source/test/test-integration/src/test/resources/ledger_init_test_web2-role.init b/source/test/test-integration/src/test/resources/ledger_init_test_web2-role.init new file mode 100644 index 00000000..634a27ca --- /dev/null +++ b/source/test/test-integration/src/test/resources/ledger_init_test_web2-role.init @@ -0,0 +1,133 @@ +#账本的种子;一段16进制字符,最长可以包含64个字符;可以用字符“-”分隔,以便更容易读取; +ledger.seed=932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323ffe + +#账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途; +ledger.name==myledger + +#声明的账本创建时间;格式为 “yyyy-MM-dd HH:mm:ss.SSSZ”,表示”年-月-日 时:分:秒:毫秒时区“;例如:“2019-08-01 14:26:58.069+0800”,其中,+0800 表示时区是东8区 +created-time=2019-08-01 14:26:58.069+0800 + +#----------------------------------------------- +# 初始的角色名称列表;可选项; +# 角色名称不区分大小写,最长不超过20个字符;多个角色名称之间用半角的逗点“,”分隔; +# 系统会预置一个默认角色“DEFAULT”,所有未指定角色的用户都以赋予该角色的权限;若初始化时未配置默认角色的权限,则为默认角色分配所有权限; +# +# 注:如果声明了角色,但未声明角色对应的权限清单,这会忽略该角色的初始化; +# +security.roles=DEFAULT, ADMIN, MANAGER, GUEST + +# 赋予角色的账本权限清单;可选项; +# 可选的权限如下; +# AUTHORIZE_ROLES, SET_CONSENSUS, SET_CRYPTO, REGISTER_PARTICIPANT, +# REGISTER_USER, REGISTER_DATA_ACCOUNT, REGISTER_CONTRACT, UPGRADE_CONTRACT, +# SET_USER_ATTRIBUTES, WRITE_DATA_ACCOUNT, +# APPROVE_TX, CONSENSUS_TX +# 多项权限之间用逗点“,”分隔; +# +security.role.DEFAULT.ledger-privileges=REGISTER_USER, REGISTER_DATA_ACCOUNT + +# 赋予角色的交易权限清单;可选项; +# 可选的权限如下; +# DIRECT_OPERATION, CONTRACT_OPERATION +# 多项权限之间用逗点“,”分隔; +# +security.role.DEFAULT.tx-privileges=DIRECT_OPERATION, CONTRACT_OPERATION + +# 其它角色的配置示例; +# 系统管理员角色:只能操作全局性的参数配置和用户注册,只能执行直接操作指令; +security.role.ADMIN.ledger-privileges=CONFIGURE_ROLES, AUTHORIZE_USER_ROLES, SET_CONSENSUS, SET_CRYPTO, REGISTER_PARTICIPANT, REGISTER_USER, APPROVE_TX,REGISTER_DATA_ACCOUNT,WRITE_DATA_ACCOUNT +security.role.ADMIN.tx-privileges=DIRECT_OPERATION + +# 业务主管角色:只能够执行账本数据相关的操作,包括注册用户、注册数据账户、注册合约、升级合约、写入数据等;能够执行直接操作指令和调用合约; +security.role.MANAGER.ledger-privileges=CONFIGURE_ROLES, AUTHORIZE_USER_ROLES, REGISTER_USER, REGISTER_DATA_ACCOUNT, REGISTER_CONTRACT, UPGRADE_CONTRACT, SET_USER_ATTRIBUTES, WRITE_DATA_ACCOUNT, APPROVE_TX,REGISTER_PARTICIPANT +security.role.MANAGER.tx-privileges=DIRECT_OPERATION, CONTRACT_OPERATION + +# 访客角色:不具备任何的账本权限,只有数据读取的操作;也只能够通过调用合约来读取数据; +security.role.GUEST.ledger-privileges=APPROVE_TX,REGISTER_DATA_ACCOUNT,CONFIGURE_ROLES +security.role.GUEST.tx-privileges=CONTRACT_OPERATION,DIRECT_OPERATION + + + +#----------------------------------------------- + +#共识服务提供者;必须; +consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider + +#共识服务的参数配置;必须; +consensus.conf=classpath:bftsmart.config + +#密码服务提供者列表,以英文逗点“,”分隔;必须; +crypto.service-providers=com.jd.blockchain.crypto.service.classic.ClassicCryptoService, \ +com.jd.blockchain.crypto.service.sm.SMCryptoService + + +#参与方的个数,后续以 cons_parti.id 分别标识每一个参与方的配置; +cons_parti.count=4 + +#第0个参与方的名称; +cons_parti.0.name=jd.com +#第0个参与方的公钥文件路径; +cons_parti.0.pubkey-path=keys/jd-com.pub +#第0个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; +cons_parti.0.pubkey=3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9 +#第0个参与方的角色清单;可选项; +cons_parti.0.roles=ADMIN, MANAGER +#第0个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项; +cons_parti.0.roles-policy=INTERSECT +#第0个参与方的账本初始服务的主机; +cons_parti.0.initializer.host=127.0.0.1 +#第0个参与方的账本初始服务的端口; +cons_parti.0.initializer.port=9800 +#第0个参与方的账本初始服务是否开启安全连接; +cons_parti.0.initializer.secure=false + +#第1个参与方的名称; +cons_parti.1.name=at.com +#第1个参与方的公钥文件路径; +cons_parti.1.pubkey-path=keys/at-com.pub +#第1个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; +cons_parti.1.pubkey=3snPdw7i7PajLB35tEau1kmixc6ZrjLXgxwKbkv5bHhP7nT5dhD9eX +#第1个参与方的角色清单;可选项; +cons_parti.1.roles=MANAGER +#第1个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项; +cons_parti.1.roles-policy=UNION +#第1个参与方的账本初始服务的主机; +cons_parti.1.initializer.host=127.0.0.1 +#第1个参与方的账本初始服务的端口; +cons_parti.1.initializer.port=9810 +#第1个参与方的账本初始服务是否开启安全连接; +cons_parti.1.initializer.secure=false + +#第2个参与方的名称; +cons_parti.2.name=bt.com +#第2个参与方的公钥文件路径; +cons_parti.2.pubkey-path=keys/bt-com.pub +#第2个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; +cons_parti.2.pubkey=3snPdw7i7PZi6TStiyc6mzjprnNhgs2atSGNS8wPYzhbKaUWGFJt7x +#第2个参与方的角色清单;可选项; +cons_parti.2.roles=MANAGER +#第2个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项; +cons_parti.2.roles-policy=UNION +#第2个参与方的账本初始服务的主机; +cons_parti.2.initializer.host=127.0.0.1 +#第2个参与方的账本初始服务的端口; +cons_parti.2.initializer.port=9820 +#第2个参与方的账本初始服务是否开启安全连接; +cons_parti.2.initializer.secure=false + +#第3个参与方的名称; +cons_parti.3.name=xt.com +#第3个参与方的公钥文件路径; +cons_parti.3.pubkey-path=keys/xt-com.pub +#第3个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; +cons_parti.3.pubkey=3snPdw7i7PifPuRX7fu3jBjsb3rJRfDe9GtbDfvFJaJ4V4hHXQfhwk +#第3个参与方的角色清单;可选项; +cons_parti.3.roles=GUEST +#第3个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项; +cons_parti.3.roles-policy=INTERSECT +#第3个参与方的账本初始服务的主机; +cons_parti.3.initializer.host=127.0.0.1 +#第3个参与方的账本初始服务的端口; +cons_parti.3.initializer.port=9830 +#第3个参与方的账本初始服务是否开启安全连接; +cons_parti.3.initializer.secure=false diff --git a/source/test/test-integration/src/test/resources/log4j2.xml b/source/test/test-integration/src/test/resources/log4j2.xml new file mode 100644 index 00000000..8e40da20 --- /dev/null +++ b/source/test/test-integration/src/test/resources/log4j2.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/test/test-ledger/pom.xml b/source/test/test-ledger/pom.xml index 3e32fb6d..fa9421da 100644 --- a/source/test/test-ledger/pom.xml +++ b/source/test/test-ledger/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain test - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT test-ledger diff --git a/source/tools/pom.xml b/source/tools/pom.xml index ce56cf0f..aada0db1 100644 --- a/source/tools/pom.xml +++ b/source/tools/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT tools pom @@ -15,7 +15,7 @@ tools-initializer tools-initializer-booter - + \ No newline at end of file diff --git a/source/tools/tools-initializer-booter/pom.xml b/source/tools/tools-initializer-booter/pom.xml index 857bdd96..06dd8b35 100644 --- a/source/tools/tools-initializer-booter/pom.xml +++ b/source/tools/tools-initializer-booter/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain tools - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT tools-initializer-booter diff --git a/source/tools/tools-initializer/pom.xml b/source/tools/tools-initializer/pom.xml index f4cfe07d..be338342 100644 --- a/source/tools/tools-initializer/pom.xml +++ b/source/tools/tools-initializer/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain tools - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT tools-initializer diff --git a/source/tools/tools-initializer/src/main/resources/log4j2-init.xml b/source/tools/tools-initializer/src/main/resources/log4j2-init.xml index 6ef49baf..fe98c0c1 100644 --- a/source/tools/tools-initializer/src/main/resources/log4j2-init.xml +++ b/source/tools/tools-initializer/src/main/resources/log4j2-init.xml @@ -13,12 +13,12 @@ - + - + @@ -27,8 +27,8 @@ - + @@ -38,8 +38,8 @@ - + diff --git a/source/tools/tools-initializer/src/test/java/test/com/jd/blockchain/tools/initializer/LedgerBindingConfigTest.java b/source/tools/tools-initializer/src/test/java/test/com/jd/blockchain/tools/initializer/LedgerBindingConfigTest.java index 3138abf1..dab50f75 100644 --- a/source/tools/tools-initializer/src/test/java/test/com/jd/blockchain/tools/initializer/LedgerBindingConfigTest.java +++ b/source/tools/tools-initializer/src/test/java/test/com/jd/blockchain/tools/initializer/LedgerBindingConfigTest.java @@ -1,19 +1,19 @@ package test.com.jd.blockchain.tools.initializer; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import com.jd.blockchain.crypto.HashDigest; +import com.jd.blockchain.ledger.core.LedgerManager; +import com.jd.blockchain.tools.initializer.LedgerBindingConfig; +import com.jd.blockchain.tools.initializer.LedgerBindingConfig.BindingConfig; +import org.junit.Test; +import org.springframework.core.io.ClassPathResource; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import org.junit.Test; -import org.springframework.core.io.ClassPathResource; - -import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.tools.initializer.LedgerBindingConfig; -import com.jd.blockchain.tools.initializer.LedgerBindingConfig.BindingConfig; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; public class LedgerBindingConfigTest { @@ -36,9 +36,36 @@ public class LedgerBindingConfigTest { } finally { in.close(); } - } +// @Test +// public void testLedgerBindingRegister() throws IOException { +// LedgerManager ledgerManager = new LedgerManager(); +// ClassPathResource ledgerBindingConfigFile = new ClassPathResource("ledger-binding-1.conf"); +// InputStream in = ledgerBindingConfigFile.getInputStream(); +// Exception ex = null; +// try { +// LedgerBindingConfig conf = LedgerBindingConfig.resolve(in); +//// assertLedgerBindingConfig(conf); +// +// HashDigest[] existingLedgerHashs = ledgerManager.getLedgerHashs(); +// for (HashDigest lh : existingLedgerHashs) { +// ledgerManager.unregister(lh); +// } +// HashDigest[] ledgerHashs = conf.getLedgerHashs(); +// for (HashDigest ledgerHash : ledgerHashs) { +//// setConfig(conf,ledgerHash); +// LedgerBindingConfig.BindingConfig bindingConfig = conf.getLedger(ledgerHash); +// } +// } catch (Exception e) { +// ex =e; +// } finally { +// in.close(); +// } +// +// assertNull(ex); +// } + /** * 判断指定的对象跟测试模板是否一致; * diff --git a/source/tools/tools-keygen-booter/pom.xml b/source/tools/tools-keygen-booter/pom.xml index 1d49ecd2..d6d8c7ea 100644 --- a/source/tools/tools-keygen-booter/pom.xml +++ b/source/tools/tools-keygen-booter/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain tools - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT tools-keygen-booter diff --git a/source/tools/tools-keygen/pom.xml b/source/tools/tools-keygen/pom.xml index 11a158a7..2be928a4 100644 --- a/source/tools/tools-keygen/pom.xml +++ b/source/tools/tools-keygen/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain tools - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT tools-keygen diff --git a/source/utils/pom.xml b/source/utils/pom.xml index 82dfda83..a74e5bb8 100644 --- a/source/utils/pom.xml +++ b/source/utils/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain jdchain-root - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT utils pom diff --git a/source/utils/utils-common/pom.xml b/source/utils/utils-common/pom.xml index d7a6e83a..f9458f84 100644 --- a/source/utils/utils-common/pom.xml +++ b/source/utils/utils-common/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain utils - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT utils-common diff --git a/source/utils/utils-http/pom.xml b/source/utils/utils-http/pom.xml index e62e9564..4ebf530f 100644 --- a/source/utils/utils-http/pom.xml +++ b/source/utils/utils-http/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain utils - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT diff --git a/source/utils/utils-http/src/main/java/com/jd/blockchain/utils/http/agent/HttpClientPool.java b/source/utils/utils-http/src/main/java/com/jd/blockchain/utils/http/agent/HttpClientPool.java index 6fe29a5c..54f9842e 100644 --- a/source/utils/utils-http/src/main/java/com/jd/blockchain/utils/http/agent/HttpClientPool.java +++ b/source/utils/utils-http/src/main/java/com/jd/blockchain/utils/http/agent/HttpClientPool.java @@ -25,6 +25,7 @@ import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.LayeredConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; @@ -37,6 +38,7 @@ import java.io.IOException; import java.io.InterruptedIOException; import java.io.UnsupportedEncodingException; import java.net.UnknownHostException; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -267,4 +269,19 @@ public class HttpClientPool { EntityUtils.consume(entity); return result; } + + public static String jsonPost(String url, String json) throws IOException { + HttpPost httpPost = new HttpPost(url); + config(httpPost); + setJsonPostParams(httpPost, json); + try (CloseableHttpResponse response = httpPost(url, httpPost)) { + return parseResponse(response); + } + } + + private static void setJsonPostParams(HttpPost httpPost, String json) { + httpPost.addHeader("Content-type","application/json; charset=utf-8"); + httpPost.setHeader("Accept", "application/json"); + httpPost.setEntity(new StringEntity(json, Charset.forName("UTF-8"))); + } } \ No newline at end of file diff --git a/source/utils/utils-serialize/pom.xml b/source/utils/utils-serialize/pom.xml index c9a9f540..35769588 100644 --- a/source/utils/utils-serialize/pom.xml +++ b/source/utils/utils-serialize/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain utils - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT utils-serialize diff --git a/source/utils/utils-test/pom.xml b/source/utils/utils-test/pom.xml index a67261b8..ebeeab34 100644 --- a/source/utils/utils-test/pom.xml +++ b/source/utils/utils-test/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain utils - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT utils-test diff --git a/source/utils/utils-web-server/pom.xml b/source/utils/utils-web-server/pom.xml index c753c498..d654c613 100644 --- a/source/utils/utils-web-server/pom.xml +++ b/source/utils/utils-web-server/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain utils - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT utils-web-server diff --git a/source/utils/utils-web/pom.xml b/source/utils/utils-web/pom.xml index 2c041a46..055dcef4 100644 --- a/source/utils/utils-web/pom.xml +++ b/source/utils/utils-web/pom.xml @@ -4,7 +4,7 @@ com.jd.blockchain utils - 1.1.0-SNAPSHOT + 1.2.0-SNAPSHOT utils-web