@@ -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 interface DataCodes { | ||||
public static final int BYTES_VALUE = 0x080; | public static final int BYTES_VALUE = 0x080; | ||||
public static final int BYTES_VALUE_LIST = 0x081; | public static final int BYTES_VALUE_LIST = 0x081; | ||||
public static final int BLOCK_CHAIN_IDENTITY = 0x090; | 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 BLOCK_GENESIS = 0x120; | ||||
public static final int DATA_SNAPSHOT = 0x130; | public static final int DATA_SNAPSHOT = 0x130; | ||||
public static final int LEDGER_ADMIN_INFO = 0x131; | |||||
public static final int TX = 0x200; | 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_RESPONSE = 0x350; | ||||
public static final int TX_OP_RESULT = 0x360; | public static final int TX_OP_RESULT = 0x360; | ||||
// enum types of permissions; | // enum types of permissions; | ||||
public static final int ENUM_TX_PERMISSIONS = 0x401; | public static final int ENUM_TX_PERMISSIONS = 0x401; | ||||
public static final int ENUM_LEDGER_PERMISSIONS = 0x402; | public static final int ENUM_LEDGER_PERMISSIONS = 0x402; | ||||
// contract types of metadata; | // contract types of metadata; | ||||
public static final int METADATA = 0x600; | public static final int METADATA = 0x600; | ||||
public static final int METADATA_INIT_SETTING = 0x610; | public static final int METADATA_INIT_SETTING = 0x610; | ||||
public static final int METADATA_INIT_PROPOSAL = 0x611; | 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_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 = 0x642; | ||||
public static final int METADATA_CRYPTO_SETTING_PROVIDER = 0x643; | public static final int METADATA_CRYPTO_SETTING_PROVIDER = 0x643; | ||||
// public static final int ACCOUNT = 0x700; | // public static final int ACCOUNT = 0x700; | ||||
@@ -88,11 +90,10 @@ public interface DataCodes { | |||||
public static final int DATA = 0x900; | public static final int DATA = 0x900; | ||||
//contract related; | |||||
// contract related; | |||||
public static final int CONTRACT = 0xA00; | public static final int CONTRACT = 0xA00; | ||||
//...0xA19 | |||||
// ...0xA19 | |||||
public static final int HASH = 0xB00; | public static final int HASH = 0xB00; | ||||
public static final int HASH_OBJECT = 0xB10; | 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.disableCircularReferenceDetect(); | ||||
JSONSerializeUtils.configStringSerializer(ByteArray.class); | JSONSerializeUtils.configStringSerializer(ByteArray.class); | ||||
DataContractRegistry.register(BftsmartNodeSettings.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.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.LedgerException; | import com.jd.blockchain.ledger.LedgerException; | ||||
import com.jd.blockchain.ledger.LedgerInitSetting; | import com.jd.blockchain.ledger.LedgerInitSetting; | ||||
import com.jd.blockchain.ledger.ParticipantNode; | 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.Bytes; | ||||
import com.jd.blockchain.utils.Transactional; | import com.jd.blockchain.utils.Transactional; | ||||
public class LedgerAdminAccount implements Transactional, LedgerAdministration { | |||||
public class LedgerAdminAccount implements Transactional, LedgerAdminInfo { | |||||
static { | static { | ||||
DataContractRegistry.register(LedgerMetadata.class); | DataContractRegistry.register(LedgerMetadata.class); | ||||
@@ -174,8 +175,8 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { | |||||
} | } | ||||
Bytes key = encodeSettingsKey(settingsHash); | Bytes key = encodeSettingsKey(settingsHash); | ||||
byte[] bytes = storage.get(key); | 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 + "]"; | String errorMsg = "Verification of the hash for ledger setting failed! --[HASH=" + key + "]"; | ||||
LOGGER.error(errorMsg); | LOGGER.error(errorMsg); | ||||
throw new LedgerException(errorMsg); | throw new LedgerException(errorMsg); | ||||
@@ -240,7 +241,7 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { | |||||
* | * | ||||
* @return | * @return | ||||
*/ | */ | ||||
public LedgerSettings getSetting() { | |||||
public LedgerSettings getSettings() { | |||||
return settings; | 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 java.io.Closeable; | ||||
import com.jd.blockchain.crypto.HashDigest; | import com.jd.blockchain.crypto.HashDigest; | ||||
import com.jd.blockchain.ledger.LedgerAdminInfo; | |||||
import com.jd.blockchain.ledger.LedgerBlock; | import com.jd.blockchain.ledger.LedgerBlock; | ||||
public interface LedgerRepository extends Closeable { | public interface LedgerRepository extends Closeable { | ||||
@@ -51,7 +52,7 @@ public interface LedgerRepository extends Closeable { | |||||
*/ | */ | ||||
LedgerBlock getBlock(long height); | LedgerBlock getBlock(long height); | ||||
LedgerAdministration getAdminInfo(); | |||||
LedgerAdminInfo getAdminInfo(); | |||||
LedgerBlock getBlock(HashDigest hash); | LedgerBlock getBlock(HashDigest hash); | ||||
@@ -69,7 +69,7 @@ public class LedgerManager implements LedgerManage { | |||||
ledgerVersioningStorage); | ledgerVersioningStorage); | ||||
// 校验 crypto service provider ; | // 校验 crypto service provider ; | ||||
CryptoSetting cryptoSetting = ledgerRepo.getAdminAccount().getSetting().getCryptoSetting(); | |||||
CryptoSetting cryptoSetting = ledgerRepo.getAdminAccount().getSettings().getCryptoSetting(); | |||||
checkCryptoSetting(cryptoSetting, ledgerHash); | 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.ContractAccountSet; | ||||
import com.jd.blockchain.ledger.core.DataAccount; | import com.jd.blockchain.ledger.core.DataAccount; | ||||
import com.jd.blockchain.ledger.core.DataAccountSet; | 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.LedgerRepository; | ||||
import com.jd.blockchain.ledger.core.LedgerService; | import com.jd.blockchain.ledger.core.LedgerService; | ||||
import com.jd.blockchain.ledger.core.TransactionSet; | import com.jd.blockchain.ledger.core.TransactionSet; | ||||
@@ -40,15 +39,23 @@ public class LedgerQueryService implements BlockchainQueryService { | |||||
ledgerInfo.setLatestBlockHeight(ledger.getLatestBlockHeight()); | ledgerInfo.setLatestBlockHeight(ledger.getLatestBlockHeight()); | ||||
return ledgerInfo; | 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 | @Override | ||||
public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) { | public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) { | ||||
return ledgerAdministration(ledgerHash).getParticipants(); | |||||
return getLedgerAdminInfo(ledgerHash).getParticipants(); | |||||
} | } | ||||
@Override | @Override | ||||
public LedgerMetadata getLedgerMetadata(HashDigest ledgerHash) { | public LedgerMetadata getLedgerMetadata(HashDigest ledgerHash) { | ||||
return ledgerAdministration(ledgerHash).getMetadata(); | |||||
return getLedgerAdminInfo(ledgerHash).getMetadata(); | |||||
} | } | ||||
@Override | @Override | ||||
@@ -390,10 +397,4 @@ public class LedgerQueryService implements BlockchainQueryService { | |||||
return contractAccountSet.getAccounts(pages[0], pages[1]); | 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.ContractAccountSet; | ||||
import com.jd.blockchain.ledger.core.DataAccountSet; | import com.jd.blockchain.ledger.core.DataAccountSet; | ||||
import com.jd.blockchain.ledger.core.LedgerAdminAccount; | 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.LedgerConsts; | ||||
import com.jd.blockchain.ledger.core.LedgerDataSet; | import com.jd.blockchain.ledger.core.LedgerDataSet; | ||||
import com.jd.blockchain.ledger.core.LedgerEditor; | import com.jd.blockchain.ledger.core.LedgerEditor; | ||||
@@ -244,7 +243,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||||
} | } | ||||
@Override | @Override | ||||
public LedgerAdministration getAdminInfo() { | |||||
public LedgerAdminInfo getAdminInfo() { | |||||
return getAdminAccount(getLatestBlock()); | return getAdminAccount(getLatestBlock()); | ||||
} | } | ||||
@@ -263,7 +262,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||||
if (transactionSet == null) { | if (transactionSet == null) { | ||||
LedgerAdminAccount adminAccount = getAdminAccount(block); | LedgerAdminAccount adminAccount = getAdminAccount(block); | ||||
transactionSet = loadTransactionSet(block.getTransactionSetHash(), | transactionSet = loadTransactionSet(block.getTransactionSetHash(), | ||||
adminAccount.getMetadata().getSetting().getCryptoSetting(), keyPrefix, exPolicyStorage, | |||||
adminAccount.getSettings().getCryptoSetting(), keyPrefix, exPolicyStorage, | |||||
versioningStorage, true); | versioningStorage, true); | ||||
state.transactionSet = transactionSet; | state.transactionSet = transactionSet; | ||||
} | } | ||||
@@ -272,7 +271,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||||
LedgerAdminAccount adminAccount = getAdminAccount(block); | LedgerAdminAccount adminAccount = getAdminAccount(block); | ||||
// All of existing block is readonly; | // All of existing block is readonly; | ||||
return loadTransactionSet(block.getTransactionSetHash(), | return loadTransactionSet(block.getTransactionSetHash(), | ||||
adminAccount.getMetadata().getSetting().getCryptoSetting(), keyPrefix, exPolicyStorage, | |||||
adminAccount.getSettings().getCryptoSetting(), keyPrefix, exPolicyStorage, | |||||
versioningStorage, true); | versioningStorage, true); | ||||
} | } | ||||
@@ -402,7 +401,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||||
} | } | ||||
LedgerBlock previousBlock = getLatestBlock(); | LedgerBlock previousBlock = getLatestBlock(); | ||||
LedgerTransactionalEditor editor = LedgerTransactionalEditor.createEditor(previousBlock, | LedgerTransactionalEditor editor = LedgerTransactionalEditor.createEditor(previousBlock, | ||||
getAdminInfo().getMetadata().getSetting(), keyPrefix, exPolicyStorage, | |||||
getAdminInfo().getSettings(), keyPrefix, exPolicyStorage, | |||||
versioningStorage); | versioningStorage); | ||||
NewBlockCommittingMonitor committingMonitor = new NewBlockCommittingMonitor(editor, this); | NewBlockCommittingMonitor committingMonitor = new NewBlockCommittingMonitor(editor, this); | ||||
this.nextBlockEditor = committingMonitor; | this.nextBlockEditor = committingMonitor; | ||||
@@ -453,7 +452,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||||
// PrefixAppender.prefix(USER_SET_PREFIX, ledgerExStorage), | // PrefixAppender.prefix(USER_SET_PREFIX, ledgerExStorage), | ||||
// PrefixAppender.prefix(USER_SET_PREFIX, ledgerVerStorage), | // PrefixAppender.prefix(USER_SET_PREFIX, ledgerVerStorage), | ||||
// DEFAULT_ACCESS_POLICY); | // DEFAULT_ACCESS_POLICY); | ||||
UserAccountSet userAccountSet = new UserAccountSet(adminAccount.getSetting().getCryptoSetting(), | |||||
UserAccountSet userAccountSet = new UserAccountSet(adminAccount.getSettings().getCryptoSetting(), | |||||
usersetKeyPrefix, ledgerExStorage, ledgerVerStorage, DEFAULT_ACCESS_POLICY); | usersetKeyPrefix, ledgerExStorage, ledgerVerStorage, DEFAULT_ACCESS_POLICY); | ||||
// DataAccountSet dataAccountSet = new | // DataAccountSet dataAccountSet = new | ||||
@@ -461,7 +460,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||||
// PrefixAppender.prefix(DATA_SET_PREFIX, ledgerExStorage), | // PrefixAppender.prefix(DATA_SET_PREFIX, ledgerExStorage), | ||||
// PrefixAppender.prefix(DATA_SET_PREFIX, ledgerVerStorage), | // PrefixAppender.prefix(DATA_SET_PREFIX, ledgerVerStorage), | ||||
// DEFAULT_ACCESS_POLICY); | // DEFAULT_ACCESS_POLICY); | ||||
DataAccountSet dataAccountSet = new DataAccountSet(adminAccount.getSetting().getCryptoSetting(), | |||||
DataAccountSet dataAccountSet = new DataAccountSet(adminAccount.getSettings().getCryptoSetting(), | |||||
datasetKeyPrefix, ledgerExStorage, ledgerVerStorage, DEFAULT_ACCESS_POLICY); | datasetKeyPrefix, ledgerExStorage, ledgerVerStorage, DEFAULT_ACCESS_POLICY); | ||||
// ContractAccountSet contractAccountSet = new | // ContractAccountSet contractAccountSet = new | ||||
@@ -469,7 +468,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { | |||||
// PrefixAppender.prefix(CONTRACT_SET_PREFIX, ledgerExStorage), | // PrefixAppender.prefix(CONTRACT_SET_PREFIX, ledgerExStorage), | ||||
// PrefixAppender.prefix(CONTRACT_SET_PREFIX, ledgerVerStorage), | // PrefixAppender.prefix(CONTRACT_SET_PREFIX, ledgerVerStorage), | ||||
// DEFAULT_ACCESS_POLICY); | // DEFAULT_ACCESS_POLICY); | ||||
ContractAccountSet contractAccountSet = new ContractAccountSet(adminAccount.getSetting().getCryptoSetting(), | |||||
ContractAccountSet contractAccountSet = new ContractAccountSet(adminAccount.getSettings().getCryptoSetting(), | |||||
contractsetKeyPrefix, ledgerExStorage, ledgerVerStorage, DEFAULT_ACCESS_POLICY); | contractsetKeyPrefix, ledgerExStorage, ledgerVerStorage, DEFAULT_ACCESS_POLICY); | ||||
LedgerDataSetImpl newDataSet = new LedgerDataSetImpl(adminAccount, userAccountSet, dataAccountSet, | LedgerDataSetImpl newDataSet = new LedgerDataSetImpl(adminAccount, userAccountSet, dataAccountSet, | ||||
@@ -262,7 +262,7 @@ public class LedgerTransactionalEditor implements LedgerEditor { | |||||
GenesisSnapshot snpht = (GenesisSnapshot) startingPoint; | GenesisSnapshot snpht = (GenesisSnapshot) startingPoint; | ||||
txDataset = LedgerRepositoryImpl.newDataSet(snpht.initSetting, ledgerKeyPrefix, txBufferedStorage, | txDataset = LedgerRepositoryImpl.newDataSet(snpht.initSetting, ledgerKeyPrefix, txBufferedStorage, | ||||
txBufferedStorage); | txBufferedStorage); | ||||
txset = LedgerRepositoryImpl.newTransactionSet(txDataset.getAdminAccount().getSetting(), | |||||
txset = LedgerRepositoryImpl.newTransactionSet(txDataset.getAdminAccount().getSettings(), | |||||
ledgerKeyPrefix, txBufferedStorage, txBufferedStorage); | ledgerKeyPrefix, txBufferedStorage, txBufferedStorage); | ||||
} else if (startingPoint instanceof TxSnapshot) { | } else if (startingPoint instanceof TxSnapshot) { | ||||
// 新的区块; | // 新的区块; | ||||
@@ -38,6 +38,11 @@ public class ContractLedgerContext implements LedgerContext { | |||||
public LedgerInfo getLedger(HashDigest ledgerHash) { | public LedgerInfo getLedger(HashDigest ledgerHash) { | ||||
return innerQueryService.getLedger(ledgerHash); | return innerQueryService.getLedger(ledgerHash); | ||||
} | } | ||||
@Override | |||||
public LedgerAdminInfo getLedgerAdminInfo(HashDigest ledgerHash) { | |||||
return innerQueryService.getLedgerAdminInfo(ledgerHash); | |||||
} | |||||
@Override | @Override | ||||
public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) { | public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) { | ||||
@@ -166,14 +166,15 @@ public class LedgerAdminAccountTest { | |||||
assertTrue(BytesUtils.equals(expMeta.getSeed(), rlmeta.getSeed())); | 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) { | private void verifyReadlingParities(LedgerAdminAccount actualAccount, ParticipantNode[] expParties) { | ||||
@@ -210,7 +211,7 @@ public class LedgerAdminAccountTest { | |||||
ex = null; | ex = null; | ||||
try { | try { | ||||
LedgerConfiguration newLedgerSetting = new LedgerConfiguration(actualAccount.getSetting()); | |||||
LedgerConfiguration newLedgerSetting = new LedgerConfiguration(actualAccount.getSettings()); | |||||
actualAccount.setLedgerSetting(newLedgerSetting); | actualAccount.setLedgerSetting(newLedgerSetting); | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
ex = e; | ex = e; | ||||
@@ -16,6 +16,7 @@ import com.jd.blockchain.binaryproto.BinaryProtocol; | |||||
import com.jd.blockchain.binaryproto.DataContractRegistry; | import com.jd.blockchain.binaryproto.DataContractRegistry; | ||||
import com.jd.blockchain.crypto.AddressEncoding; | import com.jd.blockchain.crypto.AddressEncoding; | ||||
import com.jd.blockchain.crypto.Crypto; | import com.jd.blockchain.crypto.Crypto; | ||||
import com.jd.blockchain.crypto.CryptoAlgorithm; | |||||
import com.jd.blockchain.crypto.CryptoProvider; | import com.jd.blockchain.crypto.CryptoProvider; | ||||
import com.jd.blockchain.crypto.HashDigest; | import com.jd.blockchain.crypto.HashDigest; | ||||
import com.jd.blockchain.crypto.PubKey; | import com.jd.blockchain.crypto.PubKey; | ||||
@@ -74,12 +75,14 @@ public class LedgerMetaDataTest { | |||||
cryptoConfig.setAutoVerifyHash(true); | cryptoConfig.setAutoVerifyHash(true); | ||||
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256); | 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(); | LedgerAdminAccount.LedgerMetadataImpl ledgerMetadata = new LedgerAdminAccount.LedgerMetadataImpl(); | ||||
ledgerMetadata.setSeed(seed); | ledgerMetadata.setSeed(seed); | ||||
ledgerMetadata.setSetting(ledgerConfiguration); | |||||
ledgerMetadata.setSettingsHash(settingsHash); | |||||
HashDigest hashDigest = new HashDigest(ClassicAlgorithm.SHA256, rawDigestBytes); | HashDigest hashDigest = new HashDigest(ClassicAlgorithm.SHA256, rawDigestBytes); | ||||
ledgerMetadata.setParticipantsHash(hashDigest); | ledgerMetadata.setParticipantsHash(hashDigest); | ||||
@@ -91,7 +94,7 @@ public class LedgerMetaDataTest { | |||||
// verify start | // verify start | ||||
assertArrayEquals(ledgerMetadata.getSeed(), deLedgerMetaData.getSeed()); | assertArrayEquals(ledgerMetadata.getSeed(), deLedgerMetaData.getSeed()); | ||||
assertEquals(ledgerMetadata.getParticipantsHash(), deLedgerMetaData.getParticipantsHash()); | assertEquals(ledgerMetadata.getParticipantsHash(), deLedgerMetaData.getParticipantsHash()); | ||||
assertNotEquals(ledgerMetadata.getSetting(), deLedgerMetaData.getSetting()); | |||||
assertEquals(ledgerMetadata.getSettingsHash(), deLedgerMetaData.getSettingsHash()); | |||||
return; | 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) | @DataField(order = 2, primitiveType = PrimitiveType.BYTES) | ||||
HashDigest getParticipantsHash(); | HashDigest getParticipantsHash(); | ||||
// /** | |||||
// * 账本配置; | |||||
// * | |||||
// * @return | |||||
// */ | |||||
// @DataField(order = 3, refContract = true) | |||||
// LedgerSetting getSetting(); | |||||
/** | /** | ||||
* 账本配置的哈希; | * 账本配置的哈希; | ||||
* | * | ||||
@@ -1,7 +1,21 @@ | |||||
package com.jd.blockchain.transaction; | package com.jd.blockchain.transaction; | ||||
import org.springframework.cglib.core.Block; | |||||
import com.jd.blockchain.crypto.HashDigest; | 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); | LedgerInfo getLedger(HashDigest ledgerHash); | ||||
/** | |||||
* 返回当前账本的参与者信息列表 | |||||
* | |||||
* @param ledgerHash | |||||
* @return | |||||
*/ | |||||
/** | |||||
* 获取账本信息; | |||||
* | |||||
* @param ledgerHash | |||||
* @return 账本对象;如果不存在,则返回 null; | |||||
*/ | |||||
LedgerAdminInfo getLedgerAdminInfo(HashDigest ledgerHash); | |||||
/** | |||||
* 返回当前账本的参与者信息列表 | |||||
* | |||||
* @param ledgerHash | |||||
* @return | |||||
*/ | |||||
ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash); | ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash); | ||||
/** | /** | ||||
@@ -47,10 +69,8 @@ public interface BlockchainQueryService { | |||||
/** | /** | ||||
* 返回指定账本序号的区块; | * 返回指定账本序号的区块; | ||||
* | * | ||||
* @param ledgerHash | |||||
* 账本hash; | |||||
* @param height | |||||
* 高度; | |||||
* @param ledgerHash 账本hash; | |||||
* @param height 高度; | |||||
* @return | * @return | ||||
*/ | */ | ||||
LedgerBlock getBlock(HashDigest ledgerHash, long height); | LedgerBlock getBlock(HashDigest ledgerHash, long height); | ||||
@@ -58,10 +78,8 @@ public interface BlockchainQueryService { | |||||
/** | /** | ||||
* 返回指定区块hash的区块; | * 返回指定区块hash的区块; | ||||
* | * | ||||
* @param ledgerHash | |||||
* 账本hash; | |||||
* @param blockHash | |||||
* 区块hash; | |||||
* @param ledgerHash 账本hash; | |||||
* @param blockHash 区块hash; | |||||
* @return | * @return | ||||
*/ | */ | ||||
LedgerBlock getBlock(HashDigest ledgerHash, HashDigest blockHash); | LedgerBlock getBlock(HashDigest ledgerHash, HashDigest blockHash); | ||||
@@ -84,125 +102,116 @@ public interface BlockchainQueryService { | |||||
*/ | */ | ||||
long getTransactionCount(HashDigest ledgerHash, HashDigest blockHash); | long getTransactionCount(HashDigest ledgerHash, HashDigest blockHash); | ||||
/** | |||||
* 返回当前账本的交易总数 | |||||
* | |||||
* @param ledgerHash | |||||
* @return | |||||
*/ | |||||
/** | |||||
* 返回当前账本的交易总数 | |||||
* | |||||
* @param ledgerHash | |||||
* @return | |||||
*/ | |||||
long getTransactionTotalCount(HashDigest ledgerHash); | long getTransactionTotalCount(HashDigest ledgerHash); | ||||
/** | |||||
* 返回指定高度的区块中记录的数据账户总数 | |||||
* | |||||
* @param ledgerHash | |||||
* @param height | |||||
* @return | |||||
*/ | |||||
/** | |||||
* 返回指定高度的区块中记录的数据账户总数 | |||||
* | |||||
* @param ledgerHash | |||||
* @param height | |||||
* @return | |||||
*/ | |||||
long getDataAccountCount(HashDigest ledgerHash, long height); | long getDataAccountCount(HashDigest ledgerHash, long height); | ||||
/** | |||||
* 返回指定的区块中记录的数据账户总数 | |||||
* | |||||
* @param ledgerHash | |||||
* @param blockHash | |||||
* @return | |||||
*/ | |||||
/** | |||||
* 返回指定的区块中记录的数据账户总数 | |||||
* | |||||
* @param ledgerHash | |||||
* @param blockHash | |||||
* @return | |||||
*/ | |||||
long getDataAccountCount(HashDigest ledgerHash, HashDigest blockHash); | 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); | long getUserCount(HashDigest ledgerHash, long height); | ||||
/** | |||||
* 返回指定区块中的用户总数 | |||||
* | |||||
* @param ledgerHash | |||||
* @param blockHash | |||||
* @return | |||||
*/ | |||||
/** | |||||
* 返回指定区块中的用户总数 | |||||
* | |||||
* @param ledgerHash | |||||
* @param blockHash | |||||
* @return | |||||
*/ | |||||
long getUserCount(HashDigest ledgerHash, HashDigest blockHash); | 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 | * @param ledgerHash | ||||
* 账本hash; | |||||
* @param height | * @param height | ||||
* 账本高度; | |||||
* @param fromIndex | |||||
* 开始的记录数; | |||||
* @param count | |||||
* 本次返回的记录数;<br> | |||||
* 最小为1,最大值受到系统参数的限制;<br> | |||||
* 注:通过 {@link #getBlock(String, long)} 方法获得的区块信息中可以得到区块的总交易数 | |||||
* {@link Block#getTxCount()}; | |||||
* @return | * @return | ||||
*/ | */ | ||||
LedgerTransaction[] getTransactions(HashDigest ledgerHash, long height, int fromIndex, int count); | |||||
long getContractCount(HashDigest ledgerHash, long height); | |||||
/** | /** | ||||
* 分页返回指定账本序号的区块中的交易列表; | |||||
* 返回指定区块中的合约总数 | |||||
* | * | ||||
* @param ledgerHash | * @param ledgerHash | ||||
* 账本hash; | |||||
* @param blockHash | * @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 | * @return | ||||
*/ | */ | ||||
LedgerTransaction[] getTransactions(HashDigest ledgerHash, HashDigest blockHash, int fromIndex, int count); | 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 | * @return | ||||
*/ | */ | ||||
LedgerTransaction getTransactionByContentHash(HashDigest ledgerHash, HashDigest contentHash); | 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 | * @return | ||||
*/ | */ | ||||
TransactionState getTransactionStateByContentHash(HashDigest ledgerHash, HashDigest contentHash); | TransactionState getTransactionStateByContentHash(HashDigest ledgerHash, HashDigest contentHash); | ||||
@@ -273,18 +278,13 @@ public interface BlockchainQueryService { | |||||
long getDataEntriesTotalCount(HashDigest ledgerHash, String address); | 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 | * @return | ||||
*/ | */ | ||||
KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count); | KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count); | ||||
@@ -300,6 +300,7 @@ public interface BlockchainQueryService { | |||||
/** | /** | ||||
* get users by ledgerHash and its range; | * get users by ledgerHash and its range; | ||||
* | |||||
* @param ledgerHash | * @param ledgerHash | ||||
* @param fromIndex | * @param fromIndex | ||||
* @param count | * @param count | ||||
@@ -309,6 +310,7 @@ public interface BlockchainQueryService { | |||||
/** | /** | ||||
* get data accounts by ledgerHash and its range; | * get data accounts by ledgerHash and its range; | ||||
* | |||||
* @param ledgerHash | * @param ledgerHash | ||||
* @param fromIndex | * @param fromIndex | ||||
* @param count | * @param count | ||||
@@ -318,6 +320,7 @@ public interface BlockchainQueryService { | |||||
/** | /** | ||||
* get contract accounts by ledgerHash and its range; | * get contract accounts by ledgerHash and its range; | ||||
* | |||||
* @param ledgerHash | * @param ledgerHash | ||||
* @param fromIndex | * @param fromIndex | ||||
* @param count | * @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.ContractAccountSet; | ||||
import com.jd.blockchain.ledger.core.DataAccount; | import com.jd.blockchain.ledger.core.DataAccount; | ||||
import com.jd.blockchain.ledger.core.DataAccountSet; | 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.LedgerRepository; | ||||
import com.jd.blockchain.ledger.core.LedgerService; | import com.jd.blockchain.ledger.core.LedgerService; | ||||
import com.jd.blockchain.ledger.core.ParticipantCertData; | import com.jd.blockchain.ledger.core.ParticipantCertData; | ||||
@@ -57,7 +56,7 @@ public class LedgerQueryController implements BlockchainQueryService { | |||||
@Override | @Override | ||||
public ParticipantNode[] getConsensusParticipants(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) { | public ParticipantNode[] getConsensusParticipants(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) { | ||||
LedgerRepository ledger = ledgerService.getLedger(ledgerHash); | LedgerRepository ledger = ledgerService.getLedger(ledgerHash); | ||||
LedgerAdministration ledgerAdministration = ledger.getAdminInfo(); | |||||
LedgerAdminInfo ledgerAdministration = ledger.getAdminInfo(); | |||||
long participantCount = ledgerAdministration.getParticipantCount(); | long participantCount = ledgerAdministration.getParticipantCount(); | ||||
if (participantCount <= 0) { | if (participantCount <= 0) { | ||||
return null; | return null; | ||||
@@ -73,12 +72,20 @@ public class LedgerQueryController implements BlockchainQueryService { | |||||
} | } | ||||
return null; | 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") | @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/metadata") | ||||
@Override | @Override | ||||
public LedgerMetadata getLedgerMetadata(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) { | public LedgerMetadata getLedgerMetadata(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) { | ||||
LedgerRepository ledger = ledgerService.getLedger(ledgerHash); | LedgerRepository ledger = ledgerService.getLedger(ledgerHash); | ||||
LedgerAdministration ledgerAdministration = ledger.getAdminInfo(); | |||||
LedgerAdminInfo ledgerAdministration = ledger.getAdminInfo(); | |||||
LedgerMetadata ledgerMetadata = ledgerAdministration.getMetadata(); | LedgerMetadata ledgerMetadata = ledgerAdministration.getMetadata(); | ||||
return ledgerMetadata; | return ledgerMetadata; | ||||
} | } | ||||
@@ -37,6 +37,7 @@ import com.jd.blockchain.ledger.CryptoSetting; | |||||
import com.jd.blockchain.ledger.DataAccountKVSetOperation; | import com.jd.blockchain.ledger.DataAccountKVSetOperation; | ||||
import com.jd.blockchain.ledger.DataAccountRegisterOperation; | import com.jd.blockchain.ledger.DataAccountRegisterOperation; | ||||
import com.jd.blockchain.ledger.EndpointRequest; | import com.jd.blockchain.ledger.EndpointRequest; | ||||
import com.jd.blockchain.ledger.LedgerAdminInfo; | |||||
import com.jd.blockchain.ledger.LedgerBlock; | import com.jd.blockchain.ledger.LedgerBlock; | ||||
import com.jd.blockchain.ledger.LedgerInitOperation; | import com.jd.blockchain.ledger.LedgerInitOperation; | ||||
import com.jd.blockchain.ledger.NodeRequest; | import com.jd.blockchain.ledger.NodeRequest; | ||||
@@ -121,6 +122,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(LedgerAdminInfo.class); | |||||
} | } | ||||
@@ -225,10 +228,10 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag | |||||
// load provider; | // load provider; | ||||
LedgerAdminAccount ledgerAdminAccount = ledgerRepository.getAdminAccount(); | LedgerAdminAccount ledgerAdminAccount = ledgerRepository.getAdminAccount(); | ||||
String consensusProvider = ledgerAdminAccount.getSetting().getConsensusProvider(); | |||||
String consensusProvider = ledgerAdminAccount.getSettings().getConsensusProvider(); | |||||
ConsensusProvider provider = ConsensusProviders.getProvider(consensusProvider); | ConsensusProvider provider = ConsensusProviders.getProvider(consensusProvider); | ||||
// find current node; | // find current node; | ||||
Bytes csSettingBytes = ledgerAdminAccount.getSetting().getConsensusSetting(); | |||||
Bytes csSettingBytes = ledgerAdminAccount.getSettings().getConsensusSetting(); | |||||
ConsensusSettings csSettings = provider.getSettingsFactory().getConsensusSettingsEncoder() | ConsensusSettings csSettings = provider.getSettingsFactory().getConsensusSettingsEncoder() | ||||
.decode(csSettingBytes.toBytes()); | .decode(csSettingBytes.toBytes()); | ||||
NodeSettings currentNode = null; | NodeSettings currentNode = null; | ||||
@@ -247,7 +250,7 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag | |||||
NodeServer server = provider.getServerFactory().setupServer(serverSettings, consensusMessageHandler, | NodeServer server = provider.getServerFactory().setupServer(serverSettings, consensusMessageHandler, | ||||
consensusStateManager); | consensusStateManager); | ||||
ledgerPeers.put(ledgerHash, server); | ledgerPeers.put(ledgerHash, server); | ||||
ledgerCryptoSettings.put(ledgerHash, ledgerAdminAccount.getSetting().getCryptoSetting()); | |||||
ledgerCryptoSettings.put(ledgerHash, ledgerAdminAccount.getSettings().getCryptoSetting()); | |||||
return server; | return server; | ||||
} | } | ||||
@@ -32,6 +32,11 @@ public abstract class BlockchainServiceProxy implements BlockchainService { | |||||
public LedgerInfo getLedger(HashDigest ledgerHash) { | public LedgerInfo getLedger(HashDigest ledgerHash) { | ||||
return getQueryService(ledgerHash).getLedger(ledgerHash); | return getQueryService(ledgerHash).getLedger(ledgerHash); | ||||
} | } | ||||
@Override | |||||
public LedgerAdminInfo getLedgerAdminInfo(HashDigest ledgerHash) { | |||||
return getQueryService(ledgerHash).getLedgerAdminInfo(ledgerHash); | |||||
} | |||||
@Override | @Override | ||||
public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) { | 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.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.*; | |||||
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.CryptoConfig; | ||||
import com.jd.blockchain.ledger.core.LedgerDataSet; | import com.jd.blockchain.ledger.core.LedgerDataSet; | ||||
import com.jd.blockchain.ledger.core.LedgerEditor; | import com.jd.blockchain.ledger.core.LedgerEditor; | ||||
@@ -93,6 +121,8 @@ public class MockerNodeContext implements BlockchainQueryService { | |||||
DataContractRegistry.register(ActionResponse.class); | DataContractRegistry.register(ActionResponse.class); | ||||
DataContractRegistry.register(ClientIdentifications.class); | DataContractRegistry.register(ClientIdentifications.class); | ||||
DataContractRegistry.register(ClientIdentification.class); | DataContractRegistry.register(ClientIdentification.class); | ||||
DataContractRegistry.register(LedgerAdminInfo.class); | |||||
ByteArrayObjectUtil.init(); | ByteArrayObjectUtil.init(); | ||||
} | } | ||||
@@ -243,6 +273,11 @@ public class MockerNodeContext implements BlockchainQueryService { | |||||
public LedgerInfo getLedger(HashDigest ledgerHash) { | public LedgerInfo getLedger(HashDigest ledgerHash) { | ||||
return queryService.getLedger(ledgerHash); | return queryService.getLedger(ledgerHash); | ||||
} | } | ||||
@Override | |||||
public LedgerAdminInfo getLedgerAdminInfo(HashDigest ledgerHash) { | |||||
return queryService.getLedgerAdminInfo(ledgerHash); | |||||
} | |||||
@Override | @Override | ||||
public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) { | public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) { | ||||