Skip to content

Cannot exit validator using remote signing #8722

@twoeths

Description

@twoeths

Describe the bug

The voluntaryExitRemoteSigner.test.ts failed post-deneb, see https://github.com/ChainSafe/lodestar/actions/runs/20592632915/job/59140702960?pr=8721

5929: 2025-12-30 09:02:04.255+0000 | pool-2-thread-1 | INFO  | Eth2Runner | Keys loaded from local keystores: [2], with error count: [0]
5929: 2025-12-30 09:02:04.257+0000 | pool-2-thread-1 | INFO  | DefaultArtifactSignerProvider | Total signers (keys) currently loaded in memory: 2
5929: 2025-12-30 09:02:04.329+0000 | main | INFO  | Runner | Web3Signer has started with TLS disabled, and ready to handle signing requests on 0.0.0.0:9090
5929: 2025-12-30 09:02:15.579+0000 | vert.x-eventloop-thread-0 | ERROR | LogErrorHandler | Failed request: http://127.0.0.1:9090/api/v1/eth2/sign/0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c
java.lang.IllegalArgumentException: Signing root 0x5fd2f37414733e3c2f6b32bbb4f89ade39ef5fffcf945548cd64a4d342d05753 must match signing computed signing root 0x383568b603ab44ebf3b4dc704478c92df13d2b2eb2895be26af4363e054c5152 from data
	at com.google.common.base.Preconditions.checkArgument(Preconditions.java:445)
	at tech.pegasys.web3signer.core.service.http.handlers.signing.eth2.Eth2SignForIdentifierHandler.handle(Eth2SignForIdentifierHandler.java:102)
	at tech.pegasys.web3signer.core.service.http.handlers.signing.eth2.Eth2SignForIdentifierHandler.handle(Eth2SignForIdentifierHandler.java:56)
	at io.vertx.ext.web.impl.BlockingHandlerDecorator.lambda$handle$0(BlockingHandlerDecorator.java:48)
	at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$5(ContextImpl.java:205)
	at io.vertx.core.impl.ContextInternal.dispatch(ContextInternal.java:270)
	at io.vertx.core.impl.ContextImpl$1.execute(ContextImpl.java:221)
	at io.vertx.core.impl.WorkerTask.run(WorkerTask.java:56)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Unknown Source)
5929: 2025-12-30 09:02:15.580+0000 | vert.x-eventloop-thread-0 | ERROR | RoutingContext | Unhandled exception in router
java.lang.IllegalArgumentException: Signing root 0x5fd2f37414733e3c2f6b32bbb4f89ade39ef5fffcf945548cd64a4d342d05753 must match signing computed signing root 0x383568b603ab44ebf3b4dc704478c92df13d2b2eb2895be26af4363e054c5152 from data
	at com.google.common.base.Preconditions.checkArgument(Preconditions.java:445)
	at tech.pegasys.web3signer.core.service.http.handlers.signing.eth2.Eth2SignForIdentifierHandler.handle(Eth2SignForIdentifierHandler.java:102)
	at tech.pegasys.web3signer.core.service.http.handlers.signing.eth2.Eth2SignForIdentifierHandler.handle(Eth2SignForIdentifierHandler.java:56)
	at io.vertx.ext.web.impl.BlockingHandlerDecorator.lambda$handle$0(BlockingHandlerDecorator.java:48)
	at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$5(ContextImpl.java:205)
	at io.vertx.core.impl.ContextInternal.dispatch(ContextInternal.java:270)
	at io.vertx.core.impl.ContextImpl$1.execute(ContextImpl.java:221)
	at io.vertx.core.impl.WorkerTask.run(WorkerTask.java:56)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Unknown Source)
5929: 2025-12-30 09:02:15.586+0000 | vert.x-eventloop-thread-0 | ERROR | LogErrorHandler | Failed request: http://127.0.0.1:9090/api/v1/eth2/sign/0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b
java.lang.IllegalArgumentException: Signing root 0xdcae64f2abb39389c22cd9a519a1384f2709656a2cc2385655eab28b138c359e must match signing computed signing root 0x370331c1a155e53b1863023122ceb61cb76c498a2c75710bc6256612d9d6836b from data
	at com.google.common.base.Preconditions.checkArgument(Preconditions.java:445)
	at tech.pegasys.web3signer.core.service.http.handlers.signing.eth2.Eth2SignForIdentifierHandler.handle(Eth2SignForIdentifierHandler.java:102)
	at tech.pegasys.web3signer.core.service.http.handlers.signing.eth2.Eth2SignForIdentifierHandler.handle(Eth2SignForIdentifierHandler.java:56)
	at io.vertx.ext.web.impl.BlockingHandlerDecorator.lambda$handle$0(BlockingHandlerDecorator.java:48)
	at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$5(ContextImpl.java:205)
	at io.vertx.core.impl.ContextInternal.dispatch(ContextInternal.java:270)
	at io.vertx.core.impl.ContextImpl$1.execute(ContextImpl.java:221)
	at io.vertx.core.impl.WorkerTask.run(WorkerTask.java:56)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Unknown Source)
5929: 2025-12-30 09:02:15.586+0000 | vert.x-eventloop-thread-0 | ERROR | RoutingContext | Unhandled exception in router
java.lang.IllegalArgumentException: Signing root 0xdcae64f2abb39389c22cd9a519a1384f2709656a2cc2385655eab28b138c359e must match signing computed signing root 0x370331c1a155e53b1863023122ceb61cb76c498a2c75710bc6256612d9d6836b from data
	at com.google.common.base.Preconditions.checkArgument(Preconditions.java:445)
	at tech.pegasys.web3signer.core.service.http.handlers.signing.eth2.Eth2SignForIdentifierHandler.handle(Eth2SignForIdentifierHandler.java:102)
	at tech.pegasys.web3signer.core.service.http.handlers.signing.eth2.Eth2SignForIdentifierHandler.handle(Eth2SignForIdentifierHandler.java:56)
	at io.vertx.ext.web.impl.BlockingHandlerDecorator.lambda$handle$0(BlockingHandlerDecorator.java:48)
	at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$5(ContextImpl.java:205)
	at io.vertx.core.impl.ContextInternal.dispatch(ContextInternal.java:270)
	at io.vertx.core.impl.ContextImpl$1.execute(ContextImpl.java:221)
	at io.vertx.core.impl.WorkerTask.run(WorkerTask.java:56)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Unknown Source)
stdout | packages/cli/test/e2e/voluntaryExitRemoteSigner.test.ts > voluntaryExit using remote signer
Attempting to stop container

there is a discrepancy between and web3 signer. It seems lodestar computed voluntary exit signing root correctly but we send wrong fork_info to web3 signer

const forkInfo = config.getForkInfo(signingSlot);

post-deneb, we use capella fork to compute domain for voluntary_exit message, but we send the fork of slot instead, which could be electra or fulu

cc @nflaig if he can confirm that

Expected behavior

no error

Steps to reproduce

No response

Additional context

No response

Operating system

Linux

Lodestar version or commit hash

v1.38.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    meta-bugIssues that identify a bug and require a fix.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions