Caver-java 에서 validateSignedMessage 시 오류

안녕하세요.
계정 3개로 테스트 해보는데요.
다른 계정은 잘 되는데 한 계정만 아래와 같은 오류가 발생하고있습니다.
도저희 이유를 모르겠습니다.
해당 계정만 이런 오류가 나네요 다른계정들은 다 잘되구요.

DEBUG 07.24 20:19:48.673 [     https-jsse-nio-443-exec-2] [org.web3j.protocol.http.HttpService     ]: 208 -
DEBUG 07.24 20:19:48.673 [     https-jsse-nio-443-exec-2] [org.web3j.protocol.http.HttpService     ]: 210 - {"jsonrpc":"2.0","method":"klay_getAccountKey","params":["0x2c0505ffcc540f74fb94f2792313f192e68c999e","latest"],"id":3}
DEBUG 07.24 20:19:48.673 [     https-jsse-nio-443-exec-2] [org.web3j.protocol.http.HttpService     ]: 211 - --> END POST (119-byte body)
DEBUG 07.24 20:19:48.720 [     https-jsse-nio-443-exec-2] [org.web3j.protocol.http.HttpService     ]: 233 - <-- 200 OK https://public-node-api.klaytnapi.com/v1/baobab (47ms)
DEBUG 07.24 20:19:48.721 [     https-jsse-nio-443-exec-2] [org.web3j.protocol.http.HttpService     ]: 294 - content-type: application/json; charset=utf-8
DEBUG 07.24 20:19:48.721 [     https-jsse-nio-443-exec-2] [org.web3j.protocol.http.HttpService     ]: 294 - date: Mon, 25 Jul 2022 00:19:48 GMT
DEBUG 07.24 20:19:48.721 [     https-jsse-nio-443-exec-2] [org.web3j.protocol.http.HttpService     ]: 294 - content-length: 38
DEBUG 07.24 20:19:48.721 [     https-jsse-nio-443-exec-2] [org.web3j.protocol.http.HttpService     ]: 294 - x-envoy-upstream-service-time: 5
DEBUG 07.24 20:19:48.721 [     https-jsse-nio-443-exec-2] [org.web3j.protocol.http.HttpService     ]: 294 - server: istio-envoy
DEBUG 07.24 20:19:48.722 [     https-jsse-nio-443-exec-2] [org.web3j.protocol.http.HttpService     ]: 276 -
DEBUG 07.24 20:19:48.722 [     https-jsse-nio-443-exec-2] [org.web3j.protocol.http.HttpService     ]: 277 - {"id":3,"jsonrpc":"2.0","result":null}
DEBUG 07.24 20:19:48.722 [     https-jsse-nio-443-exec-2] [org.web3j.protocol.http.HttpService     ]: 284 - <-- END HTTP (38-byte body)
ERROR 07.24 20:19:48.736 [     https-jsse-nio-443-exec-2] [c.z5corp.mtc.controller.LoginController ]:  40 - ERRO : {}
java.lang.NullPointerException: null
        at com.klaytn.caver.validator.Validator.validateSignedMessage(Validator.java:151)
        at com.klaytn.caver.validator.Validator.validateSignedMessage(Validator.java:90)
        at com.z5corp.mtc.service.BaseService.klaytnVerify(BaseService.java:96)
        at com.z5corp.mtc.controller.LoginController.klaytnVerify(LoginController.java:93)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1064)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:228)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

안녕하세요

만약 계정이 사용된 적이 없어서 플랫폼 스테이트에 저장되어 있는 정보가 없는 경우에는 account key가 null로 리턴될 수 있습니다.
즉, klay_getAccountKey 가 null로 리턴되는 계정은 KLAY 를 전송하거나 전송 받은 적이 없다는 의미입니다.
null 핸들링을 추가해 주시기 바랍니다.

안녕하세요.
빠른 답변 감사합니다.

그렇다면 account key 가 null로 되는경우 즉 klay를 전송하거나 전송받은적이 없는 계정들은
validateSignedMessage 를 못한다는 걸가요?

null로 리턴되는 경우 AccountKeyLegacy로 처리하시면 될 것 같습니다

답변 감사합니다.

Caver-java 내부 로직에서 null 오류나는 상태인데요.
그럼 컨텐츠단에서 AccountKey accountKey = klay.getAccountKey(address) 로 체킹을 먼저하고 validateSignedMessage 를 해야 된다는 말씀이신가요?

자세한 설명좀 부탁드려도 될가요?

아 자바에 그 부분 로직이 빠져있나보네요 ^^…; 죄송합니다 추가하도록 하겠습니다.
일단 자바쪽에서 수정될 때 까지는 위에서 말씀해 주신 것 처럼 getAccountKey 로 먼저 확인하시고 해야 할 것 같습니다.

답변 감사합니다.

AccountKey accountKey = caver.getRpc().getKlay().getAccountKey(klaytnSigend.getAddress()).send();
            if (accountKey.getResult() == null) {
                Zlog.error(this.getClass(), "accountKey null");
            }

해당 로직으로 처리는 하였으나. validateSignedMessage 로 이어지는 방법을 잘 모르겠습니다…
ㅠㅜ

방금 caver-java v1.9.1-rc.1 버전이 배포되었습니다.
이 버전에 해당 픽스가 들어갔는데, 이 버전으로 한 번 사용해 보시겠어요?
참고로 maven 에 배포가 완료되기 까지는 조금 시간이 소요됩니다.

해당 에러로 나옵니다.

154번째 줄 IAccountKey acctKey = accountKey.getResult().getAccountKey();
이 코드에서 accountKey.getResult() 자체가 null 입니다!!

DEBUG 07.25 04:17:32.474 [     https-jsse-nio-443-exec-5] [org.web3j.protocol.http.HttpService     ]: 284 - <-- END HTTP (38-byte body)
ERROR 07.25 04:17:32.664 [     https-jsse-nio-443-exec-5] [com.z5corp.mtc.service.BaseService      ]:  40 - ERROR : {}
java.lang.NullPointerException: null
        at com.klaytn.caver.validator.Validator.validateSignedMessage(Validator.java:154)
        at com.klaytn.caver.validator.Validator.validateSignedMessage(Validator.java:90)
        at com.z5corp.mtc.service.BaseService.klaytnVerify(BaseService.java:105)
        at com.z5corp.mtc.controller.LoginController.klaytnVerify(LoginController.java:93)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1064)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)

앗 죄송합니다 이부분 수정해서 다시 rc 버전 배포해보도록 하겠습니다~

네 답변 감사합니다.
배포 되면 말씀 부탁드립니다. (__)(–)
힘내세요!

caver-java v1.9.1-rc.2 버전 배포되었습니다. 해당버전 사용해 보시기 바랍니다

답변 감사합니다.
사용해보고 다시 글남기겠습니다.

적용후 정상적으로 동작하는것을 확인 했습니다.
감사합니다.