diff --git a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java index 1d7f91ec..d7daceaf 100644 --- a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java +++ b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java @@ -19,32 +19,7 @@ import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.crypto.service.classic.ClassicCryptoService; import com.jd.blockchain.crypto.service.sm.SMCryptoService; -import com.jd.blockchain.ledger.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.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.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.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.*; import com.jd.blockchain.ledger.core.CryptoConfig; import com.jd.blockchain.ledger.core.LedgerDataSet; import com.jd.blockchain.ledger.core.LedgerEditor; @@ -427,15 +402,16 @@ public class MockerNodeContext implements BlockchainQueryService { return reqBuilder.buildRequest(); } - public void txProcess(TransactionRequest txRequest) { + public OperationResult[] txProcess(TransactionRequest txRequest) { LedgerEditor newEditor = ledgerRepository.createNextBlock(); LedgerBlock latestBlock = ledgerRepository.getLatestBlock(); LedgerDataSet previousDataSet = ledgerRepository.getDataSet(latestBlock); TransactionBatchProcessor txProc = new TransactionBatchProcessor(newEditor, previousDataSet, opHandler, ledgerManager); - txProc.schedule(txRequest); + TransactionResponse txResp = txProc.schedule(txRequest); TransactionBatchResultHandle handle = txProc.prepare(); handle.commit(); + return txResp.getOperationResults(); } private LedgerRepository registerLedger(HashDigest ledgerHash, DBConnectionConfig dbConnConf) { diff --git a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/contracts/WriteContract.java b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/contracts/WriteContract.java index 2dbd8ae5..9662dd68 100644 --- a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/contracts/WriteContract.java +++ b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/contracts/WriteContract.java @@ -10,5 +10,5 @@ public interface WriteContract { void print(String name); @ContractEvent(name = "writeKv") - void writeKv(String address, String key, String value); + String writeKv(String address, String key, String value); } diff --git a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/contracts/WriteContractImpl.java b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/contracts/WriteContractImpl.java index 3fdedc81..c6d6edda 100644 --- a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/contracts/WriteContractImpl.java +++ b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/contracts/WriteContractImpl.java @@ -15,8 +15,9 @@ public class WriteContractImpl implements EventProcessingAwire, WriteContract { } @Override - public void writeKv(String address, String key, String value) { + public String writeKv(String address, String key, String value) { eventContext.getLedger().dataAccount(address).setText(key, value, -1); + return String.format("address = %s, key = %s, value = %s, version = %s", address, key, value, 0); } @Override 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 c16c3aba..68e8488d 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 @@ -1,9 +1,6 @@ package com.jd.blockchain.mocker.handler; -import com.jd.blockchain.contract.ContractEventContext; -import com.jd.blockchain.contract.ContractException; -import com.jd.blockchain.contract.EventProcessingAwire; -import com.jd.blockchain.contract.LedgerContext; +import com.jd.blockchain.contract.*; import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.ledger.BlockchainIdentity; import com.jd.blockchain.ledger.ContractEventSendOperation; @@ -38,6 +35,7 @@ public class MockerContractExeHandle implements OperationHandle { ExecutorProxy executorProxy = executorProxyMap.get(txHash); + Object result = null; if (executorProxy != null) { LedgerQueryService queryService = new LedgerQueryService(ledgerManager); ContractLedgerContext ledgerContext = new ContractLedgerContext(queryService, opHandleContext); @@ -45,24 +43,31 @@ public class MockerContractExeHandle implements OperationHandle { MockerContractEventContext contractEventContext = new MockerContractEventContext(ledgerHash, contractOP.getEvent(), requestContext.getRequest(), ledgerContext); - EventProcessingAwire eventProcessingAwire = (EventProcessingAwire) executorProxy.getInstance(); - try { - // - // Before处理过程 - eventProcessingAwire.beforeEvent(contractEventContext); - executorProxy.invoke(); + Object instance = executorProxy.getInstance(); + EventProcessingAwire awire = null; + + if (instance instanceof EventProcessingAwire) { + awire = (EventProcessingAwire) instance; + awire.beforeEvent(contractEventContext); + } - // After处理过程 - eventProcessingAwire.postEvent(contractEventContext, null); + try { + result = executorProxy.invoke(); + if (awire != null) { + // After处理过程 + awire.postEvent(contractEventContext, null); + } } catch (Exception e) { - eventProcessingAwire.postEvent(contractEventContext, new ContractException(e.getMessage())); + if (awire != null) { + awire.postEvent(contractEventContext, new ContractException(e.getMessage())); + } } finally { removeExecutorProxy(txHash); } } // No return value; - return null; + return ContractSerializeUtils.serialize(result); } @Override diff --git a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/proxy/ContractProxy.java b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/proxy/ContractProxy.java index 69fc305c..52cc81d3 100644 --- a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/proxy/ContractProxy.java +++ b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/proxy/ContractProxy.java @@ -4,6 +4,8 @@ import com.jd.blockchain.contract.Contract; import com.jd.blockchain.contract.ContractEvent; import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.ledger.BlockchainIdentity; +import com.jd.blockchain.ledger.OperationResult; +import com.jd.blockchain.ledger.OperationResultData; import com.jd.blockchain.ledger.TransactionRequest; import com.jd.blockchain.mocker.MockerNodeContext; import com.jd.blockchain.mocker.handler.MockerContractExeHandle; @@ -68,9 +70,14 @@ public class ContractProxy implements InvocationHandler { operationHandle.registerExecutorProxy(txHash, new ExecutorProxy(instance, method, args)); // 提交该请求至整个区块链系统 - mockerNodeContext.txProcess(txRequest); - // 不处理返回值 - return null; + OperationResult[] operationResults = mockerNodeContext.txProcess(txRequest); + if (operationResults == null || operationResults.length == 0) { + return null; + } + OperationResult opResult = operationResults[0]; + + // 处理返回值 + return new OperationResultData(opResult).getResultData(); } private boolean isExecuteContractMethod(Method method) { diff --git a/source/tools/tools-mocker/src/test/java/test/com/jd/blockchain/contract/SampleTest_.java b/source/tools/tools-mocker/src/test/java/test/com/jd/blockchain/contract/SampleTest.java similarity index 90% rename from source/tools/tools-mocker/src/test/java/test/com/jd/blockchain/contract/SampleTest_.java rename to source/tools/tools-mocker/src/test/java/test/com/jd/blockchain/contract/SampleTest.java index 68559fa2..19cd34df 100644 --- a/source/tools/tools-mocker/src/test/java/test/com/jd/blockchain/contract/SampleTest_.java +++ b/source/tools/tools-mocker/src/test/java/test/com/jd/blockchain/contract/SampleTest.java @@ -10,7 +10,7 @@ import org.junit.Test; import static org.junit.Assert.assertEquals; -public class SampleTest_ { +public class SampleTest { MockerNodeContext mockerNodeContext = null; @@ -33,7 +33,9 @@ public class SampleTest_ { writeContract = mockerNodeContext.deployContract(writeContract); - writeContract.writeKv(dataAccountAddress, key, value); + String result = writeContract.writeKv(dataAccountAddress, key, value); + + System.out.println(result); // 查询结果 KVDataEntry[] dataEntries = mockerNodeContext.getDataEntries(ledgerHash, dataAccountAddress, key);