Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 78 additions & 13 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 @@ -131,11 +131,50 @@ public String encodeMethodById(String ABI, String methodId, List<Object> params)
throw new ABICodecException(errorMsg);
}

public String encodeMethodByInterface(String ABI, String methodInterface, List<Object> params)
private ABIDefinition getABIDefinition(String methodInterface) throws ABICodecException {
int start = methodInterface.indexOf("(");
int end = methodInterface.lastIndexOf(")");
if (start == -1 || end == -1 || start >= end) {
String errorMsg = " error format";
logger.error(errorMsg);
throw new ABICodecException(errorMsg);
}
String name = methodInterface.substring(0, start);
String type = methodInterface.substring(start + 1, end);
if (type.indexOf("tuple") != -1) {
String errorMsg = " cannot support tuple type";
logger.error(errorMsg);
throw new ABICodecException(errorMsg);
}
String[] types = type.split(",");
List<ABIDefinition.NamedType> inputs = new ArrayList<ABIDefinition.NamedType>();
for (String s : types) {
ABIDefinition.NamedType input = new ABIDefinition.NamedType("name", s);
inputs.add(input);
}

return new ABIDefinition(false, inputs, name, null, "function", false, "nonpayable");
}

public String encodeMethodByInterface(String methodInterface, List<Object> params)
throws ABICodecException {
FunctionEncoder functionEncoder = new FunctionEncoder(cryptoSuite);
String methodId = functionEncoder.buildMethodId(methodInterface);
return encodeMethodById(ABI, methodId, params);
ABIDefinition abiDefinition = getABIDefinition(methodInterface);
if (abiDefinition.getInputs().size() == params.size()) {
@SuppressWarnings("static-access")
ABIObject inputABIObject = abiObjectFactory.createInputObject(abiDefinition);
ABICodecObject abiCodecObject = new ABICodecObject();
try {
String methodId = abiDefinition.getMethodId(cryptoSuite);
return methodId + abiCodecObject.encodeValue(inputABIObject, params).encode();
} catch (Exception e) {
logger.error(
" exception in encodeMethodByInterfaceFromObject : {}", e.getMessage());
}
}

String errorMsg = " cannot encode in encodeMethodByInterfaceFromObject";
logger.error(errorMsg);
throw new ABICodecException(errorMsg);
}

public String encodeMethodFromString(String ABI, String methodName, List<String> params)
Expand Down Expand Up @@ -194,11 +233,25 @@ public String encodeMethodByIdFromString(String ABI, String methodId, List<Strin
throw new ABICodecException(errorMsg);
}

public String encodeMethodByInterfaceFromString(
String ABI, String methodInterface, List<String> params) throws ABICodecException {
FunctionEncoder functionEncoder = new FunctionEncoder(cryptoSuite);
String methodId = functionEncoder.buildMethodId(methodInterface);
return encodeMethodByIdFromString(ABI, methodId, params);
public String encodeMethodByInterfaceFromString(String methodInterface, List<String> params)
throws ABICodecException {
ABIDefinition abiDefinition = getABIDefinition(methodInterface);
if (abiDefinition.getInputs().size() == params.size()) {
@SuppressWarnings("static-access")
ABIObject inputABIObject = abiObjectFactory.createInputObject(abiDefinition);
ABICodecJsonWrapper abiCodecJsonWrapper = new ABICodecJsonWrapper();
try {
String methodId = abiDefinition.getMethodId(cryptoSuite);
return methodId + abiCodecJsonWrapper.encode(inputABIObject, params).encode();
} catch (IOException e) {
logger.error(
" exception in encodeMethodByInterfaceFromString : {}", e.getMessage());
}
}

String errorMsg = " cannot encode in encodeMethodByInterfaceFromString";
logger.error(errorMsg);
throw new ABICodecException(errorMsg);
}

public List<Object> decodeMethod(ABIDefinition abiDefinition, String output)
Expand Down Expand Up @@ -334,7 +387,10 @@ public List<Object> decodeEvent(String ABI, String eventName, EventLog log)
ABIObject inputObject = abiObjectFactory.createEventInputObject(abiDefinition);
ABICodecObject abiCodecObject = new ABICodecObject();
try {
List<Object> params = abiCodecObject.decodeJavaObject(inputObject, log.getData());
List<Object> params = new ArrayList<>();
if (!log.getData().equals("0x")) {
params = abiCodecObject.decodeJavaObject(inputObject, log.getData());
}
List<String> topics = log.getTopics();
return mergeEventParamsAndTopics(abiDefinition, params, topics);
} catch (Exception e) {
Expand All @@ -355,7 +411,10 @@ public List<Object> decodeEventByTopic(String ABI, String eventTopic, EventLog l
ABIObject inputObject = abiObjectFactory.createEventInputObject(abiDefinition);
ABICodecObject abiCodecObject = new ABICodecObject();
try {
List<Object> params = abiCodecObject.decodeJavaObject(inputObject, log.getData());
List<Object> params = new ArrayList<>();
if (!log.getData().equals("0x")) {
params = abiCodecObject.decodeJavaObject(inputObject, log.getData());
}
List<String> topics = log.getTopics();
return mergeEventParamsAndTopics(abiDefinition, params, topics);
} catch (Exception e) {
Expand Down Expand Up @@ -390,7 +449,10 @@ public List<String> decodeEventToString(String ABI, String eventName, EventLog l
ABIObject inputObject = abiObjectFactory.createEventInputObject(abiDefinition);
ABICodecJsonWrapper abiCodecJsonWrapper = new ABICodecJsonWrapper();
try {
List<String> params = abiCodecJsonWrapper.decode(inputObject, log.getData());
List<String> params = new ArrayList<>();
if (!log.getData().equals("0x")) {
params = abiCodecJsonWrapper.decode(inputObject, log.getData());
}
List<String> topics = log.getTopics();
return mergeEventParamsAndTopicsToString(abiDefinition, params, topics);
} catch (Exception e) {
Expand All @@ -411,7 +473,10 @@ public List<String> decodeEventByTopicToString(String ABI, String eventTopic, Ev
ABIObject inputObject = abiObjectFactory.createEventInputObject(abiDefinition);
ABICodecJsonWrapper abiCodecJsonWrapper = new ABICodecJsonWrapper();
try {
List<String> params = abiCodecJsonWrapper.decode(inputObject, log.getData());
List<String> params = new ArrayList<>();
if (!log.getData().equals("0x")) {
params = abiCodecJsonWrapper.decode(inputObject, log.getData());
}
List<String> topics = log.getTopics();
return mergeEventParamsAndTopicsToString(abiDefinition, params, topics);
} catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -341,15 +341,33 @@ public void testEncodeFromString() {
encodedWithMethodId,
abiCodec.encodeMethodById(
abiDesc, test.getMethodId(Utils.getCryptoSuite()), abiObjects));
// MethodByInterface String & JavaObject
Assert.assertEquals(
encodedWithMethodId,
abiCodec.encodeMethodByInterfaceFromString(
abiDesc, test.getMethodSignatureAsString(), args));
Assert.assertEquals(
encodedWithMethodId,
abiCodec.encodeMethodByInterface(
abiDesc, test.getMethodSignatureAsString(), abiObjects));
} catch (ABICodecException e) {
Assert.fail(e.getMessage());
}
}

@Test
public void testEncodeByInterface() {
ABICodec abiCodec = new ABICodec(Utils.getCryptoSuite());
List<Object> argsObjects = new ArrayList<Object>();
List<BigInteger> b1 = new ArrayList<BigInteger>();
b1.add(new BigInteger("100"));
b1.add(new BigInteger("200"));
argsObjects.add(b1);
List<BigInteger> b2 = new ArrayList<BigInteger>();
b2.add(new BigInteger("100"));
b2.add(new BigInteger("200"));
b2.add(new BigInteger("300"));
argsObjects.add(b2);
byte[] b = "1234".getBytes();
argsObjects.add(b);
String a = "0x5678";
argsObjects.add(a);
try {
String s1 = abiCodec.encodeMethodByInterface("call(uint256[2],uint256[],bytes,address)", argsObjects);
String abi = "[{\"constant\":false,\"inputs\":[{\"name\":\"u1\",\"type\":\"uint256[2]\"},{\"name\":\"u2\",\"type\":\"uint256[]\"},{\"name\":\"b\",\"type\":\"bytes\"},{\"name\":\"a\",\"type\":\"address\"}],\"name\":\"call\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"u\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"},{\"name\":\"s\",\"type\":\"string\"}],\"name\":\"add\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"u\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"LogAdd1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"u\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"LogAdd2\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"u\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"a\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"s\",\"type\":\"string\"}],\"name\":\"LogAdd3\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"LogAdd4\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"LogAdd5\",\"type\":\"event\"}]";
String s2 = abiCodec.encodeMethod(abi, "call", argsObjects);
Assert.assertEquals(s1, s2);
} catch (ABICodecException e) {
Assert.fail(e.getMessage());
}
Expand Down