@@ -22,7 +22,7 @@ public interface DataCodes { | |||
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; | |||
@@ -42,6 +42,10 @@ public class BinaryProtocol { | |||
long version = HeaderEncoder.resolveVersion(bytes); | |||
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()); | |||
} | |||
@@ -35,7 +35,7 @@ | |||
+ 3)executions->execution->phase:建议使用package及其后续阶段(若不了解phase含义,请自行查阅相关信息); | |||
+ 4)executions->execution->goals->goal:必须使用compile; | |||
+ 5)mainClass:必填,该类为需要发布的合约执行类(注意此处是类,不是接口),必须正确配置; | |||
+ 6)finalName:必填,最终在编译正常的情况下,会产生{finalName}-jdchain-contract.jar文件,只有该文件是可以发布到JDChain的合约包; | |||
+ 6)finalName:必填,最终在编译正常的情况下,会产生{finalName}-JDChain-Contract.jar文件,只有该文件是可以发布到JDChain的合约包; | |||
### 2、执行命令 | |||
@@ -18,7 +18,6 @@ public class GatewayBooter { | |||
writePID(); | |||
GatewayServerBooter.main(args); | |||
} catch (Exception e) { | |||
e.printStackTrace(); | |||
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区 | |||
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 | |||
@@ -17,16 +59,36 @@ consensus.conf=bftsmart.config | |||
crypto.service-providers=com.jd.blockchain.crypto.service.classic.ClassicCryptoService, \ | |||
com.jd.blockchain.crypto.service.sm.SMCryptoService | |||
#从存储中加载账本数据时,是否校验哈希;可选; | |||
crypto.verify-hash=true | |||
#哈希算法; | |||
crypto.hash-algorithm=SHA256 | |||
#参与方的个数,后续以 cons_parti.id 分别标识每一个参与方的配置; | |||
cons_parti.count=4 | |||
#--------------------- | |||
#第0个参与方的名称; | |||
cons_parti.0.name= | |||
#第0个参与方的公钥文件路径; | |||
cons_parti.0.pubkey-path= | |||
#第0个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; | |||
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个参与方的账本初始服务的主机; | |||
cons_parti.0.initializer.host=127.0.0.1 | |||
#第0个参与方的账本初始服务的端口; | |||
@@ -34,12 +96,27 @@ cons_parti.0.initializer.port=8800 | |||
#第0个参与方的账本初始服务是否开启安全连接; | |||
cons_parti.0.initializer.secure=false | |||
#--------------------- | |||
#第1个参与方的名称; | |||
cons_parti.1.name= | |||
#第1个参与方的公钥文件路径; | |||
cons_parti.1.pubkey-path= | |||
#第1个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; | |||
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个参与方的账本初始服务的主机; | |||
cons_parti.1.initializer.host=127.0.0.1 | |||
#第1个参与方的账本初始服务的端口; | |||
@@ -47,12 +124,26 @@ cons_parti.1.initializer.port=8810 | |||
#第1个参与方的账本初始服务是否开启安全连接; | |||
cons_parti.1.initializer.secure=false | |||
#--------------------- | |||
#第2个参与方的名称; | |||
cons_parti.2.name= | |||
#第2个参与方的公钥文件路径; | |||
cons_parti.2.pubkey-path= | |||
#第2个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; | |||
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个参与方的账本初始服务的主机; | |||
cons_parti.2.initializer.host=127.0.0.1 | |||
#第2个参与方的账本初始服务的端口; | |||
@@ -60,12 +151,26 @@ cons_parti.2.initializer.port=8820 | |||
#第2个参与方的账本初始服务是否开启安全连接; | |||
cons_parti.2.initializer.secure=false | |||
#--------------------- | |||
#第3个参与方的名称; | |||
cons_parti.3.name= | |||
#第3个参与方的公钥文件路径; | |||
cons_parti.3.pubkey-path= | |||
#第3个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; | |||
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个参与方的账本初始服务的主机; | |||
cons_parti.3.initializer.host=127.0.0.1 | |||
#第3个参与方的账本初始服务的端口; | |||
@@ -2,6 +2,7 @@ package com.jd.blockchain.gateway; | |||
import java.io.File; | |||
import java.io.InputStream; | |||
import java.net.URL; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
@@ -23,10 +24,14 @@ import com.jd.blockchain.utils.ConsoleUtils; | |||
public class GatewayServerBooter { | |||
private static final String DEFAULT_GATEWAY_PROPS = "application-gw.properties"; | |||
// 当前参与方在初始化配置中的参与方列表的编号; | |||
private static final String HOST_ARG = "-c"; | |||
//sp;针对spring.config.location这个参数进行包装; | |||
private static final String SPRING_CF_LOCATION = BaseConstant.SPRING_CF_LOCATION; | |||
// 是否输出调试信息; | |||
private static final String DEBUG_OPT = "-debug"; | |||
@@ -57,11 +62,20 @@ public class GatewayServerBooter { | |||
}else { | |||
//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 "); | |||
ClassPathResource configResource = new ClassPathResource("application-gw.properties"); | |||
ClassPathResource configResource = new ClassPathResource(DEFAULT_GATEWAY_PROPS); | |||
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); | |||
springConfigLocation = "file:"+targetFile.getAbsolutePath(); | |||
springConfigLocation = "file:" + targetFile.getAbsolutePath(); | |||
} | |||
// 启动服务器; | |||
@@ -147,4 +161,17 @@ public class GatewayServerBooter { | |||
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.ledger.ParticipantNode; | |||
import com.jd.blockchain.sdk.ContractSettings; | |||
import com.jd.blockchain.sdk.LedgerInitSettings; | |||
import com.jd.blockchain.sdk.LedgerBaseSettings; | |||
/** | |||
* queryService only for gateway; | |||
@@ -34,7 +34,7 @@ public interface GatewayQueryService { | |||
* 账本Hash | |||
* @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.ParticipantNode; | |||
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.codec.HexUtils; | |||
import com.jd.blockchain.utils.decompiler.utils.DecompilerUtils; | |||
@@ -31,30 +31,26 @@ public class GatewayQueryServiceHandler implements GatewayQueryService { | |||
@Override | |||
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 | |||
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 | |||
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); | |||
return initLedgerInitSettings(participantNodes, ledgerMetadata, ledgerAdminInfo); | |||
return initLedgerBaseSettings(ledgerAdminInfo); | |||
} | |||
@Override | |||
@@ -73,36 +69,38 @@ public class GatewayQueryServiceHandler implements GatewayQueryService { | |||
} | |||
/** | |||
* 初始化账本配置 | |||
* 初始化账本的基本配置 | |||
* | |||
* @param ledgerAdminInfo | |||
* 账本信息 | |||
* | |||
* @param participantNodes | |||
* 参与方列表 | |||
* @param ledgerMetadata | |||
* 账本元数据 | |||
* @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 | |||
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 com.jd.blockchain.gateway.service.GatewayQueryService; | |||
import com.jd.blockchain.sdk.LedgerBaseSettings; | |||
import com.jd.blockchain.utils.decompiler.utils.DecompilerUtils; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
@@ -47,6 +49,9 @@ public class BlockBrowserController implements BlockchainExtendQueryService { | |||
@Autowired | |||
private PeerService peerService; | |||
@Autowired | |||
private GatewayQueryService gatewayQueryService; | |||
@Autowired | |||
private DataRetrievalService dataRetrievalService; | |||
@@ -86,10 +91,10 @@ public class BlockBrowserController implements BlockchainExtendQueryService { | |||
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") | |||
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.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.ParticipantDataQuery; | |||
import com.jd.blockchain.ledger.ParticipantNode; | |||
@@ -45,7 +45,7 @@ public class EmptyLedgerDataset implements LedgerDataQuery { | |||
@Override | |||
public LedgerAdminInfo getAdminInfo() { | |||
public LedgerAdminSettings getAdminInfo() { | |||
return null; | |||
} | |||
@@ -1,11 +1,11 @@ | |||
package com.jd.blockchain.ledger.core; | |||
import com.jd.blockchain.ledger.LedgerAdminInfo; | |||
import com.jd.blockchain.ledger.LedgerAdminSettings; | |||
import com.jd.blockchain.ledger.ParticipantDataQuery; | |||
public interface LedgerAdminDataQuery { | |||
LedgerAdminInfo getAdminInfo(); | |||
LedgerAdminSettings getAdminInfo(); | |||
ParticipantDataQuery getParticipantDataset(); | |||
@@ -8,7 +8,7 @@ import com.jd.blockchain.binaryproto.DataContractRegistry; | |||
import com.jd.blockchain.crypto.Crypto; | |||
import com.jd.blockchain.crypto.HashDigest; | |||
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.LedgerInitSetting; | |||
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.Transactional; | |||
public class LedgerAdminDataset implements Transactional, LedgerAdminDataQuery, LedgerAdminInfo { | |||
public class LedgerAdminDataset implements Transactional, LedgerAdminDataQuery, LedgerAdminSettings { | |||
static { | |||
DataContractRegistry.register(LedgerMetadata.class); | |||
@@ -110,7 +110,7 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminDataQuery, | |||
} | |||
@Override | |||
public LedgerAdminInfo getAdminInfo() { | |||
public LedgerAdminSettings getAdminInfo() { | |||
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.DigitalSignature; | |||
import com.jd.blockchain.ledger.LedgerAdminInfo; | |||
import com.jd.blockchain.ledger.LedgerAdminSettings; | |||
import com.jd.blockchain.ledger.LedgerBlock; | |||
import com.jd.blockchain.ledger.LedgerInitException; | |||
import com.jd.blockchain.ledger.LedgerInitOperation; | |||
@@ -254,6 +255,16 @@ public class LedgerInitializer { | |||
public LedgerAdminInfo getAdminInfo(LedgerBlock block) { | |||
return null; | |||
} | |||
@Override | |||
public LedgerAdminSettings getAdminSettings() { | |||
return null; | |||
} | |||
@Override | |||
public LedgerAdminSettings getAdminSettings(LedgerBlock block) { | |||
return null; | |||
} | |||
@Override | |||
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.ledger.LedgerAdminInfo; | |||
import com.jd.blockchain.ledger.LedgerAdminSettings; | |||
import com.jd.blockchain.ledger.LedgerBlock; | |||
public interface LedgerQuery { | |||
@@ -53,6 +54,10 @@ public interface LedgerQuery { | |||
LedgerAdminInfo getAdminInfo(); | |||
LedgerAdminInfo getAdminInfo(LedgerBlock block); | |||
LedgerAdminSettings getAdminSettings(); | |||
LedgerAdminSettings getAdminSettings(LedgerBlock block); | |||
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.CryptoSetting; | |||
import com.jd.blockchain.ledger.LedgerAdminInfo; | |||
import com.jd.blockchain.ledger.LedgerAdminSettings; | |||
import com.jd.blockchain.ledger.LedgerBlock; | |||
import com.jd.blockchain.ledger.LedgerDataSnapshot; | |||
import com.jd.blockchain.ledger.LedgerInitSetting; | |||
@@ -244,7 +245,7 @@ class LedgerRepositoryImpl implements LedgerRepository { | |||
@Override | |||
public LedgerAdminInfo getAdminInfo() { | |||
return getAdminInfo(getLatestBlock()); | |||
return createAdminData(getLatestBlock()); | |||
} | |||
private LedgerBlock deserialize(byte[] blockBytes) { | |||
@@ -265,7 +266,17 @@ class LedgerRepositoryImpl implements LedgerRepository { | |||
} | |||
@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(); | |||
if (height == block.getHeight()) { | |||
return latestState.getAdminDataset(); | |||
@@ -274,6 +285,23 @@ class LedgerRepositoryImpl implements LedgerRepository { | |||
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) { | |||
return new LedgerAdminDataset(block.getAdminAccountHash(), keyPrefix, exPolicyStorage, versioningStorage, true); | |||
} | |||
@@ -284,7 +312,7 @@ class LedgerRepositoryImpl implements LedgerRepository { | |||
if (height == block.getHeight()) { | |||
return latestState.getUserAccountSet(); | |||
} | |||
LedgerAdminDataset adminAccount = getAdminInfo(block); | |||
LedgerAdminSettings adminAccount = getAdminSettings(block); | |||
return createUserAccountSet(block, adminAccount.getSettings().getCryptoSetting()); | |||
} | |||
@@ -300,7 +328,7 @@ class LedgerRepositoryImpl implements LedgerRepository { | |||
return latestState.getDataAccountSet(); | |||
} | |||
LedgerAdminDataset adminAccount = getAdminInfo(block); | |||
LedgerAdminSettings adminAccount = getAdminSettings(block); | |||
return createDataAccountSet(block, adminAccount.getSettings().getCryptoSetting()); | |||
} | |||
@@ -316,7 +344,7 @@ class LedgerRepositoryImpl implements LedgerRepository { | |||
return latestState.getContractAccountSet(); | |||
} | |||
LedgerAdminDataset adminAccount = getAdminInfo(block); | |||
LedgerAdminSettings adminAccount = getAdminSettings(block); | |||
return createContractAccountSet(block, adminAccount.getSettings().getCryptoSetting()); | |||
} | |||
@@ -10,7 +10,6 @@ import static org.junit.Assert.assertTrue; | |||
import java.util.Arrays; | |||
import java.util.Random; | |||
import com.jd.blockchain.ledger.*; | |||
import org.junit.Test; | |||
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.ClassicCryptoService; | |||
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.LedgerAdminDataset; | |||
import com.jd.blockchain.ledger.core.LedgerConfiguration; | |||
@@ -213,7 +227,7 @@ public class LedgerAdminDatasetTest { | |||
actualLedgerSettings.getCryptoSetting().getHashAlgorithm()); | |||
} | |||
private void verifyRealoadingRoleAuthorizations(LedgerAdminInfo actualAccount, | |||
private void verifyRealoadingRoleAuthorizations(LedgerAdminSettings actualAccount, | |||
RolePrivilegeSettings expRolePrivilegeSettings, UserRolesSettings expUserRoleSettings) { | |||
// 验证基本信息; | |||
RolePrivilegeSettings actualRolePrivileges = actualAccount.getRolePrivileges(); | |||
@@ -1,17 +1,23 @@ | |||
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 { | |||
@DataField(order=1, refContract = true) | |||
LedgerMetadata_V2 getMetadata(); | |||
@DataField(order=2, refContract = true) | |||
LedgerSettings getSettings(); | |||
long getParticipantCount(); | |||
@DataField(order=3, refContract = true, list = true) | |||
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(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 | |||
* | |||
*/ | |||
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.web.client.WebResponseConverterFactory; | |||
import com.jd.blockchain.sdk.converters.HashDigestToStringConverter; | |||
import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.web.bind.annotation.RequestMethod; | |||
/** | |||
* 作为内部使用的适配接口,用于声明 HTTP 协议的服务请求; | |||
@@ -194,6 +196,17 @@ public interface HttpBlockchainQueryService extends BlockchainExtendQueryService | |||
@Override | |||
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 | |||
ParticipantNode[] getConsensusParticipants(@PathParam(name="ledgerHash", converter=HashDigestToStringConverter.class) HashDigest ledgerHash); | |||
/** | |||
* 返回指定账本的元数据 | |||
* | |||
@@ -192,7 +192,7 @@ public class RolesAuthorizationTest { | |||
if (roles == null) { | |||
roles = new String[0]; | |||
} | |||
UserRoles userRoles = ledger.getAdminInfo().getUserRoles().getUserRoles(address); | |||
UserRoles userRoles = ledger.getAdminSettings().getUserRoles().getUserRoles(address); | |||
assertNotNull(userRoles); | |||
assertEquals(policy, userRoles.getPolicy()); | |||
@@ -206,7 +206,7 @@ public class RolesAuthorizationTest { | |||
private void assertRolePermissions(LedgerQuery ledger, String roleName, LedgerPermission[] ledgerPermissions, | |||
TransactionPermission[] txPermissions) { | |||
RolePrivilegeSettings roles = ledger.getAdminInfo().getRolePrivileges(); | |||
RolePrivilegeSettings roles = ledger.getAdminSettings().getRolePrivileges(); | |||
assertTrue(roles.contains(roleName)); | |||
RolePrivileges privileges = roles.getRolePrivilege(roleName); | |||
assertEquals(ledgerPermissions.length, privileges.getLedgerPrivilege().getPermissionCount()); | |||
@@ -103,7 +103,7 @@ public class LedgerInitCommand { | |||
// partiAddress = partiConf.getAddress(); | |||
// } | |||
// } | |||
if (localNodeAddress.equals(partiConf.getAddress())) { | |||
if (localNodeAddress.equals(partiConf.getAddress().toBase58())) { | |||
currId = i; | |||
} | |||
} | |||