Browse Source

Merge remote-tracking branch 'origin/develop' into feature/admin1-local

tags/1.1.0
shaozhuguang 5 years ago
parent
commit
5d272d3337
24 changed files with 382 additions and 67 deletions
  1. +1
    -1
      source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java
  2. +4
    -0
      source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/BinaryProtocol.java
  3. +1
    -1
      source/contract/contract-maven-plugin/ReadME.MD
  4. +0
    -1
      source/deployment/deployment-gateway/src/main/java/com/jd/blockchain/gateway/boot/GatewayBooter.java
  5. +105
    -0
      source/deployment/deployment-peer/src/main/resources/config/init/ledger.init
  6. +30
    -3
      source/gateway/src/main/java/com/jd/blockchain/gateway/GatewayServerBooter.java
  7. +2
    -2
      source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryService.java
  8. +27
    -29
      source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceHandler.java
  9. +9
    -4
      source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java
  10. +2
    -2
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/EmptyLedgerDataset.java
  11. +2
    -2
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataQuery.java
  12. +3
    -3
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataset.java
  13. +92
    -0
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminInfoData.java
  14. +11
    -0
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerInitializer.java
  15. +5
    -0
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerQuery.java
  16. +33
    -5
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerRepositoryImpl.java
  17. +16
    -2
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerAdminDatasetTest.java
  18. +12
    -6
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerAdminInfo.java
  19. +8
    -0
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerAdminSettings.java
  20. +2
    -1
      source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java
  21. +1
    -1
      source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/LedgerBaseSettings.java
  22. +13
    -1
      source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/HttpBlockchainQueryService.java
  23. +2
    -2
      source/test/test-ledger/src/test/java/test/com/jd/blockchain/test/ledger/RolesAuthorizationTest.java
  24. +1
    -1
      source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitCommand.java

+ 1
- 1
source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java View File

@@ -22,7 +22,7 @@ public interface DataCodes {


public static final int DATA_SNAPSHOT = 0x130; public static final int DATA_SNAPSHOT = 0x130;


// public static final int LEDGER_ADMIN_DATA = 0x131;
public static final int LEDGER_ADMIN_INFO = 0x131;


public static final int TX = 0x200; public static final int TX = 0x200;




+ 4
- 0
source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/BinaryProtocol.java View File

@@ -42,6 +42,10 @@ public class BinaryProtocol {
long version = HeaderEncoder.resolveVersion(bytes); long version = HeaderEncoder.resolveVersion(bytes);


DataContractEncoder encoder = DataContractContext.ENCODER_LOOKUP.lookup(code, version); DataContractEncoder encoder = DataContractContext.ENCODER_LOOKUP.lookup(code, version);
if (encoder == null) {
throw new DataContractException(
String.format("No data contract was registered with code[%s] and version[%s]!", code, version));
}
return encoder.decode(bytes.getInputStream()); return encoder.decode(bytes.getInputStream());
} }




+ 1
- 1
source/contract/contract-maven-plugin/ReadME.MD View File

@@ -35,7 +35,7 @@
+ 3)executions->execution->phase:建议使用package及其后续阶段(若不了解phase含义,请自行查阅相关信息); + 3)executions->execution->phase:建议使用package及其后续阶段(若不了解phase含义,请自行查阅相关信息);
+ 4)executions->execution->goals->goal:必须使用compile; + 4)executions->execution->goals->goal:必须使用compile;
+ 5)mainClass:必填,该类为需要发布的合约执行类(注意此处是类,不是接口),必须正确配置; + 5)mainClass:必填,该类为需要发布的合约执行类(注意此处是类,不是接口),必须正确配置;
+ 6)finalName:必填,最终在编译正常的情况下,会产生{finalName}-jdchain-contract.jar文件,只有该文件是可以发布到JDChain的合约包;
+ 6)finalName:必填,最终在编译正常的情况下,会产生{finalName}-JDChain-Contract.jar文件,只有该文件是可以发布到JDChain的合约包;




### 2、执行命令 ### 2、执行命令


+ 0
- 1
source/deployment/deployment-gateway/src/main/java/com/jd/blockchain/gateway/boot/GatewayBooter.java View File

@@ -18,7 +18,6 @@ public class GatewayBooter {
writePID(); writePID();
GatewayServerBooter.main(args); GatewayServerBooter.main(args);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
System.err.println("Error!!! --[" + e.getClass().getName() + "] " + e.getMessage()); System.err.println("Error!!! --[" + e.getClass().getName() + "] " + e.getMessage());
} }
} }


+ 105
- 0
source/deployment/deployment-peer/src/main/resources/config/init/ledger.init View File

@@ -7,6 +7,48 @@ ledger.name=
#声明的账本创建时间;格式为 “yyyy-MM-dd HH:mm:ss.SSSZ”,表示”年-月-日 时:分:秒:毫秒时区“;例如:“2019-08-01 14:26:58.069+0800”,其中,+0800 表示时区是东8区 #声明的账本创建时间;格式为 “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 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
#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


#-----------------------------------------------
#共识服务提供者;必须; #共识服务提供者;必须;
consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider


@@ -17,16 +59,36 @@ consensus.conf=bftsmart.config
crypto.service-providers=com.jd.blockchain.crypto.service.classic.ClassicCryptoService, \ crypto.service-providers=com.jd.blockchain.crypto.service.classic.ClassicCryptoService, \
com.jd.blockchain.crypto.service.sm.SMCryptoService com.jd.blockchain.crypto.service.sm.SMCryptoService


