rsk.zone An independent Rootstock reference

Merge mining

Rootstock has no miners of its own. Bitcoin miners produce its blocks as a by-product of mining Bitcoin, by committing a Rootstock block hash into the Bitcoin coinbase. This page explains the mechanism, shows what the chain actually says about who is mining it, and gives the current steps for a pool that wants to start.

How it works

A Bitcoin miner adds one extra output to its coinbase transaction. That output is an OP_RETURN carrying the ASCII tag RSKBLOCK: followed by a 32-byte commitment to a Rootstock block header:

6a 29 52534b424c4f434b3a <32-byte Rootstock commitment>
│  │  └─ "RSKBLOCK:"       └─ hash of the Rootstock block header
│  └──── length: 0x29 = 41 bytes (9 + 32)
└─────── OP_RETURN

Two rules apply to where it goes. It must be the last output of the coinbase, there must be at most 128 bytes after the commitment, and those trailing bytes must not themselves contain the string RSKBLOCK:. The tag can also appear by accident inside ExtraNonce2, which is harmless as long as the pool appends the real tag after that field.

The miner then hashes as normal. Because Rootstock's difficulty is far lower than Bitcoin's, a given hash attempt has three possible outcomes:

The Rootstock block then carries its own proof that this happened. The last three fields of every Rootstock header are the Bitcoin block header (80 bytes), a merkle proof linking the coinbase to that header's merkle root, and the partial Bitcoin coinbase transaction containing the tag. Any node can check the chain of commitments without talking to Bitcoin at all.

dev.rootstock.io — merged mining, getting started

dev.rootstock.io — mining architecture

Who is mining it, measured

Rootstock says that over 85% of Bitcoin's hash power merge-mines it (dev.rootstock.io) or over 80% (rootstock.io). Neither figure can be checked from a Rootstock node, because a node cannot see Bitcoin blocks that did not carry a tag. What a node can answer exactly is who produced the last few thousand Rootstock blocks and what they were running.

The figures below are counted from the 4,000 blocks between #9,389,856 and #9,393,855 — about 34.9 hours ending 8 Nov 2026.

Blocks sampled
4,000
34.9 hours
Carrying a valid proof
4,000
every block, no exceptions
Distinct coinbases
6
addresses producing blocks
Largest share
37.35%
top three: 83.7%
Verified on the chain

Every one of the 4,000 blocks sampled carries a complete merged-mining proof — a Bitcoin header, a merkle proof, and a coinbase containing the RSKBLOCK: tag. That is the claim "Rootstock is merge-mined with Bitcoin" stated as something checkable, and checked.

Block production by Rootstock coinbase address over 4,000 blocks, with the pool behind each
PoolCoinbase addressBlocksShareIdentified by
AntPool0x4e5dabc28e4a0f5e5b19fcb56b28c5a1989352c11,49437.35%23 shared blocks
ViaBTC0xb9237bce6b0364cf0ca9c74b55b7526d380d4bee98724.68%15 shared blocks
F2Pool0x12d3178a62ef1f520944534ed04504609f7307a186821.7%9 shared blocks
SECPOOL0x5aee2975e2ed688f231ccb40e20ee6c10a98d5073197.97%8 shared blocks
SpiderPool0x0fd9b9b567a459c6c9645ab0847785aef13dfe1b2867.15%6 shared blocks
Luxor0xcf5072f792246690c75c63638e3d98bb2554ff2c461.15%3 shared blocks

How the pool behind an address is established

The names above are measured, not taken from a list, and the method runs from Rootstock to Bitcoin rather than the other way.

Every Rootstock block carries the 80-byte Bitcoin header its miner was working on. Most of those meet Rootstock's difficulty and nothing more — but about one in a hundred also meets Bitcoin's, because the miner found a Bitcoin block and a Rootstock block with the same work. For those, the double-SHA256 of the header is the Bitcoin block's identifier, with no conversion at all, and that Bitcoin block's coinbase carries the pool's own name. The Rootstock coinbase address on the same block is the other half of the pair.

Whether a header qualifies is decided locally, so only genuine candidates cost a lookup. Over 6,000 Rootstock blocks, 64 headers also met Bitcoin's target — about 1.1% — and 6 of 6 addresses were named from them.

Which difficulty the test uses decides the answer

The test has to be against Bitcoin's real network target, not against the difficulty written in the header itself. Rootstock validates a merged-mining header's work against Rootstock's target; the header's own nBits field is never checked against Bitcoin's difficulty and is effectively free-form. At least one pool fills it with a target around 276 times easier than Bitcoin's.

Testing against that field therefore admits headers that were never Bitcoin blocks — and does so in a way that looks like a finding, since those headers have no corresponding Bitcoin block and so appear to be orphans: solutions that won the work and lost the race. They are nothing of the kind. Against Bitcoin's actual target, this window contains no orphans at all — every header with Bitcoin-level work corresponds to a block in Bitcoin's chain.

Why not read the tag instead

The obvious direction does not work, which is worth knowing before trying it. The RSKBLOCK: tag in the Bitcoin coinbase carries a 32-byte payload, and it is not the Rootstock block hash — checked against a real block, it matches neither the hash nor its first twenty bytes. It is the block's merged-mining hash, computed over a header that excludes the merged-mining fields, with a trailing fork-detection field from RSKIP110 and RSKIP177. Reading it back means reconstructing that hash exactly. The direction used here needs no conversion.

This does not match the published list

Rootstock's own page names Foundry, Antpool, F2Pool, ViaBTC and Luxor. Measured over the last 6,000 blocks, four of those five appear — Foundry does not, while SECPOOL and SpiderPool do, neither of which is on that list.

