Skip to content

Commit

Permalink
Merge pull request #551 from ywy2090/release-2.8.1
Browse files Browse the repository at this point in the history
sync code from 2.8.1
  • Loading branch information
ywy2090 authored Apr 29, 2022
2 parents 86fa4b0 + 245f66b commit 1876479
Show file tree
Hide file tree
Showing 34 changed files with 666 additions and 235 deletions.
9 changes: 5 additions & 4 deletions .ci/ci_check.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/bin/bash

set -e
tag="v2.7.2"
LOG_INFO() {
local content=${1}
echo -e "\033[32m ${content}\033[0m"
Expand Down Expand Up @@ -28,9 +29,9 @@ download_tassl()

download_build_chain()
{
tag=$(curl -sS "https://gitee.com/api/v5/repos/FISCO-BCOS/FISCO-BCOS/tags" | grep -oe "\"name\":\"v[2-9]*\.[0-9]*\.[0-9]*\"" | cut -d \" -f 4 | sort -V | tail -n 1)
LOG_INFO "--- current tag: $tag"
curl -LO "https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/${tag}/build_chain.sh" && chmod u+x build_chain.sh
# curl -LO "https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/${tag}/build_chain.sh" && chmod u+x build_chain.sh
curl -LO "https://raw.githubusercontent.com/FISCO-BCOS/FISCO-BCOS/master-2.0/tools/build_chain.sh" && chmod u+x build_chain.sh
}

get_sed_cmd()
Expand Down Expand Up @@ -75,11 +76,11 @@ build_node()
{
local node_type="${1}"
if [ "${node_type}" == "sm" ];then
./build_chain.sh -l 127.0.0.1:4 -g
bash -x build_chain.sh -l 127.0.0.1:4 -g
sed_cmd=$(get_sed_cmd)
$sed_cmd 's/sm_crypto_channel=false/sm_crypto_channel=true/g' nodes/127.0.0.1/node*/config.ini
else
./build_chain.sh -l 127.0.0.1:4
bash -x build_chain.sh -l 127.0.0.1:4
fi
./nodes/127.0.0.1/fisco-bcos -v
./nodes/127.0.0.1/start_all.sh
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-18.04, ubuntu-16.04, macos-latest]
os: [ubuntu-18.04, ubuntu-20.04, macos-latest]
steps:
- uses: actions/checkout@v2
with:
Expand Down
21 changes: 21 additions & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
## v2.8.1
(2022-04-29)
Added:
* add decodeTransactionInput to ABICodec (FISCO-BCOS#360)

Update:
* optimize java-sdk connection error message (java-sdk#536)

Fix:
* fix serialize ABIDefinition with fallback failed (java-sdk#302)

----
添加:
* ABICodec支持decodeTransactionInput

更新:
* 优化java-sdk初始化失败错误提示

修复:
* 修复ABI fallback接口序列化失败的问题

## v2.8.0
(2021-07-27)
Added:
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ ext {
// integrationTest.mustRunAfter test
allprojects {
group = 'org.fisco-bcos.java-sdk'
version = '2.8.0-GMT0018'
version = '2.8.1'
apply plugin: 'maven'
apply plugin: 'maven-publish'
apply plugin: 'idea'
Expand Down
87 changes: 82 additions & 5 deletions sdk-abi/src/main/java/org/fisco/bcos/sdk/abi/ABICodec.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.fisco.bcos.sdk.abi.wrapper.ABICodecJsonWrapper;
import org.fisco.bcos.sdk.abi.wrapper.ABICodecObject;
Expand Down Expand Up @@ -303,20 +304,74 @@ public List<Object> 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<String> 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<Object> decodeMethodById(String ABI, String methodId, String output)
public Pair<List<Object>, List<ABIObject>> 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<Object>, List<ABIObject>> decodeMethodInput(
String ABI, String input, String methodName, String code) throws ABICodecException {
ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI);
List<ABIDefinition> methods;
ABICodecObject abiCodecObject = new ABICodecObject();
ABIObjectFactory abiObjectFactory = new ABIObjectFactory();
if (StringUtils.equals(methodName, "constructor")) {
String lastCode = StringUtils.substring(code, code.length() - 32, code.length());
String paramsInput = StringUtils.substringAfter(input, lastCode);
// remove methodId of input
return abiCodecObject.decodeJavaObjectAndOutputObject(
abiObjectFactory.createInputObject(contractABIDefinition.getConstructor()),
paramsInput);
} else {
methods = contractABIDefinition.getFunctions().get(methodName);
}
for (ABIDefinition abiDefinition : methods) {
ABIObject outputABIObject = abiObjectFactory.createInputObject(abiDefinition);
try {
return abiCodecObject.decodeJavaObjectAndOutputObject(
outputABIObject, input.substring(10));
} catch (Exception e) {
logger.warn(" exception in decodeMethodInput : {}", e.getMessage());
}
}
String errorMsg = " cannot decode in decodeMethodInput with appropriate interface ABI";
logger.error(errorMsg);
throw new ABICodecException(errorMsg);
}

public Pair<List<Object>, List<ABIObject>> decodeDataByMethodId(
String ABI, String methodId, String data, boolean isOutput) throws ABICodecException {
ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI);
ABIDefinition abiDefinition = contractABIDefinition.getABIDefinitionByMethodId(methodId);
if (abiDefinition == null) {
String errorMsg = " methodId " + methodId + " is invalid";
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());
}
Expand All @@ -326,6 +381,11 @@ public List<Object> decodeMethodById(String ABI, String methodId, String output)
throw new ABICodecException(errorMsg);
}

public List<Object> decodeMethodById(String ABI, String methodId, String output)
throws ABICodecException {
return decodeDataByMethodId(ABI, methodId, output, true).getLeft();
}

public List<Object> decodeMethodByInterface(String ABI, String methodInterface, String output)
throws ABICodecException {
FunctionEncoder functionEncoder = new FunctionEncoder(cryptoSuite);
Expand Down Expand Up @@ -361,17 +421,27 @@ public List<String> decodeMethodToString(String ABI, String methodName, String o

public List<String> decodeMethodByIdToString(String ABI, String methodId, String output)
throws ABICodecException {
return decodeMethodByIdToString(ABI, methodId, output, true);
}

public List<String> decodeMethodByIdToString(
String ABI, String methodId, String data, boolean isOutput) throws ABICodecException {
ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI);
ABIDefinition abiDefinition = contractABIDefinition.getABIDefinitionByMethodId(methodId);
if (abiDefinition == null) {
String errorMsg = " methodId " + methodId + " is invalid";
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());
}
Expand Down Expand Up @@ -513,6 +583,13 @@ public List<String> decodeEventByInterfaceToString(
return decodeEventByTopicToString(ABI, methodId, log);
}

private String addHexPrefixToString(String s) {
if (!s.startsWith("0x")) {
return "0x" + s;
}
return s;
}

private List<Object> mergeEventParamsAndTopics(
ABIDefinition abiDefinition, List<Object> params, List<String> topics) {
List<Object> ret = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.fisco.bcos.sdk.abi.wrapper;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
Expand All @@ -26,16 +28,38 @@
* blockchain state), view (specified to not modify the blockchain state), nonpayable (function does
* not accept Ether - the default) and payable (function accepts Ether). <br>
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class ABIDefinition {
public static final String CONSTRUCTOR_TYPE = "constructor";
public static final String FUNCTION_TYPE = "function";
public static final String EVENT_TYPE = "event";
public static final String FALLBACK_TYPE = "fallback";
public static final String RECEIVE_TYPE = "receive";

@JsonProperty("name")
private String name;

@JsonProperty("type")
private String type;

@JsonProperty("constant")
private boolean constant;

@JsonProperty("payable")
private boolean payable;

@JsonProperty("anonymous")
private boolean anonymous;

@JsonProperty("stateMutability")
private String stateMutability;

@JsonProperty("inputs")
private List<NamedType> inputs;

@JsonProperty("outputs")
private List<NamedType> outputs;

public static List<String> CONSTANT_KEY = Arrays.asList("view");

public ABIDefinition() {}
Expand Down Expand Up @@ -94,14 +118,19 @@ public static ABIDefinition createDefaultConstructorABIDefinition() {
*/
public String getMethodSignatureAsString() {
StringBuilder result = new StringBuilder();
result.append(name);
// Fix: the name field of the fallback is empty
if (name != null) {
result.append(name);
}
result.append("(");
String params =
getInputs()
.stream()
.map(abi -> abi.getTypeAsString())
.collect(Collectors.joining(","));
result.append(params);
if (getInputs() != null) {
String params =
getInputs()
.stream()
.map(abi -> abi.getTypeAsString())
.collect(Collectors.joining(","));
result.append(params);
}
result.append(")");
return result.toString();
}
Expand All @@ -113,8 +142,11 @@ public String getMethodSignatureAsString() {
* @return the method id
*/
public String getMethodId(CryptoSuite cryptoSuite) {
FunctionEncoder encoder = new FunctionEncoder(cryptoSuite);
return encoder.buildMethodId(getMethodSignatureAsString());
if (getType().equals(ABIDefinition.FUNCTION_TYPE)) {
FunctionEncoder encoder = new FunctionEncoder(cryptoSuite);
return encoder.buildMethodId(getMethodSignatureAsString());
}
return "";
}

public boolean isConstant() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package org.fisco.bcos.sdk.abi.wrapper;

import org.fisco.bcos.sdk.abi.ABICodecException;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.utils.ObjectMapperFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ABIDefinitionFactory {

private static final Logger logger = LoggerFactory.getLogger(ABIDefinitionFactory.class);

private CryptoSuite cryptoSuite;
Expand All @@ -28,12 +28,27 @@ public ContractABIDefinition loadABI(String abi) {

ContractABIDefinition contractABIDefinition = new ContractABIDefinition(cryptoSuite);
for (ABIDefinition abiDefinition : abiDefinitions) {
if (abiDefinition.getType().equals("constructor")) {
if (abiDefinition.getType().equals(ABIDefinition.CONSTRUCTOR_TYPE)) {
contractABIDefinition.setConstructor(abiDefinition);
} else if (abiDefinition.getType().equals("function")) {
} else if (abiDefinition.getType().equals(ABIDefinition.FUNCTION_TYPE)) {
contractABIDefinition.addFunction(abiDefinition.getName(), abiDefinition);
} else if (abiDefinition.getType().equals("event")) {
} else if (abiDefinition.getType().equals(ABIDefinition.EVENT_TYPE)) {
contractABIDefinition.addEvent(abiDefinition.getName(), abiDefinition);
} else if (abiDefinition.getType().equals(ABIDefinition.FALLBACK_TYPE)) {
if (contractABIDefinition.hasFallbackFunction()) {
throw new ABICodecException("only single fallback is allowed");
}
contractABIDefinition.setFallbackFunction(abiDefinition);
} else if (abiDefinition.getType().equals(ABIDefinition.RECEIVE_TYPE)) {
if (contractABIDefinition.hasReceiveFunction()) {
throw new ABICodecException("only single receive is allowed");
}
if (abiDefinition.getStateMutability().equals("payable") == false
&& abiDefinition.isPayable() == false) {
throw new ABICodecException(
"the statemutability of receive can only be payable");
}
contractABIDefinition.setReceiveFunction(abiDefinition);
} else {
// skip and do nothing
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ public class ContractABIDefinition {
private Map<String, List<ABIDefinition>> events = new HashMap<>();
// method id => function
private Map<String, ABIDefinition> methodIDToFunctions = new HashMap<>();
private ABIDefinition fallbackFunction;
private ABIDefinition receiveFunction;
// event topic => topic
private Map<String, ABIDefinition> eventTopicToEvents = new HashMap<>();
private CryptoSuite cryptoSuite;
Expand Down Expand Up @@ -107,4 +109,28 @@ public ABIDefinition getABIDefinitionByMethodId(String methodId) {
public ABIDefinition getABIDefinitionByEventTopic(String topic) {
return eventTopicToEvents.get(Numeric.prependHexPrefix(topic));
}

public ABIDefinition getFallbackFunction() {
return fallbackFunction;
}

public void setFallbackFunction(ABIDefinition fallbackFunction) {
this.fallbackFunction = fallbackFunction;
}

public boolean hasFallbackFunction() {
return this.fallbackFunction != null;
}

public boolean hasReceiveFunction() {
return this.receiveFunction != null;
}

public ABIDefinition getReceiveFunction() {
return receiveFunction;
}

public void setReceiveFunction(ABIDefinition receiveFunction) {
this.receiveFunction = receiveFunction;
}
}
Loading

0 comments on commit 1876479

Please sign in to comment.