Browse Source

fix contract execute bug

tags/1.1.5
zhangshuang 5 years ago
parent
commit
64cea29f14
4 changed files with 40 additions and 13 deletions
  1. +9
    -3
      source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/AbstractContractCode.java
  2. +4
    -10
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/TransactionBatchProcessor.java
  3. +22
    -0
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractExecuteException.java
  4. +5
    -0
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionState.java

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

@@ -2,6 +2,7 @@ package com.jd.blockchain.contract.jvm;

import java.lang.reflect.Method;

import com.jd.blockchain.ledger.ContractExecuteException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ReflectionUtils;
@@ -74,9 +75,14 @@ public abstract class AbstractContractCode implements ContractCode {
BytesValueList bytesValues = eventContext.getArgs();
Object[] args = BytesValueEncoding.decode(bytesValues, handleMethod.getParameterTypes());
retn = ReflectionUtils.invokeMethod(handleMethod, contractInstance, args);

try {
retn = ReflectionUtils.invokeMethod(handleMethod, contractInstance, args);
} catch (Throwable e) {
throw new ContractExecuteException(String.format("Contract[%s:%s] has no handle method to handle event[%s]!", address.toString(),
contractDefinition.getType().getName(), eventContext.getEvent()));
}

} catch (Exception e) {
error = e;
}


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

@@ -157,7 +157,7 @@ public class TransactionBatchProcessor implements TransactionBatchProcess {
newBlockEditor.getBlockHeight(), request.getHash(), request.getTransactionContent().getHash(),
e.getMessage()), e);
throw e;
} catch (Exception e) {
} catch (Throwable e) {
// 抛弃发生处理异常的交易请求;
resp = discard(request, TransactionState.SYSTEM_ERROR);
LOGGER.error(String.format(
@@ -165,14 +165,6 @@ public class TransactionBatchProcessor implements TransactionBatchProcess {
newBlockEditor.getBlockHeight(), request.getHash(), request.getTransactionContent().getHash(),
e.getMessage()), e);

} catch (Error e) {
// 抛弃发生系统错误的交易请求;
resp = discard(request, TransactionState.SYSTEM_ERROR);
LOGGER.error(String.format(
"Ignore transaction caused by the transaction op error! --[BlockHeight=%s][RequestHash=%s][TxHash=%s] --%s",
newBlockEditor.getBlockHeight(), request.getHash(), request.getTransactionContent().getHash(),
e.getMessage()), e);

}
finally {
// 清空交易的用户安全策略;
@@ -315,6 +307,8 @@ public class TransactionBatchProcessor implements TransactionBatchProcess {
result = TransactionState.USER_DOES_NOT_EXIST;
} else if (e instanceof ContractDoesNotExistException) {
result = TransactionState.CONTRACT_DOES_NOT_EXIST;
} else if (e instanceof ContractExecuteException) {
result = TransactionState.CONTRACT_EXECUTE_ERROR;
} else if (e instanceof ParticipantDoesNotExistException) {
result = TransactionState.PARTICIPANT_DOES_NOT_EXIST;
} else if (e instanceof DataVersionConflictException) {
@@ -333,7 +327,7 @@ public class TransactionBatchProcessor implements TransactionBatchProcess {
"Due to ledger security exception, the data changes resulting from transaction execution will be rolled back and the results of the transaction will be committed! --[BlockHeight=%s][RequestHash=%s][TxHash=%s] --%s",
newBlockEditor.getBlockHeight(), request.getHash(), request.getTransactionContent().getHash(),
e.getMessage()), e);
} catch (Exception e) {
} catch (Throwable e) {
result = TransactionState.SYSTEM_ERROR;
txCtx.discardAndCommit(TransactionState.SYSTEM_ERROR, operationResults);
LOGGER.error(String.format(


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

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

import com.jd.blockchain.crypto.HashDigest;

/**
* @Author: zhangshuang
* @Date: 2020/5/27 10:34 AM
* Version 1.0
*/
public class ContractExecuteException extends LedgerException {

private static final long serialVersionUID = 8685914012112243776L;

public ContractExecuteException(String message) {
super(message);
}

public ContractExecuteException(String message, Throwable cause) {
super(message, cause);
}

}

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

@@ -49,6 +49,11 @@ public enum TransactionState {
*/
PARTICIPANT_DOES_NOT_EXIST((byte) 0x06),

/**
* 合约执行错误;
*/
CONTRACT_EXECUTE_ERROR((byte) 0x07),

/**
* 被安全策略拒绝;
*/


Loading…
Cancel
Save