That is a disagreement between a marketing page and a two-day window of chain data, not proof the list is wrong. A pool can merge-mine for days without finding a Bitcoin block, and the published list carries no date. The measurement says who was mining in this window; the list says who has been named at some point.

A pool that does not write its name into its own coinbase cannot be identified this way and is left unidentified. Nothing here is inferred from block timing, address clustering or any other indirect signal.

rootstock.io — mine BTC with Rootstock

What the miners are running

Every Rootstock block header carries an extraData field in which rskj writes its own build identifier. Counting those over the same sample shows which client builds are actually producing blocks:

Client build strings from block extraData
Client buildBlocksShare
VETIVER-d4021fce22,41560.38%
VETIVER-98724.68%
VETIVER-58cafa03127.8%
VETIVER-731b9d82867.15%

All of the production in this sample is on Vetiver builds, which is the upgrade currently active on mainnet — different commit hashes of the same release, as different operators build at different points.

How to merge mine today

The work happens on the pool side. A Rootstock node serves work; the pool folds it into the jobs it already sends its miners. Nothing changes on the Bitcoin node.

1. Run a Rootstock node with the mining module enabled

The four merged-mining RPC methods live in the mnr module, which must be enabled in the node configuration for the node to answer them.

2. Ask it for work

curl -X POST -H 'Content-Type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"mnr_getWork","params":[]}' \
  http://127.0.0.1:4444

This returns the current Rootstock block information, the target the solution must meet, and the data to commit to. Poll it every 2 seconds, and push a mining.notify to your miners whenever new Rootstock work appears.

3. Put the tag in the coinbase

Append the OP_RETURN output described above as the last coinbase output, after your ExtraNonce2 field.

4. Submit solutions

Four methods exist; Rootstock's documentation recommends mnr_submitBitcoinBlockPartialMerkle, which it says has optimum performance, and is preferred among other available methods.

The mnr module
MethodUse
mnr_getWorkFetch the current Rootstock work unit and its target.
mnr_submitBitcoinBlockPartialMerkleSubmit a solution with a partial merkle branch. Recommended.
mnr_submitBitcoinBlockTransactionsSubmit with the transaction list instead of a branch.
mnr_submitBitcoinBlockSubmit the whole Bitcoin block. Simplest, heaviest.
A documentation gap

The parameter and return shapes for the four mnr_ methods are not documented in Rootstock's JSON-RPC method reference — both parts of that reference cover web3, net, eth and trace only, while the module list marks all four mnr_ methods as supported. In practice the reference implementations below are the specification.

Reference implementations

Rootstock publishes pool-side integrations rather than asking operators to write their own:

dev.rootstock.io — merged mining, getting started

dev.rootstock.io — JSON-RPC methods

How miners get paid

Rootstock has no block subsidy. RSKIP15 puts it plainly: RSK will be the first blockchain based on proof-of-work consensus that has no subsidy. Miners are paid out of transaction fees, denominated in RBTC — which is bitcoin, held by the peg.

Fees do not go straight to the miner of a block. They are paid into a native contract called REMASC, which holds them and distributes them on a delay, splitting a share with the miners of sibling blocks so that producing an uncle is not worthless. The delay — a maturity period of 6,000 blocks, roughly 16 hours in RSKIP15's description — exists so that a reorg cannot leave a reward paid to a miner whose block no longer counts.

Figures are from the specification

The specific percentages in RSKIP15 (10% extracted per block, 20% of that to RSK, a 10% publisher's fee, a 10% punishment for breaking the selection rule) are from the 2016 specification. They are the design, not a current measurement, and have not been confirmed against today's live parameters.

RSKIP15 — REMASC

rootstock.io — rewards are paid in Bitcoin from Rootstock network fees

What has changed over the years

The core of merged mining — a tag in the Bitcoin coinbase, a proof in the Rootstock header — has not changed since launch. What has changed around it:

Merged-mining-related RSKIPs
RSKIPTitleStatusWhat it does
15REMASC reward distributionAdoptedNo block subsidy: miners are paid from fees via the REMASC contract, with a maturity delay. Also sets the difficulty adjustment bounds.
110Fork detection data in RSKBLOCK tagsDraftWould extend the tag with uncle count, block number and Bitcoin block ID fragments, for fork detection (Armadillo). Not shipped.
177Universal Merged Mining ExtensionAdoptedAdds an optional ummRoot to the block header, allowing the tag to commit to more than one chain.
180Limit merkle proof sizeDraft on the page, Adopted in the indexCaps bitcoinMergedMiningMerkleProof at 960 bytes. The two sources disagree on status.
290Adjust Testnet block minimum difficultyAdoptedTestnet only — raises the minimum difficulty. Does not affect mainnet.
291Network Upgrade: HopAdoptedShipped RSKIP290 among others.

Which of these took effect, and in which release, is on the RSKIPs page. Of the list above, RSKIP290 and RSKIP291 are the only two tied to a release — Hop 4.0.0, on both networks. RSKIP15, RSKIP177 and RSKIP180 are Adopted, and so are in force, but no upgrade RSKIP claims them; they appear under Adopted, but no release on record instead. RSKIP110 is the only one of the six that never activated.

The share of Bitcoin hash power involved has grown a great deal. RSKIP110, written in 2019, notes that merged mining as of March 2019 is has over 35%. Rootstock's current pages claim over 80–85%. Both are quoted here with their source because, as noted above, neither is checkable from a Rootstock node.

Two common misattributions

Two proposals are routinely misattributed in writing about Rootstock's mining. RSKIP110 is not a shipped hashing improvement — it is a Draft about fork-detection data in the tag, and it never activated. And RSKIP434 is not about merged mining at all; it concerns the Bridge's Bitcoin chainwork field.