Browse Source

Refactored the structure of operation results of ledger transaction;

tags/1.0.0
huanghaiquan 5 years ago
parent
commit
d523334c9f
23 changed files with 189 additions and 181 deletions
  1. +3
    -1
      source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java
  2. +4
    -2
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionContext.java
  3. +1
    -1
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/OperationHandle.java
  4. +22
    -6
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionData.java
  5. +6
    -6
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java
  6. +37
    -53
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/TransactionBatchProcessor.java
  7. +3
    -1
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractCodeDeployOperationHandle.java
  8. +8
    -7
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractEventSendOperationHandle.java
  9. +12
    -5
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java
  10. +9
    -6
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountRegisterOperationHandle.java
  11. +5
    -2
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/UserRegisterOperationHandle.java
  12. +0
    -17
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractReturnMessage.java
  13. +0
    -41
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractReturnMessageData.java
  14. +17
    -0
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/OperationResult.java
  15. +26
    -0
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/OperationResultData.java
  16. +6
    -7
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/Transaction.java
  17. +3
    -3
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionRespHandle.java
  18. +8
    -8
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionResponse.java
  19. +1
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionReturnMessage.java
  20. +4
    -4
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionReturnMessageData.java
  21. +4
    -3
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxResponseMessage.java
  22. +2
    -1
      source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java
  23. +8
    -6
      source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/handler/MockerContractExeHandle.java

+ 3
- 1
source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java View File

@@ -122,7 +122,9 @@ public class JavaContractCode implements ContractCode {


// 填充return结果 // 填充return结果
if (this.contractReturn != null) { if (this.contractReturn != null) {
this.contractReturn.complete(contractReturn);
//TODO: Not implemented;
throw new IllegalStateException("Not implemented!");
// this.contractReturn.complete(contractReturn);
} }
} catch (NoSuchMethodException e) { } catch (NoSuchMethodException e) {
throw new IllegalArgumentException(e.getMessage()); throw new IllegalArgumentException(e.getMessage());


+ 4
- 2
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionContext.java View File

@@ -2,6 +2,7 @@ package com.jd.blockchain.ledger.core;


import com.jd.blockchain.ledger.TransactionReturnMessage; import com.jd.blockchain.ledger.TransactionReturnMessage;
import com.jd.blockchain.ledger.TransactionState; import com.jd.blockchain.ledger.TransactionState;
import com.jd.blockchain.ledger.OperationResult;
import com.jd.blockchain.ledger.LedgerTransaction; import com.jd.blockchain.ledger.LedgerTransaction;
import com.jd.blockchain.ledger.TransactionRequest; import com.jd.blockchain.ledger.TransactionRequest;


@@ -35,7 +36,8 @@ public interface LedgerTransactionContext {
* *
* @return * @return
*/ */
LedgerTransaction commit(TransactionState txResult, TransactionReturnMessage returnMessage);
LedgerTransaction commit(TransactionState txResult, OperationResult... opResults);


/** /**
* 抛弃对账本数据的修改,以指定的交易状态提交交易;<br> * 抛弃对账本数据的修改,以指定的交易状态提交交易;<br>
@@ -45,7 +47,7 @@ public interface LedgerTransactionContext {
* @param txResult * @param txResult
* @return * @return
*/ */
LedgerTransaction discardAndCommit(TransactionState txResult, TransactionReturnMessage returnMessage);
LedgerTransaction discardAndCommit(TransactionState txResult);


/** /**
* 回滚事务,抛弃本次事务的所有数据更新; * 回滚事务,抛弃本次事务的所有数据更新;


+ 1
- 1
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/OperationHandle.java View File

@@ -25,7 +25,7 @@ public interface OperationHandle {
* @param previousBlockDataset * @param previousBlockDataset
* 新区块的前一个区块的数据集;即未提交新区块之前的经过共识的账本最新数据集; * 新区块的前一个区块的数据集;即未提交新区块之前的经过共识的账本最新数据集;
*/ */
void process(Operation op, LedgerDataSet newBlockDataset, TransactionRequestContext requestContext,
byte[] process(Operation op, LedgerDataSet newBlockDataset, TransactionRequestContext requestContext,
LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService); LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService);


} }

