@@ -0,0 +1,6 @@ | |||
1、网关节点移除查询接口 HTTP GET ledgers/{ledgerHash}/settings (出于设计合理性原因) | |||
2、网关节点增加查询接口 HTTP GET ledgers/{ledgerHash}/admininfo ,接口返回指定账本管理配置信息; |
@@ -9,7 +9,7 @@ package com.jd.blockchain.consts; | |||
public interface DataCodes { | |||
public static final int BYTES_VALUE = 0x080; | |||
public static final int BYTES_VALUE_LIST = 0x081; | |||
public static final int BLOCK_CHAIN_IDENTITY = 0x090; | |||
@@ -21,6 +21,8 @@ public interface DataCodes { | |||
public static final int BLOCK_GENESIS = 0x120; | |||
public static final int DATA_SNAPSHOT = 0x130; | |||
public static final int LEDGER_ADMIN_INFO = 0x131; | |||
public static final int TX = 0x200; | |||
@@ -52,14 +54,14 @@ public interface DataCodes { | |||
public static final int TX_RESPONSE = 0x350; | |||
public static final int TX_OP_RESULT = 0x360; | |||
// enum types of permissions; | |||
public static final int ENUM_TX_PERMISSIONS = 0x401; | |||
public static final int ENUM_LEDGER_PERMISSIONS = 0x402; | |||
// contract types of metadata; | |||
public static final int METADATA = 0x600; | |||
public static final int METADATA_INIT_SETTING = 0x610; | |||
public static final int METADATA_INIT_PROPOSAL = 0x611; | |||
@@ -70,14 +72,14 @@ public interface DataCodes { | |||
public static final int METADATA_CONSENSUS_PARTICIPANT = 0x621; | |||
// public static final int METADATA_CONSENSUS_NODE = 0x630; | |||
public static final int METADATA_CONSENSUS_SETTING = 0x631; | |||
// public static final int METADATA_PARTICIPANT_INFO = 0x640; | |||
// public static final int METADATA_CONSENSUS_NODE = 0x630; | |||
// | |||
// public static final int METADATA_CONSENSUS_SETTING = 0x631; | |||
// | |||
// public static final int METADATA_PARTICIPANT_INFO = 0x640; | |||
public static final int METADATA_CRYPTO_SETTING = 0x642; | |||
public static final int METADATA_CRYPTO_SETTING_PROVIDER = 0x643; | |||
// public static final int ACCOUNT = 0x700; | |||
@@ -88,11 +90,10 @@ public interface DataCodes { | |||
public static final int DATA = 0x900; | |||
//contract related; | |||
// contract related; | |||
public static final int CONTRACT = 0xA00; | |||
//...0xA19 | |||
// ...0xA19 | |||
public static final int HASH = 0xB00; | |||
public static final int HASH_OBJECT = 0xB10; | |||
@@ -1,50 +0,0 @@ | |||
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.utils.Bytes; | |||
/** | |||
* queryService only for gateway; | |||
* @Author zhaogw | |||
* @Date 2019/2/22 10:37 | |||
*/ | |||
public interface GatewayQueryService { | |||
/** | |||
* get all ledgers hashs; | |||
* @param fromIndex | |||
* @param count | |||
*/ | |||
HashDigest[] getLedgersHash(int fromIndex, int count); | |||
/** | |||
* get the participants by range; | |||
* @param ledgerHash | |||
* @param fromIndex | |||
* @param count | |||
* @return | |||
*/ | |||
ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash, int fromIndex, int count); | |||
/** | |||
* 获取账本初始化配置信息 | |||
* | |||
* @param ledgerHash | |||
* 账本Hash | |||
* @return | |||
*/ | |||
LedgerInitSettings getLedgerInitSettings(HashDigest ledgerHash); | |||
/** | |||
* 获取账本指定合约信息 | |||
* | |||
* @param ledgerHash | |||
* 账本Hash | |||
* @param address | |||
* 合约地址 | |||
* @return | |||
*/ | |||
ContractSettings getContractSettings(HashDigest ledgerHash, String address); | |||
} |
@@ -1,144 +0,0 @@ | |||
package com.jd.blockchain.gateway.service; | |||
import com.jd.blockchain.consensus.ConsensusProvider; | |||
import com.jd.blockchain.consensus.ConsensusProviders; | |||
import com.jd.blockchain.consensus.ConsensusSettings; | |||
import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider; | |||
import com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider; | |||
import com.jd.blockchain.crypto.HashDigest; | |||
import com.jd.blockchain.gateway.PeerService; | |||
import com.jd.blockchain.gateway.decompiler.utils.DecompilerUtils; | |||
import com.jd.blockchain.ledger.ContractInfo; | |||
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.utils.QueryUtil; | |||
import com.jd.blockchain.utils.codec.HexUtils; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Component; | |||
import java.util.Arrays; | |||
/** | |||
* @Author zhaogw | |||
* @Date 2019/2/22 10:39 | |||
*/ | |||
@Component | |||
public class GatewayQueryServiceHandler implements GatewayQueryService { | |||
@Autowired | |||
private PeerService peerService; | |||
@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; | |||
} | |||
@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; | |||
} | |||
@Override | |||
public LedgerInitSettings getLedgerInitSettings(HashDigest ledgerHash) { | |||
ParticipantNode[] participantNodes = peerService.getQueryService().getConsensusParticipants(ledgerHash); | |||
LedgerMetadata ledgerMetadata = peerService.getQueryService().getLedgerMetadata(ledgerHash); | |||
return initLedgerInitSettings(participantNodes, ledgerMetadata); | |||
} | |||
@Override | |||
public ContractSettings getContractSettings(HashDigest ledgerHash, String address) { | |||
ContractInfo contractInfo = peerService.getQueryService().getContract(ledgerHash, address); | |||
return contractSettings(contractInfo); | |||
} | |||
private ContractSettings contractSettings(ContractInfo contractInfo) { | |||
ContractSettings contractSettings = new ContractSettings(contractInfo.getAddress(), contractInfo.getPubKey(), contractInfo.getRootHash()); | |||
byte[] chainCodeBytes = contractInfo.getChainCode(); | |||
// 将反编译chainCode | |||
String mainClassJava = DecompilerUtils.decompileMainClassFromBytes(chainCodeBytes); | |||
contractSettings.setChainCode(mainClassJava); | |||
return contractSettings; | |||
} | |||
/** | |||
* 初始化账本配置 | |||
* | |||
* @param participantNodes | |||
* 参与方列表 | |||
* @param ledgerMetadata | |||
* 账本元数据 | |||
* @return | |||
*/ | |||
private LedgerInitSettings initLedgerInitSettings(ParticipantNode[] participantNodes, LedgerMetadata ledgerMetadata) { | |||
LedgerInitSettings ledgerInitSettings = new LedgerInitSettings(); | |||
// 设置参与方 | |||
ledgerInitSettings.setParticipantNodes(participantNodes); | |||
// 设置共识设置 | |||
ledgerInitSettings.setConsensusSettings(initConsensusSettings(ledgerMetadata)); | |||
// 设置参与方根Hash | |||
ledgerInitSettings.setParticipantsHash(ledgerMetadata.getParticipantsHash()); | |||
// 设置算法配置 | |||
ledgerInitSettings.setCryptoSetting(ledgerMetadata.getSetting().getCryptoSetting()); | |||
// 设置种子 | |||
ledgerInitSettings.setSeed(initSeed(ledgerMetadata.getSeed())); | |||
// 设置共识协议 | |||
ledgerInitSettings.setConsensusProtocol(ledgerMetadata.getSetting().getConsensusProvider()); | |||
return ledgerInitSettings; | |||
} | |||
/** | |||
* 初始化账本种子信息 | |||
* | |||
* @param seedBytes | |||
* 种子的字节数组显示 | |||
* @return | |||
* 种子以十六进制方式显示,为方便阅读,每隔八个字符中间以"-"分割 | |||
*/ | |||
private String initSeed(byte[] seedBytes) { | |||
String seedString = HexUtils.encode(seedBytes); | |||
// 每隔八个字符中加入一个一个横线 | |||
StringBuffer seed = new StringBuffer(); | |||
for( int i = 0; i < seedString.length(); i++) { | |||
char c = seedString.charAt(i); | |||
if (i != 0 && i % 8 == 0) { | |||
seed.append("-"); | |||
} | |||
seed.append(c); | |||
} | |||
return seed.toString(); | |||
} | |||
/** | |||
* 初始化共识配置 | |||
* | |||
* @param ledgerMetadata | |||
* 账本元数据 | |||
* @return | |||
*/ | |||
private ConsensusSettings initConsensusSettings(LedgerMetadata ledgerMetadata) { | |||
String consensusProvider = ledgerMetadata.getSetting().getConsensusProvider(); | |||
ConsensusProvider provider = ConsensusProviders.getProvider(consensusProvider); | |||
byte[] consensusSettingsBytes = ledgerMetadata.getSetting().getConsensusSetting().toBytes(); | |||
return provider.getSettingsFactory().getConsensusSettingsEncoder().decode(consensusSettingsBytes); | |||
} | |||
} |
@@ -35,6 +35,9 @@ public class GatewayWebServerConfigurer implements WebMvcConfigurer { | |||
JSONSerializeUtils.disableCircularReferenceDetect(); | |||
JSONSerializeUtils.configStringSerializer(ByteArray.class); | |||
DataContractRegistry.register(BftsmartNodeSettings.class); | |||
DataContractRegistry.register(LedgerAdminInfo.class); | |||
} | |||
@@ -10,6 +10,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.LedgerException; | |||
import com.jd.blockchain.ledger.LedgerInitSetting; | |||
import com.jd.blockchain.ledger.ParticipantNode; | |||
@@ -19,7 +20,7 @@ import com.jd.blockchain.storage.service.VersioningKVStorage; | |||
import com.jd.blockchain.utils.Bytes; | |||
import com.jd.blockchain.utils.Transactional; | |||
public class LedgerAdminAccount implements Transactional, LedgerAdministration { | |||
public class LedgerAdminAccount implements Transactional, LedgerAdminInfo { | |||
static { | |||
DataContractRegistry.register(LedgerMetadata.class); | |||
@@ -174,8 +175,8 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { | |||
} | |||
Bytes key = encodeSettingsKey(settingsHash); | |||
byte[] bytes = storage.get(key); | |||
HashFunction hashFunc = Crypto.getHashFunction(adminAccountHash.getAlgorithm()); | |||
if (!hashFunc.verify(adminAccountHash, bytes)) { | |||
HashFunction hashFunc = Crypto.getHashFunction(settingsHash.getAlgorithm()); | |||
if (!hashFunc.verify(settingsHash, bytes)) { | |||
String errorMsg = "Verification of the hash for ledger setting failed! --[HASH=" + key + "]"; | |||
LOGGER.error(errorMsg); | |||
throw new LedgerException(errorMsg); | |||
@@ -240,7 +241,7 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { | |||
* | |||
* @return | |||
*/ | |||
public LedgerSettings getSetting() { | |||
public LedgerSettings getSettings() { | |||
return settings; | |||
} | |||
@@ -1,16 +0,0 @@ | |||
package com.jd.blockchain.ledger.core; | |||
import com.jd.blockchain.ledger.LedgerMetadata; | |||
import com.jd.blockchain.ledger.ParticipantNode; | |||
public interface LedgerAdministration { | |||
LedgerMetadata getMetadata(); | |||
long getParticipantCount(); | |||
// ParticipantNode getParticipant(int id); | |||
ParticipantNode[] getParticipants(); | |||
} |
@@ -3,6 +3,7 @@ package com.jd.blockchain.ledger.core; | |||
import java.io.Closeable; | |||
import com.jd.blockchain.crypto.HashDigest; | |||
import com.jd.blockchain.ledger.LedgerAdminInfo; | |||
import com.jd.blockchain.ledger.LedgerBlock; | |||
public interface LedgerRepository extends Closeable { | |||
@@ -51,7 +52,7 @@ public interface LedgerRepository extends Closeable { | |||
*/ | |||
LedgerBlock getBlock(long height); | |||
LedgerAdministration getAdminInfo(); | |||
LedgerAdminInfo getAdminInfo(); | |||
LedgerBlock getBlock(HashDigest hash); | |||
@@ -69,7 +69,7 @@ public class LedgerManager implements LedgerManage { | |||
ledgerVersioningStorage); | |||
// 校验 crypto service provider ; | |||
CryptoSetting cryptoSetting = ledgerRepo.getAdminAccount().getSetting().getCryptoSetting(); | |||
CryptoSetting cryptoSetting = ledgerRepo.getAdminAccount().getSettings().getCryptoSetting(); | |||
checkCryptoSetting(cryptoSetting, ledgerHash); | |||
// 创建账本上下文; | |||
@@ -9,7 +9,6 @@ import com.jd.blockchain.ledger.*; | |||
import com.jd.blockchain.ledger.core.ContractAccountSet; | |||
import com.jd.blockchain.ledger.core.DataAccount; | |||
import com.jd.blockchain.ledger.core.DataAccountSet; | |||
import com.jd.blockchain.ledger.core.LedgerAdministration; | |||
import com.jd.blockchain.ledger.core.LedgerRepository; | |||
import com.jd.blockchain.ledger.core.LedgerService; | |||
import com.jd.blockchain.ledger.core.TransactionSet; | |||
@@ -40,15 +39,23 @@ public class LedgerQueryService implements BlockchainQueryService { | |||
ledgerInfo.setLatestBlockHeight(ledger.getLatestBlockHeight()); | |||
return ledgerInfo; | |||
} | |||
@Override | |||
public LedgerAdminInfo getLedgerAdminInfo(HashDigest ledgerHash) { | |||
LedgerRepository ledger = ledgerService.getLedger(ledgerHash); | |||
LedgerBlock block = ledger.getLatestBlock(); | |||
LedgerAdminInfo administration = ledger.getAdminAccount(block); | |||
return administration; | |||
} | |||
@Override | |||
public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) { | |||
return ledgerAdministration(ledgerHash).getParticipants(); | |||
return getLedgerAdminInfo(ledgerHash).getParticipants(); | |||
} | |||
@Override | |||
public LedgerMetadata getLedgerMetadata(HashDigest ledgerHash) { | |||
return ledgerAdministration(ledgerHash).getMetadata(); | |||
return getLedgerAdminInfo(ledgerHash).getMetadata(); | |||
} | |||
@Override | |||
@@ -390,10 +397,4 @@ public class LedgerQueryService implements BlockchainQueryService { | |||
return contractAccountSet.getAccounts(pages[0], pages[1]); | |||
} | |||
private LedgerAdministration ledgerAdministration(HashDigest ledgerHash) { | |||
LedgerRepository ledger = ledgerService.getLedger(ledgerHash); | |||
LedgerBlock block = ledger.getLatestBlock(); | |||
LedgerAdministration administration = ledger.getAdminAccount(block); | |||
return administration; | |||
} | |||
} |
@@ -9,7 +9,6 @@ import com.jd.blockchain.ledger.core.AccountAccessPolicy; | |||
import com.jd.blockchain.ledger.core.ContractAccountSet; | |||
import com.jd.blockchain.ledger.core.DataAccountSet; | |||
import com.jd.blockchain.ledger.core.LedgerAdminAccount; | |||
import com.jd.blockchain.ledger.core.LedgerAdministration; | |||
import com.jd.blockchain.ledger.core.LedgerConsts; | |||
import com.jd.blockchain.ledger.core.LedgerDataSet; | |||
import com.jd.blockchain.ledger.core.LedgerEditor; | |||
@@ -244,7 +243,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||
} | |||
@Override | |||
public LedgerAdministration getAdminInfo() { | |||
public LedgerAdminInfo getAdminInfo() { | |||
return getAdminAccount(getLatestBlock()); | |||
} | |||
@@ -263,7 +262,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||
if (transactionSet == null) { | |||
LedgerAdminAccount adminAccount = getAdminAccount(block); | |||
transactionSet = loadTransactionSet(block.getTransactionSetHash(), | |||
adminAccount.getMetadata().getSetting().getCryptoSetting(), keyPrefix, exPolicyStorage, | |||
adminAccount.getSettings().getCryptoSetting(), keyPrefix, exPolicyStorage, | |||
versioningStorage, true); | |||
state.transactionSet = transactionSet; | |||
} | |||
@@ -272,7 +271,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||
LedgerAdminAccount adminAccount = getAdminAccount(block); | |||
// All of existing block is readonly; | |||
return loadTransactionSet(block.getTransactionSetHash(), | |||
adminAccount.getMetadata().getSetting().getCryptoSetting(), keyPrefix, exPolicyStorage, | |||
adminAccount.getSettings().getCryptoSetting(), keyPrefix, exPolicyStorage, | |||
versioningStorage, true); | |||
} | |||
@@ -402,7 +401,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||
} | |||
LedgerBlock previousBlock = getLatestBlock(); | |||
LedgerTransactionalEditor editor = LedgerTransactionalEditor.createEditor(previousBlock, | |||
getAdminInfo().getMetadata().getSetting(), keyPrefix, exPolicyStorage, | |||
getAdminInfo().getSettings(), keyPrefix, exPolicyStorage, | |||
versioningStorage); | |||
NewBlockCommittingMonitor committingMonitor = new NewBlockCommittingMonitor(editor, this); | |||
this.nextBlockEditor = committingMonitor; | |||
@@ -453,7 +452,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||
// PrefixAppender.prefix(USER_SET_PREFIX, ledgerExStorage), | |||
// PrefixAppender.prefix(USER_SET_PREFIX, ledgerVerStorage), | |||
// DEFAULT_ACCESS_POLICY); | |||
UserAccountSet userAccountSet = new UserAccountSet(adminAccount.getSetting().getCryptoSetting(), | |||
UserAccountSet userAccountSet = new UserAccountSet(adminAccount.getSettings().getCryptoSetting(), | |||
usersetKeyPrefix, ledgerExStorage, ledgerVerStorage, DEFAULT_ACCESS_POLICY); | |||
// DataAccountSet dataAccountSet = new | |||
@@ -461,7 +460,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||
// PrefixAppender.prefix(DATA_SET_PREFIX, ledgerExStorage), | |||
// PrefixAppender.prefix(DATA_SET_PREFIX, ledgerVerStorage), | |||
// DEFAULT_ACCESS_POLICY); | |||
DataAccountSet dataAccountSet = new DataAccountSet(adminAccount.getSetting().getCryptoSetting(), | |||
DataAccountSet dataAccountSet = new DataAccountSet(adminAccount.getSettings().getCryptoSetting(), | |||
datasetKeyPrefix, ledgerExStorage, ledgerVerStorage, DEFAULT_ACCESS_POLICY); | |||
// ContractAccountSet contractAccountSet = new | |||
@@ -469,7 +468,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||
// PrefixAppender.prefix(CONTRACT_SET_PREFIX, ledgerExStorage), | |||
// PrefixAppender.prefix(CONTRACT_SET_PREFIX, ledgerVerStorage), | |||
// DEFAULT_ACCESS_POLICY); | |||
ContractAccountSet contractAccountSet = new ContractAccountSet(adminAccount.getSetting().getCryptoSetting(), | |||
ContractAccountSet contractAccountSet = new ContractAccountSet(adminAccount.getSettings().getCryptoSetting(), | |||
contractsetKeyPrefix, ledgerExStorage, ledgerVerStorage, DEFAULT_ACCESS_POLICY); | |||
LedgerDataSetImpl newDataSet = new LedgerDataSetImpl(adminAccount, userAccountSet, dataAccountSet, | |||
@@ -262,7 +262,7 @@ public class LedgerTransactionalEditor implements LedgerEditor { | |||
GenesisSnapshot snpht = (GenesisSnapshot) startingPoint; | |||
txDataset = LedgerRepositoryImpl.newDataSet(snpht.initSetting, ledgerKeyPrefix, txBufferedStorage, | |||
txBufferedStorage); | |||
txset = LedgerRepositoryImpl.newTransactionSet(txDataset.getAdminAccount().getSetting(), | |||
txset = LedgerRepositoryImpl.newTransactionSet(txDataset.getAdminAccount().getSettings(), | |||
ledgerKeyPrefix, txBufferedStorage, txBufferedStorage); | |||
} else if (startingPoint instanceof TxSnapshot) { | |||
// 新的区块; | |||
@@ -38,6 +38,11 @@ public class ContractLedgerContext implements LedgerContext { | |||
public LedgerInfo getLedger(HashDigest ledgerHash) { | |||
return innerQueryService.getLedger(ledgerHash); | |||
} | |||
@Override | |||
public LedgerAdminInfo getLedgerAdminInfo(HashDigest ledgerHash) { | |||
return innerQueryService.getLedgerAdminInfo(ledgerHash); | |||
} | |||
@Override | |||
public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) { | |||
@@ -166,14 +166,15 @@ public class LedgerAdminAccountTest { | |||
assertTrue(BytesUtils.equals(expMeta.getSeed(), rlmeta.getSeed())); | |||
assertNotNull(rlmeta.getSetting()); | |||
assertTrue(expMeta.getSetting().getConsensusSetting().equals(rlmeta.getSetting().getConsensusSetting())); | |||
assertEquals(expMeta.getSetting().getConsensusProvider(), rlmeta.getSetting().getConsensusProvider()); | |||
assertEquals(expMeta.getSetting().getCryptoSetting().getAutoVerifyHash(), | |||
rlmeta.getSetting().getCryptoSetting().getAutoVerifyHash()); | |||
assertEquals(expMeta.getSetting().getCryptoSetting().getHashAlgorithm(), | |||
rlmeta.getSetting().getCryptoSetting().getHashAlgorithm()); | |||
assertNotNull(rlmeta.getSettingsHash()); | |||
assertEquals(expMeta.getSettingsHash(), rlmeta.getSettingsHash()); | |||
// assertTrue(expMeta.getSettings().getConsensusSetting().equals(rlmeta.getSettings().getConsensusSetting())); | |||
// assertEquals(expMeta.getSettings().getConsensusProvider(), rlmeta.getSettings().getConsensusProvider()); | |||
// | |||
// assertEquals(expMeta.getSettings().getCryptoSetting().getAutoVerifyHash(), | |||
// rlmeta.getSettings().getCryptoSetting().getAutoVerifyHash()); | |||
// assertEquals(expMeta.getSettings().getCryptoSetting().getHashAlgorithm(), | |||
// rlmeta.getSettings().getCryptoSetting().getHashAlgorithm()); | |||
} | |||
private void verifyReadlingParities(LedgerAdminAccount actualAccount, ParticipantNode[] expParties) { | |||
@@ -210,7 +211,7 @@ public class LedgerAdminAccountTest { | |||
ex = null; | |||
try { | |||
LedgerConfiguration newLedgerSetting = new LedgerConfiguration(actualAccount.getSetting()); | |||
LedgerConfiguration newLedgerSetting = new LedgerConfiguration(actualAccount.getSettings()); | |||
actualAccount.setLedgerSetting(newLedgerSetting); | |||
} catch (Exception e) { | |||
ex = e; | |||
@@ -16,6 +16,7 @@ import com.jd.blockchain.binaryproto.BinaryProtocol; | |||
import com.jd.blockchain.binaryproto.DataContractRegistry; | |||
import com.jd.blockchain.crypto.AddressEncoding; | |||
import com.jd.blockchain.crypto.Crypto; | |||
import com.jd.blockchain.crypto.CryptoAlgorithm; | |||
import com.jd.blockchain.crypto.CryptoProvider; | |||
import com.jd.blockchain.crypto.HashDigest; | |||
import com.jd.blockchain.crypto.PubKey; | |||
@@ -74,12 +75,14 @@ public class LedgerMetaDataTest { | |||
cryptoConfig.setAutoVerifyHash(true); | |||
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256); | |||
LedgerConfiguration ledgerConfiguration = new LedgerConfiguration(consensusProvider, | |||
new Bytes(consensusSettingBytes), cryptoConfig); | |||
// LedgerConfiguration ledgerConfiguration = new LedgerConfiguration(consensusProvider, | |||
// new Bytes(consensusSettingBytes), cryptoConfig); | |||
HashDigest settingsHash = Crypto.getHashFunction("SHA256").hash(consensusSettingBytes); | |||
LedgerAdminAccount.LedgerMetadataImpl ledgerMetadata = new LedgerAdminAccount.LedgerMetadataImpl(); | |||
ledgerMetadata.setSeed(seed); | |||
ledgerMetadata.setSetting(ledgerConfiguration); | |||
ledgerMetadata.setSettingsHash(settingsHash); | |||
HashDigest hashDigest = new HashDigest(ClassicAlgorithm.SHA256, rawDigestBytes); | |||
ledgerMetadata.setParticipantsHash(hashDigest); | |||
@@ -91,7 +94,7 @@ public class LedgerMetaDataTest { | |||
// verify start | |||
assertArrayEquals(ledgerMetadata.getSeed(), deLedgerMetaData.getSeed()); | |||
assertEquals(ledgerMetadata.getParticipantsHash(), deLedgerMetaData.getParticipantsHash()); | |||
assertNotEquals(ledgerMetadata.getSetting(), deLedgerMetaData.getSetting()); | |||
assertEquals(ledgerMetadata.getSettingsHash(), deLedgerMetaData.getSettingsHash()); | |||
return; | |||
} | |||
@@ -0,0 +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, name = "LEDGER-ADMIN-INFO") | |||
public interface LedgerAdminInfo { | |||
@DataField(order = 1, refContract = true) | |||
LedgerMetadata getMetadata(); | |||
@DataField(order = 2, refContract = true) | |||
LedgerSettings getSettings(); | |||
@DataField(order = 3, primitiveType = PrimitiveType.INT64) | |||
long getParticipantCount(); | |||
@DataField(order = 4, refContract = true, list = true) | |||
ParticipantNode[] getParticipants(); | |||
} |
@@ -31,14 +31,6 @@ public interface LedgerMetadata { | |||
@DataField(order = 2, primitiveType = PrimitiveType.BYTES) | |||
HashDigest getParticipantsHash(); | |||
// /** | |||
// * 账本配置; | |||
// * | |||
// * @return | |||
// */ | |||
// @DataField(order = 3, refContract = true) | |||
// LedgerSetting getSetting(); | |||
/** | |||
* 账本配置的哈希; | |||
* | |||
@@ -1,7 +1,21 @@ | |||
package com.jd.blockchain.transaction; | |||
import org.springframework.cglib.core.Block; | |||
import com.jd.blockchain.crypto.HashDigest; | |||
import com.jd.blockchain.ledger.*; | |||
import com.jd.blockchain.ledger.AccountHeader; | |||
import com.jd.blockchain.ledger.ContractInfo; | |||
import com.jd.blockchain.ledger.KVDataEntry; | |||
import com.jd.blockchain.ledger.KVInfoVO; | |||
import com.jd.blockchain.ledger.LedgerAdminInfo; | |||
import com.jd.blockchain.ledger.LedgerBlock; | |||
import com.jd.blockchain.ledger.LedgerInfo; | |||
import com.jd.blockchain.ledger.LedgerMetadata; | |||
import com.jd.blockchain.ledger.LedgerTransaction; | |||
import com.jd.blockchain.ledger.ParticipantNode; | |||
import com.jd.blockchain.ledger.Transaction; | |||
import com.jd.blockchain.ledger.TransactionState; | |||
import com.jd.blockchain.ledger.UserInfo; | |||
/** | |||
* 区块链查询器; | |||
@@ -28,12 +42,20 @@ public interface BlockchainQueryService { | |||
*/ | |||
LedgerInfo getLedger(HashDigest ledgerHash); | |||
/** | |||
* 返回当前账本的参与者信息列表 | |||
* | |||
* @param ledgerHash | |||
* @return | |||
*/ | |||
/** | |||
* 获取账本信息; | |||
* | |||
* @param ledgerHash | |||
* @return 账本对象;如果不存在,则返回 null; | |||
*/ | |||
LedgerAdminInfo getLedgerAdminInfo(HashDigest ledgerHash); | |||
/** | |||
* 返回当前账本的参与者信息列表 | |||
* | |||
* @param ledgerHash | |||
* @return | |||
*/ | |||
ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash); | |||
/** | |||
@@ -47,10 +69,8 @@ public interface BlockchainQueryService { | |||
/** | |||
* 返回指定账本序号的区块; | |||
* | |||
* @param ledgerHash | |||
* 账本hash; | |||
* @param height | |||
* 高度; | |||
* @param ledgerHash 账本hash; | |||
* @param height 高度; | |||
* @return | |||
*/ | |||
LedgerBlock getBlock(HashDigest ledgerHash, long height); | |||
@@ -58,10 +78,8 @@ public interface BlockchainQueryService { | |||
/** | |||
* 返回指定区块hash的区块; | |||
* | |||
* @param ledgerHash | |||
* 账本hash; | |||
* @param blockHash | |||
* 区块hash; | |||
* @param ledgerHash 账本hash; | |||
* @param blockHash 区块hash; | |||
* @return | |||
*/ | |||
LedgerBlock getBlock(HashDigest ledgerHash, HashDigest blockHash); | |||
@@ -84,125 +102,116 @@ public interface BlockchainQueryService { | |||
*/ | |||
long getTransactionCount(HashDigest ledgerHash, HashDigest blockHash); | |||
/** | |||
* 返回当前账本的交易总数 | |||
* | |||
* @param ledgerHash | |||
* @return | |||
*/ | |||
/** | |||
* 返回当前账本的交易总数 | |||
* | |||
* @param ledgerHash | |||
* @return | |||
*/ | |||
long getTransactionTotalCount(HashDigest ledgerHash); | |||
/** | |||
* 返回指定高度的区块中记录的数据账户总数 | |||
* | |||
* @param ledgerHash | |||
* @param height | |||
* @return | |||
*/ | |||
/** | |||
* 返回指定高度的区块中记录的数据账户总数 | |||
* | |||
* @param ledgerHash | |||
* @param height | |||
* @return | |||
*/ | |||
long getDataAccountCount(HashDigest ledgerHash, long height); | |||
/** | |||
* 返回指定的区块中记录的数据账户总数 | |||
* | |||
* @param ledgerHash | |||
* @param blockHash | |||
* @return | |||
*/ | |||
/** | |||
* 返回指定的区块中记录的数据账户总数 | |||
* | |||
* @param ledgerHash | |||
* @param blockHash | |||
* @return | |||
*/ | |||
long getDataAccountCount(HashDigest ledgerHash, HashDigest blockHash); | |||
/** | |||
* 返回当前账本的数据账户总数 | |||
* | |||
* @param ledgerHash | |||
* @return | |||
*/ | |||
long getDataAccountTotalCount(HashDigest ledgerHash); | |||
/** | |||
* 返回指定高度区块中的用户总数 | |||
* | |||
* @param ledgerHash | |||
* @param height | |||
* @return | |||
*/ | |||
/** | |||
* 返回当前账本的数据账户总数 | |||
* | |||
* @param ledgerHash | |||
* @return | |||
*/ | |||
long getDataAccountTotalCount(HashDigest ledgerHash); | |||
/** | |||
* 返回指定高度区块中的用户总数 | |||
* | |||
* @param ledgerHash | |||
* @param height | |||
* @return | |||
*/ | |||
long getUserCount(HashDigest ledgerHash, long height); | |||
/** | |||
* 返回指定区块中的用户总数 | |||
* | |||
* @param ledgerHash | |||
* @param blockHash | |||
* @return | |||
*/ | |||
/** | |||
* 返回指定区块中的用户总数 | |||
* | |||
* @param ledgerHash | |||
* @param blockHash | |||
* @return | |||
*/ | |||
long getUserCount(HashDigest ledgerHash, HashDigest blockHash); | |||
/** | |||
* 返回当前账本的用户总数 | |||
* | |||
* @param ledgerHash | |||
* @return | |||
*/ | |||
long getUserTotalCount(HashDigest ledgerHash); | |||
/** | |||
* 返回指定高度区块中的合约总数 | |||
* | |||
* @param ledgerHash | |||
* @param height | |||
* @return | |||
*/ | |||
long getContractCount(HashDigest ledgerHash, long height); | |||
/** | |||
* 返回指定区块中的合约总数 | |||
* | |||
* @param ledgerHash | |||
* @param blockHash | |||
* @return | |||
*/ | |||
long getContractCount(HashDigest ledgerHash, HashDigest blockHash); | |||
/** | |||
* 返回当前账本的合约总数 | |||
* | |||
* @param ledgerHash | |||
* @return | |||
*/ | |||
long getContractTotalCount(HashDigest ledgerHash); | |||
/** | |||
* 返回当前账本的用户总数 | |||
* | |||
* @param ledgerHash | |||
* @return | |||
*/ | |||
long getUserTotalCount(HashDigest ledgerHash); | |||
/** | |||
* 分页返回指定账本序号的区块中的交易列表; | |||
* 返回指定高度区块中的合约总数 | |||
* | |||
* @param ledgerHash | |||
* 账本hash; | |||
* @param height | |||
* 账本高度; | |||
* @param fromIndex | |||
* 开始的记录数; | |||
* @param count | |||
* 本次返回的记录数;<br> | |||
* 最小为1,最大值受到系统参数的限制;<br> | |||
* 注:通过 {@link #getBlock(String, long)} 方法获得的区块信息中可以得到区块的总交易数 | |||
* {@link Block#getTxCount()}; | |||
* @return | |||
*/ | |||
LedgerTransaction[] getTransactions(HashDigest ledgerHash, long height, int fromIndex, int count); | |||
long getContractCount(HashDigest ledgerHash, long height); | |||
/** | |||
* 分页返回指定账本序号的区块中的交易列表; | |||
* 返回指定区块中的合约总数 | |||
* | |||
* @param ledgerHash | |||
* 账本hash; | |||
* @param blockHash | |||
* 账本高度; | |||
* @param fromIndex | |||
* 开始的记录数; | |||
* @param count | |||
* 本次返回的记录数;<br> | |||
* 如果参数值为 -1,则返回全部的记录;<br> | |||
* 注:通过 {@link #getBlock(String, String)} 方法获得的区块信息中可以得到区块的总交易数 | |||
* {@link Block#getTxCount()}; | |||
* @return | |||
*/ | |||
long getContractCount(HashDigest ledgerHash, HashDigest blockHash); | |||
/** | |||
* 返回当前账本的合约总数 | |||
* | |||
* @param ledgerHash | |||
* @return | |||
*/ | |||
long getContractTotalCount(HashDigest ledgerHash); | |||
/** | |||
* 分页返回指定账本序号的区块中的交易列表; | |||
* | |||
* @param ledgerHash 账本hash; | |||
* @param height 账本高度; | |||
* @param fromIndex 开始的记录数; | |||
* @param count 本次返回的记录数;<br> | |||
* 最小为1,最大值受到系统参数的限制;<br> | |||
* 注:通过 {@link #getBlock(String, long)} 方法获得的区块信息中可以得到区块的总交易数 | |||
* {@link Block#getTxCount()}; | |||
* @return | |||
*/ | |||
LedgerTransaction[] getTransactions(HashDigest ledgerHash, long height, int fromIndex, int count); | |||
/** | |||
* 分页返回指定账本序号的区块中的交易列表; | |||
* | |||
* @param ledgerHash 账本hash; | |||
* @param blockHash 账本高度; | |||
* @param fromIndex 开始的记录数; | |||
* @param count 本次返回的记录数;<br> | |||
* 如果参数值为 -1,则返回全部的记录;<br> | |||
* 注:通过 {@link #getBlock(String, String)} | |||
* 方法获得的区块信息中可以得到区块的总交易数 {@link Block#getTxCount()}; | |||
* @return | |||
*/ | |||
LedgerTransaction[] getTransactions(HashDigest ledgerHash, HashDigest blockHash, int fromIndex, int count); | |||
@@ -210,21 +219,17 @@ public interface BlockchainQueryService { | |||
/** | |||
* 根据交易内容的哈希获取对应的交易记录; | |||
* | |||
* @param ledgerHash | |||
* 账本hash; | |||
* @param contentHash | |||
* 交易内容的hash,即交易的 {@link Transaction#getContentHash()} 属性的值; | |||
* @param ledgerHash 账本hash; | |||
* @param contentHash 交易内容的hash,即交易的 {@link Transaction#getContentHash()} 属性的值; | |||
* @return | |||
*/ | |||
LedgerTransaction getTransactionByContentHash(HashDigest ledgerHash, HashDigest contentHash); | |||
/** | |||
* 根据交易内容的哈希获取对应的交易状态; | |||
* | |||
* @param ledgerHash | |||
* 账本hash; | |||
* @param contentHash | |||
* 交易内容的hash,即交易的 {@link Transaction#getContentHash()} 属性的值; | |||
* @param ledgerHash 账本hash; | |||
* @param contentHash 交易内容的hash,即交易的 {@link Transaction#getContentHash()} 属性的值; | |||
* @return | |||
*/ | |||
TransactionState getTransactionStateByContentHash(HashDigest ledgerHash, HashDigest contentHash); | |||
@@ -273,18 +278,13 @@ public interface BlockchainQueryService { | |||
long getDataEntriesTotalCount(HashDigest ledgerHash, String address); | |||
/** | |||
* 返回数据账户中指定序号的最新值; | |||
* 返回结果的顺序与指定的序号的顺序是一致的;<br> | |||
* 返回数据账户中指定序号的最新值; 返回结果的顺序与指定的序号的顺序是一致的;<br> | |||
* | |||
* @param ledgerHash | |||
* 账本hash; | |||
* @param address | |||
* 数据账户地址; | |||
* @param fromIndex | |||
* 开始的记录数; | |||
* @param count | |||
* 本次返回的记录数;<br> | |||
* 如果参数值为 -1,则返回全部的记录;<br> | |||
* @param ledgerHash 账本hash; | |||
* @param address 数据账户地址; | |||
* @param fromIndex 开始的记录数; | |||
* @param count 本次返回的记录数;<br> | |||
* 如果参数值为 -1,则返回全部的记录;<br> | |||
* @return | |||
*/ | |||
KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count); | |||
@@ -300,6 +300,7 @@ public interface BlockchainQueryService { | |||
/** | |||
* get users by ledgerHash and its range; | |||
* | |||
* @param ledgerHash | |||
* @param fromIndex | |||
* @param count | |||
@@ -309,6 +310,7 @@ public interface BlockchainQueryService { | |||
/** | |||
* get data accounts by ledgerHash and its range; | |||
* | |||
* @param ledgerHash | |||
* @param fromIndex | |||
* @param count | |||
@@ -318,6 +320,7 @@ public interface BlockchainQueryService { | |||
/** | |||
* get contract accounts by ledgerHash and its range; | |||
* | |||
* @param ledgerHash | |||
* @param fromIndex | |||
* @param count | |||
@@ -17,7 +17,6 @@ import com.jd.blockchain.crypto.HashDigest; | |||
import com.jd.blockchain.ledger.core.ContractAccountSet; | |||
import com.jd.blockchain.ledger.core.DataAccount; | |||
import com.jd.blockchain.ledger.core.DataAccountSet; | |||
import com.jd.blockchain.ledger.core.LedgerAdministration; | |||
import com.jd.blockchain.ledger.core.LedgerRepository; | |||
import com.jd.blockchain.ledger.core.LedgerService; | |||
import com.jd.blockchain.ledger.core.ParticipantCertData; | |||
@@ -57,7 +56,7 @@ public class LedgerQueryController implements BlockchainQueryService { | |||
@Override | |||
public ParticipantNode[] getConsensusParticipants(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) { | |||
LedgerRepository ledger = ledgerService.getLedger(ledgerHash); | |||
LedgerAdministration ledgerAdministration = ledger.getAdminInfo(); | |||
LedgerAdminInfo ledgerAdministration = ledger.getAdminInfo(); | |||
long participantCount = ledgerAdministration.getParticipantCount(); | |||
if (participantCount <= 0) { | |||
return null; | |||
@@ -73,12 +72,20 @@ public class LedgerQueryController implements BlockchainQueryService { | |||
} | |||
return null; | |||
} | |||
@RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/admininfo") | |||
@Override | |||
public LedgerAdminInfo getLedgerAdminInfo(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) { | |||
LedgerRepository ledger = ledgerService.getLedger(ledgerHash); | |||
LedgerAdminInfo ledgerAdministration = ledger.getAdminInfo(); | |||
return ledgerAdministration; | |||
} | |||
@RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/metadata") | |||
@Override | |||
public LedgerMetadata getLedgerMetadata(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) { | |||
LedgerRepository ledger = ledgerService.getLedger(ledgerHash); | |||
LedgerAdministration ledgerAdministration = ledger.getAdminInfo(); | |||
LedgerAdminInfo ledgerAdministration = ledger.getAdminInfo(); | |||
LedgerMetadata ledgerMetadata = ledgerAdministration.getMetadata(); | |||
return ledgerMetadata; | |||
} | |||
@@ -37,6 +37,7 @@ import com.jd.blockchain.ledger.CryptoSetting; | |||
import com.jd.blockchain.ledger.DataAccountKVSetOperation; | |||
import com.jd.blockchain.ledger.DataAccountRegisterOperation; | |||
import com.jd.blockchain.ledger.EndpointRequest; | |||
import com.jd.blockchain.ledger.LedgerAdminInfo; | |||
import com.jd.blockchain.ledger.LedgerBlock; | |||
import com.jd.blockchain.ledger.LedgerInitOperation; | |||
import com.jd.blockchain.ledger.NodeRequest; | |||
@@ -121,6 +122,8 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag | |||
DataContractRegistry.register(BftsmartConsensusSettings.class); | |||
DataContractRegistry.register(BftsmartNodeSettings.class); | |||
DataContractRegistry.register(LedgerAdminInfo.class); | |||
} | |||
@@ -225,10 +228,10 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag | |||
// load provider; | |||
LedgerAdminAccount ledgerAdminAccount = ledgerRepository.getAdminAccount(); | |||
String consensusProvider = ledgerAdminAccount.getSetting().getConsensusProvider(); | |||
String consensusProvider = ledgerAdminAccount.getSettings().getConsensusProvider(); | |||
ConsensusProvider provider = ConsensusProviders.getProvider(consensusProvider); | |||
// find current node; | |||
Bytes csSettingBytes = ledgerAdminAccount.getSetting().getConsensusSetting(); | |||
Bytes csSettingBytes = ledgerAdminAccount.getSettings().getConsensusSetting(); | |||
ConsensusSettings csSettings = provider.getSettingsFactory().getConsensusSettingsEncoder() | |||
.decode(csSettingBytes.toBytes()); | |||
NodeSettings currentNode = null; | |||
@@ -247,7 +250,7 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag | |||
NodeServer server = provider.getServerFactory().setupServer(serverSettings, consensusMessageHandler, | |||
consensusStateManager); | |||
ledgerPeers.put(ledgerHash, server); | |||
ledgerCryptoSettings.put(ledgerHash, ledgerAdminAccount.getSetting().getCryptoSetting()); | |||
ledgerCryptoSettings.put(ledgerHash, ledgerAdminAccount.getSettings().getCryptoSetting()); | |||
return server; | |||
} | |||
@@ -32,6 +32,11 @@ public abstract class BlockchainServiceProxy implements BlockchainService { | |||
public LedgerInfo getLedger(HashDigest ledgerHash) { | |||
return getQueryService(ledgerHash).getLedger(ledgerHash); | |||
} | |||
@Override | |||
public LedgerAdminInfo getLedgerAdminInfo(HashDigest ledgerHash) { | |||
return getQueryService(ledgerHash).getLedgerAdminInfo(ledgerHash); | |||
} | |||
@Override | |||
public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) { | |||
@@ -21,7 +21,35 @@ import com.jd.blockchain.crypto.PubKey; | |||
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.*; | |||
import com.jd.blockchain.ledger.AccountHeader; | |||
import com.jd.blockchain.ledger.BlockchainIdentity; | |||
import com.jd.blockchain.ledger.BlockchainKeyGenerator; | |||
import com.jd.blockchain.ledger.BlockchainKeypair; | |||
import com.jd.blockchain.ledger.ContractCodeDeployOperation; | |||
import com.jd.blockchain.ledger.ContractEventSendOperation; | |||
import com.jd.blockchain.ledger.ContractInfo; | |||
import com.jd.blockchain.ledger.DataAccountKVSetOperation; | |||
import com.jd.blockchain.ledger.DataAccountRegisterOperation; | |||
import com.jd.blockchain.ledger.EndpointRequest; | |||
import com.jd.blockchain.ledger.KVDataEntry; | |||
import com.jd.blockchain.ledger.KVInfoVO; | |||
import com.jd.blockchain.ledger.LedgerAdminInfo; | |||
import com.jd.blockchain.ledger.LedgerBlock; | |||
import com.jd.blockchain.ledger.LedgerInfo; | |||
import com.jd.blockchain.ledger.LedgerMetadata; | |||
import com.jd.blockchain.ledger.LedgerTransaction; | |||
import com.jd.blockchain.ledger.NodeRequest; | |||
import com.jd.blockchain.ledger.Operation; | |||
import com.jd.blockchain.ledger.OperationResult; | |||
import com.jd.blockchain.ledger.ParticipantNode; | |||
import com.jd.blockchain.ledger.TransactionContent; | |||
import com.jd.blockchain.ledger.TransactionContentBody; | |||
import com.jd.blockchain.ledger.TransactionRequest; | |||
import com.jd.blockchain.ledger.TransactionRequestBuilder; | |||
import com.jd.blockchain.ledger.TransactionResponse; | |||
import com.jd.blockchain.ledger.TransactionState; | |||
import com.jd.blockchain.ledger.UserInfo; | |||
import com.jd.blockchain.ledger.UserRegisterOperation; | |||
import com.jd.blockchain.ledger.core.CryptoConfig; | |||
import com.jd.blockchain.ledger.core.LedgerDataSet; | |||
import com.jd.blockchain.ledger.core.LedgerEditor; | |||
@@ -93,6 +121,8 @@ public class MockerNodeContext implements BlockchainQueryService { | |||
DataContractRegistry.register(ActionResponse.class); | |||
DataContractRegistry.register(ClientIdentifications.class); | |||
DataContractRegistry.register(ClientIdentification.class); | |||
DataContractRegistry.register(LedgerAdminInfo.class); | |||
ByteArrayObjectUtil.init(); | |||
} | |||
@@ -243,6 +273,11 @@ public class MockerNodeContext implements BlockchainQueryService { | |||
public LedgerInfo getLedger(HashDigest ledgerHash) { | |||
return queryService.getLedger(ledgerHash); | |||
} | |||
@Override | |||
public LedgerAdminInfo getLedgerAdminInfo(HashDigest ledgerHash) { | |||
return queryService.getLedgerAdminInfo(ledgerHash); | |||
} | |||
@Override | |||
public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) { | |||