#从存储中加载账本数据时,是否校验哈希;可选;
crypto.verify-hash=true

#哈希算法;
crypto.hash-algorithm=SHA256



#参与方的个数,后续以 cons_parti.id 分别标识每一个参与方的配置; #参与方的个数,后续以 cons_parti.id 分别标识每一个参与方的配置;
cons_parti.count=4 cons_parti.count=4


#---------------------
#第0个参与方的名称; #第0个参与方的名称;
cons_parti.0.name= cons_parti.0.name=
#第0个参与方的公钥文件路径; #第0个参与方的公钥文件路径;
cons_parti.0.pubkey-path= cons_parti.0.pubkey-path=
#第0个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; #第0个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.0.pubkey= cons_parti.0.pubkey=

#第0个参与方的角色清单;可选项;
#cons_parti.0.roles=ADMIN, MANAGER
#第0个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项;
#cons_parti.0.roles-policy=UNION

#第0个参与方的共识服务的主机地址;
cons_parti.0.consensus.host=127.0.0.1
#第0个参与方的共识服务的端口;
cons_parti.0.consensus.port=8900
#第0个参与方的共识服务是否开启安全连接;
cons_parti.0.consensus.secure=true

#第0个参与方的账本初始服务的主机; #第0个参与方的账本初始服务的主机;
cons_parti.0.initializer.host=127.0.0.1 cons_parti.0.initializer.host=127.0.0.1
#第0个参与方的账本初始服务的端口; #第0个参与方的账本初始服务的端口;
@@ -34,12 +96,27 @@ cons_parti.0.initializer.port=8800
#第0个参与方的账本初始服务是否开启安全连接; #第0个参与方的账本初始服务是否开启安全连接;
cons_parti.0.initializer.secure=false cons_parti.0.initializer.secure=false



#---------------------
#第1个参与方的名称; #第1个参与方的名称;
cons_parti.1.name= cons_parti.1.name=
#第1个参与方的公钥文件路径; #第1个参与方的公钥文件路径;
cons_parti.1.pubkey-path= cons_parti.1.pubkey-path=
#第1个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; #第1个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.1.pubkey= cons_parti.1.pubkey=

#第1个参与方的角色清单;可选项;
#cons_parti.1.roles=MANAGER
#第1个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项;
#cons_parti.1.roles-policy=UNION

#第1个参与方的共识服务的主机地址;
cons_parti.1.consensus.host=127.0.0.1
#第1个参与方的共识服务的端口;
cons_parti.1.consensus.port=8910
#第1个参与方的共识服务是否开启安全连接;
cons_parti.1.consensus.secure=false

#第1个参与方的账本初始服务的主机; #第1个参与方的账本初始服务的主机;
cons_parti.1.initializer.host=127.0.0.1 cons_parti.1.initializer.host=127.0.0.1
#第1个参与方的账本初始服务的端口; #第1个参与方的账本初始服务的端口;
@@ -47,12 +124,26 @@ cons_parti.1.initializer.port=8810
#第1个参与方的账本初始服务是否开启安全连接; #第1个参与方的账本初始服务是否开启安全连接;
cons_parti.1.initializer.secure=false cons_parti.1.initializer.secure=false


#---------------------
#第2个参与方的名称; #第2个参与方的名称;
cons_parti.2.name= cons_parti.2.name=
#第2个参与方的公钥文件路径; #第2个参与方的公钥文件路径;
cons_parti.2.pubkey-path= cons_parti.2.pubkey-path=
#第2个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; #第2个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.2.pubkey= cons_parti.2.pubkey=

#第2个参与方的角色清单;可选项;
#cons_parti.2.roles=MANAGER
#第2个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项;
#cons_parti.2.roles-policy=UNION

#第2个参与方的共识服务的主机地址;
cons_parti.2.consensus.host=127.0.0.1
#第2个参与方的共识服务的端口;
cons_parti.2.consensus.port=8920
#第2个参与方的共识服务是否开启安全连接;
cons_parti.2.consensus.secure=false

#第2个参与方的账本初始服务的主机; #第2个参与方的账本初始服务的主机;
cons_parti.2.initializer.host=127.0.0.1 cons_parti.2.initializer.host=127.0.0.1
#第2个参与方的账本初始服务的端口; #第2个参与方的账本初始服务的端口;
@@ -60,12 +151,26 @@ cons_parti.2.initializer.port=8820
#第2个参与方的账本初始服务是否开启安全连接; #第2个参与方的账本初始服务是否开启安全连接;
cons_parti.2.initializer.secure=false cons_parti.2.initializer.secure=false


#---------------------
#第3个参与方的名称; #第3个参与方的名称;
cons_parti.3.name= cons_parti.3.name=
#第3个参与方的公钥文件路径; #第3个参与方的公钥文件路径;
cons_parti.3.pubkey-path= cons_parti.3.pubkey-path=
#第3个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; #第3个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.3.pubkey= cons_parti.3.pubkey=

#第3个参与方的角色清单;可选项;
#cons_parti.3.roles=GUEST
#第3个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项;
#cons_parti.3.roles-policy=INTERSECT

#第3个参与方的共识服务的主机地址;
cons_parti.3.consensus.host=127.0.0.1
#第3个参与方的共识服务的端口;
cons_parti.3.consensus.port=8930
#第3个参与方的共识服务是否开启安全连接;
cons_parti.3.consensus.secure=false