+ 22
- 6
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionData.java View File

@@ -1,7 +1,15 @@
package com.jd.blockchain.ledger.core.impl; 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.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 { public class LedgerTransactionData implements LedgerTransaction {


@@ -19,7 +27,7 @@ public class LedgerTransactionData implements LedgerTransaction {


private long blockHeight; private long blockHeight;


private TransactionReturnMessage returnMessage;
private OperationResult[] operationResults;


// private HashDigest adminAccountHash; // private HashDigest adminAccountHash;
// //
@@ -47,7 +55,7 @@ public class LedgerTransactionData implements LedgerTransaction {
* 交易级的系统快照; * 交易级的系统快照;
*/ */
public LedgerTransactionData(long blockHeight, TransactionRequest txReq, TransactionState execState, public LedgerTransactionData(long blockHeight, TransactionRequest txReq, TransactionState execState,
TransactionStagedSnapshot txSnapshot, TransactionReturnMessage returnMessage) {
TransactionStagedSnapshot txSnapshot, OperationResult... opResults) {
this.blockHeight = blockHeight; this.blockHeight = blockHeight;
// this.txSnapshot = txSnapshot == null ? new TransactionStagedSnapshot() : txSnapshot; // this.txSnapshot = txSnapshot == null ? new TransactionStagedSnapshot() : txSnapshot;
this.txSnapshot = txSnapshot; this.txSnapshot = txSnapshot;
@@ -55,7 +63,15 @@ public class LedgerTransactionData implements LedgerTransaction {
this.endpointSignatures = txReq.getEndpointSignatures(); this.endpointSignatures = txReq.getEndpointSignatures();
this.nodeSignatures = txReq.getNodeSignatures(); this.nodeSignatures = txReq.getNodeSignatures();
this.executionState = execState; this.executionState = execState;
this.returnMessage = returnMessage;
if (opResults != null) {
Arrays.sort(opResults, new Comparator<OperationResult>() {
@Override
public int compare(OperationResult o1, OperationResult o2) {
return o1.getIndex() - o2.getIndex();
}
});
}
this.operationResults = opResults;
} }


@Override @Override
@@ -74,8 +90,8 @@ public class LedgerTransactionData implements LedgerTransaction {
} }


@Override @Override
public TransactionReturnMessage getReturnMessage() {
return returnMessage;
public OperationResult[] getOperationResults() {
return operationResults;
} }


@Override @Override


+ 6
- 6
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java View File

@@ -348,9 +348,9 @@ public class LedgerTransactionalEditor implements LedgerEditor {
public TransactionRequest getRequestTX() { public TransactionRequest getRequestTX() {
return txRequest; return txRequest;
} }
@Override @Override
public LedgerTransaction commit(TransactionState txResult, TransactionReturnMessage returnMessage) {
public LedgerTransaction commit(TransactionState txResult, OperationResult... opResults) {
checkTxState(); checkTxState();


// capture snapshot // capture snapshot
@@ -359,7 +359,7 @@ public class LedgerTransactionalEditor implements LedgerEditor {


// LedgerTransactionData tx = new LedgerTransactionData(blockHeight, txRequest, // LedgerTransactionData tx = new LedgerTransactionData(blockHeight, txRequest,
// txResult, txDataSnapshot); // 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.add(tx);
// this.txset.commit(); // this.txset.commit();


@@ -374,9 +374,9 @@ public class LedgerTransactionalEditor implements LedgerEditor {
committed = true; committed = true;
return tx; return tx;
} }
@Override @Override
public LedgerTransaction discardAndCommit(TransactionState txResult, TransactionReturnMessage returnMessage) {
public LedgerTransaction discardAndCommit(TransactionState txResult) {
checkTxState(); checkTxState();


// 未处理 // 未处理
@@ -385,7 +385,7 @@ public class LedgerTransactionalEditor implements LedgerEditor {
// TransactionStagedSnapshot txDataSnapshot = takeSnapshot(); // TransactionStagedSnapshot txDataSnapshot = takeSnapshot();
// LedgerTransactionData tx = new LedgerTransactionData(blockHeight, txRequest, // LedgerTransactionData tx = new LedgerTransactionData(blockHeight, txRequest,
// txResult, txDataSnapshot); // 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.add(tx);
// this.txset.commit(); // this.txset.commit();




+ 37
- 53
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/TransactionBatchProcessor.java View File

@@ -3,15 +3,20 @@ package com.jd.blockchain.ledger.core.impl;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; 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.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;


import com.jd.blockchain.crypto.HashDigest; 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.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.LedgerDataSet;
import com.jd.blockchain.ledger.core.LedgerEditor; import com.jd.blockchain.ledger.core.LedgerEditor;
import com.jd.blockchain.ledger.core.LedgerService; import com.jd.blockchain.ledger.core.LedgerService;
@@ -26,7 +31,7 @@ import com.jd.blockchain.utils.Bytes;
public class TransactionBatchProcessor implements TransactionBatchProcess { public class TransactionBatchProcessor implements TransactionBatchProcess {


private static final Logger LOGGER = LoggerFactory.getLogger(TransactionBatchProcessor.class); private static final Logger LOGGER = LoggerFactory.getLogger(TransactionBatchProcessor.class);
private LedgerService ledgerService; private LedgerService ledgerService;


private LedgerEditor newBlockEditor; private LedgerEditor newBlockEditor;
@@ -45,12 +50,9 @@ public class TransactionBatchProcessor implements TransactionBatchProcess {
private TransactionBatchResult batchResult; private TransactionBatchResult batchResult;


/** /**
* @param newBlockEditor
* 新区块的数据编辑器;
* @param previousBlockDataset
* 新区块的前一个区块的数据集;即未提交新区块之前的经过共识的账本最新数据集;
* @param opHandles
* 操作处理对象注册表;
* @param newBlockEditor 新区块的数据编辑器;
* @param previousBlockDataset 新区块的前一个区块的数据集;即未提交新区块之前的经过共识的账本最新数据集;
* @param opHandles 操作处理对象注册表;
*/ */
public TransactionBatchProcessor(LedgerEditor newBlockEditor, LedgerDataSet previousBlockDataset, public TransactionBatchProcessor(LedgerEditor newBlockEditor, LedgerDataSet previousBlockDataset,
OperationHandleRegisteration opHandles, LedgerService ledgerService) { OperationHandleRegisteration opHandles, LedgerService ledgerService) {
@@ -71,9 +73,8 @@ public class TransactionBatchProcessor implements TransactionBatchProcess {
public TransactionResponse schedule(TransactionRequest request) { public TransactionResponse schedule(TransactionRequest request) {
// 此调用将会验证交易签名,验签失败将会抛出异常,同时,不记录签名错误的交易到链上; // 此调用将会验证交易签名,验签失败将会抛出异常,同时,不记录签名错误的交易到链上;
LedgerTransactionContext txCtx = newBlockEditor.newTransaction(request); LedgerTransactionContext txCtx = newBlockEditor.newTransaction(request);
TransactionState result;
TransactionReturnMessageData returnMessageData = new TransactionReturnMessageData();

TransactionState txResult;
OperationResult[] opResults = null;
try { try {
LedgerDataSet dataset = txCtx.getDataSet(); LedgerDataSet dataset = txCtx.getDataSet();
TransactionRequestContext reqCtx = new TransactionRequestContextImpl(request); TransactionRequestContext reqCtx = new TransactionRequestContextImpl(request);
@@ -94,58 +95,44 @@ public class TransactionBatchProcessor implements TransactionBatchProcess {
OperationHandleContext handleContext = new OperationHandleContext() { OperationHandleContext handleContext = new OperationHandleContext() {
@Override @Override
public void handle(Operation operation) { 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()); OperationHandle hdl = opHandles.getHandle(operation.getClass());
hdl.process(operation, dataset, reqCtx, previousBlockDataset, this, ledgerService); hdl.process(operation, dataset, reqCtx, previousBlockDataset, this, ledgerService);
} }
}; };
OperationHandle opHandle; OperationHandle opHandle;
int contractOpIndex = 0; int contractOpIndex = 0;
List<OperationResult> opResultList = new ArrayList<OperationResult>();
int opIdx = 0;
for (Operation op : ops) { for (Operation op : ops) {
opHandle = opHandles.getHandle(op.getClass()); opHandle = opHandles.getHandle(op.getClass());
// 合约执行需要填充执行结果
if (opHandle instanceof ContractEventSendOperationHandle) {
CompletableFuture<String> 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) { } catch (LedgerException e) {
// TODO: 识别更详细的异常类型以及执行对应的处理; // 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", LOGGER.warn(String.format("Transaction rollback caused by the ledger exception! --[TxHash=%s] --%s",
request.getHash().toBase58(), e.getMessage()), e); request.getHash().toBase58(), e.getMessage()), e);
} catch (Exception 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", LOGGER.warn(String.format("Transaction rollback caused by the system exception! --[TxHash=%s] --%s",
request.getHash().toBase58(), e.getMessage()), e); 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); responseList.add(resp);


@@ -226,11 +213,12 @@ public class TransactionBatchProcessor implements TransactionBatchProcess {


private TransactionState result; 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.request = request;
this.result = result; this.result = result;
this.opResults = opResults;
} }


@Override @Override
@@ -259,12 +247,8 @@ public class TransactionBatchProcessor implements TransactionBatchProcess {
} }


@Override @Override
public String[] getContractReturn() {
return contractReturn;
}

public void setContractReturn(String[] contractReturn) {
this.contractReturn = contractReturn;
public OperationResult[] getContractReturn() {
return opResults;
} }
} }




+ 3
- 1
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractCodeDeployOperationHandle.java View File

@@ -14,7 +14,7 @@ import org.springframework.stereotype.Service;
public class ContractCodeDeployOperationHandle implements OperationHandle { public class ContractCodeDeployOperationHandle implements OperationHandle {


@Override @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) { LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) {
ContractCodeDeployOperation contractOP = (ContractCodeDeployOperation) op; ContractCodeDeployOperation contractOP = (ContractCodeDeployOperation) op;
// TODO: 校验合约代码的正确性; // TODO: 校验合约代码的正确性;
@@ -22,6 +22,8 @@ public class ContractCodeDeployOperationHandle implements OperationHandle {
// TODO: 请求者应该提供合约账户的公钥签名,已确定注册的地址的唯一性; // TODO: 请求者应该提供合约账户的公钥签名,已确定注册的地址的唯一性;
dataset.getContractAccountSet().deploy(contractOP.getContractID().getAddress(), dataset.getContractAccountSet().deploy(contractOP.getContractID().getAddress(),
contractOP.getContractID().getPubKey(), contractOP.getAddressSignature(), contractOP.getChainCode()); contractOP.getContractID().getPubKey(), contractOP.getAddressSignature(), contractOP.getChainCode());
//No result;
return null;
} }


@Override @Override


+ 8
- 7
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractEventSendOperationHandle.java View File

@@ -2,6 +2,8 @@ package com.jd.blockchain.ledger.core.impl.handles;


import static com.jd.blockchain.utils.BaseConstant.CONTRACT_SERVICE_PROVIDER; import static com.jd.blockchain.utils.BaseConstant.CONTRACT_SERVICE_PROVIDER;


import java.util.concurrent.CompletableFuture;

import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;


import com.jd.blockchain.contract.LocalContractEventContext; 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.LedgerQueryService;
import com.jd.blockchain.ledger.core.impl.OperationHandleContext; import com.jd.blockchain.ledger.core.impl.OperationHandleContext;


import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;

@Service @Service
public class ContractEventSendOperationHandle implements OperationHandle { public class ContractEventSendOperationHandle implements OperationHandle {


@@ -33,9 +32,12 @@ public class ContractEventSendOperationHandle implements OperationHandle {
} }


@Override @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) { LedgerDataSet previousBlockDataset, OperationHandleContext opHandleContext, LedgerService ledgerService) {
process(op, dataset, requestContext, previousBlockDataset, opHandleContext, ledgerService, null); process(op, dataset, requestContext, previousBlockDataset, opHandleContext, ledgerService, null);

// TODO: return value;
return null;
} }


@Override @Override
@@ -44,8 +46,8 @@ public class ContractEventSendOperationHandle implements OperationHandle {
} }


public void process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, public void process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext,
LedgerDataSet previousBlockDataset, OperationHandleContext opHandleContext,
LedgerService ledgerService, CompletableFuture<String> contractReturn) {
LedgerDataSet previousBlockDataset, OperationHandleContext opHandleContext, LedgerService ledgerService,
CompletableFuture<String> contractReturn) {


ContractEventSendOperation contractOP = (ContractEventSendOperation) op; ContractEventSendOperation contractOP = (ContractEventSendOperation) op;
// 先从账本校验合约的有效性; // 先从账本校验合约的有效性;
@@ -84,5 +86,4 @@ public class ContractEventSendOperationHandle implements OperationHandle {
contractCode.processEvent(localContractEventContext, contractReturn); contractCode.processEvent(localContractEventContext, contractReturn);
} }



} }

+ 12
- 5
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java View File

@@ -1,24 +1,28 @@
package com.jd.blockchain.ledger.core.impl.handles; 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.binaryproto.DataContractRegistry;
import com.jd.blockchain.ledger.BytesValue; import com.jd.blockchain.ledger.BytesValue;
import com.jd.blockchain.ledger.DataAccountKVSetOperation; import com.jd.blockchain.ledger.DataAccountKVSetOperation;
import com.jd.blockchain.ledger.DataAccountKVSetOperation.KVWriteEntry; import com.jd.blockchain.ledger.DataAccountKVSetOperation.KVWriteEntry;
import com.jd.blockchain.ledger.Operation; 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.ledger.core.impl.OperationHandleContext;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;
import org.springframework.stereotype.Service;


@Service @Service
public class DataAccountKVSetOperationHandle implements OperationHandle{
public class DataAccountKVSetOperationHandle implements OperationHandle {
static { static {
DataContractRegistry.register(BytesValue.class); DataContractRegistry.register(BytesValue.class);
} }


@Override @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) { LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) {
DataAccountKVSetOperation kvWriteOp = (DataAccountKVSetOperation) op; DataAccountKVSetOperation kvWriteOp = (DataAccountKVSetOperation) op;
DataAccount account = dataset.getDataAccountSet().getDataAccount(kvWriteOp.getAccountAddress()); DataAccount account = dataset.getDataAccountSet().getDataAccount(kvWriteOp.getAccountAddress());
@@ -26,6 +30,9 @@ public class DataAccountKVSetOperationHandle implements OperationHandle{
for (KVWriteEntry kvw : writeset) { for (KVWriteEntry kvw : writeset) {
account.setBytes(Bytes.fromString(kvw.getKey()), kvw.getValue(), kvw.getExpectedVersion()); account.setBytes(Bytes.fromString(kvw.getKey()), kvw.getValue(), kvw.getExpectedVersion());
} }

// No return value;
return null;
} }


@Override @Override


+ 9
- 6
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountRegisterOperationHandle.java View File

@@ -12,18 +12,21 @@ import com.jd.blockchain.ledger.core.impl.OperationHandleContext;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;


@Service @Service
public class DataAccountRegisterOperationHandle implements OperationHandle{
public class DataAccountRegisterOperationHandle implements OperationHandle {


@Override @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) { LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) {
DataAccountRegisterOperation dataAccountRegOp = (DataAccountRegisterOperation) op; DataAccountRegisterOperation dataAccountRegOp = (DataAccountRegisterOperation) op;
BlockchainIdentity bid = dataAccountRegOp.getAccountID(); BlockchainIdentity bid = dataAccountRegOp.getAccountID();
//TODO: 校验用户身份;
//TODO: 请求者应该提供数据账户的公钥签名,已确定注册的地址的唯一性;
// TODO: 校验用户身份;
// TODO: 请求者应该提供数据账户的公钥签名,已确定注册的地址的唯一性;
dataset.getDataAccountSet().register(bid.getAddress(), bid.getPubKey(), null); dataset.getDataAccountSet().register(bid.getAddress(), bid.getPubKey(), null);

// No return value;
return null;
} }


@Override @Override


+ 5
- 2
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/UserRegisterOperationHandle.java View File

@@ -9,14 +9,17 @@ import com.jd.blockchain.ledger.core.OperationHandle;
import com.jd.blockchain.ledger.core.TransactionRequestContext; import com.jd.blockchain.ledger.core.TransactionRequestContext;
import com.jd.blockchain.ledger.core.impl.OperationHandleContext; import com.jd.blockchain.ledger.core.impl.OperationHandleContext;


public class UserRegisterOperationHandle implements OperationHandle{
public class UserRegisterOperationHandle implements OperationHandle {


@Override @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) { LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) {
UserRegisterOperation userRegOp = (UserRegisterOperation) op; UserRegisterOperation userRegOp = (UserRegisterOperation) op;
BlockchainIdentity bid = userRegOp.getUserID(); BlockchainIdentity bid = userRegOp.getUserID();
dataset.getUserAccountSet().register(bid.getAddress(), bid.getPubKey()); dataset.getUserAccountSet().register(bid.getAddress(), bid.getPubKey());

// No return value;
return null;
} }


@Override @Override


+ 0
- 17
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractReturnMessage.java View File

@@ -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();

}

+ 0
- 41
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractReturnMessageData.java View File

@@ -1,41 +0,0 @@
package com.jd.blockchain.ledger;

import java.util.concurrent.CompletableFuture;

public class ContractReturnMessageData implements ContractReturnMessage {

private int operationIndex;

private CompletableFuture<String> returnMsgFuture;

public ContractReturnMessageData() {
}

public ContractReturnMessageData(int operationIndex, CompletableFuture<String> returnMsgFuture) {
this.operationIndex = operationIndex;
this.returnMsgFuture = returnMsgFuture;
}

public void setOperationIndex(int operationIndex) {
this.operationIndex = operationIndex;
}

public void setReturnMsgFuture(CompletableFuture<String> 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);
}
}
}

+ 17
- 0
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/OperationResult.java View File

@@ -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();

}

+ 26
- 0
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/OperationResultData.java View File

@@ -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;
}
}

+ 6
- 7
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/Transaction.java View File

@@ -5,7 +5,6 @@ import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes; import com.jd.blockchain.consts.DataCodes;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.utils.io.ByteArray;
/** /**
* Transaction 区块链交易,是被原子执行的操作集合; * Transaction 区块链交易,是被原子执行的操作集合;
@@ -13,7 +12,7 @@ import com.jd.blockchain.utils.io.ByteArray;
* @author huanghaiquan * @author huanghaiquan
* *
*/ */
@DataContract(code= DataCodes.TX)
@DataContract(code = DataCodes.TX)
public interface Transaction extends NodeRequest, HashObject { public interface Transaction extends NodeRequest, HashObject {
/** /**
@@ -23,7 +22,7 @@ public interface Transaction extends NodeRequest, HashObject {
* *
* @return * @return
*/ */
@DataField(order=1, primitiveType = PrimitiveType.BYTES)
@DataField(order = 1, primitiveType = PrimitiveType.BYTES)
@Override @Override
HashDigest getHash(); HashDigest getHash();
@@ -32,7 +31,7 @@ public interface Transaction extends NodeRequest, HashObject {
* *
* @return * @return
*/ */
@DataField(order=2, primitiveType=PrimitiveType.INT64)
@DataField(order = 2, primitiveType = PrimitiveType.INT64)
long getBlockHeight(); long getBlockHeight();
/** /**
@@ -42,7 +41,7 @@ public interface Transaction extends NodeRequest, HashObject {
* *
* @return * @return
*/ */
@DataField(order=3, refEnum=true)
@DataField(order = 3, refEnum = true)
TransactionState getExecutionState(); TransactionState getExecutionState();
/** /**
@@ -50,6 +49,6 @@ public interface Transaction extends NodeRequest, HashObject {
* *
* @return * @return
*/ */
@DataField(order=4, refContract=true)
TransactionReturnMessage getReturnMessage();
@DataField(order = 4, refContract = true, list = true)
OperationResult[] getOperationResults();
} }

+ 3
- 3
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionRespHandle.java View File

@@ -27,7 +27,7 @@ public class TransactionRespHandle implements TransactionResponse {


private TransactionState globalResult; private TransactionState globalResult;


private String[] contractReturn;
private OperationResult[] contractReturn;


public TransactionRespHandle(TransactionRequest request, TransactionState result, TransactionState globalResult) { public TransactionRespHandle(TransactionRequest request, TransactionState result, TransactionState globalResult) {
this.request = request; this.request = request;
@@ -51,7 +51,7 @@ public class TransactionRespHandle implements TransactionResponse {
this.result = result; this.result = result;
} }


public void setContractReturn(String[] contractReturn) {
public void setContractReturn(OperationResult[] contractReturn) {
this.contractReturn = contractReturn; this.contractReturn = contractReturn;
} }


@@ -97,7 +97,7 @@ public class TransactionRespHandle implements TransactionResponse {
} }


@Override @Override
public String[] getContractReturn() {
public OperationResult[] getContractReturn() {
return contractReturn; return contractReturn;
} }
} }

+ 8
- 8
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionResponse.java View File

@@ -12,7 +12,7 @@ import com.jd.blockchain.crypto.HashDigest;
* @author huanghaiquan * @author huanghaiquan
* *
*/ */
@DataContract(code= DataCodes.TX_RESPONSE)
@DataContract(code = DataCodes.TX_RESPONSE)
public interface TransactionResponse { public interface TransactionResponse {
/** /**
@@ -20,7 +20,7 @@ public interface TransactionResponse {
* *
* @return * @return
*/ */
@DataField(order=1, primitiveType = PrimitiveType.BYTES)
@DataField(order = 1, primitiveType = PrimitiveType.BYTES)
HashDigest getContentHash(); HashDigest getContentHash();
/** /**
@@ -28,7 +28,7 @@ public interface TransactionResponse {
* *
* @return * @return
*/ */
@DataField(order=2, refEnum=true)
@DataField(order = 2, refEnum = true)
TransactionState getExecutionState(); TransactionState getExecutionState();
/** /**
@@ -36,7 +36,7 @@ public interface TransactionResponse {
* *
* @return * @return
*/ */
@DataField(order=3, primitiveType = PrimitiveType.BYTES)
@DataField(order = 3, primitiveType = PrimitiveType.BYTES)
HashDigest getBlockHash(); HashDigest getBlockHash();
/** /**
@@ -47,7 +47,7 @@ public interface TransactionResponse {
* *
* @return * @return
*/ */
@DataField(order=4, primitiveType=PrimitiveType.INT64)
@DataField(order = 4, primitiveType = PrimitiveType.INT64)
long getBlockHeight(); long getBlockHeight();
/** /**
@@ -55,7 +55,7 @@ public interface TransactionResponse {
* *
* @return * @return
*/ */
@DataField(order=5, primitiveType=PrimitiveType.BOOLEAN)
@DataField(order = 5, primitiveType = PrimitiveType.BOOLEAN)
boolean isSuccess(); boolean isSuccess();
/** /**
@@ -63,6 +63,6 @@ public interface TransactionResponse {
* *
* @return * @return
*/ */
@DataField(order=6, list=true, primitiveType=PrimitiveType.TEXT)
String[] getContractReturn();
@DataField(order = 6, list = true, refContract = true)
OperationResult[] getContractReturn();
} }

+ 1
- 1
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionReturnMessage.java View File

@@ -13,5 +13,5 @@ public interface TransactionReturnMessage {
* @return * @return
*/ */
@DataField(order=1, list = true, refContract=true) @DataField(order=1, list = true, refContract=true)
ContractReturnMessage[] getContractReturn();
OperationResult[] getContractReturn();
} }

+ 4
- 4
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionReturnMessageData.java View File

@@ -5,9 +5,9 @@ import java.util.List;


public class TransactionReturnMessageData implements TransactionReturnMessage { public class TransactionReturnMessageData implements TransactionReturnMessage {


private List<ContractReturnMessage> contractReturnMessages = new ArrayList<>();
private List<OperationResult> contractReturnMessages = new ArrayList<>();


public void addContractReturnMessage(ContractReturnMessage contractReturnMessage) {
public void addContractReturnMessage(OperationResult contractReturnMessage) {
contractReturnMessages.add(contractReturnMessage); contractReturnMessages.add(contractReturnMessage);
} }


@@ -16,11 +16,11 @@ public class TransactionReturnMessageData implements TransactionReturnMessage {
} }


@Override @Override
public ContractReturnMessage[] getContractReturn() {
public OperationResult[] getContractReturn() {
if (isContractReturnEmpty()) { if (isContractReturnEmpty()) {
return null; return null;
} }
ContractReturnMessage[] crms = new ContractReturnMessage[contractReturnMessages.size()];
OperationResult[] crms = new OperationResult[contractReturnMessages.size()];
return contractReturnMessages.toArray(crms); return contractReturnMessages.toArray(crms);
} }
} }

