| @@ -359,33 +359,105 @@ public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer | |||
| * Used by consensus write phase, pre compute new block hash | |||
| * | |||
| */ | |||
| // public BatchAppResultImpl preComputeAppHash(byte[][] commands) { | |||
| // String batchId = messageHandle.beginBatch(realmName); | |||
| // List<AsyncFuture<byte[]>> asyncFutureLinkedList = new ArrayList<>(commands.length); | |||
| // List<byte[]> responseLinkedList = new ArrayList<>(); | |||
| // try { | |||
| // int msgId = 0; | |||
| // for (byte[] txContent : commands) { | |||
| // AsyncFuture<byte[]> asyncFuture = messageHandle.processOrdered(msgId++, txContent, realmName, batchId); | |||
| // asyncFutureLinkedList.add(asyncFuture); | |||
| // } | |||
| // StateSnapshot stateSnapshot = messageHandle.completeBatch(realmName, batchId); | |||
| // byte[] blockHashBytes = stateSnapshot.getSnapshot(); | |||
| // | |||
| // for (int i = 0; i< asyncFutureLinkedList.size(); i++) { | |||
| // responseLinkedList.add(asyncFutureLinkedList.get(i).get()); | |||
| // } | |||
| // | |||
| // | |||
| // return new BatchAppResultImpl(responseLinkedList, blockHashBytes, batchId); | |||
| // | |||
| // } catch (Exception e) { | |||
| // // todo 需要处理应答码 404 | |||
| // LOGGER.error("Error occurred while processing ordered messages! --" + e.getMessage(), e); | |||
| // messageHandle.rollbackBatch(realmName, batchId, TransactionState.IGNORED_BY_CONSENSUS_PHASE_PRECOMPUTE_ROLLBACK.CODE); | |||
| // } | |||
| // | |||
| // return null; | |||
| // } | |||
| /** | |||
| * Used by consensus write phase, pre compute new block hash | |||
| */ | |||
| public BatchAppResultImpl preComputeAppHash(byte[][] commands) { | |||
| String batchId = messageHandle.beginBatch(realmName); | |||
| List<AsyncFuture<byte[]>> asyncFutureLinkedList = new ArrayList<>(commands.length); | |||
| List<byte[]> responseLinkedList = new ArrayList<>(); | |||
| BatchAppResultImpl result; | |||
| try { | |||
| int msgId = 0; | |||
| for (byte[] txContent : commands) { | |||
| AsyncFuture<byte[]> asyncFuture = messageHandle.processOrdered(msgId++, txContent, realmName, batchId); | |||
| asyncFutureLinkedList.add(asyncFuture); | |||
| } | |||
| StateSnapshot stateSnapshot = messageHandle.completeBatch(realmName, batchId); | |||
| byte[] blockHashBytes = stateSnapshot.getSnapshot(); | |||
| for (int i = 0; i< asyncFutureLinkedList.size(); i++) { | |||
| responseLinkedList.add(asyncFutureLinkedList.get(i).get()); | |||
| boolean isOK = true; | |||
| for (int i = 0; i < commands.length; i++) { | |||
| byte[] txContent = commands[i]; | |||
| try { | |||
| AsyncFuture<byte[]> asyncFuture = messageHandle.processOrdered(msgId++, txContent, realmName, batchId); | |||
| asyncFutureLinkedList.add(asyncFuture); | |||
| } catch (BlockRollbackException e) { | |||
| LOGGER.error("Error occurred while processing ordered messages! --" + e.getMessage(), e); | |||
| isOK = false; | |||
| break; | |||
| } | |||
| } | |||
| if (isOK) { | |||
| StateSnapshot stateSnapshot = messageHandle.completeBatch(realmName, batchId); | |||
| byte[] blockHashBytes = stateSnapshot.getSnapshot(); | |||
| for (int i = 0; i < asyncFutureLinkedList.size(); i++) { | |||
| responseLinkedList.add(asyncFutureLinkedList.get(i).get()); | |||
| } | |||
| result = new BatchAppResultImpl(responseLinkedList, blockHashBytes, batchId); | |||
| result.setErrorCode((byte) 0); | |||
| return result; | |||
| } else { | |||
| for (int i = 0; i < commands.length; i++) { | |||
| responseLinkedList.add(createAppResponse(commands[i])); | |||
| } | |||
| Random random = new Random(); | |||
| byte[] rand = new byte[4]; | |||
| random.nextBytes(rand); | |||
| return new BatchAppResultImpl(responseLinkedList, blockHashBytes, batchId); | |||
| result = new BatchAppResultImpl(responseLinkedList, rand, batchId); | |||
| result.setErrorCode((byte) 1); | |||
| return result; | |||
| } | |||
| } catch (Exception e) { | |||
| // todo 需要处理应答码 404 | |||
| LOGGER.error("Error occurred while processing ordered messages! --" + e.getMessage(), e); | |||
| messageHandle.rollbackBatch(realmName, batchId, TransactionState.IGNORED_BY_CONSENSUS_PHASE_PRECOMPUTE_ROLLBACK.CODE); | |||
| LOGGER.error("Error occurred while genearte batch app result! --" + e.getMessage(), e); | |||
| throw e; | |||
| } | |||
| } | |||
| return null; | |||
| public byte[] createAppResponse(byte[] command) { | |||
| TransactionRequest txRequest = BinaryProtocol.decode(command); | |||
| TxResponseMessage resp = new TxResponseMessage(txRequest.getTransactionContent().getHash()); | |||
| resp.setExecutionState(TransactionState.IGNORED_BY_BLOCK_FULL_ROLLBACK); | |||
| return BinaryProtocol.encode(resp, TransactionResponse.class); | |||
| } | |||
| /** | |||