Skip to content

MPC ECDSA signing occasionally fails with nats: no responders available for request until node restart #147

@cppfuns

Description

@cppfuns

Title

Intermittent ECDSA signing failure: nats: no responders available for request until node restart

Description

We observed an intermittent failure in the ECDSA MPC signing flow while EDDSA signing continued to work normally.

At the time of the issue:

  • EDDSA (session_eddsa) signing sessions were created and completed successfully.
  • ECDSA (session_ecdsa) signing sessions were created successfully and reached the point of "Have enough participants to sign".
  • However, during the ECDSA signing protocol, direct NATS messages between peers failed with nats: no responders available for request, and the MPC layer reported ERROR_PEER_UNAVAILABLE and Failed to sign tx.

After restarting the affected MPC node, the problem disappeared and ECDSA signing started to work again, without any changes to the NATS server or its docker-compose configuration. This suggests that the issue is likely in the MPC node / signer process state (e.g. NATS subscriptions / responder registration) rather than the NATS server itself.

Environment

  • Deployment: local / docker-compose (NATS started via docker-compose.yml)

  • NATS service config (excerpt):

    nats-server:
      image: nats:latest
      container_name: nats-server
      command: -js --http_port 8222 --store_dir /data
      ports:
        - "4222:4222"
        - "8222:8222"
        - "6222:6222"
      volumes:
        - ./data/nats:/data
      tty: true
      restart: always
      logging:
        driver: json-file
        options:
          max-size: "10m"
          max-file: "3"
  • NATS server was running normally (EDDSA signing via NATS was working at the same time).

Steps to Reproduce

We do not yet have a deterministic reproduction, but the observed sequence is:

  1. Start the MPC sentinel and NATS via docker-compose.
  2. Perform an EDDSA signing operation.
    • EDDSA signing session (type=session_eddsa) initializes and completes successfully.
  3. Perform an ECDSA signing operation for the same wallet.
    • ECDSA signing session (type=session_ecdsa) initializes with three participants and logs "Have enough participants to sign".
  4. During the ECDSA signing protocol, the node attempts to send direct NATS messages between peers.
  5. ECDSA signing fails with nats: no responders available for request, and the MPC layer logs ERROR_PEER_UNAVAILABLE.
  6. Restart the affected MPC node.
  7. Retry the same ECDSA signing operation.
    • Now the ECDSA signing succeeds and the NATS errors disappear.

Expected Behavior

  • Once a signing session is initialized successfully and participants are ready, the ECDSA signing protocol should complete without NATS no responders errors, assuming the NATS server is up and reachable.
  • MPC nodes should correctly register and maintain their NATS subscriptions / responders for ECDSA direct messages as long as the process is running.

Actual Behavior

  • EDDSA signing works correctly.
  • ECDSA signing session is created and initialized, but fails with NATS errors indicating no responders on the direct message subjects.
  • MPC logs show ERROR_PEER_UNAVAILABLE and the signing operation fails.
  • Restarting the affected node immediately resolves the issue without changing the NATS server or configuration.

Relevant Logs

From the time of the failure (timestamps anonymized slightly):

2026-03-13 09:17:52.000 INF Creating signing session min ready=3 participantPeerIDs=["bc135dac-8ab0-4e31-9b72-c52d31928622","4060aba8-69fb-4c5c-9e8c-3b39dc5de16e","c05c5a17-c805-400e-8ffe-b71bf0811803"] ready count=3 readyPeers=["4060aba8-69fb-4c5c-9e8c-3b39dc5de16e","c05c5a17-c805-400e-8ffe-b71bf0811803","bc135dac-8ab0-4e31-9b72-c52d31928622"] type=session_eddsa version=1
2026-03-13 09:17:52.000 INF Initializing signing session with partyID: {1,keygen}, peerIDs [{0,keygen} {1,keygen} {2,keygen}]
2026-03-13 09:17:52.000 INF Have enough participants to sign participants=["bc135dac-8ab0-4e31-9b72-c52d31928622","4060aba8-69fb-4c5c-9e8c-3b39dc5de16e","c05c5a17-c805-400e-8ffe-b71bf0811803"]
2026-03-13 09:17:52.000 INF Initialized sigining session successfully!
2026-03-13 09:17:53.000 INF Starting signing walletID=2c8af8cc-3fd9-4852-8a4e-6f92c3f5d400
2026-03-13 09:18:09.000 INF Received signing event Id=bc135dac-8ab0-4e31-9b72-c52d31928622 tx=d4094d01-dfdd-4a54-bf2e-5f9ae3116da1 type=secp256k1 waleltID=2c8af8cc-3fd9-4852-8a4e-6f92c3f5d400
2026-03-13 09:18:09.000 INF SigningConsumer: Completed signing event; reply received

