From efbef110eea050657954bf22056c17e7f624a473 Mon Sep 17 00:00:00 2001 From: cyjseagull Date: Fri, 8 Oct 2021 19:22:06 +0800 Subject: [PATCH] add decodeTransactionInput to ABICodec --- .ci/ci_check.sh | 2 +- build.gradle | 2 +- .../java/org/fisco/bcos/sdk/abi/ABICodec.java | 56 +++++++++++++++++-- .../decode/TransactionDecoderService.java | 9 +++ .../model/dto/TransactionResponse.java | 28 ++++++++++ 5 files changed, 90 insertions(+), 7 deletions(-) diff --git a/.ci/ci_check.sh b/.ci/ci_check.sh index 9706112c6..733889e36 100755 --- a/.ci/ci_check.sh +++ b/.ci/ci_check.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -tag="v2.8.0" +tag="v2.7.2" LOG_INFO() { local content=${1} echo -e "\033[32m ${content}\033[0m" diff --git a/build.gradle b/build.gradle index 93c297809..d34fc02de 100644 --- a/build.gradle +++ b/build.gradle @@ -37,7 +37,7 @@ ext { // integrationTest.mustRunAfter test allprojects { group = 'org.fisco-bcos.java-sdk' - version = '2.8.0-GMT0018' + version = '2.8.1-SNAPSHOT' apply plugin: 'maven' apply plugin: 'maven-publish' apply plugin: 'idea' diff --git a/sdk-abi/src/main/java/org/fisco/bcos/sdk/abi/ABICodec.java b/sdk-abi/src/main/java/org/fisco/bcos/sdk/abi/ABICodec.java index 060f3a7d7..af3677c2d 100644 --- a/sdk-abi/src/main/java/org/fisco/bcos/sdk/abi/ABICodec.java +++ b/sdk-abi/src/main/java/org/fisco/bcos/sdk/abi/ABICodec.java @@ -303,9 +303,28 @@ public List decodeMethod(String ABI, String methodName, String output) throws ABICodecException { return decodeMethodAndGetOutputObject(ABI, methodName, output).getLeft(); } + /** + * decode the input string into json + * + * @param input the transaction input + * @return the decoded json string of the input + */ + public List decodeTransactionInputToString(String ABI, String input) + throws ABICodecException { + String inputWithPrefix = addHexPrefixToString(input); + String methodId = inputWithPrefix.substring(0, 10); + return decodeMethodByIdToString(ABI, methodId, input.substring(10), false); + } - public List decodeMethodById(String ABI, String methodId, String output) + public Pair, List> decodeTransactionInput(String ABI, String input) throws ABICodecException { + String inputWithPrefix = addHexPrefixToString(input); + String methodId = inputWithPrefix.substring(0, 10); + return decodeDataByMethodId(ABI, methodId, input.substring(10), false); + } + + public Pair, List> decodeDataByMethodId( + String ABI, String methodId, String data, boolean isOutput) throws ABICodecException { ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI); ABIDefinition abiDefinition = contractABIDefinition.getABIDefinitionByMethodId(methodId); if (abiDefinition == null) { @@ -313,10 +332,15 @@ public List decodeMethodById(String ABI, String methodId, String output) logger.error(errorMsg); throw new ABICodecException(errorMsg); } - ABIObject outputABIObject = abiObjectFactory.createOutputObject(abiDefinition); + ABIObject outputABIObject = null; + if (isOutput) { + outputABIObject = abiObjectFactory.createOutputObject(abiDefinition); + } else { + outputABIObject = abiObjectFactory.createInputObject(abiDefinition); + } ABICodecObject abiCodecObject = new ABICodecObject(); try { - return abiCodecObject.decodeJavaObject(outputABIObject, output); + return abiCodecObject.decodeJavaObjectAndOutputObject(outputABIObject, data); } catch (Exception e) { logger.error(" exception in decodeMethodByIdToObject : {}", e.getMessage()); } @@ -326,6 +350,11 @@ public List decodeMethodById(String ABI, String methodId, String output) throw new ABICodecException(errorMsg); } + public List decodeMethodById(String ABI, String methodId, String output) + throws ABICodecException { + return decodeDataByMethodId(ABI, methodId, output, true).getLeft(); + } + public List decodeMethodByInterface(String ABI, String methodInterface, String output) throws ABICodecException { FunctionEncoder functionEncoder = new FunctionEncoder(cryptoSuite); @@ -361,6 +390,11 @@ public List decodeMethodToString(String ABI, String methodName, String o public List decodeMethodByIdToString(String ABI, String methodId, String output) throws ABICodecException { + return decodeMethodByIdToString(ABI, methodId, output, true); + } + + public List decodeMethodByIdToString( + String ABI, String methodId, String data, boolean isOutput) throws ABICodecException { ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI); ABIDefinition abiDefinition = contractABIDefinition.getABIDefinitionByMethodId(methodId); if (abiDefinition == null) { @@ -368,10 +402,15 @@ public List decodeMethodByIdToString(String ABI, String methodId, String logger.error(errorMsg); throw new ABICodecException(errorMsg); } - ABIObject outputABIObject = abiObjectFactory.createOutputObject(abiDefinition); + ABIObject outputABIObject = null; + if (isOutput) { + outputABIObject = abiObjectFactory.createOutputObject(abiDefinition); + } else { + outputABIObject = abiObjectFactory.createInputObject(abiDefinition); + } ABICodecJsonWrapper abiCodecJsonWrapper = new ABICodecJsonWrapper(); try { - return abiCodecJsonWrapper.decode(outputABIObject, output); + return abiCodecJsonWrapper.decode(outputABIObject, data); } catch (UnsupportedOperationException e) { logger.error(" exception in decodeMethodByIdToString : {}", e.getMessage()); } @@ -513,6 +552,13 @@ public List decodeEventByInterfaceToString( return decodeEventByTopicToString(ABI, methodId, log); } + private String addHexPrefixToString(String s) { + if (!s.startsWith("0x")) { + return "0x" + s; + } + return s; + } + private List mergeEventParamsAndTopics( ABIDefinition abiDefinition, List params, List topics) { List ret = new ArrayList<>(); diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/codec/decode/TransactionDecoderService.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/codec/decode/TransactionDecoderService.java index 2f3d9f368..88c4f1cda 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/codec/decode/TransactionDecoderService.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/codec/decode/TransactionDecoderService.java @@ -72,6 +72,15 @@ public TransactionResponse decodeReceiptWithValues( String abi, String functionName, TransactionReceipt transactionReceipt) throws IOException, ABICodecException, TransactionException { TransactionResponse response = decodeReceiptWithoutValues(abi, transactionReceipt); + // parse the input + if (transactionReceipt.getInput() != null) { + Pair, List> inputObject = + abiCodec.decodeTransactionInput(abi, transactionReceipt.getInput()); + String inputValues = JsonUtils.toJson(inputObject.getLeft()); + response.setInputData(inputValues); + response.setInputObject(inputObject.getLeft()); + response.setInputABIObject(inputObject.getRight()); + } // only successful tx has return values. if (transactionReceipt.getStatus().equals("0x0")) { Pair, List> returnObject = diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/dto/TransactionResponse.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/dto/TransactionResponse.java index cd6c6e0ff..fbaba1dfb 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/dto/TransactionResponse.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/dto/TransactionResponse.java @@ -37,6 +37,10 @@ public class TransactionResponse extends CommonResponse { private List returnObject; private List returnABIObject; + private String inputData; + private List inputObject; + private List inputABIObject; + public TransactionResponse() { super(); } @@ -134,4 +138,28 @@ public List getReturnABIObject() { public void setReturnABIObject(List returnABIObject) { this.returnABIObject = returnABIObject; } + + public List getInputObject() { + return inputObject; + } + + public void setInputObject(List inputObject) { + this.inputObject = inputObject; + } + + public List getInputABIObject() { + return inputABIObject; + } + + public void setInputABIObject(List inputABIObject) { + this.inputABIObject = inputABIObject; + } + + public String getInputData() { + return inputData; + } + + public void setInputData(String inputData) { + this.inputData = inputData; + } }