From d523334c9fb7ed18a46b7a6bd5c322930bcb7340 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Wed, 12 Jun 2019 17:55:16 +0800 Subject: [PATCH] Refactored the structure of operation results of ledger transaction; --- .../contract/jvm/JavaContractCode.java | 4 +- .../ledger/core/LedgerTransactionContext.java | 6 +- .../ledger/core/OperationHandle.java | 2 +- .../core/impl/LedgerTransactionData.java | 28 ++++-- .../core/impl/LedgerTransactionalEditor.java | 12 +-- .../core/impl/TransactionBatchProcessor.java | 90 ++++++++----------- .../ContractCodeDeployOperationHandle.java | 4 +- .../ContractEventSendOperationHandle.java | 15 ++-- .../DataAccountKVSetOperationHandle.java | 17 ++-- .../DataAccountRegisterOperationHandle.java | 15 ++-- .../handles/UserRegisterOperationHandle.java | 7 +- .../ledger/ContractReturnMessage.java | 17 ---- .../ledger/ContractReturnMessageData.java | 41 --------- .../jd/blockchain/ledger/OperationResult.java | 17 ++++ .../ledger/OperationResultData.java | 26 ++++++ .../com/jd/blockchain/ledger/Transaction.java | 13 ++- .../ledger/TransactionRespHandle.java | 6 +- .../ledger/TransactionResponse.java | 16 ++-- .../ledger/TransactionReturnMessage.java | 2 +- .../ledger/TransactionReturnMessageData.java | 8 +- .../transaction/TxResponseMessage.java | 7 +- .../consensus/ConsensusMessageDispatcher.java | 3 +- .../handler/MockerContractExeHandle.java | 14 +-- 23 files changed, 189 insertions(+), 181 deletions(-) delete mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractReturnMessage.java delete mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractReturnMessageData.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/OperationResult.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/OperationResultData.java diff --git a/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java b/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java index 8130f1bd..a8036121 100644 --- a/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java +++ b/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java @@ -122,7 +122,9 @@ public class JavaContractCode implements ContractCode { // 填充return结果 if (this.contractReturn != null) { - this.contractReturn.complete(contractReturn); + //TODO: Not implemented; + throw new IllegalStateException("Not implemented!"); +// this.contractReturn.complete(contractReturn); } } catch (NoSuchMethodException e) { throw new IllegalArgumentException(e.getMessage()); diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionContext.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionContext.java index c7be08e5..6eda929a 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionContext.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionContext.java @@ -2,6 +2,7 @@ package com.jd.blockchain.ledger.core; import com.jd.blockchain.ledger.TransactionReturnMessage; import com.jd.blockchain.ledger.TransactionState; +import com.jd.blockchain.ledger.OperationResult; import com.jd.blockchain.ledger.LedgerTransaction; import com.jd.blockchain.ledger.TransactionRequest; @@ -35,7 +36,8 @@ public interface LedgerTransactionContext { * * @return */ - LedgerTransaction commit(TransactionState txResult, TransactionReturnMessage returnMessage); + LedgerTransaction commit(TransactionState txResult, OperationResult... opResults); + /** * 抛弃对账本数据的修改,以指定的交易状态提交交易;
@@ -45,7 +47,7 @@ public interface LedgerTransactionContext { * @param txResult * @return */ - LedgerTransaction discardAndCommit(TransactionState txResult, TransactionReturnMessage returnMessage); + LedgerTransaction discardAndCommit(TransactionState txResult); /** * 回滚事务,抛弃本次事务的所有数据更新; diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/OperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/OperationHandle.java index da4e8f43..9889a457 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/OperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/OperationHandle.java @@ -25,7 +25,7 @@ public interface OperationHandle { * @param previousBlockDataset * 新区块的前一个区块的数据集;即未提交新区块之前的经过共识的账本最新数据集; */ - void process(Operation op, LedgerDataSet newBlockDataset, TransactionRequestContext requestContext, + byte[] process(Operation op, LedgerDataSet newBlockDataset, TransactionRequestContext requestContext, LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService); } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionData.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionData.java index a7c3d480..6e231b44 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionData.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionData.java @@ -1,7 +1,15 @@ package com.jd.blockchain.ledger.core.impl; +import java.util.Arrays; +import java.util.Comparator; + import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.ledger.*; +import com.jd.blockchain.ledger.DigitalSignature; +import com.jd.blockchain.ledger.LedgerTransaction; +import com.jd.blockchain.ledger.OperationResult; +import com.jd.blockchain.ledger.TransactionContent; +import com.jd.blockchain.ledger.TransactionRequest; +import com.jd.blockchain.ledger.TransactionState; public class LedgerTransactionData implements LedgerTransaction { @@ -19,7 +27,7 @@ public class LedgerTransactionData implements LedgerTransaction { private long blockHeight; - private TransactionReturnMessage returnMessage; + private OperationResult[] operationResults; // private HashDigest adminAccountHash; // @@ -47,7 +55,7 @@ public class LedgerTransactionData implements LedgerTransaction { * 交易级的系统快照; */ public LedgerTransactionData(long blockHeight, TransactionRequest txReq, TransactionState execState, - TransactionStagedSnapshot txSnapshot, TransactionReturnMessage returnMessage) { + TransactionStagedSnapshot txSnapshot, OperationResult... opResults) { this.blockHeight = blockHeight; // this.txSnapshot = txSnapshot == null ? new TransactionStagedSnapshot() : txSnapshot; this.txSnapshot = txSnapshot; @@ -55,7 +63,15 @@ public class LedgerTransactionData implements LedgerTransaction { this.endpointSignatures = txReq.getEndpointSignatures(); this.nodeSignatures = txReq.getNodeSignatures(); this.executionState = execState; - this.returnMessage = returnMessage; + if (opResults != null) { + Arrays.sort(opResults, new Comparator() { + @Override + public int compare(OperationResult o1, OperationResult o2) { + return o1.getIndex() - o2.getIndex(); + } + }); + } + this.operationResults = opResults; } @Override @@ -74,8 +90,8 @@ public class LedgerTransactionData implements LedgerTransaction { } @Override - public TransactionReturnMessage getReturnMessage() { - return returnMessage; + public OperationResult[] getOperationResults() { + return operationResults; } @Override diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java index deec6200..0aae1738 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java @@ -348,9 +348,9 @@ public class LedgerTransactionalEditor implements LedgerEditor { public TransactionRequest getRequestTX() { return txRequest; } - + @Override - public LedgerTransaction commit(TransactionState txResult, TransactionReturnMessage returnMessage) { + public LedgerTransaction commit(TransactionState txResult, OperationResult... opResults) { checkTxState(); // capture snapshot @@ -359,7 +359,7 @@ public class LedgerTransactionalEditor implements LedgerEditor { // LedgerTransactionData tx = new LedgerTransactionData(blockHeight, txRequest, // txResult, txDataSnapshot); - LedgerTransactionData tx = new LedgerTransactionData(blockHeight, txRequest, txResult, null, returnMessage); + LedgerTransactionData tx = new LedgerTransactionData(blockHeight, txRequest, txResult, null, opResults); this.txset.add(tx); // this.txset.commit(); @@ -374,9 +374,9 @@ public class LedgerTransactionalEditor implements LedgerEditor { committed = true; return tx; } - + @Override - public LedgerTransaction discardAndCommit(TransactionState txResult, TransactionReturnMessage returnMessage) { + public LedgerTransaction discardAndCommit(TransactionState txResult) { checkTxState(); // 未处理 @@ -385,7 +385,7 @@ public class LedgerTransactionalEditor implements LedgerEditor { // TransactionStagedSnapshot txDataSnapshot = takeSnapshot(); // LedgerTransactionData tx = new LedgerTransactionData(blockHeight, txRequest, // txResult, txDataSnapshot); - LedgerTransactionData tx = new LedgerTransactionData(blockHeight, txRequest, txResult, null, returnMessage); + LedgerTransactionData tx = new LedgerTransactionData(blockHeight, txRequest, txResult, null); this.txset.add(tx); // this.txset.commit(); diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/TransactionBatchProcessor.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/TransactionBatchProcessor.java index 0cd6beeb..c251af2d 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/TransactionBatchProcessor.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/TransactionBatchProcessor.java @@ -3,15 +3,20 @@ package com.jd.blockchain.ledger.core.impl; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.concurrent.CompletableFuture; -import com.jd.blockchain.ledger.*; -import com.jd.blockchain.ledger.core.impl.handles.ContractEventSendOperationHandle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.jd.blockchain.crypto.HashDigest; +import com.jd.blockchain.ledger.ContractEventSendOperation; +import com.jd.blockchain.ledger.LedgerBlock; import com.jd.blockchain.ledger.LedgerException; +import com.jd.blockchain.ledger.Operation; +import com.jd.blockchain.ledger.OperationResult; +import com.jd.blockchain.ledger.OperationResultData; +import com.jd.blockchain.ledger.TransactionRequest; +import com.jd.blockchain.ledger.TransactionResponse; +import com.jd.blockchain.ledger.TransactionState; import com.jd.blockchain.ledger.core.LedgerDataSet; import com.jd.blockchain.ledger.core.LedgerEditor; import com.jd.blockchain.ledger.core.LedgerService; @@ -26,7 +31,7 @@ import com.jd.blockchain.utils.Bytes; public class TransactionBatchProcessor implements TransactionBatchProcess { private static final Logger LOGGER = LoggerFactory.getLogger(TransactionBatchProcessor.class); - + private LedgerService ledgerService; private LedgerEditor newBlockEditor; @@ -45,12 +50,9 @@ public class TransactionBatchProcessor implements TransactionBatchProcess { private TransactionBatchResult batchResult; /** - * @param newBlockEditor - * 新区块的数据编辑器; - * @param previousBlockDataset - * 新区块的前一个区块的数据集;即未提交新区块之前的经过共识的账本最新数据集; - * @param opHandles - * 操作处理对象注册表; + * @param newBlockEditor 新区块的数据编辑器; + * @param previousBlockDataset 新区块的前一个区块的数据集;即未提交新区块之前的经过共识的账本最新数据集; + * @param opHandles 操作处理对象注册表; */ public TransactionBatchProcessor(LedgerEditor newBlockEditor, LedgerDataSet previousBlockDataset, OperationHandleRegisteration opHandles, LedgerService ledgerService) { @@ -71,9 +73,8 @@ public class TransactionBatchProcessor implements TransactionBatchProcess { public TransactionResponse schedule(TransactionRequest request) { // 此调用将会验证交易签名,验签失败将会抛出异常,同时,不记录签名错误的交易到链上; LedgerTransactionContext txCtx = newBlockEditor.newTransaction(request); - TransactionState result; - TransactionReturnMessageData returnMessageData = new TransactionReturnMessageData(); - + TransactionState txResult; + OperationResult[] opResults = null; try { LedgerDataSet dataset = txCtx.getDataSet(); TransactionRequestContext reqCtx = new TransactionRequestContextImpl(request); @@ -94,58 +95,44 @@ public class TransactionBatchProcessor implements TransactionBatchProcess { OperationHandleContext handleContext = new OperationHandleContext() { @Override public void handle(Operation operation) { - //assert; Instance of operation are one of User related operations or DataAccount related operations; + // assert; Instance of operation are one of User related operations or + // DataAccount related operations; OperationHandle hdl = opHandles.getHandle(operation.getClass()); hdl.process(operation, dataset, reqCtx, previousBlockDataset, this, ledgerService); } }; OperationHandle opHandle; int contractOpIndex = 0; + List opResultList = new ArrayList(); + int opIdx = 0; for (Operation op : ops) { opHandle = opHandles.getHandle(op.getClass()); - // 合约执行需要填充执行结果 - if (opHandle instanceof ContractEventSendOperationHandle) { - CompletableFuture currContractReturn = new CompletableFuture<>(); - ContractReturnMessageData crmd = new ContractReturnMessageData(contractOpIndex++, currContractReturn); - returnMessageData.addContractReturnMessage(crmd); - ((ContractEventSendOperationHandle) opHandle).process(op, dataset, reqCtx, previousBlockDataset, handleContext, ledgerService, currContractReturn); - } else { - opHandle.process(op, dataset, reqCtx, previousBlockDataset, handleContext, ledgerService); + byte[] retn = opHandle.process(op, dataset, reqCtx, previousBlockDataset, handleContext, ledgerService); + if (op instanceof ContractEventSendOperation) { + // 支持返回值的操作; + opResultList.add(new OperationResultData(opIdx, retn)); } + + opIdx++; } // 提交交易(事务); - result = TransactionState.SUCCESS; - txCtx.commit(result, returnMessageData); + txResult = TransactionState.SUCCESS; + opResults = opResultList.toArray(new OperationResult[opResultList.size()]); + txCtx.commit(txResult, opResults); } catch (LedgerException e) { // TODO: 识别更详细的异常类型以及执行对应的处理; - result = TransactionState.LEDGER_ERROR; - txCtx.discardAndCommit(TransactionState.LEDGER_ERROR, returnMessageData); + txResult = TransactionState.LEDGER_ERROR; + txCtx.discardAndCommit(TransactionState.LEDGER_ERROR); LOGGER.warn(String.format("Transaction rollback caused by the ledger exception! --[TxHash=%s] --%s", request.getHash().toBase58(), e.getMessage()), e); } catch (Exception e) { - result = TransactionState.SYSTEM_ERROR; - txCtx.discardAndCommit(TransactionState.SYSTEM_ERROR, returnMessageData); + txResult = TransactionState.SYSTEM_ERROR; + txCtx.discardAndCommit(TransactionState.SYSTEM_ERROR); LOGGER.warn(String.format("Transaction rollback caused by the system exception! --[TxHash=%s] --%s", request.getHash().toBase58(), e.getMessage()), e); } - TxResponseHandle resp = new TxResponseHandle(request, result); - - if (!returnMessageData.isContractReturnEmpty()) { - - ContractReturnMessage[] contractReturnMessages = returnMessageData.getContractReturn(); - - // 获取结果中的字符串 - String[] returnValue = new String[contractReturnMessages.length]; - try { - for (int i = 0; i < contractReturnMessages.length; i++) { - returnValue[i] = contractReturnMessages[i].getReturnMessage(); - } - resp.setContractReturn(returnValue); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } + TxResponseHandle resp = new TxResponseHandle(request, txResult, opResults); responseList.add(resp); @@ -226,11 +213,12 @@ public class TransactionBatchProcessor implements TransactionBatchProcess { private TransactionState result; - private String[] contractReturn; + private OperationResult[] opResults; - public TxResponseHandle(TransactionRequest request, TransactionState result) { + public TxResponseHandle(TransactionRequest request, TransactionState result, OperationResult... opResults) { this.request = request; this.result = result; + this.opResults = opResults; } @Override @@ -259,12 +247,8 @@ public class TransactionBatchProcessor implements TransactionBatchProcess { } @Override - public String[] getContractReturn() { - return contractReturn; - } - - public void setContractReturn(String[] contractReturn) { - this.contractReturn = contractReturn; + public OperationResult[] getContractReturn() { + return opResults; } } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractCodeDeployOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractCodeDeployOperationHandle.java index fc84830f..a6b2ac85 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractCodeDeployOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractCodeDeployOperationHandle.java @@ -14,7 +14,7 @@ import org.springframework.stereotype.Service; public class ContractCodeDeployOperationHandle implements OperationHandle { @Override - public void process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, + public byte[] process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) { ContractCodeDeployOperation contractOP = (ContractCodeDeployOperation) op; // TODO: 校验合约代码的正确性; @@ -22,6 +22,8 @@ public class ContractCodeDeployOperationHandle implements OperationHandle { // TODO: 请求者应该提供合约账户的公钥签名,已确定注册的地址的唯一性; dataset.getContractAccountSet().deploy(contractOP.getContractID().getAddress(), contractOP.getContractID().getPubKey(), contractOP.getAddressSignature(), contractOP.getChainCode()); + //No result; + return null; } @Override diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractEventSendOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractEventSendOperationHandle.java index a8882d5d..03342459 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractEventSendOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractEventSendOperationHandle.java @@ -2,6 +2,8 @@ package com.jd.blockchain.ledger.core.impl.handles; import static com.jd.blockchain.utils.BaseConstant.CONTRACT_SERVICE_PROVIDER; +import java.util.concurrent.CompletableFuture; + import org.springframework.stereotype.Service; import com.jd.blockchain.contract.LocalContractEventContext; @@ -20,9 +22,6 @@ import com.jd.blockchain.ledger.core.TransactionRequestContext; import com.jd.blockchain.ledger.core.impl.LedgerQueryService; import com.jd.blockchain.ledger.core.impl.OperationHandleContext; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Future; - @Service public class ContractEventSendOperationHandle implements OperationHandle { @@ -33,9 +32,12 @@ public class ContractEventSendOperationHandle implements OperationHandle { } @Override - public void process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, + public byte[] process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, LedgerDataSet previousBlockDataset, OperationHandleContext opHandleContext, LedgerService ledgerService) { process(op, dataset, requestContext, previousBlockDataset, opHandleContext, ledgerService, null); + + // TODO: return value; + return null; } @Override @@ -44,8 +46,8 @@ public class ContractEventSendOperationHandle implements OperationHandle { } public void process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, - LedgerDataSet previousBlockDataset, OperationHandleContext opHandleContext, - LedgerService ledgerService, CompletableFuture contractReturn) { + LedgerDataSet previousBlockDataset, OperationHandleContext opHandleContext, LedgerService ledgerService, + CompletableFuture contractReturn) { ContractEventSendOperation contractOP = (ContractEventSendOperation) op; // 先从账本校验合约的有效性; @@ -84,5 +86,4 @@ public class ContractEventSendOperationHandle implements OperationHandle { contractCode.processEvent(localContractEventContext, contractReturn); } - } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java index 4331c29c..cc1f16b9 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java @@ -1,24 +1,28 @@ package com.jd.blockchain.ledger.core.impl.handles; -import com.jd.blockchain.binaryproto.BinaryProtocol; +import org.springframework.stereotype.Service; + import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.ledger.BytesValue; import com.jd.blockchain.ledger.DataAccountKVSetOperation; import com.jd.blockchain.ledger.DataAccountKVSetOperation.KVWriteEntry; import com.jd.blockchain.ledger.Operation; -import com.jd.blockchain.ledger.core.*; +import com.jd.blockchain.ledger.core.DataAccount; +import com.jd.blockchain.ledger.core.LedgerDataSet; +import com.jd.blockchain.ledger.core.LedgerService; +import com.jd.blockchain.ledger.core.OperationHandle; +import com.jd.blockchain.ledger.core.TransactionRequestContext; import com.jd.blockchain.ledger.core.impl.OperationHandleContext; import com.jd.blockchain.utils.Bytes; -import org.springframework.stereotype.Service; @Service -public class DataAccountKVSetOperationHandle implements OperationHandle{ +public class DataAccountKVSetOperationHandle implements OperationHandle { static { DataContractRegistry.register(BytesValue.class); } @Override - public void process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, + public byte[] process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) { DataAccountKVSetOperation kvWriteOp = (DataAccountKVSetOperation) op; DataAccount account = dataset.getDataAccountSet().getDataAccount(kvWriteOp.getAccountAddress()); @@ -26,6 +30,9 @@ public class DataAccountKVSetOperationHandle implements OperationHandle{ for (KVWriteEntry kvw : writeset) { account.setBytes(Bytes.fromString(kvw.getKey()), kvw.getValue(), kvw.getExpectedVersion()); } + + // No return value; + return null; } @Override diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountRegisterOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountRegisterOperationHandle.java index c4d3fd61..29178dab 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountRegisterOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountRegisterOperationHandle.java @@ -12,18 +12,21 @@ import com.jd.blockchain.ledger.core.impl.OperationHandleContext; import org.springframework.stereotype.Service; @Service -public class DataAccountRegisterOperationHandle implements OperationHandle{ +public class DataAccountRegisterOperationHandle implements OperationHandle { @Override - public void process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, + public byte[] process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) { DataAccountRegisterOperation dataAccountRegOp = (DataAccountRegisterOperation) op; BlockchainIdentity bid = dataAccountRegOp.getAccountID(); - - //TODO: 校验用户身份; - - //TODO: 请求者应该提供数据账户的公钥签名,已确定注册的地址的唯一性; + + // TODO: 校验用户身份; + + // TODO: 请求者应该提供数据账户的公钥签名,已确定注册的地址的唯一性; dataset.getDataAccountSet().register(bid.getAddress(), bid.getPubKey(), null); + + // No return value; + return null; } @Override diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/UserRegisterOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/UserRegisterOperationHandle.java index aef14906..bc6e1cb7 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/UserRegisterOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/UserRegisterOperationHandle.java @@ -9,14 +9,17 @@ import com.jd.blockchain.ledger.core.OperationHandle; import com.jd.blockchain.ledger.core.TransactionRequestContext; import com.jd.blockchain.ledger.core.impl.OperationHandleContext; -public class UserRegisterOperationHandle implements OperationHandle{ +public class UserRegisterOperationHandle implements OperationHandle { @Override - public void process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, + public byte[] process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) { UserRegisterOperation userRegOp = (UserRegisterOperation) op; BlockchainIdentity bid = userRegOp.getUserID(); dataset.getUserAccountSet().register(bid.getAddress(), bid.getPubKey()); + + // No return value; + return null; } @Override diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractReturnMessage.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractReturnMessage.java deleted file mode 100644 index 3556c95c..00000000 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractReturnMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -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.CONTRACT_RETURN) -public interface ContractReturnMessage { - - @DataField(order=1, primitiveType = PrimitiveType.INT32) - int getOperationIndex(); - - @DataField(order=2, primitiveType = PrimitiveType.TEXT) - String getReturnMessage(); - -} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractReturnMessageData.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractReturnMessageData.java deleted file mode 100644 index 70282725..00000000 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractReturnMessageData.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.jd.blockchain.ledger; - -import java.util.concurrent.CompletableFuture; - -public class ContractReturnMessageData implements ContractReturnMessage { - - private int operationIndex; - - private CompletableFuture returnMsgFuture; - - public ContractReturnMessageData() { - } - - public ContractReturnMessageData(int operationIndex, CompletableFuture returnMsgFuture) { - this.operationIndex = operationIndex; - this.returnMsgFuture = returnMsgFuture; - } - - public void setOperationIndex(int operationIndex) { - this.operationIndex = operationIndex; - } - - public void setReturnMsgFuture(CompletableFuture returnMsgFuture) { - this.returnMsgFuture = returnMsgFuture; - } - - @Override - public int getOperationIndex() { - return operationIndex; - } - - @Override - public String getReturnMessage() { - try { - return returnMsgFuture.get(); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } -} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/OperationResult.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/OperationResult.java new file mode 100644 index 00000000..87ff2bdc --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/OperationResult.java @@ -0,0 +1,17 @@ +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.CONTRACT_RETURN) +public interface OperationResult { + + @DataField(order = 1, primitiveType = PrimitiveType.INT32) + int getIndex(); + + @DataField(order = 2, primitiveType = PrimitiveType.BYTES) + byte[] getResult(); + +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/OperationResultData.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/OperationResultData.java new file mode 100644 index 00000000..a96fe407 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/OperationResultData.java @@ -0,0 +1,26 @@ +package com.jd.blockchain.ledger; + +public class OperationResultData implements OperationResult { + + private int index; + + private byte[] result; + + public OperationResultData() { + } + + public OperationResultData(int operationIndex, byte[] result) { + this.index = operationIndex; + this.result = result; + } + + @Override + public int getIndex() { + return index; + } + + @Override + public byte[] getResult() { + return result; + } +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/Transaction.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/Transaction.java index 402024e2..26b744bd 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/Transaction.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/Transaction.java @@ -5,7 +5,6 @@ import com.jd.blockchain.binaryproto.DataField; import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.consts.DataCodes; import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.utils.io.ByteArray; /** * Transaction 区块链交易,是被原子执行的操作集合; @@ -13,7 +12,7 @@ import com.jd.blockchain.utils.io.ByteArray; * @author huanghaiquan * */ -@DataContract(code= DataCodes.TX) +@DataContract(code = DataCodes.TX) public interface Transaction extends NodeRequest, HashObject { /** @@ -23,7 +22,7 @@ public interface Transaction extends NodeRequest, HashObject { * * @return */ - @DataField(order=1, primitiveType = PrimitiveType.BYTES) + @DataField(order = 1, primitiveType = PrimitiveType.BYTES) @Override HashDigest getHash(); @@ -32,7 +31,7 @@ public interface Transaction extends NodeRequest, HashObject { * * @return */ - @DataField(order=2, primitiveType=PrimitiveType.INT64) + @DataField(order = 2, primitiveType = PrimitiveType.INT64) long getBlockHeight(); /** @@ -42,7 +41,7 @@ public interface Transaction extends NodeRequest, HashObject { * * @return */ - @DataField(order=3, refEnum=true) + @DataField(order = 3, refEnum = true) TransactionState getExecutionState(); /** @@ -50,6 +49,6 @@ public interface Transaction extends NodeRequest, HashObject { * * @return */ - @DataField(order=4, refContract=true) - TransactionReturnMessage getReturnMessage(); + @DataField(order = 4, refContract = true, list = true) + OperationResult[] getOperationResults(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionRespHandle.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionRespHandle.java index 8695ab7e..62fc3ebe 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionRespHandle.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionRespHandle.java @@ -27,7 +27,7 @@ public class TransactionRespHandle implements TransactionResponse { private TransactionState globalResult; - private String[] contractReturn; + private OperationResult[] contractReturn; public TransactionRespHandle(TransactionRequest request, TransactionState result, TransactionState globalResult) { this.request = request; @@ -51,7 +51,7 @@ public class TransactionRespHandle implements TransactionResponse { this.result = result; } - public void setContractReturn(String[] contractReturn) { + public void setContractReturn(OperationResult[] contractReturn) { this.contractReturn = contractReturn; } @@ -97,7 +97,7 @@ public class TransactionRespHandle implements TransactionResponse { } @Override - public String[] getContractReturn() { + public OperationResult[] getContractReturn() { return contractReturn; } } \ No newline at end of file diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionResponse.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionResponse.java index e7aa1197..6d6916a0 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionResponse.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionResponse.java @@ -12,7 +12,7 @@ import com.jd.blockchain.crypto.HashDigest; * @author huanghaiquan * */ -@DataContract(code= DataCodes.TX_RESPONSE) +@DataContract(code = DataCodes.TX_RESPONSE) public interface TransactionResponse { /** @@ -20,7 +20,7 @@ public interface TransactionResponse { * * @return */ - @DataField(order=1, primitiveType = PrimitiveType.BYTES) + @DataField(order = 1, primitiveType = PrimitiveType.BYTES) HashDigest getContentHash(); /** @@ -28,7 +28,7 @@ public interface TransactionResponse { * * @return */ - @DataField(order=2, refEnum=true) + @DataField(order = 2, refEnum = true) TransactionState getExecutionState(); /** @@ -36,7 +36,7 @@ public interface TransactionResponse { * * @return */ - @DataField(order=3, primitiveType = PrimitiveType.BYTES) + @DataField(order = 3, primitiveType = PrimitiveType.BYTES) HashDigest getBlockHash(); /** @@ -47,7 +47,7 @@ public interface TransactionResponse { * * @return */ - @DataField(order=4, primitiveType=PrimitiveType.INT64) + @DataField(order = 4, primitiveType = PrimitiveType.INT64) long getBlockHeight(); /** @@ -55,7 +55,7 @@ public interface TransactionResponse { * * @return */ - @DataField(order=5, primitiveType=PrimitiveType.BOOLEAN) + @DataField(order = 5, primitiveType = PrimitiveType.BOOLEAN) boolean isSuccess(); /** @@ -63,6 +63,6 @@ public interface TransactionResponse { * * @return */ - @DataField(order=6, list=true, primitiveType=PrimitiveType.TEXT) - String[] getContractReturn(); + @DataField(order = 6, list = true, refContract = true) + OperationResult[] getContractReturn(); } \ No newline at end of file diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionReturnMessage.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionReturnMessage.java index 2d2fbfc7..94cef8b0 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionReturnMessage.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionReturnMessage.java @@ -13,5 +13,5 @@ public interface TransactionReturnMessage { * @return */ @DataField(order=1, list = true, refContract=true) - ContractReturnMessage[] getContractReturn(); + OperationResult[] getContractReturn(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionReturnMessageData.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionReturnMessageData.java index 646b7090..7f324158 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionReturnMessageData.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionReturnMessageData.java @@ -5,9 +5,9 @@ import java.util.List; public class TransactionReturnMessageData implements TransactionReturnMessage { - private List contractReturnMessages = new ArrayList<>(); + private List contractReturnMessages = new ArrayList<>(); - public void addContractReturnMessage(ContractReturnMessage contractReturnMessage) { + public void addContractReturnMessage(OperationResult contractReturnMessage) { contractReturnMessages.add(contractReturnMessage); } @@ -16,11 +16,11 @@ public class TransactionReturnMessageData implements TransactionReturnMessage { } @Override - public ContractReturnMessage[] getContractReturn() { + public OperationResult[] getContractReturn() { if (isContractReturnEmpty()) { return null; } - ContractReturnMessage[] crms = new ContractReturnMessage[contractReturnMessages.size()]; + OperationResult[] crms = new OperationResult[contractReturnMessages.size()]; return contractReturnMessages.toArray(crms); } } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxResponseMessage.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxResponseMessage.java index 5d143898..a966239b 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxResponseMessage.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxResponseMessage.java @@ -2,6 +2,7 @@ package com.jd.blockchain.transaction; import com.jd.blockchain.ledger.TransactionState; import com.jd.blockchain.crypto.HashDigest; +import com.jd.blockchain.ledger.OperationResult; import com.jd.blockchain.ledger.TransactionResponse; /** @@ -18,7 +19,7 @@ public class TxResponseMessage implements TransactionResponse { private TransactionState executionState; - private String[] contractReturn; + private OperationResult[] contractReturn; public TxResponseMessage() { } @@ -59,7 +60,7 @@ public class TxResponseMessage implements TransactionResponse { this.blockHeight = blockHeight; } - public void setContractReturn(String[] contractReturn) { + public void setContractReturn(OperationResult[] contractReturn) { this.contractReturn = contractReturn; } @@ -69,7 +70,7 @@ public class TxResponseMessage implements TransactionResponse { } @Override - public String[] getContractReturn() { + public OperationResult[] getContractReturn() { return contractReturn; } diff --git a/source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java b/source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java index ae62e2d6..97d7b9ba 100644 --- a/source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java +++ b/source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java @@ -2,6 +2,7 @@ package com.jd.blockchain.peer.consensus; import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.ledger.LedgerBlock; +import com.jd.blockchain.ledger.OperationResult; import com.jd.blockchain.ledger.TransactionRequest; import com.jd.blockchain.ledger.TransactionResponse; import com.jd.blockchain.ledger.TransactionState; @@ -309,7 +310,7 @@ public class ConsensusMessageDispatcher implements MessageHandle { } @Override - public String[] getContractReturn() { + public OperationResult[] getContractReturn() { return txResp.getContractReturn(); } } diff --git a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/handler/MockerContractExeHandle.java b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/handler/MockerContractExeHandle.java index 53bc9417..23dbaa7a 100644 --- a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/handler/MockerContractExeHandle.java +++ b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/handler/MockerContractExeHandle.java @@ -20,7 +20,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; - public class MockerContractExeHandle implements OperationHandle { private Map executorProxyMap = new ConcurrentHashMap<>(); @@ -30,7 +29,7 @@ public class MockerContractExeHandle implements OperationHandle { private HashDigest ledgerHash; @Override - public void process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, + public byte[] process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, LedgerDataSet previousBlockDataset, OperationHandleContext opHandleContext, LedgerService ledgerService) { ContractEventSendOperation contractOP = (ContractEventSendOperation) op; @@ -42,8 +41,8 @@ public class MockerContractExeHandle implements OperationHandle { LedgerQueryService queryService = new LedgerQueryService(ledgerManager); ContractLedgerContext ledgerContext = new ContractLedgerContext(queryService, opHandleContext); - MockerContractEventContext contractEventContext = new MockerContractEventContext( - ledgerHash, contractOP.getEvent(), requestContext.getRequest(), ledgerContext); + MockerContractEventContext contractEventContext = new MockerContractEventContext(ledgerHash, + contractOP.getEvent(), requestContext.getRequest(), ledgerContext); EventProcessingAwire eventProcessingAwire = (EventProcessingAwire) executorProxy.getInstance(); try { @@ -60,6 +59,9 @@ public class MockerContractExeHandle implements OperationHandle { removeExecutorProxy(txHash); } } + + // No return value; + return null; } @Override @@ -90,8 +92,8 @@ public class MockerContractExeHandle implements OperationHandle { private LedgerContext ledgerContext; - public MockerContractEventContext(HashDigest ledgeHash, String event, - TransactionRequest transactionRequest, LedgerContext ledgerContext) { + public MockerContractEventContext(HashDigest ledgeHash, String event, TransactionRequest transactionRequest, + LedgerContext ledgerContext) { this.ledgeHash = ledgeHash; this.event = event; this.transactionRequest = transactionRequest;