2026-03-13 09:18:09.000 INF Creating signing session min ready=3 participantPeerIDs=["c05c5a17-c805-400e-8ffe-b71bf0811803","4060aba8-69fb-4c5c-9e8c-3b39dc5de16e","bc135dac-8ab0-4e31-9b72-c52d31928622"] ready count=3 readyPeers=["4060aba8-69fb-4c5c-9e8c-3b39dc5de16e","c05c5a17-c805-400e-8ffe-b71bf0811803","bc135dac-8ab0-4e31-9b72-c52d31928622"] type=session_ecdsa version=1
2026-03-13 09:18:09.000 INF Initializing signing session with partyID: {1,keygen}, peerIDs [{0,keygen} {1,keygen} {2,keygen}]
2026-03-13 09:18:09.000 INF Have enough participants to sign participants=["c05c5a17-c805-400e-8ffe-b71bf0811803","4060aba8-69fb-4c5c-9e8c-3b39dc5de16e","bc135dac-8ab0-4e31-9b72-c52d31928622"]
2026-03-13 09:18:09.000 INF Initialized sigining session successfully!
2026-03-13 09:18:09.000 INF Starting signing walletID=2c8af8cc-3fd9-4852-8a4e-6f92c3f5d400

2026-03-13 09:18:09.000 ERR mpcium/pkg/logger/logger.go:119 > Failed to send direct message error="nats: no responders available for request" attempt=1 topic=sign:ecdsa:direct:bc135dac-8ab0-4e31-9b72-c52d31928622:4060aba8-69fb-4c5c-9e8c-3b39dc5de16e:d4094d01-dfdd-4a54-bf2e-5f9ae3116da1
2026-03-13 09:18:09.000 ERR mpcium/pkg/logger/logger.go:119 > Failed to send direct message error="nats: no responders available for request" attempt=2 topic=sign:ecdsa:direct:bc135dac-8ab0-4e31-9b72-c52d31928622:4060aba8-69fb-4c5c-9e8c-3b39dc5de16e:d4094d01-dfdd-4a54-bf2e-5f9ae3116da1
2026-03-13 09:18:09.000 ERR mpcium/pkg/logger/logger.go:119 > Failed to send direct message error="nats: no responders available for request" attempt=3 topic=sign:ecdsa:direct:bc135dac-8ab0-4e31-9b72-c52d31928622:4060aba8-69fb-4c5c-9e8c-3b39dc5de16e:d4094d01-dfdd-4a54-bf2e-5f9ae3116da1
2026-03-13 09:18:09.000 ERR mpcium/pkg/logger/logger.go:119 > Failed in SendToOther direct message error="All attempts fail:\n#1: nats: no responders available for request\n#2: nats: no responders available for request\n#3: nats: no responders available for request" topic=sign:ecdsa:direct:bc135dac-8ab0-4e31-9b72-c52d31928622:4060aba8-69fb-4c5c-9e8c-3b39dc5de16e:d4094d01-dfdd-4a54-bf2e-5f9ae3116da1
2026-03-13 09:18:09.000 WRN Signing session error error="failed to send direct message to All attempts fail:\n#1: nats: no responders available for request\n#2: nats: no responders available for request\n#3: nats: no responders available for request" context="Failed to sign tx" errorCode=ERROR_PEER_UNAVAILABLE networkInternalCode=nero-testnet txID=d4094d01-dfdd-4a54-bf2e-5f9ae3116da1 walletID=2c8af8cc-3fd9-4852-8a4e-6f92c3f5d400
2026-03-13 09:18:09.000 INF Publishing message consumerName=mpc_signing_result topic=mpc.mpc_signing_result.complete

2026-03-13 09:18:09.000 ERR mpcium/pkg/logger/logger.go:119 > Failed to send direct message error="nats: no responders available for request" attempt=1 topic=sign:ecdsa:direct:bc135dac-8ab0-4e31-9b72-c52d31928622:c05c5a17-c805-400e-8ffe-b71bf0811803:d4094d01-dfdd-4a54-bf2e-5f9ae3116da1
2026-03-13 09:18:10.000 ERR mpcium/pkg/logger/logger.go:119 > Failed to send direct message error="nats: no responders available for request" attempt=2 topic=sign:ecdsa:direct:bc135dac-8ab0-4e31-9b72-c52d31928622:c05c5a17-c805-400e-8ffe-b71bf0811803:d4094d01-dfdd-4a54-bf2e-5f9ae3116da1
2026-03-13 09:18:10.000 ERR mpcium/pkg/logger/logger.go:119 > Failed to send direct message error="nats: no responders available for request" attempt=3 topic=sign:ecdsa:direct:bc135dac-8ab0-4e31-9b72-c52d31928622:c05c5a17-c805-400e-8ffe-b71bf0811803:d4094d01-dfdd-4a54-bf2e-5f9ae3116da1
2026-03-13 09:18:10.000 ERR mpcium/pkg/logger/logger.go:119 > Failed in SendToOther direct message error="All attempts fail:\n#1: nats: no responders available for request\n#2: nats: no responders available for request\n#3: nats: no responders available for request" topic=sign:ecdsa:direct:bc135dac-8ab0-4e31-9b72-c52d31928622:c05c5a17-c805-400e-8ffe-b71bf0811803:d4094d01-dfdd-4a54-bf2e-5f9ae3116da1

Additional Notes / Hypothesis

  • Because EDDSA signing via NATS worked at the same time, and restarting only the MPC node fixed the issue, it seems unlikely that the root cause is the NATS server configuration itself.
  • A possible hypothesis is that the ECDSA signer / participant on the affected node:
    • Did not register the expected NATS subscriptions for sign:ecdsa:direct:<from>:<to>:<tx-id> subjects, or
    • Lost its subscriptions / responder state at runtime, leading to no responders available for request until the process was restarted.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions