@@ -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.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.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.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; | ||||
@@ -427,15 +402,16 @@ public class MockerNodeContext implements BlockchainQueryService { | |||||
return reqBuilder.buildRequest(); | return reqBuilder.buildRequest(); | ||||
} | } | ||||
public void txProcess(TransactionRequest txRequest) { | |||||
public OperationResult[] txProcess(TransactionRequest txRequest) { | |||||
LedgerEditor newEditor = ledgerRepository.createNextBlock(); | LedgerEditor newEditor = ledgerRepository.createNextBlock(); | ||||
LedgerBlock latestBlock = ledgerRepository.getLatestBlock(); | LedgerBlock latestBlock = ledgerRepository.getLatestBlock(); | ||||
LedgerDataSet previousDataSet = ledgerRepository.getDataSet(latestBlock); | LedgerDataSet previousDataSet = ledgerRepository.getDataSet(latestBlock); | ||||
TransactionBatchProcessor txProc = new TransactionBatchProcessor(newEditor, previousDataSet, opHandler, | TransactionBatchProcessor txProc = new TransactionBatchProcessor(newEditor, previousDataSet, opHandler, | ||||
ledgerManager); | ledgerManager); | ||||
txProc.schedule(txRequest); | |||||
TransactionResponse txResp = txProc.schedule(txRequest); | |||||
TransactionBatchResultHandle handle = txProc.prepare(); | TransactionBatchResultHandle handle = txProc.prepare(); | ||||
handle.commit(); | handle.commit(); | ||||
return txResp.getOperationResults(); | |||||
} | } | ||||
private LedgerRepository registerLedger(HashDigest ledgerHash, DBConnectionConfig dbConnConf) { | private LedgerRepository registerLedger(HashDigest ledgerHash, DBConnectionConfig dbConnConf) { | ||||
@@ -10,5 +10,5 @@ public interface WriteContract { | |||||
void print(String name); | void print(String name); | ||||
@ContractEvent(name = "writeKv") | @ContractEvent(name = "writeKv") | ||||
void writeKv(String address, String key, String value); | |||||
String writeKv(String address, String key, String value); | |||||
} | } |
@@ -15,8 +15,9 @@ public class WriteContractImpl implements EventProcessingAwire, WriteContract { | |||||
} | } | ||||
@Override | @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); | eventContext.getLedger().dataAccount(address).setText(key, value, -1); | ||||
return String.format("address = %s, key = %s, value = %s, version = %s", address, key, value, 0); | |||||
} | } | ||||
@Override | @Override | ||||
@@ -1,9 +1,6 @@ | |||||
package com.jd.blockchain.mocker.handler; | 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.crypto.HashDigest; | ||||
import com.jd.blockchain.ledger.BlockchainIdentity; | import com.jd.blockchain.ledger.BlockchainIdentity; | ||||
import com.jd.blockchain.ledger.ContractEventSendOperation; | import com.jd.blockchain.ledger.ContractEventSendOperation; | ||||
@@ -38,6 +35,7 @@ public class MockerContractExeHandle implements OperationHandle { | |||||
ExecutorProxy executorProxy = executorProxyMap.get(txHash); | ExecutorProxy executorProxy = executorProxyMap.get(txHash); | ||||
Object result = null; | |||||
if (executorProxy != null) { | if (executorProxy != null) { | ||||
LedgerQueryService queryService = new LedgerQueryService(ledgerManager); | LedgerQueryService queryService = new LedgerQueryService(ledgerManager); | ||||
ContractLedgerContext ledgerContext = new ContractLedgerContext(queryService, opHandleContext); | ContractLedgerContext ledgerContext = new ContractLedgerContext(queryService, opHandleContext); | ||||
@@ -45,24 +43,31 @@ public class MockerContractExeHandle implements OperationHandle { | |||||
MockerContractEventContext contractEventContext = new MockerContractEventContext(ledgerHash, | MockerContractEventContext contractEventContext = new MockerContractEventContext(ledgerHash, | ||||
contractOP.getEvent(), requestContext.getRequest(), ledgerContext); | 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) { | } catch (Exception e) { | ||||
eventProcessingAwire.postEvent(contractEventContext, new ContractException(e.getMessage())); | |||||
if (awire != null) { | |||||
awire.postEvent(contractEventContext, new ContractException(e.getMessage())); | |||||
} | |||||
} finally { | } finally { | ||||
removeExecutorProxy(txHash); | removeExecutorProxy(txHash); | ||||
} | } | ||||
} | } | ||||
// No return value; | // No return value; | ||||
return null; | |||||
return ContractSerializeUtils.serialize(result); | |||||
} | } | ||||
@Override | @Override | ||||
@@ -4,6 +4,8 @@ import com.jd.blockchain.contract.Contract; | |||||
import com.jd.blockchain.contract.ContractEvent; | import com.jd.blockchain.contract.ContractEvent; | ||||
import com.jd.blockchain.crypto.HashDigest; | import com.jd.blockchain.crypto.HashDigest; | ||||
import com.jd.blockchain.ledger.BlockchainIdentity; | 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.ledger.TransactionRequest; | ||||
import com.jd.blockchain.mocker.MockerNodeContext; | import com.jd.blockchain.mocker.MockerNodeContext; | ||||
import com.jd.blockchain.mocker.handler.MockerContractExeHandle; | import com.jd.blockchain.mocker.handler.MockerContractExeHandle; | ||||
@@ -68,9 +70,14 @@ public class ContractProxy<T> implements InvocationHandler { | |||||
operationHandle.registerExecutorProxy(txHash, new ExecutorProxy(instance, method, args)); | 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) { | private boolean isExecuteContractMethod(Method method) { | ||||
@@ -10,7 +10,7 @@ import org.junit.Test; | |||||
import static org.junit.Assert.assertEquals; | import static org.junit.Assert.assertEquals; | ||||
public class SampleTest_ { | |||||
public class SampleTest { | |||||
MockerNodeContext mockerNodeContext = null; | MockerNodeContext mockerNodeContext = null; | ||||
@@ -33,7 +33,9 @@ public class SampleTest_ { | |||||
writeContract = mockerNodeContext.deployContract(writeContract); | 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); | KVDataEntry[] dataEntries = mockerNodeContext.getDataEntries(ledgerHash, dataAccountAddress, key); |