@@ -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; | ||||
@@ -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()); | ||||
} | } | ||||
@@ -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、执行命令 | ||||
@@ -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()); | ||||
} | } | ||||
} | } | ||||
@@ -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个参与方的账本初始服务的端口; | ||||
@@ -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; | |||||
} | |||||
} | } |
@@ -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); | |||||
/** | /** | ||||
* 获取账本指定合约信息 | * 获取账本指定合约信息 | ||||
@@ -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; | |||||
} | } | ||||
/** | /** | ||||
@@ -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,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; | ||||
} | } | ||||
@@ -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(); | ||||
@@ -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; | ||||
} | } | ||||
@@ -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; | |||||
} | |||||
} |
@@ -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) { | ||||
@@ -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); | ||||
@@ -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()); | ||||
} | } | ||||
@@ -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(); | ||||
@@ -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(); | |||||
} | } |
@@ -0,0 +1,8 @@ | |||||
package com.jd.blockchain.ledger; | |||||
public interface LedgerAdminSettings extends LedgerAdminInfo { | |||||
UserRolesSettings getUserRoles(); | |||||
RolePrivilegeSettings getRolePrivileges(); | |||||
} |
@@ -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); | |||||
} | } | ||||
@@ -14,7 +14,7 @@ import com.jd.blockchain.ledger.ParticipantNode; | |||||
* @since 1.0.0 | * @since 1.0.0 | ||||
* | * | ||||
*/ | */ | ||||
public class LedgerInitSettings { | |||||
public class LedgerBaseSettings { | |||||
/** | /** | ||||
* 账本初始化种子 | * 账本初始化种子 |
@@ -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); | ||||
/** | /** | ||||
* 返回指定账本的元数据 | * 返回指定账本的元数据 | ||||
* | * | ||||
@@ -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()); | ||||
@@ -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; | ||||
} | } | ||||
} | } | ||||