#第3个参与方的账本初始服务的主机; #第3个参与方的账本初始服务的主机;
cons_parti.3.initializer.host=127.0.0.1 cons_parti.3.initializer.host=127.0.0.1
#第3个参与方的账本初始服务的端口; #第3个参与方的账本初始服务的端口;


+ 30
- 3
source/gateway/src/main/java/com/jd/blockchain/gateway/GatewayServerBooter.java View File

@@ -2,6 +2,7 @@ package com.jd.blockchain.gateway;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -23,10 +24,14 @@ import com.jd.blockchain.utils.ConsoleUtils;
public class GatewayServerBooter { public class GatewayServerBooter {
private static final String DEFAULT_GATEWAY_PROPS = "application-gw.properties";
// 当前参与方在初始化配置中的参与方列表的编号; // 当前参与方在初始化配置中的参与方列表的编号;
private static final String HOST_ARG = "-c"; private static final String HOST_ARG = "-c";
//sp;针对spring.config.location这个参数进行包装; //sp;针对spring.config.location这个参数进行包装;
private static final String SPRING_CF_LOCATION = BaseConstant.SPRING_CF_LOCATION; private static final String SPRING_CF_LOCATION = BaseConstant.SPRING_CF_LOCATION;
// 是否输出调试信息; // 是否输出调试信息;
private static final String DEBUG_OPT = "-debug"; private static final String DEBUG_OPT = "-debug";
@@ -57,11 +62,20 @@ public class GatewayServerBooter {
}else { }else {
//if no the config file, then should tip as follows. but it's not a good feeling, so we create it by inputStream; //if no the config file, then should tip as follows. but it's not a good feeling, so we create it by inputStream;
ConsoleUtils.info("no param:-sp, format: -sp /x/xx.properties, use the default application-gw.properties "); ConsoleUtils.info("no param:-sp, format: -sp /x/xx.properties, use the default application-gw.properties ");
ClassPathResource configResource = new ClassPathResource("application-gw.properties");
ClassPathResource configResource = new ClassPathResource(DEFAULT_GATEWAY_PROPS);
InputStream in = configResource.getInputStream(); InputStream in = configResource.getInputStream();
File targetFile = new File(System.getProperty("user.dir")+File.separator+"conf"+File.separator+"application-gw.properties");
// 将文件写入至config目录下
String configPath = bootPath() + "config" + File.separator + DEFAULT_GATEWAY_PROPS;
File targetFile = new File(configPath);
// 先将原来文件删除再Copy
if (targetFile.exists()) {
FileUtils.forceDelete(targetFile);
}
FileUtils.copyInputStreamToFile(in, targetFile); FileUtils.copyInputStreamToFile(in, targetFile);
springConfigLocation = "file:"+targetFile.getAbsolutePath();
springConfigLocation = "file:" + targetFile.getAbsolutePath();
} }
// 启动服务器; // 启动服务器;
@@ -147,4 +161,17 @@ public class GatewayServerBooter {
return appCtx; return appCtx;
} }
private static String bootPath() throws Exception {
URL url = GatewayServerBooter.class.getProtectionDomain().getCodeSource().getLocation();
String currPath = java.net.URLDecoder.decode(url.getPath(), "UTF-8");
// 处理打包至SpringBoot问题
if (currPath.contains("!/")) {
currPath = currPath.substring(5, currPath.indexOf("!/"));
}
if (currPath.endsWith(".jar")) {
currPath = currPath.substring(0, currPath.lastIndexOf("/") + 1);
}
System.out.printf("Current Project Boot Path = %s \r\n", currPath);
return new File(currPath).getParent() + File.separator;
}
} }

+ 2
- 2
source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryService.java View File

@@ -3,7 +3,7 @@ package com.jd.blockchain.gateway.service;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.ParticipantNode; import com.jd.blockchain.ledger.ParticipantNode;
import com.jd.blockchain.sdk.ContractSettings; import com.jd.blockchain.sdk.ContractSettings;
import com.jd.blockchain.sdk.LedgerInitSettings;
import com.jd.blockchain.sdk.LedgerBaseSettings;


/** /**
* queryService only for gateway; * queryService only for gateway;
@@ -34,7 +34,7 @@ public interface GatewayQueryService {
* 账本Hash * 账本Hash
* @return * @return
*/ */
LedgerInitSettings getLedgerInitSettings(HashDigest ledgerHash);
LedgerBaseSettings getLedgerBaseSettings(HashDigest ledgerHash);


