Skip to content

Translator falls back if it cannot verify the payout is in the coinbase #209

Description

@pavlenex

It seems that 617c15b caused most of solo pools to be incompatible with SV2 UI.

My understanding of this feature is that it allows miners to verify that the solo pool included their payout address in the coinbase, and it can be verified. However, this is default behaviour not an optional feature, and since pools can do payouts differently, we basically blocked any pool that doesn't pay out of coinbase.

I think both NerdAxe and Bitaxe have this feature, and it's an optional checkbox, that once checked shows message on the dashboard to the user.

Unfortunately, the way we added it breaks things for a lot of pools on the list, just because they do payouts differently, user cannot use these pools at all, since we force a default behaviour to them.

Work:

  • BlitzPool
  • PublicPool
  • SRI Pool

Don't work:

  • MKPool
  • NexusPool
  • PyBlock
  • https://xtratumpool.com (New pool not yet in the SV2 UI, but connected through custom pool)

Logs are identical, due to inability to verify payout we fallback:

2026-07-12T11:15:34.586723Z INFO translator_sv2: Starting Translator Proxy...
2026-07-12T11:15:34.586761Z INFO translator_sv2: Initializing upstream connection...
2026-07-12T11:15:34.586769Z INFO translator_sv2: Trying upstream 1 of 1: nexuspool.io:3350
2026-07-12T11:15:34.586771Z INFO translator_sv2: Connection attempt 1/3...
2026-07-12T11:15:35.588468Z INFO translator_sv2::sv2::upstream: Trying to connect to upstream at nexuspool.io:3350
2026-07-12T11:15:35.588529Z INFO stratum_apps::network_helpers::resolve_hostname: Resolving hostname 'nexuspool.io' via DNS...
2026-07-12T11:15:35.822222Z INFO translator_sv2::sv2::upstream: Connected to upstream at 149.28.74.136:3350
2026-07-12T11:15:36.277571Z INFO translator_sv2::sv2::upstream::common_message_handler: Received: SetupConnectionSuccess(used_version: 2, flags: 0x00000000)
2026-07-12T11:15:36.277741Z INFO translator_sv2: Payout verification enabled for configured user_identity: 100% miner payout to bc1q625vkp7gfmnkejvuut0aazpeel6gs74seh8e5k
2026-07-12T11:15:36.277757Z INFO translator_sv2::sv1::sv1_server: Starting SV1 server on 0.0.0.0:34255
2026-07-12T11:15:36.277837Z INFO translator_sv2::sv1::sv1_server: Translator Proxy: listening on 0.0.0.0:34255
2026-07-12T11:15:36.277899Z INFO translator_sv2: Launching ChannelManager tasks...
2026-07-12T11:15:36.277919Z INFO translator_sv2: Initializing monitoring server on http://0.0.0.0:9092
2026-07-12T11:15:36.278028Z INFO translator_sv2::sv1::sv1_server::difficulty_manager: Variable difficulty adjustment enabled - starting vardiff loop
2026-07-12T11:15:36.278053Z INFO translator_sv2::sv1::sv1_server: Starting job keepalive loop with interval of 60 seconds
2026-07-12T11:15:36.278069Z INFO stratum_apps::monitoring::http_server: Starting monitoring server on http://0.0.0.0:9092
2026-07-12T11:15:36.278073Z INFO stratum_apps::monitoring::http_server: Cache refresh interval: 15s
2026-07-12T11:15:36.279457Z INFO translator_sv2::sv1::sv1_server::difficulty_manager: Starting vardiff loop for downstreams
2026-07-12T11:15:36.279620Z INFO stratum_apps::monitoring::http_server: Swagger UI available at http://0.0.0.0:9092/swagger-ui
2026-07-12T11:15:36.279640Z INFO stratum_apps::monitoring::http_server: Prometheus metrics available at http://0.0.0.0:9092/metrics
2026-07-12T11:15:46.493407Z INFO translator_sv2::sv1::sv1_server: New SV1 downstream connection from 172.19.0.1:57490
2026-07-12T11:15:46.493508Z INFO translator_sv2::sv1::sv1_server: Downstream 1 registered successfully (channel will be opened after first message)
2026-07-12T11:15:46.493778Z INFO translator_sv2::sv1::sv1_server: SV1 server: opening extended mining channel for downstream 1 after first message
2026-07-12T11:15:46.493850Z INFO translator_sv2::sv2::channel_manager: Sending OpenExtendedMiningChannel message to upstream: OpenExtendedMiningChannel(request_id: 1, user_identity: bc1q625vkp7gfmnkejvuut0aazpeel6gs74seh8e5k.miner1, nominal_hash_rate: 1000000000, max_target: U256(000000006df37f672fbda8c64a7da74b6e138438ea66f7a98d33f48d2c35de63), min_extranonce_size: 4)
2026-07-12T11:15:46.722781Z INFO translator_sv2::sv2::channel_manager::mining_message_handler: Received: OpenExtendedMiningChannelSuccess(request_id: 1, channel_id: 1, target: U256(00000000494cb64d3fb507f04a9184de5cd350dba0e147bf4286c96e84a92dc7), extranonce_size: 4, extranonce_prefix: B032(00000001), group_channel_id: 0), user_identity: bc1q625vkp7gfmnkejvuut0aazpeel6gs74seh8e5k.miner1, nominal_hashrate: 1000000000
2026-07-12T11:15:46.722917Z INFO translator_sv2::sv1::sv1_server: Processing 1 queued Sv1 messages for downstream 1
2026-07-12T11:15:46.722941Z INFO translator_sv2::sv1::sv1_server::downstream_message_handler: Received mining.subscribe from Sv1 downstream
2026-07-12T11:15:46.723259Z INFO translator_sv2::sv2::channel_manager::mining_message_handler: Received: NewExtendedMiningJob(channel_id: 1, job_id: 1, min_ntime: Sv2Option(None), version: 0x20000000, version_rolling_allowed: true, merkle_path: Seq0255<len=9: [44f709da7d69ee043c95b3f6ff5fdd390af412921f075bf3834e0ca116809b20, b04acadfe6fd92e8826c596bbf9e55a9f818827f76c1c2e6f1b28431c4caf6d3, ... , 3e6c8596977b017d05ab14eef2428dde8934f5966be285e12f0cd7288441214f, 5ad20224d30b43a36c4c2e9e3cf05afc66819701e61736288cf4871a918277f1], coinbase_tx_prefix: B064K(01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1703009d0e), coinbase_tx_suffix: B064K(2f4e65787573506f6f6c2ffeffffff02b8efa41200000000160014d2a8cb07c84ee76cc99ce2dfde8839cff4887ab00000000000000000266a24aa21a9ed355527daaa90be42e37f2e5686b83ee2df27a1f8fab53c7611eb97694f91e4dbff9c0e00))
2026-07-12T11:15:46.723735Z ERROR translator_sv2::sv2::channel_manager::mining_message_handler: NewExtendedMiningJob failed payout verification: failed to decode coinbase outputs: IO error
2026-07-12T11:15:46.723775Z WARN translator_sv2::sv2::channel_manager: ChannelManager::handle_upstream_frame requested fallback error_kind=PayoutVerificationFailed("failed to decode coinbase outputs: IO error")
2026-07-12T11:15:46.723816Z WARN translator_sv2::sv2::channel_manager: ChannelManager: unified message loop exited.
2026-07-12T11:15:46.723833Z INFO translator_sv2::sv2::upstream: Upstream: fallback triggered
2026-07-12T11:15:46.723839Z WARN translator_sv2::sv2::upstream: Upstream: task shutting down cleanly.
2026-07-12T11:15:46.723850Z INFO translator_sv2: Monitoring server: fallback triggered.
2026-07-12T11:15:46.723861Z INFO stratum_apps::monitoring::http_server: Monitoring server received shutdown signal, stopping...
2026-07-12T11:15:46.723979Z INFO translator_sv2::sv1::sv1_server: SV1 Server: fallback triggered, clearing state
2026-07-12T11:15:46.723981Z INFO translator_sv2: Preparing fallback
2026-07-12T11:15:46.724087Z WARN translator_sv2::io_task: Writer task exited.
2026-07-12T11:15:46.724259Z INFO translator_sv2::sv1::downstream: Downstream 1: fallback triggered
2026-07-12T11:15:46.724268Z WARN translator_sv2::sv1::downstream: Downstream 1: unified task shutting down
2026-07-12T11:15:46.724264Z INFO stratum_apps::monitoring::http_server: Monitoring server stopped
2026-07-12T11:15:46.724285Z INFO translator_sv2: Monitoring server task exited and signaled fallback coordinator
2026-07-12T11:15:46.724326Z WARN translator_sv2::io_task: Reader task exited.
2026-07-12T11:15:46.724535Z INFO translator_sv2: All components finished fallback cleanup
2026-07-12T11:15:46.724680Z ERROR translator_sv2: All upstreams failed after 3 retries each
2026-07-12T11:15:46.724727Z ERROR translator_sv2: Couldn't perform fallback, shutting system down: CouldNotInitiateSystem
2026-07-12T11:15:46.724735Z WARN translator_sv2: Graceful shutdown: waiting 5 seconds for tasks to finish
2026-07-12T11:15:46.724759Z INFO translator_sv2: All tasks joined cleanly
2026-07-12T11:15:46.724762Z INFO translator_sv2: TranslatorSv2 shutdown complete.
2026-07-12T11:15:46.724780Z INFO translator_sv2: TranslatorSv2 dropped

I think we have to change the way this is done. Payout verification out of coinbase can be optional feature, and we have to notify user that if failed to verify pool will fallback in the UI. Or instead of falling back we may just want to show message in the UI.

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