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
76 changes: 60 additions & 16 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 @@ -16,6 +16,7 @@
package org.fisco.bcos.sdk.abi;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.fisco.bcos.sdk.abi.wrapper.ABICodecJsonWrapper;
import org.fisco.bcos.sdk.abi.wrapper.ABICodecObject;
Expand All @@ -25,6 +26,7 @@
import org.fisco.bcos.sdk.abi.wrapper.ABIObjectFactory;
import org.fisco.bcos.sdk.abi.wrapper.ContractABIDefinition;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.model.EventLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -317,7 +319,7 @@ public List<String> decodeMethodByInterfaceToString(
return decodeMethodByIdToString(ABI, methodId, output);
}

public List<Object> decodeEvent(String ABI, String eventName, String output)
public List<Object> decodeEvent(String ABI, String eventName, EventLog log)
throws ABICodecException {
ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI);
List<ABIDefinition> events = contractABIDefinition.getEvents().get(eventName);
Expand All @@ -329,10 +331,12 @@ public List<Object> decodeEvent(String ABI, String eventName, String output)
+ contractABIDefinition.getEvents().keySet());
}
for (ABIDefinition abiDefinition : events) {
ABIObject outputObject = abiObjectFactory.createInputObject(abiDefinition);
ABIObject inputObject = abiObjectFactory.createEventInputObject(abiDefinition);
ABICodecObject abiCodecObject = new ABICodecObject();
try {
return abiCodecObject.decodeJavaObject(outputObject, output);
List<Object> params = abiCodecObject.decodeJavaObject(inputObject, log.getData());
List<String> topics = log.getTopics();
return mergeEventParamsAndTopics(abiDefinition, params, topics);
} catch (Exception e) {
logger.error(" exception in decodeEventToObject : {}", e.getMessage());
}
Expand All @@ -343,15 +347,17 @@ public List<Object> decodeEvent(String ABI, String eventName, String output)
throw new ABICodecException(errorMsg);
}

public List<Object> decodeEventByTopic(String ABI, String eventTopic, String output)
public List<Object> decodeEventByTopic(String ABI, String eventTopic, EventLog log)
throws ABICodecException {
ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI);
ABIDefinition abiDefinition =
contractABIDefinition.getABIDefinitionByEventTopic(eventTopic);
ABIObject outputObject = abiObjectFactory.createOutputObject(abiDefinition);
ABIObject inputObject = abiObjectFactory.createEventInputObject(abiDefinition);
ABICodecObject abiCodecObject = new ABICodecObject();
try {
return abiCodecObject.decodeJavaObject(outputObject, output);
List<Object> params = abiCodecObject.decodeJavaObject(inputObject, log.getData());
List<String> topics = log.getTopics();
return mergeEventParamsAndTopics(abiDefinition, params, topics);
} catch (Exception e) {
logger.error(" exception in decodeEventByTopicToObject : {}", e.getMessage());
}
Expand All @@ -362,14 +368,14 @@ public List<Object> decodeEventByTopic(String ABI, String eventTopic, String out
throw new ABICodecException(errorMsg);
}

public List<Object> decodeEventByInterface(String ABI, String eventSignature, String output)
public List<Object> decodeEventByInterface(String ABI, String eventSignature, EventLog log)
throws ABICodecException {
FunctionEncoder functionEncoder = new FunctionEncoder(cryptoSuite);
String methodId = functionEncoder.buildMethodId(eventSignature);
return decodeEventByTopic(ABI, methodId, output);
return decodeEventByTopic(ABI, methodId, log);
}

public List<String> decodeEventToString(String ABI, String eventName, String output)
public List<String> decodeEventToString(String ABI, String eventName, EventLog log)
throws ABICodecException {
ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI);
List<ABIDefinition> events = contractABIDefinition.getEvents().get(eventName);
Expand All @@ -381,10 +387,12 @@ public List<String> decodeEventToString(String ABI, String eventName, String out
+ contractABIDefinition.getEvents().keySet());
}
for (ABIDefinition abiDefinition : events) {
ABIObject outputObject = abiObjectFactory.createOutputObject(abiDefinition);
ABIObject inputObject = abiObjectFactory.createEventInputObject(abiDefinition);
ABICodecJsonWrapper abiCodecJsonWrapper = new ABICodecJsonWrapper();
try {
return abiCodecJsonWrapper.decode(outputObject, output);
List<String> params = abiCodecJsonWrapper.decode(inputObject, log.getData());
List<String> topics = log.getTopics();
return mergeEventParamsAndTopicsToString(abiDefinition, params, topics);
} catch (Exception e) {
logger.error(" exception in decodeEventToString : {}", e.getMessage());
}
Expand All @@ -395,15 +403,17 @@ public List<String> decodeEventToString(String ABI, String eventName, String out
throw new ABICodecException(errorMsg);
}

public List<String> decodeEventByTopicToString(String ABI, String eventTopic, String output)
public List<String> decodeEventByTopicToString(String ABI, String eventTopic, EventLog log)
throws ABICodecException {
ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI);
ABIDefinition abiDefinition =
contractABIDefinition.getABIDefinitionByEventTopic(eventTopic);
ABIObject outputObject = abiObjectFactory.createOutputObject(abiDefinition);
ABIObject inputObject = abiObjectFactory.createEventInputObject(abiDefinition);
ABICodecJsonWrapper abiCodecJsonWrapper = new ABICodecJsonWrapper();
try {
return abiCodecJsonWrapper.decode(outputObject, output);
List<String> params = abiCodecJsonWrapper.decode(inputObject, log.getData());
List<String> topics = log.getTopics();
return mergeEventParamsAndTopicsToString(abiDefinition, params, topics);
} catch (Exception e) {
logger.error(" exception in decodeEventByTopicToString : {}", e.getMessage());
}
Expand All @@ -415,9 +425,43 @@ public List<String> decodeEventByTopicToString(String ABI, String eventTopic, St
}

public List<String> decodeEventByInterfaceToString(
String ABI, String eventSignature, String output) throws ABICodecException {
String ABI, String eventSignature, EventLog log) throws ABICodecException {
FunctionEncoder functionEncoder = new FunctionEncoder(cryptoSuite);
String methodId = functionEncoder.buildMethodId(eventSignature);
return decodeEventByTopicToString(ABI, methodId, output);
return decodeEventByTopicToString(ABI, methodId, log);
}

private List<Object> mergeEventParamsAndTopics(
ABIDefinition abiDefinition, List<Object> params, List<String> topics) {
List<Object> ret = new ArrayList<>();
int paramIdx = 0;
int topicIdx = 1;
for (ABIDefinition.NamedType namedType : abiDefinition.getInputs()) {
if (namedType.isIndexed()) {
ret.add(topics.get(topicIdx));
topicIdx++;
} else {
ret.add(params.get(paramIdx));
paramIdx++;
}
}
return ret;
}

private List<String> mergeEventParamsAndTopicsToString(
ABIDefinition abiDefinition, List<String> params, List<String> topics) {
List<String> ret = new ArrayList<>();
int paramIdx = 0;
int topicIdx = 1;
for (ABIDefinition.NamedType namedType : abiDefinition.getInputs()) {
if (namedType.isIndexed()) {
ret.add(topics.get(topicIdx));
topicIdx++;
} else {
ret.add(params.get(paramIdx));
paramIdx++;
}
}
return ret;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,27 @@ private static ABIObject createObject(
return null;
}

public static ABIObject createEventInputObject(ABIDefinition abiDefinition) {
return creatEventObjectWithOutIndexed(abiDefinition.getInputs());
}

public static ABIObject creatEventObjectWithOutIndexed(
List<ABIDefinition.NamedType> namedTypes) {
try {
ABIObject abiObject = new ABIObject(ABIObject.ObjectType.STRUCT);

for (ABIDefinition.NamedType namedType : namedTypes) {
if (!namedType.isIndexed()) {
abiObject.getStructFields().add(buildTypeObject(namedType));
}
}
return abiObject;
} catch (Exception e) {
logger.error("namedTypes: {}, e: ", namedTypes, e);
}
return null;
}

/**
* build ABIObject by raw type name
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public Map<String, ABIDefinition> getEventTopicToEvents() {
return eventTopicToEvents;
}

public void setEvectTopicToEvents(Map<String, ABIDefinition> eventTopicToEvents) {
public void setEventTopicToEvents(Map<String, ABIDefinition> eventTopicToEvents) {
this.eventTopicToEvents = eventTopicToEvents;
}

Expand Down Expand Up @@ -94,6 +94,10 @@ public void addEvent(String name, ABIDefinition abiDefinition) {
List<ABIDefinition> abiDefinitions = events.get(name);
abiDefinitions.add(abiDefinition);
logger.info(" name: {}, abi: {}", name, abiDefinition);

// calculate method id and add abiDefinition to eventTopicToEvents
String methodId = abiDefinition.getMethodId(cryptoSuite);
eventTopicToEvents.put(methodId, abiDefinition);
}

public ABIDefinition getABIDefinitionByMethodId(String methodId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package org.fisco.bcos.sdk.test.abi;

import java.util.ArrayList;
import java.util.List;
import org.fisco.bcos.sdk.model.EventLog;
import org.fisco.bcos.sdk.abi.ABICodec;
import org.fisco.bcos.sdk.abi.ABICodecException;
import org.junit.Assert;
Expand All @@ -16,7 +18,8 @@ public class ABIEventTest {
public void testDecode() {
ABICodec abiCodec = new ABICodec(Utils.getCryptoSuite());
try {
List<Object> list = abiCodec.decodeEvent(abi, "LogSetValues", encoded);
EventLog log = new EventLog(encoded, new ArrayList<>());
List<Object> list = abiCodec.decodeEvent(abi, "LogSetValues", log);
Assert.assertEquals(list.size(), 3);
Assert.assertEquals(list.get(0).toString(), "20");
Assert.assertEquals(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ public void onResponse(Response response) {
ctx,
EnumChannelProtocolVersion.VERSION_1,
nodeVersion.getResult().getSupportedVersion());
addPeerHost(ctx);
}
disconnect = false;
} catch (Exception e) {
Expand All @@ -246,9 +247,6 @@ public void onResponse(Response response) {
if (disconnect) {
ctx.disconnect();
ctx.close();
} else {
String host = ChannelVersionNegotiation.getPeerHost(ctx);
addAvailablePeer(host, ctx);
}
}
};
Expand Down Expand Up @@ -327,11 +325,18 @@ public void onResponse(Response response) {
if (disconnect) {
ctx.disconnect();
ctx.close();
} else {
addPeerHost(ctx);
}
}
};

ctx.writeAndFlush(message);
addSeq2CallBack(seq, callback);
}

private void addPeerHost(ChannelHandlerContext ctx) {
String host = ChannelVersionNegotiation.getPeerHost(ctx);
addAvailablePeer(host, ctx);
}
}
5 changes: 5 additions & 0 deletions sdk-core/src/main/java/org/fisco/bcos/sdk/model/EventLog.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ public EventLog(
this.topics = topics;
}

public EventLog(String data, List<String> topics) {
this.data = data;
this.topics = topics;
}

@JsonIgnore
public boolean isRemoved() {
return removed;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public void testEventSubModule() {
String[] o = {"0x1", "0x2", "0x3"};
List<String> a = Arrays.asList(o);
paramsSetValues.add(a);
paramsSetValues.add("set values 字符串");
paramsSetValues.add("test");
TransactionResponse transactionResponse =
manager.sendTransactionAndGetResponse(
contractAddress, abi, "setValues", paramsSetValues);
Expand Down Expand Up @@ -125,11 +125,14 @@ public void onReceiveLog(int status, List<EventLog> logs) {
+ log.getData());
ABICodec abiCodec = new ABICodec(client.getCryptoSuite());
try {
List<Object> list =
abiCodec.decodeEvent(abi, "LogSetValues", log.getData());
List<Object> list = abiCodec.decodeEvent(abi, "LogSetValues", log);
logger.debug("decode event log content, " + list);
Assert.assertEquals("20", list.get(0).toString());
Assert.assertEquals("set values 字符串", list.get(2).toString());
Assert.assertEquals("test", list.get(2).toString());
List<Object> list1 =
abiCodec.decodeEventByInterface(
abi, "LogSetValues(int256,address[],string)", log);
Assert.assertEquals(3, list1.size());
} catch (ABICodecException e) {
logger.error("decode event log error, " + e.getMessage());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
import org.fisco.bcos.sdk.abi.ABICodec;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.model.ConstantConfig;
import org.fisco.bcos.sdk.model.EventLog;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.transaction.manager.AssembleTransactionProcessor;
import org.fisco.bcos.sdk.transaction.manager.TransactionProcessorFactory;
import org.fisco.bcos.sdk.transaction.model.dto.TransactionResponse;
Expand Down Expand Up @@ -60,11 +62,10 @@ public void testDecode() throws Exception {
System.out.println(response.getReturnMessage());
return;
}
List<Object> list =
abiCodec.decodeEvent(
abi,
"LogInit",
response.getTransactionReceipt().getLogs().get(0).getData());

TransactionReceipt.Logs log = response.getTransactionReceipt().getLogs().get(0);
EventLog eventLog = new EventLog(log.getData(), log.getTopics());
List<Object> list = abiCodec.decodeEvent(abi, "LogInit", eventLog);
Assert.assertEquals("test2", list.get(1));
Map<String, List<Object>> map = response.getEventResultMap();
Assert.assertEquals("test2", map.get("LogInit").get(1));
Expand Down