/** /**
* 获取账本指定合约信息 * 获取账本指定合约信息


+ 27
- 29
source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceHandler.java View File

@@ -10,7 +10,7 @@ import com.jd.blockchain.ledger.LedgerAdminInfo;
import com.jd.blockchain.ledger.LedgerMetadata; import com.jd.blockchain.ledger.LedgerMetadata;
import com.jd.blockchain.ledger.ParticipantNode; import com.jd.blockchain.ledger.ParticipantNode;
import com.jd.blockchain.sdk.ContractSettings; import com.jd.blockchain.sdk.ContractSettings;
import com.jd.blockchain.sdk.LedgerInitSettings;
import com.jd.blockchain.sdk.LedgerBaseSettings;
import com.jd.blockchain.utils.QueryUtil; import com.jd.blockchain.utils.QueryUtil;
import com.jd.blockchain.utils.codec.HexUtils; import com.jd.blockchain.utils.codec.HexUtils;
import com.jd.blockchain.utils.decompiler.utils.DecompilerUtils; import com.jd.blockchain.utils.decompiler.utils.DecompilerUtils;
@@ -31,30 +31,26 @@ public class GatewayQueryServiceHandler implements GatewayQueryService {


@Override @Override
public HashDigest[] getLedgersHash(int fromIndex, int count) { public HashDigest[] getLedgersHash(int fromIndex, int count) {
HashDigest ledgersHash[] = peerService.getQueryService().getLedgerHashs();
int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex,count,ledgersHash.length);
HashDigest ledgersHashNew[] = Arrays.copyOfRange(ledgersHash,indexAndCount[0],indexAndCount[0]+indexAndCount[1]);
return ledgersHashNew;
HashDigest[] ledgersHashs = peerService.getQueryService().getLedgerHashs();
int[] indexAndCount = QueryUtil.calFromIndexAndCount(fromIndex, count, ledgersHashs.length);
return Arrays.copyOfRange(ledgersHashs, indexAndCount[0], indexAndCount[0] + indexAndCount[1]);
} }


@Override @Override
public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash, int fromIndex, int count) { public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash, int fromIndex, int count) {
ParticipantNode participantNode[] = peerService.getQueryService().getConsensusParticipants(ledgerHash);
int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex,count,participantNode.length);
ParticipantNode participantNodesNew[] = Arrays.copyOfRange(participantNode,indexAndCount[0],indexAndCount[0]+indexAndCount[1]);
return participantNodesNew;
ParticipantNode[] participantNodes = peerService.getQueryService().getConsensusParticipants(ledgerHash);
int[] indexAndCount = QueryUtil.calFromIndexAndCount(fromIndex, count, participantNodes.length);
ParticipantNode[] participantNodesNews = Arrays.copyOfRange(participantNodes, indexAndCount[0],
indexAndCount[0] + indexAndCount[1]);
return participantNodesNews;
} }


@Override @Override
public LedgerInitSettings getLedgerInitSettings(HashDigest ledgerHash) {

ParticipantNode[] participantNodes = peerService.getQueryService().getConsensusParticipants(ledgerHash);

LedgerMetadata ledgerMetadata = peerService.getQueryService().getLedgerMetadata(ledgerHash);
public LedgerBaseSettings getLedgerBaseSettings(HashDigest ledgerHash) {


LedgerAdminInfo ledgerAdminInfo = peerService.getQueryService().getLedgerAdminInfo(ledgerHash); LedgerAdminInfo ledgerAdminInfo = peerService.getQueryService().getLedgerAdminInfo(ledgerHash);


return initLedgerInitSettings(participantNodes, ledgerMetadata, ledgerAdminInfo);
return initLedgerBaseSettings(ledgerAdminInfo);
} }


@Override @Override
@@ -73,36 +69,38 @@ public class GatewayQueryServiceHandler implements GatewayQueryService {
} }


/** /**
* 初始化账本配置
* 初始化账本的基本配置
*
* @param ledgerAdminInfo
* 账本信息
* *
* @param participantNodes
* 参与方列表
* @param ledgerMetadata
* 账本元数据
* @return * @return
*/ */
private LedgerInitSettings initLedgerInitSettings(ParticipantNode[] participantNodes, LedgerMetadata ledgerMetadata, LedgerAdminInfo ledgerAdminInfo) {
LedgerInitSettings ledgerInitSettings = new LedgerInitSettings();
private LedgerBaseSettings initLedgerBaseSettings(LedgerAdminInfo ledgerAdminInfo) {

LedgerMetadata ledgerMetadata = ledgerAdminInfo.getMetadata();

LedgerBaseSettings ledgerBaseSettings = new LedgerBaseSettings();


// 设置参与方 // 设置参与方
ledgerInitSettings.setParticipantNodes(participantNodes);
ledgerBaseSettings.setParticipantNodes(ledgerAdminInfo.getParticipants());


// 设置共识设置 // 设置共识设置
ledgerInitSettings.setConsensusSettings(initConsensusSettings(ledgerAdminInfo));
ledgerBaseSettings.setConsensusSettings(initConsensusSettings(ledgerAdminInfo));


// 设置参与方根Hash // 设置参与方根Hash
ledgerInitSettings.setParticipantsHash(ledgerMetadata.getParticipantsHash());
ledgerBaseSettings.setParticipantsHash(ledgerMetadata.getParticipantsHash());


// 设置算法配置 // 设置算法配置
ledgerInitSettings.setCryptoSetting(ledgerAdminInfo.getSettings().getCryptoSetting());
ledgerBaseSettings.setCryptoSetting(ledgerAdminInfo.getSettings().getCryptoSetting());


// 设置种子 // 设置种子
ledgerInitSettings.setSeed(initSeed(ledgerMetadata.getSeed()));
ledgerBaseSettings.setSeed(initSeed(ledgerMetadata.getSeed()));


// 设置共识协议 // 设置共识协议
ledgerInitSettings.setConsensusProtocol(ledgerAdminInfo.getSettings().getConsensusProvider());
ledgerBaseSettings.setConsensusProtocol(ledgerAdminInfo.getSettings().getConsensusProvider());


return ledgerInitSettings;
return ledgerBaseSettings;
} }


