Caver-java로 klay 전송 시 NullPointerException 에러

안녕하세요 caver-java를 이용하여 간단하게 klay를 전송해보는 중입니다.

caver-java : 1.4.0
EN은 ken-baobab-v1.8.2-0-darwin-10.10-amd64.tar.gz 를 설치하였습니다.

klay를 전송하고 txhash값도 확인했지만 그 다음날 같은 코드를 테스트 해보니

java.lang.NullPointerException
	at com.klaytn.caver.tx.manager.TransactionManager.send(TransactionManager.java:183)
	at com.icon.mp.kn_mp.KlaytnMpApplicationTests.txManagerTransaction(KlaytnMpApplicationTests.java:122)
	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.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
	at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

란 에러가뜹니다. kend start 시에 노드 상태도 확인해보고 주소값들도 모두 확인해보았는데
어느부분이 문제인걸까요?

테스트한 소스코드 첨부합니다.


        Caver caver = Caver.build(Caver.BAOBAB_URL);

        KlayCredentials credentials = KlayCredentials.create(SENDER_PRIVATE_KEY);

        TransactionManager transactionManager = new TransactionManager.Builder(caver, credentials)
                .setChaindId(ChainId.BAOBAB_TESTNET).build();

        ValueTransferTransaction valueTransferTransaction = ValueTransferTransaction.create(
                credentials.getAddress(),       // fromAddress
                TO_ADDRESS,                     // toAddress
                new BigInteger("9000000000"), // value
                new BigInteger("750000000000"),
                BigInteger.valueOf(100_000)     // gasLimit
        );

        KlayRawTransaction klayRawTransaction = transactionManager.sign(valueTransferTransaction);
        String transactionHash = transactionManager.send(klayRawTransaction);
        System.out.println("txHash : " + transactionHash);

안녕하세요.
transactionManager.send()에 전달되는 klayRawTransaction이라는 instance가 null로 들어오는 것 같은데요.
그 이전동작이 잘 수행되었는지 확인해보시는게 좋을 것 같습니다.

감사합니다.

2개의 좋아요

안녕하세요
위의 테스트는 정상적으로 txhash값이 나왔습니다만 전 어제의 코드에서 수정한 부분이 전혀 없는데
완전히 다른 결과가 나왔습니다.
어제 EN의 chaindata를 최신으로 받아 다시 동기화 후 블록넘버를 확있했을 때 klaytn scope의 블록넘버와 일치했습니다. 그 때에도 테스트 코드 결과값은 nullpointerException이 나왔구요.

수정한 부분은 kend.conf의 'SC_MAIN_BRIDGE=1 ’ 부분을 0 이 아닌 1로 설정해준것이 전부입니다.

하지만 오늘 다시 확인해보니 transfer가 정상적으로 작동된것을 확인했습니다. 이 부분에서 transfer가 정상적으로 작동한 특별한 이슈가 있을까요?

안녕하세요.

  • transfer라는 것이 어떤 것을 이야기하는 것인지?
  • 어느 부분에서 반복적으로 Null pointer exception이 발생했는지?

를 알려주셔야 확인을 해드릴 수 있을 것 같습니다.

위에 언급한 transfer는 klay를 전송하는 메서드 부분을 의미하였습니다.
Null pointer exception이 발생한 부분은 transactionManager.sign() 부분 입니다.

감사합니다.

TransactionManager를 생성 시, ErrorHandler를 등록하여 sign()에서 어떤 Exception이 발생하는지 확인을 해보시는 것이 필요할 것 같습니다.

네 감사합니다.
한가지 궁금한 점이 있습니다.
모든 트랜잭션 전송 시에 바오밥 테스트넷의 EN을 최신블록까지 동기화 시켜줘하는 부분이 필수 전제 조건인가요?

네. 노드간 블록 싱크가 맞춰지지않은 상태에서 트랜잭션을 전송하면 에러가 발생할 수 있습니다.
아래 링크 참고 부탁드립니다.