hiero-ledger / hiero-ledger/hiero-consensus-node
Submitting a ScheduleCreateTransaction with no transaction body causes a NPE and a Possibly CATASTROPHIC failure alert
Open
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 407
- Forks
- 226
- Avg merge
- 3d 4h
- Merged PRs (30d)
- 210
Description
Submitting a ScheduleCreateTransaction with no transaction body causes a NPE. A null check needs to be added here
This is the stack trace from testnet:
2025-08-29 15:08:24.877 ERROR 92 IngestWorkflowImpl - Possibly CATASTROPHIC failure while running the ingest workflow
java.lang.NullPointerException: Field scheduledTransactionBody is null
at java.base/java.util.Objects.requireNonNull(Objects.java:259)
at com.hedera.hapi.node.scheduled.ScheduleCreateTransactionBody.scheduledTransactionBodyOrThrow(ScheduleCreateTransactionBody.java:607)
at com.hedera.node.app.throttle.ThrottleAccumulator.shouldThrottleScheduleCreate(ThrottleAccumulator.java:500)
at com.hedera.node.app.throttle.ThrottleAccumulator.shouldThrottleTxn(ThrottleAccumulator.java:468)
at com.hedera.node.app.throttle.ThrottleAccumulator.checkAndEnforceThrottle(ThrottleAccumulator.java:188)
at com.hedera.node.app.throttle.SynchronizedThrottleAccumulator.shouldThrottle(SynchronizedThrottleAccumulator.java:59)
at com.hedera.node.app.workflows.ingest.IngestChecker.checkThrottles(IngestChecker.java:344)
at com.hedera.node.app.workflows.ingest.IngestChecker.runAllChecks(IngestChecker.java:286)
at com.hedera.node.app.workflows.ingest.IngestChecker.runAllChecks(IngestChecker.java:235)
at com.hedera.node.app.workflows.ingest.IngestWorkflowImpl.submitTransaction(IngestWorkflowImpl.java:75)
at com.hedera.node.app.grpc.impl.TransactionMethod.handle(TransactionMethod.java:43)
at com.hedera.node.app.grpc.impl.MethodBase.invoke(MethodBase.java:124)
at com.hedera.node.app.grpc.impl.netty.GrpcServiceBuilder$ListenerImpl.onMessage(GrpcServiceBuilder.java:266)
at com.hedera.node.app.grpc.impl.netty.GrpcServiceBuilder$ListenerImpl.onMessage(GrpcServiceBuilder.java:234)
at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.messagesAvailableInternal(ServerCallImpl.java:334)
at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.messagesAvailable(ServerCallImpl.java:319)
at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1MessagesAvailable.runInContext(ServerImpl.java:834)
at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
at io.grpc.internal.SerializeReentrantCallsDirectExecutor.execute(SerializeReentrantCallsDirectExecutor.java:49)
at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener.messagesAvailable(ServerImpl.java:842)
at io.grpc.internal.AbstractStream$TransportState.messagesAvailable(AbstractStream.java:218)
at io.grpc.internal.MessageDeframer.processBody(MessageDeframer.java:415)
at io.grpc.internal.MessageDeframer.deliver(MessageDeframer.java:276)
at io.grpc.internal.MessageDeframer.deframe(MessageDeframer.java:178)
at io.grpc.internal.AbstractStream$TransportState.deframe(AbstractStream.java:246)
at io.grpc.internal.AbstractServerStream$TransportState.inboundDataReceived(AbstractServerStream.java:277)
at io.grpc.netty.NettyServerStream$TransportState.inboundDataReceived(NettyServerStream.java:229)
at io.grpc.netty.NettyServerHandler.onDataRead(NettyServerHandler.java:568)
at io.grpc.netty.NettyServerHandler.access$900(NettyServerHandler.java:111)
at io.grpc.netty.NettyServerHandler$FrameListener.onDataRead(NettyServerHandler.java:947)
at io.netty.handler.codec.http2.DefaultHttp2ConnectionDecoder$FrameReadListener.onDataRead(DefaultHttp2ConnectionDecoder.java:320)
at io.netty.handler.codec.http2.Http2InboundFrameLogger$1.onDataRead(Http2InboundFrameLogger.java:46)
at io.netty.handler.codec.http2.DefaultHttp2FrameReader.readDataFrame(DefaultHttp2FrameReader.java:409)
at io.netty.handler.codec.http2.DefaultHttp2FrameReader.processPayloadState(DefaultHttp2FrameReader.java:244)
at io.netty.handler.codec.http2.DefaultHttp2FrameReader.readFrame(DefaultHttp2FrameReader.java:164)
at io.netty.handler.codec.http2.Http2InboundFrameLogger.readFrame(Http2InboundFrameLogger.java:39)
at io.netty.handler.codec.http2.DefaultHttp2ConnectionDecoder.decodeFrame(DefaultHttp2ConnectionDecoder.java:186)
at io.netty.handler.codec.http2.Http2ConnectionHandler$FrameDecoder.decode(Http2ConnectionHandler.java:391)
at io.netty.handler.codec.http2.Http2ConnectionHandler.decode(Http2ConnectionHandler.java:451)
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:530)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1429)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:918)
at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:793)
at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.handle(AbstractEpollChannel.java:479)
at io.netty.channel.epoll.EpollIoHandler$DefaultEpollIoRegistration.handle(EpollIoHandler.java:307)
at io.netty.channel.epoll.EpollIoHandler.processReady(EpollIoHandler.java:489)
at io.netty.channel.epoll.EpollIoHandler.run(EpollIoHandler.java:444)
at io.netty.channel.SingleThreadIoEventLoop.runIo(SingleThreadIoEventLoop.java:206)
at io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:177)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1073)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:1583)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start at hedera-node/hedera-app/src/main/java/com/hedera/node/app/throttle/ThrottleAccumulator.java around shouldThrottleScheduleCreate and compare it with the stack trace. Reproduce or cover a ScheduleCreateTransaction with no transaction body, then verify ingest no longer produces the reported NullPointerException or catastrophic failure alert.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 52/100