use of com.jd.blockchain.ledger.TransactionResponse in project jdchain-core by blockchain-jd-com.
the class BftsmartNodeServer method updateAppResponses.
@Override
public List<byte[]> updateAppResponses(List<byte[]> asyncResponseLinkedList, byte[] commonHash, boolean isConsistent) {
List<byte[]> updatedResponses = new ArrayList<>();
TxResponseMessage resp = null;
for (int i = 0; i < asyncResponseLinkedList.size(); i++) {
TransactionResponse txResponse = BinaryProtocol.decode(asyncResponseLinkedList.get(i));
if (isConsistent) {
resp = new TxResponseMessage(txResponse.getContentHash());
} else {
resp = new TxResponseMessage(Crypto.resolveAsHashDigest(commonHash));
}
resp.setExecutionState(TransactionState.IGNORED_BY_BLOCK_FULL_ROLLBACK);
updatedResponses.add(BinaryProtocol.encode(resp, TransactionResponse.class));
}
return updatedResponses;
}
use of com.jd.blockchain.ledger.TransactionResponse in project jdchain-core by blockchain-jd-com.
the class TransactionBatchProcessorTest method testMultiTxsProcess.
@Test
public void testMultiTxsProcess() {
final MemoryKVStorage STORAGE = new MemoryKVStorage();
// 初始化账本到指定的存储库;
HashDigest ledgerHash = LedgerTestUtils.initLedger(STORAGE, parti0, parti1, parti2, parti3);
// 加载账本;
LedgerManager ledgerManager = new LedgerManager();
LedgerRepository ledgerRepo = ledgerManager.register(ledgerHash, STORAGE, LedgerDataStructure.MERKLE_TREE);
// 验证参与方账户的存在;
LedgerDataSet previousBlockDataset = ledgerRepo.getLedgerDataSet(ledgerRepo.getLatestBlock());
UserAccount user0 = previousBlockDataset.getUserAccountSet().getAccount(parti0.getAddress());
assertNotNull(user0);
boolean partiRegistered = previousBlockDataset.getUserAccountSet().contains(parti0.getAddress());
assertTrue(partiRegistered);
// 生成新区块;
LedgerEditor newBlockEditor = ledgerRepo.createNextBlock();
OperationHandleRegisteration opReg = new DefaultOperationHandleRegisteration();
LedgerSecurityManager securityManager = getSecurityManager();
TransactionBatchProcessor txbatchProcessor = new TransactionBatchProcessor(securityManager, newBlockEditor, ledgerRepo, opReg);
// 注册新用户;
BlockchainKeypair userKeypair1 = BlockchainKeyGenerator.getInstance().generate();
TransactionRequest transactionRequest1 = LedgerTestUtils.createTxRequest_UserReg(userKeypair1, ledgerHash, parti0, parti0);
TransactionResponse txResp1 = txbatchProcessor.schedule(transactionRequest1);
BlockchainKeypair userKeypair2 = BlockchainKeyGenerator.getInstance().generate();
TransactionRequest transactionRequest2 = LedgerTestUtils.createTxRequest_UserReg(userKeypair2, ledgerHash, parti0, parti0);
TransactionResponse txResp2 = txbatchProcessor.schedule(transactionRequest2);
LedgerBlock newBlock = newBlockEditor.prepare();
newBlockEditor.commit();
assertEquals(TransactionState.SUCCESS, txResp1.getExecutionState());
assertEquals(TransactionState.SUCCESS, txResp2.getExecutionState());
// 验证正确性;
ledgerManager = new LedgerManager();
ledgerRepo = ledgerManager.register(ledgerHash, STORAGE, LedgerDataStructure.MERKLE_TREE);
LedgerBlock latestBlock = ledgerRepo.getLatestBlock();
assertEquals(newBlock.getHash(), latestBlock.getHash());
assertEquals(1, newBlock.getHeight());
LedgerDataSet ledgerDS = ledgerRepo.getLedgerDataSet(latestBlock);
boolean existUser1 = ledgerDS.getUserAccountSet().contains(userKeypair1.getAddress());
boolean existUser2 = ledgerDS.getUserAccountSet().contains(userKeypair2.getAddress());
assertTrue(existUser1);
assertTrue(existUser2);
}
use of com.jd.blockchain.ledger.TransactionResponse in project jdchain-core by blockchain-jd-com.
the class TransactionBatchProcessorTest method testTxRollback.
@Test
public void testTxRollback() {
System.out.println("------------ keys -----------");
System.out.printf("Parti0 -- PUB:[%s]; PRIV:[%s]\r\n", parti0.getPubKey().toBase58(), parti0.getPrivKey().toBase58());
System.out.printf("Parti1 -- PUB:[%s]; PRIV:[%s]\r\n", parti1.getPubKey().toBase58(), parti1.getPrivKey().toBase58());
System.out.printf("Parti2 -- PUB:[%s]; PRIV:[%s]\r\n", parti2.getPubKey().toBase58(), parti2.getPrivKey().toBase58());
System.out.printf("Parti3 -- PUB:[%s]; PRIV:[%s]\r\n", parti3.getPubKey().toBase58(), parti3.getPrivKey().toBase58());
System.out.println("------------ end-keys -----------");
final MemoryKVStorage STORAGE = new MemoryKVStorage();
// 初始化账本到指定的存储库;
HashDigest ledgerHash = LedgerTestUtils.initLedger(STORAGE, parti0, parti1, parti2, parti3);
System.out.printf("\r\n------------ LEDGER [%s] -----------\r\n", ledgerHash.toBase58());
// 加载账本;
LedgerManager ledgerManager = new LedgerManager();
LedgerRepository ledgerRepo = ledgerManager.register(ledgerHash, STORAGE, LedgerDataStructure.MERKLE_TREE);
CryptoSetting cryptoSetting = ledgerRepo.getAdminSettings().getSettings().getCryptoSetting();
// 验证参与方账户的存在;
LedgerDataSet previousBlockDataset = ledgerRepo.getLedgerDataSet(ledgerRepo.getLatestBlock());
UserAccount user0 = previousBlockDataset.getUserAccountSet().getAccount(parti0.getAddress());
assertNotNull(user0);
boolean partiRegistered = previousBlockDataset.getUserAccountSet().contains(parti0.getAddress());
assertTrue(partiRegistered);
// 生成新区块;
LedgerEditor newBlockEditor = ledgerRepo.createNextBlock();
OperationHandleRegisteration opReg = new DefaultOperationHandleRegisteration();
LedgerSecurityManager securityManager = getSecurityManager();
TransactionBatchProcessor txbatchProcessor = new TransactionBatchProcessor(securityManager, newBlockEditor, ledgerRepo, opReg);
// 注册新用户;
// BlockchainKeypair userKeypair1 = BlockchainKeyGenerator.getInstance().generate();
BlockchainKeypair userKeypair1 = LedgerTestUtils.createKeyPair("7VeRKf3GFLFcBfzvtzmtyMXEoX2HYGEJ4j7CmHcnRV99W5Dp", "7VeRYQjeAaQY5Po8MMtmGNHA2SniqLXmJaZwBS5K8zTtMAU1");
TransactionRequest transactionRequest1 = LedgerTestUtils.createTxRequest_UserReg_SHA256(userKeypair1, ledgerHash, 1580315317127L, parti0, parti0);
// 错误参数:ts=1580315317127; txhash=j5wPGKT5CUzwi8j6VfCWaP2p9YZ6WVWtMANp9HbHWzvhgG
System.out.printf("\r\n ===||=== transactionRequest1.getTransactionHash()=[%s]\r\n", transactionRequest1.getTransactionHash().toBase58());
TransactionResponse txResp1 = txbatchProcessor.schedule(transactionRequest1);
// BlockchainKeypair userKeypair2 = BlockchainKeyGenerator.getInstance().generate();
BlockchainKeypair userKeypair2 = LedgerTestUtils.createKeyPair("7VeRKSnDFveTfLLMsLZDmmhGmgf7i142XHgBFjnrKuS95tY3", "7VeRTiJ2TpQD9aBi29ajnqdntgoVBANmC3oCbHThKb5tzfTJ");
TransactionRequest transactionRequest2 = LedgerTestUtils.createTxRequest_MultiOPs_WithNotExistedDataAccount_SHA256(userKeypair2, ledgerHash, 202001202020L, parti0, parti0);
System.out.printf("\r\n ===||=== transactionRequest2.getTransactionHash()=[%s]\r\n", transactionRequest2.getTransactionHash().toBase58());
TransactionResponse txResp2 = txbatchProcessor.schedule(transactionRequest2);
// BlockchainKeypair userKeypair3 = BlockchainKeyGenerator.getInstance().generate();
BlockchainKeypair userKeypair3 = LedgerTestUtils.createKeyPair("7VeRDoaSexqLWKkaZyrQwdwSuE9n5nszduMrYBfYRfEkREQV", "7VeRdFtTuLfrzCYJzQ6enQUkGTc83ATgjr8WbmfjBQuTFpHt");
TransactionRequest transactionRequest3 = LedgerTestUtils.createTxRequest_UserReg_SHA256(userKeypair3, ledgerHash, 202001202020L, parti0, parti0);
System.out.printf("\r\n ===||=== transactionRequest3.getTransactionHash()=[%s]\r\n", transactionRequest3.getTransactionHash().toBase58());
TransactionResponse txResp3 = txbatchProcessor.schedule(transactionRequest3);
LedgerBlock newBlock = newBlockEditor.prepare();
newBlockEditor.commit();
// 在重新加载之前验证一次;
long blockHeight = newBlock.getHeight();
assertEquals(1, blockHeight);
HashDigest blockHash = newBlock.getHash();
assertNotNull(blockHash);
assertEquals(TransactionState.SUCCESS, txResp1.getExecutionState());
assertEquals(TransactionState.DATA_ACCOUNT_DOES_NOT_EXIST, txResp2.getExecutionState());
assertEquals(TransactionState.SUCCESS, txResp3.getExecutionState());
LedgerTransaction tx1 = ledgerRepo.getTransactionSet().getTransaction(transactionRequest1.getTransactionHash());
LedgerTransaction tx2 = ledgerRepo.getTransactionSet().getTransaction(transactionRequest2.getTransactionHash());
LedgerTransaction tx3 = ledgerRepo.getTransactionSet().getTransaction(transactionRequest3.getTransactionHash());
assertNotNull(tx3);
assertEquals(TransactionState.SUCCESS, tx3.getResult().getExecutionState());
assertNotNull(tx2);
assertEquals(TransactionState.DATA_ACCOUNT_DOES_NOT_EXIST, tx2.getResult().getExecutionState());
assertNotNull(tx1);
assertEquals(TransactionState.SUCCESS, tx1.getResult().getExecutionState());
HashDigest txsetRootHash = ledgerRepo.getTransactionSet().getRootHash();
// 单独加载交易集合;
TransactionSetEditor txset = new TransactionSetEditor(-1, txsetRootHash, cryptoSetting, "LDG://3A3dP4", STORAGE, STORAGE, LedgerDataStructure.MERKLE_TREE, false);
tx1 = txset.getTransaction(transactionRequest1.getTransactionHash());
// tx2 = txset.get(transactionRequest2.getTransactionHash());
tx3 = txset.getTransaction(transactionRequest3.getTransactionHash());
assertNotNull(tx3);
// assertNotNull(tx2);
assertNotNull(tx1);
// 重新加载之后验证正确性;
ledgerManager = new LedgerManager();
ledgerRepo = ledgerManager.register(ledgerHash, STORAGE, LedgerDataStructure.MERKLE_TREE);
LedgerBlock latestBlock = ledgerRepo.getLatestBlock();
assertEquals(blockHash, latestBlock.getHash());
assertEquals(blockHeight, latestBlock.getHeight());
assertEquals(txsetRootHash, ledgerRepo.getTransactionSet().getRootHash());
tx1 = ledgerRepo.getTransactionSet().getTransaction(transactionRequest1.getTransactionHash());
tx2 = ledgerRepo.getTransactionSet().getTransaction(transactionRequest2.getTransactionHash());
tx3 = ledgerRepo.getTransactionSet().getTransaction(transactionRequest3.getTransactionHash());
assertNotNull(tx1);
assertEquals(TransactionState.SUCCESS, tx1.getResult().getExecutionState());
assertNotNull(tx2);
assertEquals(TransactionState.DATA_ACCOUNT_DOES_NOT_EXIST, tx2.getResult().getExecutionState());
assertNotNull(tx3);
assertEquals(TransactionState.SUCCESS, tx3.getResult().getExecutionState());
LedgerDataSet ledgerDS = ledgerRepo.getLedgerDataSet(latestBlock);
boolean existUser1 = ledgerDS.getUserAccountSet().contains(userKeypair1.getAddress());
boolean existUser2 = ledgerDS.getUserAccountSet().contains(userKeypair2.getAddress());
boolean existUser3 = ledgerDS.getUserAccountSet().contains(userKeypair3.getAddress());
assertTrue(existUser1);
assertFalse(existUser2);
assertTrue(existUser3);
}
use of com.jd.blockchain.ledger.TransactionResponse in project jdchain-core by blockchain-jd-com.
the class LedgerInitializer method prepareLedger.
/**
* 初始化账本数据,返回创始区块;
*
* @param ledgerEditor
* @return
*/
private LedgerBlock prepareLedger(LedgerEditor ledgerEditor, DigitalSignature... nodeSignatures) {
// 初始化时,自动将参与方注册为账本的用户;
HashDigest txHash = TxBuilder.computeTxContentHash(initSetting.getCryptoSetting().getHashAlgorithm(), this.initTxContent);
TxRequestBuilder txReqBuilder = new TxRequestBuilder(txHash, this.initTxContent);
txReqBuilder.addNodeSignature(nodeSignatures);
TransactionRequest txRequest = txReqBuilder.buildRequest();
TransactionBatchProcessor txProcessor = null;
if (initSetting.getLedgerDataStructure().equals(LedgerDataStructure.MERKLE_TREE)) {
txProcessor = new TransactionBatchProcessor(FULL_PERMISSION_SECURITY_MANAGER, ledgerEditor, EMPTY_LEDGER_MERKLE, DEFAULT_OP_HANDLE_REG);
} else {
txProcessor = new TransactionBatchProcessor(FULL_PERMISSION_SECURITY_MANAGER, ledgerEditor, EMPTY_LEDGER_KV, DEFAULT_OP_HANDLE_REG);
}
LedgerEditor.TIMESTAMP_HOLDER.set(initSetting.getCreatedTime());
TransactionResponse response = txProcessor.schedule(txRequest);
if (!response.isSuccess()) {
throw new LedgerInitException("Transaction execution failed in genesis block!");
}
txResultsHandle = txProcessor.prepare();
LedgerEditor.TIMESTAMP_HOLDER.remove();
return txResultsHandle.getBlock();
}
use of com.jd.blockchain.ledger.TransactionResponse in project jdchain-core by blockchain-jd-com.
the class TransactionBatchProcessorTest method testSingleTxProcess.
@Test
public void testSingleTxProcess() {
final MemoryKVStorage STORAGE = new MemoryKVStorage();
// 初始化账本到指定的存储库;
HashDigest ledgerHash = LedgerTestUtils.initLedger(STORAGE, parti0, parti1, parti2, parti3);
// 加载账本;
LedgerManager ledgerManager = new LedgerManager();
LedgerRepository ledgerRepo = ledgerManager.register(ledgerHash, STORAGE, LedgerDataStructure.MERKLE_TREE);
// 验证交易总数;创始区块的交易数预期为 1 ——只有一笔账本初始化的交易;
long totalCount = ledgerRepo.getTransactionSet().getTotalCount();
assertEquals(1, totalCount);
// 验证参与方账户的存在;
LedgerDataSet previousBlockDataset = ledgerRepo.getLedgerDataSet(ledgerRepo.getLatestBlock());
UserAccount user0 = previousBlockDataset.getUserAccountSet().getAccount(parti0.getAddress());
assertNotNull(user0);
boolean partiRegistered = previousBlockDataset.getUserAccountSet().contains(parti0.getAddress());
assertTrue(partiRegistered);
// 生成新区块;
LedgerEditor newBlockEditor = ledgerRepo.createNextBlock();
OperationHandleRegisteration opReg = new DefaultOperationHandleRegisteration();
LedgerSecurityManager securityManager = getSecurityManager();
TransactionBatchProcessor txbatchProcessor = new TransactionBatchProcessor(securityManager, newBlockEditor, ledgerRepo, opReg);
// 注册新用户;
BlockchainKeypair userKeypair = BlockchainKeyGenerator.getInstance().generate();
TransactionRequest transactionRequest = LedgerTestUtils.createTxRequest_UserReg(userKeypair, ledgerHash, parti0, parti0);
TransactionResponse txResp = txbatchProcessor.schedule(transactionRequest);
LedgerBlock newBlock = newBlockEditor.prepare();
newBlockEditor.commit();
// 验证正确性;
ledgerManager = new LedgerManager();
ledgerRepo = ledgerManager.register(ledgerHash, STORAGE, LedgerDataStructure.MERKLE_TREE);
LedgerBlock latestBlock = ledgerRepo.getLatestBlock();
assertEquals(newBlock.getHash(), latestBlock.getHash());
assertEquals(1, newBlock.getHeight());
// 再次验证交易数;在新增一笔交易之后,交易数预期为 2 ;
totalCount = ledgerRepo.getTransactionSet().getTotalCount();
assertEquals(2, totalCount);
assertEquals(TransactionState.SUCCESS, txResp.getExecutionState());
}
Aggregations