+ 4
- 3
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxResponseMessage.java View File

@@ -2,6 +2,7 @@ package com.jd.blockchain.transaction;
import com.jd.blockchain.ledger.TransactionState; import com.jd.blockchain.ledger.TransactionState;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.OperationResult;
import com.jd.blockchain.ledger.TransactionResponse; import com.jd.blockchain.ledger.TransactionResponse;
/** /**
@@ -18,7 +19,7 @@ public class TxResponseMessage implements TransactionResponse {
private TransactionState executionState; private TransactionState executionState;
private String[] contractReturn;
private OperationResult[] contractReturn;
public TxResponseMessage() { public TxResponseMessage() {
} }
@@ -59,7 +60,7 @@ public class TxResponseMessage implements TransactionResponse {
this.blockHeight = blockHeight; this.blockHeight = blockHeight;
} }
public void setContractReturn(String[] contractReturn) {
public void setContractReturn(OperationResult[] contractReturn) {
this.contractReturn = contractReturn; this.contractReturn = contractReturn;
} }
@@ -69,7 +70,7 @@ public class TxResponseMessage implements TransactionResponse {
} }
@Override @Override
public String[] getContractReturn() {
public OperationResult[] getContractReturn() {
return contractReturn; return contractReturn;
} }


+ 2
- 1
source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java View File

@@ -2,6 +2,7 @@ package com.jd.blockchain.peer.consensus;


import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.ledger.LedgerBlock; import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.OperationResult;
import com.jd.blockchain.ledger.TransactionRequest; import com.jd.blockchain.ledger.TransactionRequest;
import com.jd.blockchain.ledger.TransactionResponse; import com.jd.blockchain.ledger.TransactionResponse;
import com.jd.blockchain.ledger.TransactionState; import com.jd.blockchain.ledger.TransactionState;
@@ -309,7 +310,7 @@ public class ConsensusMessageDispatcher implements MessageHandle {
} }


@Override @Override
public String[] getContractReturn() {
public OperationResult[] getContractReturn() {
return txResp.getContractReturn(); return txResp.getContractReturn();
} }
} }


+ 8
- 6
source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/handler/MockerContractExeHandle.java View File

@@ -20,7 +20,6 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;



public class MockerContractExeHandle implements OperationHandle { public class MockerContractExeHandle implements OperationHandle {


private Map<HashDigest, ExecutorProxy> executorProxyMap = new ConcurrentHashMap<>(); private Map<HashDigest, ExecutorProxy> executorProxyMap = new ConcurrentHashMap<>();
@@ -30,7 +29,7 @@ public class MockerContractExeHandle implements OperationHandle {
private HashDigest ledgerHash; private HashDigest ledgerHash;


@Override @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) { LedgerDataSet previousBlockDataset, OperationHandleContext opHandleContext, LedgerService ledgerService) {
ContractEventSendOperation contractOP = (ContractEventSendOperation) op; ContractEventSendOperation contractOP = (ContractEventSendOperation) op;


@@ -42,8 +41,8 @@ public class MockerContractExeHandle implements OperationHandle {
LedgerQueryService queryService = new LedgerQueryService(ledgerManager); LedgerQueryService queryService = new LedgerQueryService(ledgerManager);
ContractLedgerContext ledgerContext = new ContractLedgerContext(queryService, opHandleContext); 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(); EventProcessingAwire eventProcessingAwire = (EventProcessingAwire) executorProxy.getInstance();
try { try {
@@ -60,6 +59,9 @@ public class MockerContractExeHandle implements OperationHandle {
removeExecutorProxy(txHash); removeExecutorProxy(txHash);
} }
} }

// No return value;
return null;
} }


@Override @Override
@@ -90,8 +92,8 @@ public class MockerContractExeHandle implements OperationHandle {


private LedgerContext ledgerContext; 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.ledgeHash = ledgeHash;
this.event = event; this.event = event;
this.transactionRequest = transactionRequest; this.transactionRequest = transactionRequest;


Loading…
Cancel
Save