@@ -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) { | |||
@@ -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); | |||
} |
@@ -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 | |||
@@ -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 | |||
@@ -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<T> 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) { | |||
@@ -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); |