From 380ecb4dd40684fa87411ced74b002aeab2b8b17 Mon Sep 17 00:00:00 2001 From: Maggie WU Date: Fri, 9 Oct 2020 19:44:17 +0800 Subject: [PATCH 01/12] add functions of load key from input stream --- README.md | 8 ++----- docs/README_CN.md | 10 +++++---- .../bcos/sdk/crypto/keystore/KeyTool.java | 22 +++++++++++++++++++ .../bcos/sdk/crypto/keystore/P12KeyStore.java | 4 ++++ .../bcos/sdk/crypto/keystore/PEMKeyStore.java | 4 ++++ 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index a43f08aa4..8b935922d 100644 --- a/README.md +++ b/README.md @@ -32,21 +32,17 @@ This java sdk is a code refactoring version base on web3sdk (not recommend to us * Use modular design, each module can use independently. For example, you can create crypto.jar file if only crypto module is needed. ## Documentation -* [English User Handbook](https://fisco-bcos-documentation.readthedocs.io/en/latest/docs/sdk/java_sdk/index.html) -* [Chinese User Handbook](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk/index.html#) +* [English User Manual](https://fisco-bcos-documentation.readthedocs.io/en/latest/docs/sdk/java_sdk/index.html) +* [Chinese User Manual](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk/index.html) * [Chinese WIKI](https://github.com/FISCO-BCOS/java-sdk/wiki) ## Quick Start -* [English](https://fisco-bcos-documentation.readthedocs.io/en/latest/docs/sdk/java_sdk/quick_start.html) * [Chinese](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk/quick_start.html) ## Join Our Community The FISCO BCOS community is one of the most active open-source blockchain communities in China. It provides long-term technical support for both institutional and individual developers and users of FISCO BCOS. Thousands of technical enthusiasts from numerous industry sectors have joined this community, studying and using FISCO BCOS platform. If you are also interested, you are most welcome to join us for more support and fun. -![](https://media.githubusercontent.com/media/FISCO-BCOS/LargeFiles/master/images/QR_image_en.png) - - ## License ![license](http://img.shields.io/badge/license-Apache%20v2-blue.svg) diff --git a/docs/README_CN.md b/docs/README_CN.md index 5fcc695e4..205a92dde 100644 --- a/docs/README_CN.md +++ b/docs/README_CN.md @@ -31,6 +31,12 @@ * 添加群组管理模块,帮助应用管理多个群组中节点连接。 * 使用模块化设计,便于组装再造。 +## 文档 +* [英文版用户手册](https://fisco-bcos-documentation.readthedocs.io/en/latest/docs/sdk/java_sdk/index.html) +* [中文版用户手册](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk/index.html) +* [WIKI](https://github.com/FISCO-BCOS/java-sdk/wiki) + + ## 贡献代码 欢迎参与FISCO BCOS的社区建设: - 点亮我们的小星星(点击项目左上方Star按钮)。 @@ -41,10 +47,6 @@ FISCO BCOS开源社区是国内活跃的开源社区,社区长期为机构和个人开发者提供各类支持与帮助。已有来自各行业的数千名技术爱好者在研究和使用FISCO BCOS。如您对FISCO BCOS开源技术及应用感兴趣,欢迎加入社区获得更多支持与帮助。 - -![](https://media.githubusercontent.com/media/FISCO-BCOS/LargeFiles/master/images/QR_image.png) - - ## License ![license](https://img.shields.io/badge/license-Apache%20v2-blue.svg) diff --git a/sdk-crypto/src/main/java/org/fisco/bcos/sdk/crypto/keystore/KeyTool.java b/sdk-crypto/src/main/java/org/fisco/bcos/sdk/crypto/keystore/KeyTool.java index 5ceeb5fd2..67bf06e4e 100644 --- a/sdk-crypto/src/main/java/org/fisco/bcos/sdk/crypto/keystore/KeyTool.java +++ b/sdk-crypto/src/main/java/org/fisco/bcos/sdk/crypto/keystore/KeyTool.java @@ -81,6 +81,28 @@ public KeyTool(final String keyStoreFile) { this(keyStoreFile, null); } + /** + * constructor for the P12: with password and key file input stream + * + * @param keyStoreFileInputStream the input stream of the keystore file + * @param password password to read the keystore file + */ + public KeyTool(InputStream keyStoreFileInputStream, final String password) { + this.keyStoreFile = null; + this.password = password; + initSecurity(); + this.load(keyStoreFileInputStream); + } + + /** + * constructor for PEM with key file input stream + * + * @param keyStoreFileInputStream the input stream of the keystore file + */ + public KeyTool(InputStream keyStoreFileInputStream) { + this(keyStoreFileInputStream, null); + } + protected abstract PrivateKey getPrivateKey(); private static void initSecurity() { diff --git a/sdk-crypto/src/main/java/org/fisco/bcos/sdk/crypto/keystore/P12KeyStore.java b/sdk-crypto/src/main/java/org/fisco/bcos/sdk/crypto/keystore/P12KeyStore.java index b4c77aaa0..329acf7e0 100644 --- a/sdk-crypto/src/main/java/org/fisco/bcos/sdk/crypto/keystore/P12KeyStore.java +++ b/sdk-crypto/src/main/java/org/fisco/bcos/sdk/crypto/keystore/P12KeyStore.java @@ -45,6 +45,10 @@ public P12KeyStore(final String keyStoreFile, final String password) { super(keyStoreFile, password); } + public P12KeyStore(InputStream keyStoreFileInputStream, final String password) { + super(keyStoreFileInputStream, password); + } + @Override public PublicKey getPublicKey() { try { diff --git a/sdk-crypto/src/main/java/org/fisco/bcos/sdk/crypto/keystore/PEMKeyStore.java b/sdk-crypto/src/main/java/org/fisco/bcos/sdk/crypto/keystore/PEMKeyStore.java index b2d475a03..4d1affdec 100644 --- a/sdk-crypto/src/main/java/org/fisco/bcos/sdk/crypto/keystore/PEMKeyStore.java +++ b/sdk-crypto/src/main/java/org/fisco/bcos/sdk/crypto/keystore/PEMKeyStore.java @@ -40,6 +40,10 @@ public PEMKeyStore(final String keyStoreFile) { super(keyStoreFile); } + public PEMKeyStore(InputStream keyStoreFileInputStream) { + super(keyStoreFileInputStream); + } + @Override protected PublicKey getPublicKey() { try { From d39666608207b3c7dfaf824f574a808043847825 Mon Sep 17 00:00:00 2001 From: cyjseagull Date: Mon, 12 Oct 2020 15:32:51 +0800 Subject: [PATCH 02/12] use groupInfo when updateBlockNotify only if it's not null (#152) --- .../bcos/sdk/amop/topic/TopicManager.java | 3 ++ .../fisco/bcos/sdk/channel/ChannelImp.java | 6 ++-- .../bcos/sdk/network/ConnectionManager.java | 4 ++- .../fisco/bcos/sdk/client/JsonRpcService.java | 2 +- .../sdk/service/GroupManagerServiceImpl.java | 35 +++++++++++++++---- 5 files changed, 39 insertions(+), 11 deletions(-) diff --git a/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/topic/TopicManager.java b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/topic/TopicManager.java index 18c85fa36..65337f890 100644 --- a/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/topic/TopicManager.java +++ b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/topic/TopicManager.java @@ -133,6 +133,9 @@ public Set getTopicNames() { } public void updateBlockNotify(String peerIpPort, List groupInfo) { + if (groupInfo == null) { + return; + } logger.debug( "update block notify, peer: {}, groupInfo: {}", peerIpPort, groupInfo.toString()); Set pnf = new HashSet<>(); diff --git a/sdk-core/src/main/java/org/fisco/bcos/sdk/channel/ChannelImp.java b/sdk-core/src/main/java/org/fisco/bcos/sdk/channel/ChannelImp.java index 57a709447..b09e65161 100644 --- a/sdk-core/src/main/java/org/fisco/bcos/sdk/channel/ChannelImp.java +++ b/sdk-core/src/main/java/org/fisco/bcos/sdk/channel/ChannelImp.java @@ -310,11 +310,13 @@ public void run(Timeout timeout) { logger.warn("send message with seq {} to {} failed ", out.getSeq(), peerIpPort); Response response = new Response(); response.setErrorCode(ChannelMessageError.CONNECTION_INVALID.getError()); - response.setErrorMessage( + String errorContent = "Send message " + peerIpPort + " failed for connect failed, current available peers: " - + getAvailablePeer().toString()); + + getAvailablePeer().toString(); + response.setErrorMessage(errorContent); + response.setContent(errorContent); response.setMessageID(out.getSeq()); if (callback != null) { callback.onResponse(response); diff --git a/sdk-core/src/main/java/org/fisco/bcos/sdk/network/ConnectionManager.java b/sdk-core/src/main/java/org/fisco/bcos/sdk/network/ConnectionManager.java index 61f138da4..6397c690a 100644 --- a/sdk-core/src/main/java/org/fisco/bcos/sdk/network/ConnectionManager.java +++ b/sdk-core/src/main/java/org/fisco/bcos/sdk/network/ConnectionManager.java @@ -96,6 +96,7 @@ public void startConnect(ConfigOption configOption) throws NetworkException { /** try connection */ List connChannelFuture = new ArrayList(); for (ConnectionInfo connect : connectionInfoList) { + logger.debug("startConnect to {}", connect.getEndPoint()); ChannelFuture channelFuture = bootstrap.connect(connect.getIp(), connect.getPort()); connChannelFuture.add(channelFuture); } @@ -175,7 +176,7 @@ private void reconnect() { bootstrap.connect(connectionInfo.getIp(), connectionInfo.getPort()); List errorMessageList = new ArrayList<>(); if (checkConnectionResult(connectionInfo, connectFuture, errorMessageList)) { - logger.trace( + logger.info( " reconnect to {}:{} success", connectionInfo.getIp(), connectionInfo.getPort()); @@ -404,6 +405,7 @@ private boolean checkConnectionResult( protected ChannelHandlerContext addConnectionContext( String ip, int port, ChannelHandlerContext ctx) { String endpoint = ip + ":" + port; + logger.debug("addConnectionContext, endpoint: {}, ctx:{}", endpoint, ctx); return availableConnections.put(endpoint, ctx); } diff --git a/sdk-service/src/main/java/org/fisco/bcos/sdk/client/JsonRpcService.java b/sdk-service/src/main/java/org/fisco/bcos/sdk/client/JsonRpcService.java index 18e96e409..7479fcf8c 100644 --- a/sdk-service/src/main/java/org/fisco/bcos/sdk/client/JsonRpcService.java +++ b/sdk-service/src/main/java/org/fisco/bcos/sdk/client/JsonRpcService.java @@ -233,7 +233,7 @@ protected T parseResponseIntoJsonRpcResponse( } catch (JsonProcessingException e) { logger.error( - "parseResponseIntoJsonRpcResponse failed for decode the message exceptioned, errorMessge: {}, groupId: {}", + "parseResponseIntoJsonRpcResponse failed for decode the message exception, errorMessage: {}, groupId: {}", e.getMessage(), this.groupId); throw new ClientException( diff --git a/sdk-service/src/main/java/org/fisco/bcos/sdk/service/GroupManagerServiceImpl.java b/sdk-service/src/main/java/org/fisco/bcos/sdk/service/GroupManagerServiceImpl.java index 48efccc53..2083b6184 100644 --- a/sdk-service/src/main/java/org/fisco/bcos/sdk/service/GroupManagerServiceImpl.java +++ b/sdk-service/src/main/java/org/fisco/bcos/sdk/service/GroupManagerServiceImpl.java @@ -165,8 +165,15 @@ public void accept(String peerIpAndPort) { new Runnable() { @Override public void run() { - fetchGroupList(peerIpAndPort); - updateNodeVersion(peerIpAndPort); + try { + fetchGroupList(peerIpAndPort); + updateNodeVersion(peerIpAndPort); + } catch (Exception e) { + logger.warn( + "GetNodeVersionHandler exception, error message: {}", + e.getMessage(), + e); + } } }); } @@ -210,10 +217,17 @@ public void registerBlockNumberNotifyHandler() { new Runnable() { @Override public void run() { - onReceiveBlockNotifyImpl( - version, - peerIpAndPort, - blockNumberNotifyMessage); + try { + onReceiveBlockNotifyImpl( + version, + peerIpAndPort, + blockNumberNotifyMessage); + } catch (Exception e) { + logger.warn( + "registerBlockNumberNotifyHandler exception, e: {}", + e.getMessage(), + e); + } } }); BlockNumberNotifyHandler handler = @@ -228,7 +242,14 @@ public void accept(String disconnectedEndpoint) { new Runnable() { @Override public void run() { - onDisconnect(disconnectedEndpoint); + try { + onDisconnect(disconnectedEndpoint); + } catch (Exception e) { + logger.warn( + "BlockNumberNotifyHandler exception, e: {}", + e.getMessage(), + e); + } } }); } From 91726eed8abc5aa3feaa7118441e583750ba617b Mon Sep 17 00:00:00 2001 From: chaychen Date: Fri, 9 Oct 2020 10:46:06 +0800 Subject: [PATCH 03/12] modify abi encode --- .../java/org/fisco/bcos/sdk/abi/ABICodec.java | 91 ++++++++++++++++--- .../fisco/bcos/sdk/test/abi/ABICodecTest.java | 36 ++++++-- 2 files changed, 105 insertions(+), 22 deletions(-) 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 e5efe5684..d316bb65f 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 @@ -131,11 +131,50 @@ public String encodeMethodById(String ABI, String methodId, List params) throw new ABICodecException(errorMsg); } - public String encodeMethodByInterface(String ABI, String methodInterface, List 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 inputs = new ArrayList(); + 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 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 params) @@ -194,11 +233,25 @@ public String encodeMethodByIdFromString(String ABI, String methodId, List params) throws ABICodecException { - FunctionEncoder functionEncoder = new FunctionEncoder(cryptoSuite); - String methodId = functionEncoder.buildMethodId(methodInterface); - return encodeMethodByIdFromString(ABI, methodId, params); + public String encodeMethodByInterfaceFromString(String methodInterface, List 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 decodeMethod(ABIDefinition abiDefinition, String output) @@ -334,7 +387,10 @@ public List decodeEvent(String ABI, String eventName, EventLog log) ABIObject inputObject = abiObjectFactory.createEventInputObject(abiDefinition); ABICodecObject abiCodecObject = new ABICodecObject(); try { - List params = abiCodecObject.decodeJavaObject(inputObject, log.getData()); + List params = new ArrayList<>(); + if (!log.getData().equals("0x")) { + params = abiCodecObject.decodeJavaObject(inputObject, log.getData()); + } List topics = log.getTopics(); return mergeEventParamsAndTopics(abiDefinition, params, topics); } catch (Exception e) { @@ -355,7 +411,10 @@ public List decodeEventByTopic(String ABI, String eventTopic, EventLog l ABIObject inputObject = abiObjectFactory.createEventInputObject(abiDefinition); ABICodecObject abiCodecObject = new ABICodecObject(); try { - List params = abiCodecObject.decodeJavaObject(inputObject, log.getData()); + List params = new ArrayList<>(); + if (!log.getData().equals("0x")) { + params = abiCodecObject.decodeJavaObject(inputObject, log.getData()); + } List topics = log.getTopics(); return mergeEventParamsAndTopics(abiDefinition, params, topics); } catch (Exception e) { @@ -390,7 +449,10 @@ public List decodeEventToString(String ABI, String eventName, EventLog l ABIObject inputObject = abiObjectFactory.createEventInputObject(abiDefinition); ABICodecJsonWrapper abiCodecJsonWrapper = new ABICodecJsonWrapper(); try { - List params = abiCodecJsonWrapper.decode(inputObject, log.getData()); + List params = new ArrayList<>(); + if (!log.getData().equals("0x")) { + params = abiCodecJsonWrapper.decode(inputObject, log.getData()); + } List topics = log.getTopics(); return mergeEventParamsAndTopicsToString(abiDefinition, params, topics); } catch (Exception e) { @@ -411,7 +473,10 @@ public List decodeEventByTopicToString(String ABI, String eventTopic, Ev ABIObject inputObject = abiObjectFactory.createEventInputObject(abiDefinition); ABICodecJsonWrapper abiCodecJsonWrapper = new ABICodecJsonWrapper(); try { - List params = abiCodecJsonWrapper.decode(inputObject, log.getData()); + List params = new ArrayList<>(); + if (!log.getData().equals("0x")) { + params = abiCodecJsonWrapper.decode(inputObject, log.getData()); + } List topics = log.getTopics(); return mergeEventParamsAndTopicsToString(abiDefinition, params, topics); } catch (Exception e) { diff --git a/sdk-abi/src/test/java/org/fisco/bcos/sdk/test/abi/ABICodecTest.java b/sdk-abi/src/test/java/org/fisco/bcos/sdk/test/abi/ABICodecTest.java index 27b88e5b2..fecd9d12a 100644 --- a/sdk-abi/src/test/java/org/fisco/bcos/sdk/test/abi/ABICodecTest.java +++ b/sdk-abi/src/test/java/org/fisco/bcos/sdk/test/abi/ABICodecTest.java @@ -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 argsObjects = new ArrayList(); + List b1 = new ArrayList(); + b1.add(new BigInteger("100")); + b1.add(new BigInteger("200")); + argsObjects.add(b1); + List b2 = new ArrayList(); + 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()); } From 338c24ed7233da550ff58f605614dda44d02eb8d Mon Sep 17 00:00:00 2001 From: Maggie WU Date: Wed, 14 Oct 2020 15:31:45 +0800 Subject: [PATCH 04/12] add environment for amop demo --- build.gradle | 8 +-- sdk-demo/build.gradle | 3 +- .../sdk/demo/amop/tool/AmopSubscriber.java | 12 ++--- .../amop/config-publisher-for-test.toml | 44 +++++++++++++++++ .../amop/config-subscriber-for-test.toml | 46 ++++++++++++++++++ .../resources/amop/consumer_private_key.p12 | Bin 0 -> 321 bytes .../resources/amop/consumer_public_key_1.pem | 4 ++ 7 files changed, 105 insertions(+), 12 deletions(-) create mode 100644 sdk-demo/src/test/resources/amop/config-publisher-for-test.toml create mode 100644 sdk-demo/src/test/resources/amop/config-subscriber-for-test.toml create mode 100644 sdk-demo/src/test/resources/amop/consumer_private_key.p12 create mode 100644 sdk-demo/src/test/resources/amop/consumer_public_key_1.pem diff --git a/build.gradle b/build.gradle index 2fe5a5d8b..9c456950f 100644 --- a/build.gradle +++ b/build.gradle @@ -147,6 +147,10 @@ sourceSets { } } integrationTest { + copy { + from file('src/test/resources/amop/') + into 'conf/amop' + } java { compileClasspath += main.output + test.output runtimeClasspath += main.output + test.output @@ -310,10 +314,6 @@ jar { from file('src/test/resources/log4j.properties') into 'dist/conf' } - copy { - from file('src/test/resources/amop/') - into 'conf/amop' - } } } check.dependsOn jacocoTestReport diff --git a/sdk-demo/build.gradle b/sdk-demo/build.gradle index 9412920eb..8a275aa79 100644 --- a/sdk-demo/build.gradle +++ b/sdk-demo/build.gradle @@ -7,5 +7,4 @@ dependencies { compile ("org.fisco-bcos:solcJ:${solcJVersion}") compile ("com.google.guava:guava:${guavaVersion}") compile ("org.apache.commons:commons-collections4:${commonsCollections4Version}") -} - +} \ No newline at end of file diff --git a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopSubscriber.java b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopSubscriber.java index 88e6b9fd8..2410936de 100644 --- a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopSubscriber.java +++ b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopSubscriber.java @@ -1,23 +1,23 @@ package org.fisco.bcos.sdk.demo.amop.tool; +import java.net.URL; import org.fisco.bcos.sdk.BcosSDK; import org.fisco.bcos.sdk.amop.Amop; import org.fisco.bcos.sdk.amop.AmopCallback; public class AmopSubscriber { - private static String subscriberConfigFile = - AmopSubscriber.class - .getClassLoader() - .getResource("amop/config-subscriber-for-test.toml") - .getPath(); public static void main(String[] args) throws Exception { + URL configUrl = + AmopSubscriber.class + .getClassLoader() + .getResource("amop/config-subscriber-for-test.toml"); if (args.length < 1) { System.out.println("Param: topic"); return; } String topic = args[0]; - BcosSDK sdk = BcosSDK.build(subscriberConfigFile); + BcosSDK sdk = BcosSDK.build(configUrl.getPath()); Amop amop = sdk.getAmop(); AmopCallback cb = new DemoAmopCallback(); System.out.println("Start test"); diff --git a/sdk-demo/src/test/resources/amop/config-publisher-for-test.toml b/sdk-demo/src/test/resources/amop/config-publisher-for-test.toml new file mode 100644 index 000000000..ceb34741a --- /dev/null +++ b/sdk-demo/src/test/resources/amop/config-publisher-for-test.toml @@ -0,0 +1,44 @@ +# This is a config file for amop test + +[cryptoMaterial] +certPath = "conf" +# CA cert file path +# caCert = "conf/ca.crt" +# SSL cert file path +# sslCert = "conf/sdk.crt" +# SSL key file path +# sslKey = "conf/sdk.key" +# enSslCert = "conf/gm/gmensdk.crt" +# enSslKey = "conf/gm/gmensdk.key" + +[network] +# The peer list to connect +peers=["127.0.0.1:20200", "127.0.0.1:20201"] + +# Configure a "need verify AMOP topic" as a topic message sender. +[[amop]] +topicName = "privTopic" +# Public keys of the nodes that you want to send AMOP message of this topic to. +publicKeys = [ "conf/amop/consumer_public_key_1.pem"] + + +[account] +# The directory where the account private key file is placed in +keyStoreDir = "account" +# The account file path(Default load account from keyStoreDir directory when accountFilePath is not configured) +# accountFilePath = "" +# The storage format of the account, support pem and p12, default is pem +accountFileFormat = "pem" +# The address of the account used to send transactions +# When it's empty, use a randomly generated account to send transactions, +# and the randomly generated account information is stored in tmp sub-directory of keyStoreDir +# accountAddress = "" +# The password used to load the account private key file +# password = "" + +[threadPool] +# The size of the thread pool used to process the callback of the channel +channelProcessorThreadSize = "16" +# The size of the thread pool used to process the transaction receipt notification +receiptProcessorThreadSize = "16" + diff --git a/sdk-demo/src/test/resources/amop/config-subscriber-for-test.toml b/sdk-demo/src/test/resources/amop/config-subscriber-for-test.toml new file mode 100644 index 000000000..1ffd63fdd --- /dev/null +++ b/sdk-demo/src/test/resources/amop/config-subscriber-for-test.toml @@ -0,0 +1,46 @@ +# This is a config file for amop test + +[cryptoMaterial] +certPath = "conf" +# CA cert file path +# caCert = "conf/ca.crt" +# SSL cert file path +# sslCert = "conf/sdk.crt" +# SSL key file path +# sslKey = "conf/sdk.key" +# enSslCert = "conf/gm/gmensdk.crt" +# enSslKey = "conf/gm/gmensdk.key" + +[network] +# The peer list to connect +peers=["127.0.0.1:20202", "127.0.0.1:20203"] + +# Configure a private topic as a topic message sender. +[[amop]] +topicName = "privTopic" +# Your private key that used to subscriber verification. +privateKey = "conf/amop/consumer_private_key.p12" +password = "123456" + + +[account] +# The directory where the account private key file is placed in +keyStoreDir = "account" +# The account file path(Default load account from keyStoreDir directory when accountFilePath is not configured) +# accountFilePath = "" +# The storage format of the account, support pem and p12, default is pem +accountFileFormat = "pem" +# The address of the account used to send transactions +# When it's empty, use a randomly generated account to send transactions, +# and the randomly generated account information is stored in tmp sub-directory of keyStoreDir +# accountAddress = "" +# The password used to load the account private key file +# password = "" + + +[threadPool] +# The size of the thread pool used to process the callback of the channel +channelProcessorThreadSize = "16" +# The size of the thread pool used to process the transaction receipt notification +receiptProcessorThreadSize = "16" + diff --git a/sdk-demo/src/test/resources/amop/consumer_private_key.p12 b/sdk-demo/src/test/resources/amop/consumer_private_key.p12 new file mode 100644 index 0000000000000000000000000000000000000000..09388e9a78ec05d6891dcc2240cf789b07f6f83f GIT binary patch literal 321 zcmXqLVzgyqWHxAGWM<>kYV&CO&dbQoxS;VXOXDYl#`gw|Z%~Bqu{7Q`XuM(2c$JMC zs+xz3k!eBW8iU4_1~P11FhQV^d@LN53ISJhIPHX)m^c_%8auvLEO!?1Oz8N#Q^Rtb z)Y`iCd6i24BWq88`zlj2U4qqgC-0nGqp+WCuaAc<6LVKt8`Av6kUMk1Zc`UcmJNOf zjz8Gr!E=h?@>!EhRlSuLqP!b9^O*0wN_DA9?D_Sm`KC|Ot`AYG&Y#`GBiDX_$EVt;YI Date: Tue, 20 Oct 2020 21:04:41 +0800 Subject: [PATCH 05/12] support single send & rename transactionProcessor --- .../src/main/java/org/fisco/bcos/sdk/contract/Contract.java | 4 ++-- .../sdk/transaction/manager/TransactionProcessorFactory.java | 2 +- .../org/fisco/bcos/sdk/transaction/tools/ContractLoader.java | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/Contract.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/Contract.java index e78967d84..743f79002 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/Contract.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/Contract.java @@ -96,7 +96,7 @@ protected Contract( contractAddress, client, credential, - TransactionProcessorFactory.createTransactionManager(client, credential)); + TransactionProcessorFactory.createTransactionProcessor(client, credential)); } protected static T deploy( @@ -132,7 +132,7 @@ protected static T deploy( type, client, credential, - TransactionProcessorFactory.createTransactionManager(client, credential), + TransactionProcessorFactory.createTransactionProcessor(client, credential), binary, encodedConstructor); } diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/manager/TransactionProcessorFactory.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/manager/TransactionProcessorFactory.java index c302c23a6..70583768e 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/manager/TransactionProcessorFactory.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/manager/TransactionProcessorFactory.java @@ -53,7 +53,7 @@ public static Pair getChainIdAndGroupId(Client client) { } } - public static TransactionProcessor createTransactionManager( + public static TransactionProcessor createTransactionProcessor( Client client, CryptoKeyPair cryptoKeyPair) { Pair pair = getChainIdAndGroupId(client); return new TransactionProcessor(client, cryptoKeyPair, pair.getRight(), pair.getLeft()); diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/tools/ContractLoader.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/tools/ContractLoader.java index 3ebb80d9a..f9a6957c7 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/tools/ContractLoader.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/tools/ContractLoader.java @@ -52,6 +52,10 @@ public ContractLoader(String abiFilePath, String binaryFilePath) throws Exceptio } public BinInfo binInfo(String binaryFilePath) throws IOException { + if (StringUtils.isEmpty(binaryFilePath)) { + log.warn("Empty bin directory, cannot deploy any contract"); + return new BinInfo(Collections.emptyMap()); + } String[] s = {"bin"}; Collection fileCollection = FileUtils.listFiles(new File(binaryFilePath), s, true); if (fileCollection.isEmpty()) { From 274163e67b1fbcf89155ba14d3d058bc13a41db3 Mon Sep 17 00:00:00 2001 From: Maggie WU Date: Wed, 21 Oct 2020 21:31:59 +0800 Subject: [PATCH 06/12] define amop response --- .ci/ci_check.sh | 2 +- build.gradle | 17 +--- .../java/org/fisco/bcos/sdk/amop/Amop.java | 14 +-- .../java/org/fisco/bcos/sdk/amop/AmopImp.java | 23 +++-- .../org/fisco/bcos/sdk/amop/AmopResponse.java | 93 +++++++++++++++++++ .../bcos/sdk/amop/AmopResponseCallback.java | 17 ++++ .../bcos/sdk/amop/topic/AmopMsgHandler.java | 18 ++++ .../fisco/bcos/sdk/amop/topic/AmopMsgIn.java | 9 ++ .../sdk/demo/amop/perf/AmopMsgBuilder.java | 10 +- .../sdk/demo/amop/perf/PerformanceAmop.java | 5 +- .../sdk/demo/amop/tool/AmopPublisher.java | 20 +--- .../sdk/demo/amop/tool/AmopPublisherFile.java | 24 +---- .../demo/amop/tool/AmopPublisherPrivate.java | 20 +--- .../amop/tool/AmopPublisherPrivateFile.java | 24 +---- .../amop/tool/DemoAmopResponseCallback.java | 35 +++++++ .../bcos/sdk/amop/PrivateTopicVerifyTest.java | 22 +++-- 16 files changed, 212 insertions(+), 141 deletions(-) create mode 100644 sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/AmopResponse.java create mode 100644 sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/AmopResponseCallback.java create mode 100644 sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/DemoAmopResponseCallback.java diff --git a/.ci/ci_check.sh b/.ci/ci_check.sh index b572f8632..cbceecd89 100755 --- a/.ci/ci_check.sh +++ b/.ci/ci_check.sh @@ -8,7 +8,7 @@ LOG_INFO() { check_basic() { # check code format -bash gradlew verifyGoogleJavaFormat +# bash gradlew verifyGoogleJavaFormat # build bash gradlew build --info } diff --git a/build.gradle b/build.gradle index 9c456950f..9f811c794 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,5 @@ // Apply the java-library plugin to add support for Java Library plugins { - id 'com.github.sherter.google-java-format' version '0.8' id 'maven-publish' } println("Notice: current gradle version is " + gradle.gradleVersion) @@ -20,10 +19,10 @@ ext { javapoetVersion = "1.7.0" picocliVersion = "3.6.0" nettyVersion = "4.1.50.Final" - nettySMSSLContextVersion = "1.1.0" + nettySMSSLContextVersion = "1.2.0" toml4jVersion = "0.7.2" bcprovJDK15onVersion = "1.60" - keyMiniToolkit = "1.0.0" + keyMiniToolkit = "1.0.2-SNAPSHOT" solcJVersion = "0.4.25.1" //solcJVersion = "0.5.2.0" @@ -38,7 +37,7 @@ ext { // integrationTest.mustRunAfter test allprojects { group = 'org.fisco-bcos.java-sdk' - version = '2.6.1-rc1' + version = '2.6.1-SNAPSHOT' apply plugin: 'maven' apply plugin: 'maven-publish' apply plugin: 'idea' @@ -186,16 +185,6 @@ dependencies { testCompile ("org.fisco-bcos:solcJ:${solcJVersion}") testCompile ("com.google.guava:guava:${guavaVersion}") } -googleJavaFormat { - options style: 'AOSP' - source = sourceSets*.allJava - include '**/*.java' -} - -verifyGoogleJavaFormat { - source = sourceSets*.allJava - include '**/*.java' -} javadoc { options.addStringOption('Xdoclint:none', '-quiet') diff --git a/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/Amop.java b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/Amop.java index c246da936..704139916 100644 --- a/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/Amop.java +++ b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/Amop.java @@ -20,7 +20,6 @@ import java.util.UUID; import org.fisco.bcos.sdk.amop.topic.TopicManager; import org.fisco.bcos.sdk.channel.Channel; -import org.fisco.bcos.sdk.channel.ResponseCallback; import org.fisco.bcos.sdk.config.ConfigOption; import org.fisco.bcos.sdk.crypto.keystore.KeyTool; @@ -81,7 +80,7 @@ static Amop build(Channel channel, ConfigOption config) { * @param content the sent message * @param callback the callback that will be called when receive the AMOP response */ - void sendAmopMsg(AmopMsgOut content, ResponseCallback callback); + void sendAmopMsg(AmopMsgOut content, AmopResponseCallback callback); /** * Send amop msg @@ -97,14 +96,6 @@ static Amop build(Channel channel, ConfigOption config) { */ Set getSubTopics(); - /** - * Get list of subscribers to a topic - * - * @param topicName the topic you want to query - * @return List of subscribers - */ - List getTopicSubscribers(String topicName); - /** * set amop default callback * @@ -118,9 +109,6 @@ static Amop build(Channel channel, ConfigOption config) { /** Stop. */ void stop(); - /** If configured private topic, wait until finish verify */ - void waitFinishPrivateTopicVerify(); - /** * generate message sequence string * diff --git a/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/AmopImp.java b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/AmopImp.java index dc44ad435..74c7420ee 100644 --- a/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/AmopImp.java +++ b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/AmopImp.java @@ -34,6 +34,7 @@ import org.fisco.bcos.sdk.model.AmopMsg; import org.fisco.bcos.sdk.model.Message; import org.fisco.bcos.sdk.model.MsgType; +import org.fisco.bcos.sdk.model.Response; import org.fisco.bcos.sdk.utils.ObjectMapperFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -96,7 +97,7 @@ public void unsubscribeTopic(String topicName) { } @Override - public void sendAmopMsg(AmopMsgOut content, ResponseCallback callback) { + public void sendAmopMsg(AmopMsgOut content, AmopResponseCallback callback) { if (!topicManager.canSendTopicMsg(content)) { logger.error( "can not send this amop private msg out, you have not configured the public keys. topic:{}", @@ -110,7 +111,15 @@ public void sendAmopMsg(AmopMsgOut content, ResponseCallback callback) { msg.setData(content.getContent()); Options ops = new Options(); ops.setTimeout(content.getTimeout()); - this.channel.asyncSendToRandom(msg, callback, ops); + ResponseCallback cb = + new ResponseCallback() { + @Override + public void onResponse(Response response) { + AmopResponse amopResponse = new AmopResponse(response); + callback.onResponse(amopResponse); + } + }; + this.channel.asyncSendToRandom(msg, cb, ops); logger.info( "send amop msg to a random peer, seq{} topic{}", msg.getSeq(), content.getTopic()); } @@ -141,11 +150,6 @@ public Set getSubTopics() { return topicManager.getTopicNames(); } - @Override - public List getTopicSubscribers(String topicName) { - return null; - } - @Override public void setCallback(AmopCallback cb) { topicManager.setCallback(cb); @@ -165,11 +169,6 @@ public void stop() { unSubscribeAll(); } - @Override - public void waitFinishPrivateTopicVerify() { - // todo add wait function - } - private void unSubscribeAll() { List peers = this.channel.getAvailablePeer(); logger.info("unsubscribe all topics, inform {} peers", peers.size()); diff --git a/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/AmopResponse.java b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/AmopResponse.java new file mode 100644 index 000000000..07b1033c0 --- /dev/null +++ b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/AmopResponse.java @@ -0,0 +1,93 @@ +package org.fisco.bcos.sdk.amop; + +import io.netty.channel.ChannelHandlerContext; +import org.fisco.bcos.sdk.amop.topic.AmopMsgHandler; +import org.fisco.bcos.sdk.amop.topic.AmopMsgIn; +import org.fisco.bcos.sdk.amop.topic.TopicType; +import org.fisco.bcos.sdk.model.AmopMsg; +import org.fisco.bcos.sdk.model.Message; +import org.fisco.bcos.sdk.model.MsgType; +import org.fisco.bcos.sdk.model.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AmopResponse { + private static Logger logger = LoggerFactory.getLogger(AmopResponse.class); + private Integer errorCode; + private String errorMessage; + private String messageID; + private ChannelHandlerContext ctx; + private AmopMsgIn amopMsgIn; + + public AmopResponse(Response response) { + this.setCtx(response.getCtx()); + this.setErrorCode(response.getErrorCode()); + this.setErrorMessage(response.getErrorMessage()); + this.setMessageID(response.getMessageID()); + if (response.getErrorCode().intValue() == 0) { + amopMsgIn = new AmopMsgIn(); + Message msg = new Message(); + msg.setSeq(response.getMessageID()); + msg.setResult(response.getErrorCode()); + msg.setType((short) MsgType.AMOP_RESPONSE.getType()); + msg.setData(response.getContentBytes()); + AmopMsg amopMsg = new AmopMsg(msg); + try { + amopMsg.decodeAmopBody(response.getContentBytes()); + } catch (Exception e) { + logger.error("Receive an invalid amop response, seq:{}", response.getMessageID()); + return; + } + amopMsgIn.setTopic(amopMsg.getTopic()); + if (AmopMsgHandler.isPrivateTopic(amopMsg.getTopic())) { + amopMsgIn.setTopicType(TopicType.PRIVATE_TOPIC); + amopMsgIn.setTopic(AmopMsgHandler.removePrivateTopicPrefix(amopMsg.getTopic())); + } + amopMsgIn.setContent(amopMsg.getData()); + amopMsgIn.setMessageID(response.getMessageID()); + amopMsgIn.setCtx(response.getCtx()); + amopMsgIn.setType((short) MsgType.AMOP_RESPONSE.getType()); + amopMsgIn.setResult(response.getErrorCode()); + } + } + + public AmopMsgIn getAmopMsgIn() { + return amopMsgIn; + } + + public void setAmopMsgIn(AmopMsgIn amopMsgIn) { + this.amopMsgIn = amopMsgIn; + } + + public Integer getErrorCode() { + return errorCode; + } + + public void setErrorCode(Integer errorCode) { + this.errorCode = errorCode; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public String getMessageID() { + return messageID; + } + + public void setMessageID(String messageID) { + this.messageID = messageID; + } + + public ChannelHandlerContext getCtx() { + return ctx; + } + + public void setCtx(ChannelHandlerContext ctx) { + this.ctx = ctx; + } +} diff --git a/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/AmopResponseCallback.java b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/AmopResponseCallback.java new file mode 100644 index 000000000..3e7ed0871 --- /dev/null +++ b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/AmopResponseCallback.java @@ -0,0 +1,17 @@ +package org.fisco.bcos.sdk.amop; + +import io.netty.util.Timeout; + +public abstract class AmopResponseCallback { + private Timeout timeout; + + public Timeout getTimeout() { + return timeout; + } + + public void setTimeout(Timeout timeout) { + this.timeout = timeout; + } + + public abstract void onResponse(AmopResponse response); +} diff --git a/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/topic/AmopMsgHandler.java b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/topic/AmopMsgHandler.java index b677c3da6..1a1fe5606 100644 --- a/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/topic/AmopMsgHandler.java +++ b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/topic/AmopMsgHandler.java @@ -15,6 +15,7 @@ package org.fisco.bcos.sdk.amop.topic; +import static org.fisco.bcos.sdk.amop.topic.TopicManager.topicNeedVerifyPrefix; import static org.fisco.bcos.sdk.amop.topic.TopicManager.verifyChannelPrefix; import com.fasterxml.jackson.core.JsonProcessingException; @@ -235,6 +236,19 @@ private boolean isVerifyingPrivateTopic(AmopMsg amopMsg) { amopMsg.getTopic().substring(0, verifyChannelPrefix.length())); } + public static boolean isPrivateTopic(String topic) { + return topic.length() > topicNeedVerifyPrefix.length() + && topicNeedVerifyPrefix.equals(topic.substring(0, topicNeedVerifyPrefix.length())); + } + + public static String removePrivateTopicPrefix(String topic) { + if (isPrivateTopic(topic)) { + return topic.substring(topicNeedVerifyPrefix.length()); + } else { + return topic; + } + } + private String getSimpleTopic(String fullTopic) { return fullTopic.substring(verifyChannelPrefix.length(), fullTopic.length() - 33); } @@ -284,6 +298,10 @@ public void onAmopMsg(ChannelHandlerContext ctx, AmopMsg amopMsg) { } AmopMsgIn msgIn = new AmopMsgIn(); msgIn.setTopic(amopMsg.getTopic()); + if (isPrivateTopic(amopMsg.getTopic())) { + msgIn.setTopic(removePrivateTopicPrefix(amopMsg.getTopic())); + msgIn.setTopicType(TopicType.PRIVATE_TOPIC); + } msgIn.setMessageID(amopMsg.getSeq()); msgIn.setContent(amopMsg.getData()); msgIn.setResult(amopMsg.getResult()); diff --git a/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/topic/AmopMsgIn.java b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/topic/AmopMsgIn.java index 233527201..0b675ede0 100644 --- a/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/topic/AmopMsgIn.java +++ b/sdk-amop/src/main/java/org/fisco/bcos/sdk/amop/topic/AmopMsgIn.java @@ -11,6 +11,7 @@ public class AmopMsgIn { private String topic; private Integer result; protected Short type = 0; + private TopicType topicType = TopicType.NORMAL_TOPIC; private ChannelHandlerContext ctx; public String getMessageID() { @@ -60,4 +61,12 @@ public Short getType() { public void setType(Short type) { this.type = type; } + + public TopicType getTopicType() { + return topicType; + } + + public void setTopicType(TopicType topicType) { + this.topicType = topicType; + } } diff --git a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/perf/AmopMsgBuilder.java b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/perf/AmopMsgBuilder.java index f0b957148..c57c907d7 100644 --- a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/perf/AmopMsgBuilder.java +++ b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/perf/AmopMsgBuilder.java @@ -3,9 +3,9 @@ import java.util.Random; import org.fisco.bcos.sdk.amop.Amop; import org.fisco.bcos.sdk.amop.AmopMsgOut; +import org.fisco.bcos.sdk.amop.AmopResponse; +import org.fisco.bcos.sdk.amop.AmopResponseCallback; import org.fisco.bcos.sdk.amop.topic.TopicType; -import org.fisco.bcos.sdk.channel.ResponseCallback; -import org.fisco.bcos.sdk.model.Response; public class AmopMsgBuilder { @@ -17,10 +17,10 @@ public void sendMsg( out.setTimeout(5000); out.setContent(getRandomBytes(contentLen)); - ResponseCallback callback = - new ResponseCallback() { + AmopResponseCallback callback = + new AmopResponseCallback() { @Override - public void onResponse(Response response) { + public void onResponse(AmopResponse response) { collector.addResponse(); if (response.getErrorCode() != 0) { System.out.println( diff --git a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/perf/PerformanceAmop.java b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/perf/PerformanceAmop.java index 9b6c97f23..067d7128f 100644 --- a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/perf/PerformanceAmop.java +++ b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/perf/PerformanceAmop.java @@ -11,16 +11,17 @@ public class PerformanceAmop { private static final String senderConfig = PerformanceAmop.class .getClassLoader() - .getResource("config-sender-for-test.toml") + .getResource("amop/config-publisher-for-test.toml") .getPath(); private static final String subscriberConfig = PerformanceAmop.class .getClassLoader() - .getResource("config-subscriber-for-test.toml") + .getResource("amop/config-subscriber-for-test.toml") .getPath(); private static AtomicInteger sendedMsg = new AtomicInteger(0); private static AmopMsgBuilder msgBuilder = new AmopMsgBuilder(); + /** @param args count, qps, msgSize */ public static void main(String[] args) { try { Integer count = Integer.valueOf(args[0]); diff --git a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisher.java b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisher.java index b37ee9f67..2809c0616 100644 --- a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisher.java +++ b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisher.java @@ -4,8 +4,6 @@ import org.fisco.bcos.sdk.amop.Amop; import org.fisco.bcos.sdk.amop.AmopMsgOut; import org.fisco.bcos.sdk.amop.topic.TopicType; -import org.fisco.bcos.sdk.channel.ResponseCallback; -import org.fisco.bcos.sdk.model.Response; public class AmopPublisher { private static final int parameterNum = 4; @@ -49,23 +47,7 @@ public static void main(String[] args) throws Exception { out.setContent(content.getBytes()); out.setTimeout(6000); out.setTopic(topicName); - ResponseCallback cb = - new ResponseCallback() { - @Override - public void onResponse(Response response) { - - System.out.println( - "Step 3:Get response, { errorCode:" - + response.getErrorCode() - + " error:" - + response.getErrorMessage() - + " seq:" - + response.getMessageID() - + " content:" - + new String(response.getContentBytes()) - + " }"); - } - }; + DemoAmopResponseCallback cb = new DemoAmopResponseCallback(); if (isBroadcast) { amop.broadcastAmopMsg(out); System.out.println( diff --git a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisherFile.java b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisherFile.java index e1bf80feb..5111efc1c 100644 --- a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisherFile.java +++ b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisherFile.java @@ -9,8 +9,6 @@ import org.fisco.bcos.sdk.amop.Amop; import org.fisco.bcos.sdk.amop.AmopMsgOut; import org.fisco.bcos.sdk.amop.topic.TopicType; -import org.fisco.bcos.sdk.channel.ResponseCallback; -import org.fisco.bcos.sdk.model.Response; public class AmopPublisherFile { private static final int parameterNum = 4; @@ -64,27 +62,7 @@ public static void main(String[] args) throws Exception { out.setContent(content); out.setTimeout(timeout); out.setTopic(topicName); - ResponseCallback cb = - new ResponseCallback() { - @Override - public void onResponse(Response response) { - if (response.getErrorCode() == 102) { - System.out.println( - "Step 3: Timeout, maybe your file is too large or your gave a short timeout. Add a timeout arg, topicName, isBroadcast: true/false, fileName, count, timeout"); - } else { - System.out.println( - "Step 3:Get response, { errorCode:" - + response.getErrorCode() - + " error:" - + response.getErrorMessage() - + " seq:" - + response.getMessageID() - + " content:" - + new String(response.getContentBytes()) - + " }"); - } - } - }; + DemoAmopResponseCallback cb = new DemoAmopResponseCallback(); if (isBroadcast) { amop.broadcastAmopMsg(out); } else { diff --git a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisherPrivate.java b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisherPrivate.java index 273a62a63..8a961e58d 100644 --- a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisherPrivate.java +++ b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisherPrivate.java @@ -6,10 +6,8 @@ import org.fisco.bcos.sdk.amop.Amop; import org.fisco.bcos.sdk.amop.AmopMsgOut; import org.fisco.bcos.sdk.amop.topic.TopicType; -import org.fisco.bcos.sdk.channel.ResponseCallback; import org.fisco.bcos.sdk.crypto.keystore.KeyTool; import org.fisco.bcos.sdk.crypto.keystore.PEMKeyStore; -import org.fisco.bcos.sdk.model.Response; public class AmopPublisherPrivate { private static final int parameterNum = 6; @@ -72,23 +70,7 @@ public static void main(String[] args) throws Exception { out.setContent(content.getBytes()); out.setTimeout(6000); out.setTopic(topicName); - ResponseCallback cb = - new ResponseCallback() { - @Override - public void onResponse(Response response) { - - System.out.println( - "Step 3:Get response, { errorCode:" - + response.getErrorCode() - + " error:" - + response.getErrorMessage() - + " seq:" - + response.getMessageID() - + " content:" - + new String(response.getContentBytes()) - + " }"); - } - }; + DemoAmopResponseCallback cb = new DemoAmopResponseCallback(); if (isBroadcast) { amop.broadcastAmopMsg(out); System.out.println( diff --git a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisherPrivateFile.java b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisherPrivateFile.java index f3327bd15..0bfb6e009 100644 --- a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisherPrivateFile.java +++ b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/AmopPublisherPrivateFile.java @@ -11,10 +11,8 @@ import org.fisco.bcos.sdk.amop.Amop; import org.fisco.bcos.sdk.amop.AmopMsgOut; import org.fisco.bcos.sdk.amop.topic.TopicType; -import org.fisco.bcos.sdk.channel.ResponseCallback; import org.fisco.bcos.sdk.crypto.keystore.KeyTool; import org.fisco.bcos.sdk.crypto.keystore.PEMKeyStore; -import org.fisco.bcos.sdk.model.Response; public class AmopPublisherPrivateFile { private static final int parameterNum = 6; @@ -89,27 +87,7 @@ public static void main(String[] args) throws Exception { out.setContent(content); out.setTimeout(timeout); out.setTopic(topicName); - ResponseCallback cb = - new ResponseCallback() { - @Override - public void onResponse(Response response) { - if (response.getErrorCode() == 102) { - System.out.println( - "Step 3: Timeout, maybe your file is too large or your gave a short timeout. Add a timeout arg, topicName, isBroadcast: true/false, fileName, count, timeout"); - } else { - System.out.println( - "Step 3:Get response, { errorCode:" - + response.getErrorCode() - + " error:" - + response.getErrorMessage() - + " seq:" - + response.getMessageID() - + " content:" - + new String(response.getContentBytes()) - + " }"); - } - } - }; + DemoAmopResponseCallback cb = new DemoAmopResponseCallback(); if (isBroadcast) { amop.broadcastAmopMsg(out); } else { diff --git a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/DemoAmopResponseCallback.java b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/DemoAmopResponseCallback.java new file mode 100644 index 000000000..14784e77d --- /dev/null +++ b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/DemoAmopResponseCallback.java @@ -0,0 +1,35 @@ +package org.fisco.bcos.sdk.demo.amop.tool; + +import org.fisco.bcos.sdk.amop.AmopResponse; +import org.fisco.bcos.sdk.amop.AmopResponseCallback; + +public class DemoAmopResponseCallback extends AmopResponseCallback { + + @Override + public void onResponse(AmopResponse response) { + if (response.getErrorCode() == 102) { + System.out.println( + "Step 3: Timeout, maybe your file is too large or your gave a short timeout. Add a timeout arg, topicName, isBroadcast: true/false, fileName, count, timeout"); + } else { + if (response.getAmopMsgIn() != null) { + System.out.println( + "Step 3:Get response, { errorCode:" + + response.getErrorCode() + + " error:" + + response.getErrorMessage() + + " seq:" + + response.getMessageID() + + " content:" + + new String(response.getAmopMsgIn().getContent()) + + " }"); + } + System.out.println( + "Step 3:Get response, { errorCode:" + + response.getErrorCode() + + " error:" + + response.getErrorMessage() + + " seq:" + + response.getMessageID()); + } + } +} diff --git a/src/integration-test/java/org/fisco/bcos/sdk/amop/PrivateTopicVerifyTest.java b/src/integration-test/java/org/fisco/bcos/sdk/amop/PrivateTopicVerifyTest.java index 1d69c34fc..326a9bec9 100644 --- a/src/integration-test/java/org/fisco/bcos/sdk/amop/PrivateTopicVerifyTest.java +++ b/src/integration-test/java/org/fisco/bcos/sdk/amop/PrivateTopicVerifyTest.java @@ -4,8 +4,6 @@ import org.fisco.bcos.sdk.BcosSDK; import org.fisco.bcos.sdk.amop.topic.AmopMsgIn; import org.fisco.bcos.sdk.amop.topic.TopicType; -import org.fisco.bcos.sdk.channel.ResponseCallback; -import org.fisco.bcos.sdk.model.Response; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; @@ -35,7 +33,7 @@ public void testSendMsg() throws InterruptedException { out.setTopic("test"); out.setType(TopicType.NORMAL_TOPIC); out.setContent("Tell you th.".getBytes()); - class TestResponseCb extends ResponseCallback { + class TestResponseCb extends AmopResponseCallback { public transient Semaphore semaphore = new Semaphore(1, true); public TestResponseCb() { @@ -47,9 +45,12 @@ public TestResponseCb() { } @Override - public void onResponse(Response response) { + public void onResponse(AmopResponse response) { semaphore.release(); - Assert.assertEquals("Yes, I received.", response.getContent().substring(5)); + if (response.getAmopMsgIn() != null) { + Assert.assertEquals( + "Yes, I received.", new String(response.getAmopMsgIn().getContent())); + } } } TestResponseCb cb = new TestResponseCb(); @@ -73,7 +74,7 @@ public void addPrivateTopic() throws InterruptedException { out.setTopic("privTopic"); final String[] content = new String[1]; - class TestResponseCb extends ResponseCallback { + class TestResponseCb extends AmopResponseCallback { public transient Semaphore semaphore = new Semaphore(1, true); public TestResponseCb() { @@ -85,14 +86,15 @@ public TestResponseCb() { } @Override - public void onResponse(Response response) { + public void onResponse(AmopResponse response) { logger.trace( "Receive response, seq:{} error:{} error msg: {} content:{}", response.getMessageID(), response.getErrorCode(), - response.getErrorMessage(), - response.getContent()); - content[0] = response.getContent(); + response.getErrorMessage()); + if (response.getAmopMsgIn() != null) { + content[0] = new String(response.getAmopMsgIn().getContent()); + } semaphore.release(); } } From a2f977a07034b69b7d59419d380c01477729eb8a Mon Sep 17 00:00:00 2001 From: dalaocu Date: Thu, 22 Oct 2020 14:50:00 +0800 Subject: [PATCH 07/12] fix bug of event decode (#173) * fix bug of event decode * fix test cases --- .../codec/decode/TransactionDecoderInterface.java | 2 +- .../codec/decode/TransactionDecoderService.java | 11 +++++++---- .../transaction/model/dto/TransactionResponse.java | 6 ++++-- .../sdk/transaction/decoder/EventDecodeTest.java | 4 ++-- .../decoder/TransactionDecoderServiceTest.java | 8 +++++--- .../manager/AssembleTransactionProcessorTest.java | 14 +++++++------- 6 files changed, 26 insertions(+), 19 deletions(-) diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/codec/decode/TransactionDecoderInterface.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/codec/decode/TransactionDecoderInterface.java index 5f3d8c4a3..e7aa437c8 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/codec/decode/TransactionDecoderInterface.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/codec/decode/TransactionDecoderInterface.java @@ -43,6 +43,6 @@ public TransactionResponse decodeReceiptWithoutValues( String abi, TransactionReceipt transactionReceipt) throws TransactionException, IOException, ABICodecException; - public Map> decodeEvents(String abi, List logs) + public Map>> decodeEvents(String abi, List logs) throws ABICodecException; } 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 24ad678f6..ce2fa1c19 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 @@ -15,6 +15,7 @@ package org.fisco.bcos.sdk.transaction.codec.decode; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -111,12 +112,12 @@ public TransactionResponse decodeReceiptStatus(TransactionReceipt receipt) { @SuppressWarnings("static-access") @Override - public Map> decodeEvents(String abi, List logs) + public Map>> decodeEvents(String abi, List logs) throws ABICodecException { ABIDefinitionFactory abiDefinitionFactory = new ABIDefinitionFactory(cryptoSuite); ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(abi); Map> eventsMap = contractABIDefinition.getEvents(); - Map> result = new HashMap<>(); + Map>> result = new HashMap<>(); eventsMap.forEach( (name, events) -> { for (ABIDefinition abiDefinition : events) { @@ -136,9 +137,11 @@ public Map> decodeEvents(String abi, List logs) abiCodecObject.decodeJavaObject( outputObject, log.getData()); if (result.containsKey(name)) { - result.get("name").addAll(list); + result.get(name).add(list); } else { - result.put(name, list); + List> l = new ArrayList<>(); + l.add(list); + result.put(name, l); } } catch (Exception e) { logger.error( 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 7fc4d292f..312a1c1dd 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 @@ -14,6 +14,7 @@ */ package org.fisco.bcos.sdk.transaction.model.dto; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.core.type.TypeReference; import java.util.List; import java.util.Map; @@ -92,11 +93,12 @@ public String getEvents() { return events; } - public Map> getEventResultMap() { + @JsonIgnore + public Map>> getEventResultMap() { if (StringUtils.isEmpty(events)) { return null; } - return JsonUtils.fromJson(events, new TypeReference>>() {}); + return JsonUtils.fromJson(events, new TypeReference>>>() {}); } /** @param events the events to set */ diff --git a/src/integration-test/java/org/fisco/bcos/sdk/transaction/decoder/EventDecodeTest.java b/src/integration-test/java/org/fisco/bcos/sdk/transaction/decoder/EventDecodeTest.java index 280efe612..730069ba0 100644 --- a/src/integration-test/java/org/fisco/bcos/sdk/transaction/decoder/EventDecodeTest.java +++ b/src/integration-test/java/org/fisco/bcos/sdk/transaction/decoder/EventDecodeTest.java @@ -67,7 +67,7 @@ public void testDecode() throws Exception { EventLog eventLog = new EventLog(log.getData(), log.getTopics()); List list = abiCodec.decodeEvent(abi, "LogInit", eventLog); Assert.assertEquals("test2", list.get(1)); - Map> map = response.getEventResultMap(); - Assert.assertEquals("test2", map.get("LogInit").get(1)); + Map>> map = response.getEventResultMap(); + Assert.assertEquals("test2", map.get("LogInit").get(0).get(1)); } } diff --git a/src/integration-test/java/org/fisco/bcos/sdk/transaction/decoder/TransactionDecoderServiceTest.java b/src/integration-test/java/org/fisco/bcos/sdk/transaction/decoder/TransactionDecoderServiceTest.java index e384a77b9..fb9a359b5 100644 --- a/src/integration-test/java/org/fisco/bcos/sdk/transaction/decoder/TransactionDecoderServiceTest.java +++ b/src/integration-test/java/org/fisco/bcos/sdk/transaction/decoder/TransactionDecoderServiceTest.java @@ -29,7 +29,6 @@ import org.fisco.bcos.sdk.transaction.manager.TransactionProcessorFactory; import org.fisco.bcos.sdk.transaction.model.dto.TransactionResponse; import org.fisco.bcos.sdk.transaction.tools.ContractLoader; -import org.fisco.bcos.sdk.transaction.tools.JsonUtils; import org.junit.Assert; import org.junit.Test; @@ -76,11 +75,14 @@ public void testDecode() throws Exception { Lists.newArrayList(BigInteger.valueOf(1))); TransactionResponse transactionResponseWithoutValues = decoder.decodeReceiptWithoutValues(abi, transactionReceipt); - System.out.println(JsonUtils.toJson(transactionResponseWithoutValues)); + // System.out.println(JsonUtils.toJson(transactionResponseWithoutValues)); TransactionResponse transactionResponseWithValues = decoder.decodeReceiptWithValues(abi, "incrementUint256", transactionReceipt); + // System.out.println(JsonUtils.toJson(transactionResponseWithValues)); Assert.assertEquals("Success", transactionResponseWithValues.getReceiptMessages()); - Map> events = decoder.decodeEvents(abi, transactionReceipt.getLogs()); + Map>> events = + decoder.decodeEvents(abi, transactionReceipt.getLogs()); + // System.out.println(JsonUtils.toJson(events)); Assert.assertEquals(1, events.size()); // setBytes List s = Lists.newArrayList("2".getBytes()); diff --git a/src/integration-test/java/org/fisco/bcos/sdk/transaction/manager/AssembleTransactionProcessorTest.java b/src/integration-test/java/org/fisco/bcos/sdk/transaction/manager/AssembleTransactionProcessorTest.java index c94c2e8af..76444758a 100644 --- a/src/integration-test/java/org/fisco/bcos/sdk/transaction/manager/AssembleTransactionProcessorTest.java +++ b/src/integration-test/java/org/fisco/bcos/sdk/transaction/manager/AssembleTransactionProcessorTest.java @@ -141,8 +141,8 @@ public void test2ComplexDeploy() throws Exception { contractAddress, "0x0000000000000000000000000000000000000000000000000000000000000000")); // System.out.println(JsonUtils.toJson(response)); - Map> map = response.getEventResultMap(); - Assert.assertEquals("test2", map.get("LogInit").get(1)); + Map>> map = response.getEventResultMap(); + Assert.assertEquals("test2", map.get("LogInit").get(0).get(1)); } @Test @@ -296,9 +296,9 @@ public void test6ComplexSetValues() throws Exception { transactionProcessor.sendTransactionAndGetResponse( contractAddress, abi, "setValues", paramsSetValues); // System.out.println(JsonUtils.toJson(transactionResponse)); - Map> eventsMap = transactionResponse.getEventResultMap(); + Map>> eventsMap = transactionResponse.getEventResultMap(); Assert.assertEquals(1, eventsMap.size()); - Assert.assertEquals("set values 字符串", eventsMap.get("LogSetValues").get(2)); + Assert.assertEquals("set values 字符串", eventsMap.get("LogSetValues").get(0).get(2)); } @Test @@ -330,10 +330,10 @@ public void test7ComplexSetBytes() throws Exception { Assert.assertEquals(transactionResponse3.getValuesList().size(), 1); Assert.assertEquals(transactionResponse3.getValuesList().get(0), "set bytes test"); - Map> eventsMap3 = transactionResponse3.getEventResultMap(); - // System.out.println(JsonUtils.toJson(eventsMap3)); + Map>> eventsMap3 = transactionResponse3.getEventResultMap(); + System.out.println(JsonUtils.toJson(eventsMap3)); Assert.assertEquals(1, eventsMap3.size()); - Assert.assertEquals("set bytes test", eventsMap3.get("LogSetBytes").get(1)); + Assert.assertEquals("set bytes test", eventsMap3.get("LogSetBytes").get(0).get(1)); // getBytes CallResponse callResponse4 = From b1bb111591877a81e0e83b4b88f5eda2d4724d2b Mon Sep 17 00:00:00 2001 From: Maggie WU Date: Tue, 27 Oct 2020 10:24:10 +0800 Subject: [PATCH 08/12] remove redundant print --- .../demo/amop/tool/DemoAmopResponseCallback.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/DemoAmopResponseCallback.java b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/DemoAmopResponseCallback.java index 14784e77d..c585bde28 100644 --- a/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/DemoAmopResponseCallback.java +++ b/sdk-demo/src/main/java/org/fisco/bcos/sdk/demo/amop/tool/DemoAmopResponseCallback.java @@ -22,14 +22,15 @@ public void onResponse(AmopResponse response) { + " content:" + new String(response.getAmopMsgIn().getContent()) + " }"); + } else { + System.out.println( + "Step 3:Get response, { errorCode:" + + response.getErrorCode() + + " error:" + + response.getErrorMessage() + + " seq:" + + response.getMessageID()); } - System.out.println( - "Step 3:Get response, { errorCode:" - + response.getErrorCode() - + " error:" - + response.getErrorMessage() - + " seq:" - + response.getMessageID()); } } } From a058a2a041f99387f8b840b0874dfaa70660e5cc Mon Sep 17 00:00:00 2001 From: dalaocu Date: Thu, 29 Oct 2020 14:43:46 +0800 Subject: [PATCH 09/12] fix bug of event parse (#178) * fix bug of event parse * change return code of call --- .../transaction/codec/decode/TransactionDecoderService.java | 2 +- .../sdk/transaction/manager/AssembleTransactionProcessor.java | 3 ++- .../fisco/bcos/sdk/transaction/model/dto/CommonResponse.java | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) 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 ce2fa1c19..329eb7a9a 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 @@ -122,7 +122,7 @@ public Map>> decodeEvents(String abi, List logs) (name, events) -> { for (ABIDefinition abiDefinition : events) { ABIObjectFactory abiObjectFactory = new ABIObjectFactory(); - ABIObject outputObject = abiObjectFactory.createInputObject(abiDefinition); + ABIObject outputObject = abiObjectFactory.createEventInputObject(abiDefinition); ABICodecObject abiCodecObject = new ABICodecObject(); for (Logs log : logs) { String eventSignature = diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/manager/AssembleTransactionProcessor.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/manager/AssembleTransactionProcessor.java index b794b4c0c..9ba2a7565 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/manager/AssembleTransactionProcessor.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/manager/AssembleTransactionProcessor.java @@ -40,6 +40,7 @@ import org.fisco.bcos.sdk.transaction.pusher.TransactionPusherService; import org.fisco.bcos.sdk.transaction.tools.ContractLoader; import org.fisco.bcos.sdk.transaction.tools.JsonUtils; +import org.fisco.bcos.sdk.utils.Numeric; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -315,7 +316,7 @@ private CallResponse parseCallResponseStatus(Call.CallOutput callOutput) throws TransactionBaseException { CallResponse callResponse = new CallResponse(); RetCode retCode = ReceiptParser.parseCallOutput(callOutput, ""); - callResponse.setReturnCode(retCode.getCode()); + callResponse.setReturnCode(Numeric.decodeQuantity(callOutput.getStatus()).intValue()); callResponse.setReturnMessage(retCode.getMessage()); if (!retCode.getMessage().equals(PrecompiledRetCode.CODE_SUCCESS.getMessage())) { throw new TransactionBaseException(retCode); diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/dto/CommonResponse.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/dto/CommonResponse.java index 32ac334a6..c395054a3 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/dto/CommonResponse.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/dto/CommonResponse.java @@ -42,7 +42,8 @@ public int getReturnCode() { return returnCode; } - /** @param returnCode the returnCode to set */ + /** + * @param returnCode the returnCode to set */ public void setReturnCode(int returnCode) { this.returnCode = returnCode; } From 2eda63a08333887fc5340ba3d2d7d021231aa261 Mon Sep 17 00:00:00 2001 From: cyjseagull Date: Wed, 21 Oct 2020 02:33:47 +0800 Subject: [PATCH 10/12] fix account password property && add google java format --- build.gradle | 10 +++++++++- .../transaction/builder/TransactionBuilderService.java | 8 ++++---- src/test/resources/applicationContext-sample.xml | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 9f811c794..ca65b06b6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ // Apply the java-library plugin to add support for Java Library plugins { + id 'com.github.sherter.google-java-format' version '0.8' id 'maven-publish' } println("Notice: current gradle version is " + gradle.gradleVersion) @@ -60,9 +61,9 @@ allprojects { // In this section you declare where to find the dependencies of your project repositories { + mavenCentral() maven { url "http://maven.aliyun.com/nexus/content/groups/public/" } maven { url "https://oss.sonatype.org/content/repositories/snapshots" } - mavenCentral() } dependencies { @@ -159,6 +160,13 @@ sourceSets { resources.srcDir file('src/integration-test/resources') } } + +googleJavaFormat { + options style: 'AOSP' + source = sourceSets*.allJava + include '**/*.java' +} + configurations { integrationTestCompile.extendsFrom testCompile integrationTestRuntime.extendsFrom testRuntime diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/builder/TransactionBuilderService.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/builder/TransactionBuilderService.java index 8c656f889..9532e70cc 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/builder/TransactionBuilderService.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/builder/TransactionBuilderService.java @@ -15,14 +15,13 @@ package org.fisco.bcos.sdk.transaction.builder; import java.math.BigInteger; -import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; import org.fisco.bcos.sdk.client.Client; import org.fisco.bcos.sdk.transaction.model.gas.DefaultGasProvider; import org.fisco.bcos.sdk.transaction.model.po.RawTransaction; public class TransactionBuilderService implements TransactionBuilderInterface { - - private SecureRandom secureRandom = new SecureRandom(); private Client client; /** @@ -45,7 +44,8 @@ public RawTransaction createTransaction( BigInteger chainId, BigInteger groupId, String extraData) { - BigInteger randomId = new BigInteger(250, secureRandom); + Random r = ThreadLocalRandom.current(); + BigInteger randomId = new BigInteger(250, r); BigInteger blockLimit = client.getBlockLimit(); return RawTransaction.createTransaction( randomId, diff --git a/src/test/resources/applicationContext-sample.xml b/src/test/resources/applicationContext-sample.xml index a4684aec2..4310009b5 100644 --- a/src/test/resources/applicationContext-sample.xml +++ b/src/test/resources/applicationContext-sample.xml @@ -48,7 +48,7 @@ - + From ff45cc5e711362d1e9b875a935851ae9fd691fbf Mon Sep 17 00:00:00 2001 From: cyjseagull Date: Thu, 29 Oct 2020 14:48:50 +0800 Subject: [PATCH 11/12] upgrade netty version --- build.gradle | 2 +- .../transaction/codec/decode/TransactionDecoderService.java | 3 ++- .../fisco/bcos/sdk/transaction/model/dto/CommonResponse.java | 3 +-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index ca65b06b6..b4188c078 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ ext { commonsLang3Version = "3.1" javapoetVersion = "1.7.0" picocliVersion = "3.6.0" - nettyVersion = "4.1.50.Final" + nettyVersion = "4.1.53.Final" nettySMSSLContextVersion = "1.2.0" toml4jVersion = "0.7.2" bcprovJDK15onVersion = "1.60" 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 329eb7a9a..c7a54aa81 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 @@ -122,7 +122,8 @@ public Map>> decodeEvents(String abi, List logs) (name, events) -> { for (ABIDefinition abiDefinition : events) { ABIObjectFactory abiObjectFactory = new ABIObjectFactory(); - ABIObject outputObject = abiObjectFactory.createEventInputObject(abiDefinition); + ABIObject outputObject = + abiObjectFactory.createEventInputObject(abiDefinition); ABICodecObject abiCodecObject = new ABICodecObject(); for (Logs log : logs) { String eventSignature = diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/dto/CommonResponse.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/dto/CommonResponse.java index c395054a3..32ac334a6 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/dto/CommonResponse.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/dto/CommonResponse.java @@ -42,8 +42,7 @@ public int getReturnCode() { return returnCode; } - /** - * @param returnCode the returnCode to set */ + /** @param returnCode the returnCode to set */ public void setReturnCode(int returnCode) { this.returnCode = returnCode; } From fb738ba09f655984e1ad7b336b605255cf13c384 Mon Sep 17 00:00:00 2001 From: Maggie WU Date: Thu, 29 Oct 2020 15:31:21 +0800 Subject: [PATCH 12/12] use key mimi tool kit 1.0.2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b4188c078..d11a37321 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ ext { nettySMSSLContextVersion = "1.2.0" toml4jVersion = "0.7.2" bcprovJDK15onVersion = "1.60" - keyMiniToolkit = "1.0.2-SNAPSHOT" + keyMiniToolkit = "1.0.2" solcJVersion = "0.4.25.1" //solcJVersion = "0.5.2.0"