/** /**


+ 9
- 4
source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java View File

@@ -5,6 +5,8 @@ import java.util.List;


import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;


import com.jd.blockchain.gateway.service.GatewayQueryService;
import com.jd.blockchain.sdk.LedgerBaseSettings;
import com.jd.blockchain.utils.decompiler.utils.DecompilerUtils; import com.jd.blockchain.utils.decompiler.utils.DecompilerUtils;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -47,6 +49,9 @@ public class BlockBrowserController implements BlockchainExtendQueryService {
@Autowired @Autowired
private PeerService peerService; private PeerService peerService;


@Autowired
private GatewayQueryService gatewayQueryService;

@Autowired @Autowired
private DataRetrievalService dataRetrievalService; private DataRetrievalService dataRetrievalService;


@@ -86,10 +91,10 @@ public class BlockBrowserController implements BlockchainExtendQueryService {
return peerService.getQueryService().getLedgerMetadata(ledgerHash); return peerService.getQueryService().getLedgerMetadata(ledgerHash);
} }


// @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/settings")
// public LedgerInitSettings getLedgerInitSettings(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
// return gatewayQueryService.getLedgerInitSettings(ledgerHash);
// }
@RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/settings")
public LedgerBaseSettings getLedgerInitSettings(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
return gatewayQueryService.getLedgerBaseSettings(ledgerHash);
}


@RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks") @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks")
public LedgerBlock[] getBlocks(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) { public LedgerBlock[] getBlocks(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {


+ 2
- 2
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/EmptyLedgerDataset.java View File

@@ -2,7 +2,7 @@ package com.jd.blockchain.ledger.core;


import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.AccountHeader; import com.jd.blockchain.ledger.AccountHeader;
import com.jd.blockchain.ledger.LedgerAdminInfo;
import com.jd.blockchain.ledger.LedgerAdminSettings;
import com.jd.blockchain.ledger.MerkleProof; import com.jd.blockchain.ledger.MerkleProof;
import com.jd.blockchain.ledger.ParticipantDataQuery; import com.jd.blockchain.ledger.ParticipantDataQuery;
import com.jd.blockchain.ledger.ParticipantNode; import com.jd.blockchain.ledger.ParticipantNode;
@@ -45,7 +45,7 @@ public class EmptyLedgerDataset implements LedgerDataQuery {


@Override @Override
public LedgerAdminInfo getAdminInfo() {
public LedgerAdminSettings getAdminInfo() {
return null; return null;
} }




+ 2
- 2
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataQuery.java View File

@@ -1,11 +1,11 @@
package com.jd.blockchain.ledger.core; package com.jd.blockchain.ledger.core;


import com.jd.blockchain.ledger.LedgerAdminInfo;
import com.jd.blockchain.ledger.LedgerAdminSettings;
import com.jd.blockchain.ledger.ParticipantDataQuery; import com.jd.blockchain.ledger.ParticipantDataQuery;


public interface LedgerAdminDataQuery { public interface LedgerAdminDataQuery {
LedgerAdminInfo getAdminInfo();
LedgerAdminSettings getAdminInfo();


ParticipantDataQuery getParticipantDataset(); ParticipantDataQuery getParticipantDataset();



+ 3
- 3
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataset.java View File

@@ -8,7 +8,7 @@ import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.Crypto; import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.HashFunction; import com.jd.blockchain.crypto.HashFunction;
import com.jd.blockchain.ledger.LedgerAdminInfo;
import com.jd.blockchain.ledger.LedgerAdminSettings;
import com.jd.blockchain.ledger.LedgerException; import com.jd.blockchain.ledger.LedgerException;
import com.jd.blockchain.ledger.LedgerInitSetting; import com.jd.blockchain.ledger.LedgerInitSetting;
import com.jd.blockchain.ledger.LedgerMetadata; import com.jd.blockchain.ledger.LedgerMetadata;
@@ -23,7 +23,7 @@ import com.jd.blockchain.storage.service.VersioningKVStorage;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.Transactional; import com.jd.blockchain.utils.Transactional;
public class LedgerAdminDataset implements Transactional, LedgerAdminDataQuery, LedgerAdminInfo {
public class LedgerAdminDataset implements Transactional, LedgerAdminDataQuery, LedgerAdminSettings {
static { static {
DataContractRegistry.register(LedgerMetadata.class); DataContractRegistry.register(LedgerMetadata.class);
@@ -110,7 +110,7 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminDataQuery,
} }
@Override @Override
public LedgerAdminInfo getAdminInfo() {
public LedgerAdminSettings getAdminInfo() {
return this; return this;
} }


+ 92
- 0
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminInfoData.java View File

@@ -0,0 +1,92 @@
package com.jd.blockchain.ledger.core;

import com.jd.blockchain.ledger.*;

/**
* @author shaozhuguang
* @date 2019-09-16
*
* LedgerAdminInfo的独立实现类,主要用于页面展示,区分 {@link LedgerAdminDataset}
*/
public class LedgerAdminInfoData implements LedgerAdminInfo {

/**
* 元数据
*/
private LedgerMetadata_V2 metadata;

/**
* 账本配置
*
*/
private LedgerSettings ledgerSettings;

/**
* 参与方数量
*
*/
private long participantCount;

/**
* 参与方
*
*/
private ParticipantNode[] participantNodes;

/**
* 包装构造方法
*
* @param ledgerAdminInfo
*/
public LedgerAdminInfoData(LedgerAdminInfo ledgerAdminInfo) {
this(ledgerAdminInfo.getMetadata(), ledgerAdminInfo.getSettings(),
ledgerAdminInfo.getParticipantCount(), ledgerAdminInfo.getParticipants());
}

public LedgerAdminInfoData(LedgerMetadata_V2 metadata, LedgerSettings ledgerSettings, long participantCount, ParticipantNode[] participantNodes) {
this.metadata = metadata;
this.ledgerSettings = ledgerSettings;
this.participantCount = participantCount;
this.participantNodes = participantNodes;
}

/**
* 返回元数据配置信息
*
* @return
*/
@Override
public LedgerMetadata_V2 getMetadata() {
return this.metadata;
}

/**
* 返回当前设置的账本配置;
*
* @return
*/
@Override
public LedgerSettings getSettings() {
return this.ledgerSettings;
}

/**
* 返回当前参与方的数量
*
* @return
*/
@Override
public long getParticipantCount() {
return this.participantCount;
}

/**
* 返回当前参与方列表
*
* @return
*/
@Override
public ParticipantNode[] getParticipants() {
return this.participantNodes;
}
}

+ 11
- 0
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerInitializer.java View File

@@ -8,6 +8,7 @@ import com.jd.blockchain.ledger.BlockchainIdentityData;
import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.DigitalSignature; import com.jd.blockchain.ledger.DigitalSignature;
import com.jd.blockchain.ledger.LedgerAdminInfo; import com.jd.blockchain.ledger.LedgerAdminInfo;
import com.jd.blockchain.ledger.LedgerAdminSettings;
import com.jd.blockchain.ledger.LedgerBlock; import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerInitException; import com.jd.blockchain.ledger.LedgerInitException;
import com.jd.blockchain.ledger.LedgerInitOperation; import com.jd.blockchain.ledger.LedgerInitOperation;
@@ -254,6 +255,16 @@ public class LedgerInitializer {
public LedgerAdminInfo getAdminInfo(LedgerBlock block) { public LedgerAdminInfo getAdminInfo(LedgerBlock block) {
return null; return null;
} }
@Override
public LedgerAdminSettings getAdminSettings() {
return null;
}
@Override
public LedgerAdminSettings getAdminSettings(LedgerBlock block) {
return null;
}


@Override @Override
public LedgerBlock getBlock(HashDigest hash) { public LedgerBlock getBlock(HashDigest hash) {


+ 5
- 0
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerQuery.java View File

@@ -2,6 +2,7 @@ package com.jd.blockchain.ledger.core;


import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.LedgerAdminInfo; import com.jd.blockchain.ledger.LedgerAdminInfo;
import com.jd.blockchain.ledger.LedgerAdminSettings;
import com.jd.blockchain.ledger.LedgerBlock; import com.jd.blockchain.ledger.LedgerBlock;


public interface LedgerQuery { public interface LedgerQuery {
@@ -53,6 +54,10 @@ public interface LedgerQuery {
LedgerAdminInfo getAdminInfo(); LedgerAdminInfo getAdminInfo();


LedgerAdminInfo getAdminInfo(LedgerBlock block); LedgerAdminInfo getAdminInfo(LedgerBlock block);
LedgerAdminSettings getAdminSettings();
LedgerAdminSettings getAdminSettings(LedgerBlock block);


LedgerBlock getBlock(HashDigest hash); LedgerBlock getBlock(HashDigest hash);




+ 33
- 5
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerRepositoryImpl.java View File

@@ -7,6 +7,7 @@ import com.jd.blockchain.crypto.HashFunction;
import com.jd.blockchain.ledger.BlockBody; import com.jd.blockchain.ledger.BlockBody;
import com.jd.blockchain.ledger.CryptoSetting; import com.jd.blockchain.ledger.CryptoSetting;
import com.jd.blockchain.ledger.LedgerAdminInfo; import com.jd.blockchain.ledger.LedgerAdminInfo;
import com.jd.blockchain.ledger.LedgerAdminSettings;
import com.jd.blockchain.ledger.LedgerBlock; import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerDataSnapshot; import com.jd.blockchain.ledger.LedgerDataSnapshot;
import com.jd.blockchain.ledger.LedgerInitSetting; import com.jd.blockchain.ledger.LedgerInitSetting;
@@ -244,7 +245,7 @@ class LedgerRepositoryImpl implements LedgerRepository {


@Override @Override
public LedgerAdminInfo getAdminInfo() { public LedgerAdminInfo getAdminInfo() {
return getAdminInfo(getLatestBlock());
return createAdminData(getLatestBlock());
} }


private LedgerBlock deserialize(byte[] blockBytes) { private LedgerBlock deserialize(byte[] blockBytes) {
@@ -265,7 +266,17 @@ class LedgerRepositoryImpl implements LedgerRepository {
} }


@Override @Override
public LedgerAdminDataset getAdminInfo(LedgerBlock block) {
public LedgerAdminInfo getAdminInfo(LedgerBlock block) {
return createAdminData(block);
}
@Override
public LedgerAdminSettings getAdminSettings() {
return getAdminSettings(getLatestBlock());
}
@Override
public LedgerAdminSettings getAdminSettings(LedgerBlock block) {
long height = getLatestBlockHeight(); long height = getLatestBlockHeight();
if (height == block.getHeight()) { if (height == block.getHeight()) {
return latestState.getAdminDataset(); return latestState.getAdminDataset();
@@ -274,6 +285,23 @@ class LedgerRepositoryImpl implements LedgerRepository {
return createAdminDataset(block); return createAdminDataset(block);
} }


/**
* 生成LedgerAdminInfoData对象
* 该对象主要用于页面展示
*
* @param block
* @return
*/
private LedgerAdminInfoData createAdminData(LedgerBlock block) {
return new LedgerAdminInfoData(createAdminDataset(block));
}

/**
* 生成LedgerAdminDataset对象
*
* @param block
* @return
*/
private LedgerAdminDataset createAdminDataset(LedgerBlock block) { private LedgerAdminDataset createAdminDataset(LedgerBlock block) {
return new LedgerAdminDataset(block.getAdminAccountHash(), keyPrefix, exPolicyStorage, versioningStorage, true); return new LedgerAdminDataset(block.getAdminAccountHash(), keyPrefix, exPolicyStorage, versioningStorage, true);
} }
@@ -284,7 +312,7 @@ class LedgerRepositoryImpl implements LedgerRepository {
if (height == block.getHeight()) { if (height == block.getHeight()) {
return latestState.getUserAccountSet(); return latestState.getUserAccountSet();
} }
LedgerAdminDataset adminAccount = getAdminInfo(block);
LedgerAdminSettings adminAccount = getAdminSettings(block);
return createUserAccountSet(block, adminAccount.getSettings().getCryptoSetting()); return createUserAccountSet(block, adminAccount.getSettings().getCryptoSetting());
} }


@@ -300,7 +328,7 @@ class LedgerRepositoryImpl implements LedgerRepository {
return latestState.getDataAccountSet(); return latestState.getDataAccountSet();
} }


LedgerAdminDataset adminAccount = getAdminInfo(block);
LedgerAdminSettings adminAccount = getAdminSettings(block);
return createDataAccountSet(block, adminAccount.getSettings().getCryptoSetting()); return createDataAccountSet(block, adminAccount.getSettings().getCryptoSetting());
} }


@@ -316,7 +344,7 @@ class LedgerRepositoryImpl implements LedgerRepository {
return latestState.getContractAccountSet(); return latestState.getContractAccountSet();
} }


LedgerAdminDataset adminAccount = getAdminInfo(block);
LedgerAdminSettings adminAccount = getAdminSettings(block);
return createContractAccountSet(block, adminAccount.getSettings().getCryptoSetting()); return createContractAccountSet(block, adminAccount.getSettings().getCryptoSetting());
} }




+ 16
- 2
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerAdminDatasetTest.java View File

@@ -10,7 +10,6 @@ import static org.junit.Assert.assertTrue;
import java.util.Arrays; import java.util.Arrays;
import java.util.Random; import java.util.Random;


import com.jd.blockchain.ledger.*;
import org.junit.Test; import org.junit.Test;


import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.AddressEncoding;
@@ -20,6 +19,21 @@ import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService; import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService; import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.LedgerAdminInfo;
import com.jd.blockchain.ledger.LedgerAdminSettings;
import com.jd.blockchain.ledger.LedgerMetadata_V2;
import com.jd.blockchain.ledger.LedgerPermission;
import com.jd.blockchain.ledger.LedgerSettings;
import com.jd.blockchain.ledger.ParticipantNode;
import com.jd.blockchain.ledger.ParticipantNodeState;
import com.jd.blockchain.ledger.RolePrivilegeSettings;
import com.jd.blockchain.ledger.RolePrivileges;
import com.jd.blockchain.ledger.RolesPolicy;
import com.jd.blockchain.ledger.TransactionPermission;
import com.jd.blockchain.ledger.UserRoles;
import com.jd.blockchain.ledger.UserRolesSettings;
import com.jd.blockchain.ledger.core.CryptoConfig; import com.jd.blockchain.ledger.core.CryptoConfig;
import com.jd.blockchain.ledger.core.LedgerAdminDataset; import com.jd.blockchain.ledger.core.LedgerAdminDataset;
import com.jd.blockchain.ledger.core.LedgerConfiguration; import com.jd.blockchain.ledger.core.LedgerConfiguration;
@@ -213,7 +227,7 @@ public class LedgerAdminDatasetTest {
actualLedgerSettings.getCryptoSetting().getHashAlgorithm()); actualLedgerSettings.getCryptoSetting().getHashAlgorithm());
} }


private void verifyRealoadingRoleAuthorizations(LedgerAdminInfo actualAccount,
private void verifyRealoadingRoleAuthorizations(LedgerAdminSettings actualAccount,
RolePrivilegeSettings expRolePrivilegeSettings, UserRolesSettings expUserRoleSettings) { RolePrivilegeSettings expRolePrivilegeSettings, UserRolesSettings expUserRoleSettings) {
// 验证基本信息; // 验证基本信息;
RolePrivilegeSettings actualRolePrivileges = actualAccount.getRolePrivileges(); RolePrivilegeSettings actualRolePrivileges = actualAccount.getRolePrivileges();


+ 12
- 6
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerAdminInfo.java View File

@@ -1,17 +1,23 @@
package com.jd.blockchain.ledger; package com.jd.blockchain.ledger;


import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes;

@DataContract(code=DataCodes.LEDGER_ADMIN_INFO)
public interface LedgerAdminInfo { public interface LedgerAdminInfo {


@DataField(order=1, refContract = true)
LedgerMetadata_V2 getMetadata(); LedgerMetadata_V2 getMetadata();


@DataField(order=2, refContract = true)
LedgerSettings getSettings(); LedgerSettings getSettings();


long getParticipantCount();

@DataField(order=3, refContract = true, list = true)
ParticipantNode[] getParticipants(); ParticipantNode[] getParticipants();

UserRolesSettings getUserRoles();

RolePrivilegeSettings getRolePrivileges();
@DataField(order=4, primitiveType = PrimitiveType.INT64)
long getParticipantCount();


} }

+ 8
- 0
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerAdminSettings.java View File

@@ -0,0 +1,8 @@
package com.jd.blockchain.ledger;

public interface LedgerAdminSettings extends LedgerAdminInfo {

UserRolesSettings getUserRoles();

RolePrivilegeSettings getRolePrivileges();
}

+ 2
- 1
source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java View File

@@ -111,7 +111,8 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag
DataContractRegistry.register(BftsmartConsensusSettings.class); DataContractRegistry.register(BftsmartConsensusSettings.class);
DataContractRegistry.register(BftsmartNodeSettings.class); DataContractRegistry.register(BftsmartNodeSettings.class);
// DataContractRegistry.register(LedgerAdminDataQuery.class);
DataContractRegistry.register(LedgerAdminInfo.class);
DataContractRegistry.register(LedgerSettings.class);
} }


source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/LedgerInitSettings.java → source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/LedgerBaseSettings.java View File

@@ -14,7 +14,7 @@ import com.jd.blockchain.ledger.ParticipantNode;
* @since 1.0.0 * @since 1.0.0
* *
*/ */
public class LedgerInitSettings {
public class LedgerBaseSettings {


/** /**
* 账本初始化种子 * 账本初始化种子

+ 13
- 1
source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/HttpBlockchainQueryService.java View File

@@ -8,6 +8,8 @@ import com.jd.blockchain.transaction.BlockchainQueryService;
import com.jd.blockchain.utils.http.*; import com.jd.blockchain.utils.http.*;
import com.jd.blockchain.utils.web.client.WebResponseConverterFactory; import com.jd.blockchain.utils.web.client.WebResponseConverterFactory;
import com.jd.blockchain.sdk.converters.HashDigestToStringConverter; import com.jd.blockchain.sdk.converters.HashDigestToStringConverter;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;


/** /**
* 作为内部使用的适配接口,用于声明 HTTP 协议的服务请求; * 作为内部使用的适配接口,用于声明 HTTP 协议的服务请求;
@@ -194,6 +196,17 @@ public interface HttpBlockchainQueryService extends BlockchainExtendQueryService
@Override @Override
long getAdditionalContractCount(@PathParam(name="ledgerHash", converter=HashDigestToStringConverter.class) HashDigest ledgerHash); long getAdditionalContractCount(@PathParam(name="ledgerHash", converter=HashDigestToStringConverter.class) HashDigest ledgerHash);



/**
* 获取账本信息;
*
* @param ledgerHash
* @return 账本对象;如果不存在,则返回 null;
*/
@HttpAction(method=HttpMethod.GET, path="ledgers/{ledgerHash}/admininfo")
@Override
LedgerAdminInfo getLedgerAdminInfo(@PathParam(name="ledgerHash", converter=HashDigestToStringConverter.class) HashDigest ledgerHash);

/** /**
* 返回指定账本的参与列表 * 返回指定账本的参与列表
* *
@@ -204,7 +217,6 @@ public interface HttpBlockchainQueryService extends BlockchainExtendQueryService
@Override @Override
ParticipantNode[] getConsensusParticipants(@PathParam(name="ledgerHash", converter=HashDigestToStringConverter.class) HashDigest ledgerHash); ParticipantNode[] getConsensusParticipants(@PathParam(name="ledgerHash", converter=HashDigestToStringConverter.class) HashDigest ledgerHash);



/** /**
* 返回指定账本的元数据 * 返回指定账本的元数据
* *


+ 2
- 2
source/test/test-ledger/src/test/java/test/com/jd/blockchain/test/ledger/RolesAuthorizationTest.java View File

@@ -192,7 +192,7 @@ public class RolesAuthorizationTest {
if (roles == null) { if (roles == null) {
roles = new String[0]; roles = new String[0];
} }
UserRoles userRoles = ledger.getAdminInfo().getUserRoles().getUserRoles(address);
UserRoles userRoles = ledger.getAdminSettings().getUserRoles().getUserRoles(address);
assertNotNull(userRoles); assertNotNull(userRoles);
assertEquals(policy, userRoles.getPolicy()); assertEquals(policy, userRoles.getPolicy());


@@ -206,7 +206,7 @@ public class RolesAuthorizationTest {


private void assertRolePermissions(LedgerQuery ledger, String roleName, LedgerPermission[] ledgerPermissions, private void assertRolePermissions(LedgerQuery ledger, String roleName, LedgerPermission[] ledgerPermissions,
TransactionPermission[] txPermissions) { TransactionPermission[] txPermissions) {
RolePrivilegeSettings roles = ledger.getAdminInfo().getRolePrivileges();
RolePrivilegeSettings roles = ledger.getAdminSettings().getRolePrivileges();
assertTrue(roles.contains(roleName)); assertTrue(roles.contains(roleName));
RolePrivileges privileges = roles.getRolePrivilege(roleName); RolePrivileges privileges = roles.getRolePrivilege(roleName);
assertEquals(ledgerPermissions.length, privileges.getLedgerPrivilege().getPermissionCount()); assertEquals(ledgerPermissions.length, privileges.getLedgerPrivilege().getPermissionCount());


+ 1
- 1
source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitCommand.java View File

@@ -103,7 +103,7 @@ public class LedgerInitCommand {
// partiAddress = partiConf.getAddress(); // partiAddress = partiConf.getAddress();
// } // }
// } // }
if (localNodeAddress.equals(partiConf.getAddress())) {
if (localNodeAddress.equals(partiConf.getAddress().toBase58())) {
currId = i; currId = i;
} }
} }


Loading…
Cancel
Save