Blockchain Mirroring
This section of the devnet helps developers understand how to mirror blockchain state (like Ethereum and Bitcoin blocks) into the Verifiable Settlement Layer (VSL). By using Geth or Reth full nodes for Ethereum, and Bitcoin full nodes for BTC, you can generate and validate verifiable claims about block execution, and submit them to the VSL.
The Blockchain Mirroring demo shows how data from Geth, Reth, and Bitcoin nodes can be captured, processed through stateless execution, and turned into VSL-backed claims. These claims enable cross-domain composability and verification of blockchain state, essential for building trust-minimized bridges, cross-chain oracles, and synchronized state machines.
The guide includes everything you need to get started: working services, build tools, and a browser-based frontend for live visualization.
Getting started
As earlier stated, this demo lets you mirror both Ethereum and Bitcoin blocks using full nodes (Geth or Reth for Ethereum, and Bitcoin Core for BTC).
You can generate claims that are submitted to the VSL for validation and view their results in a UI just like the one at: https://mirroring.pi2.network/dashboard.
Once everything is set up, you’ll be able to explore proof-backed block data from your own nodes and view the validation output in a local frontend interface.
How it works
The demo includes four main components:
Mirroring-geth: Connects to a running Geth node, retrieves blocks, and generates a stateless execution claim.
Mirroring-reth: Same as above but uses the Reth execution client.
BTC-mirroring: Connects to a Bitcoin node, retrieves blocks, and creates block verification claims.
Backend: A Go-based service that stores and serves the validation results of the mirrored claims.
Frontend: A Bun/Node.js-based web UI to visualize blocks, claims, and validation outcomes.
Each mirroring service (Geth, Reth, or BTC) connects to its respective client via RPC and WebSocket (where applicable), retrieves block data, computes a stateless witness or verification input, and wraps it into a verifiable claim.
Once validated, the claim is passed to the backend and visualized in the frontend dashboard.
Try it yourself
To run the full blockchain mirroring demo locally, you’ll need to set up and run four components: the backend, one of the mirroring services (Geth, Reth, or BTC), and the frontend. Each has its own setup steps, and they should be started in a specific order.
Start by reviewing the Blockchain Mirroring README for the overall structure and prerequisites.
1. Set up the backend
Begin with the backend service. It handles storage and retrieval of validation results and is a required dependency for the mirroring services and frontend. Follow the setup steps in the backend README.
2. Set up a mirroring service
Next, choose one of the three mirroring options depending on the blockchain and client you’re using.
If you’re using a Geth node, set up the Geth mirroring service.
If you’re using a Reth node, set up the Reth mirroring service.
If you’re mirroring Bitcoin blocks, set up the BTC mirroring service.
Each service requires connection details for a running Ethereum node (RPC and WebSocket endpoints where applicable) and a configured .env
file.
3. Start the frontend
Once the backend and mirroring service are running, start the frontend dashboard to visualize validation results in your browser. Follow the instructions in the frontend README.
Immediately after the frontend is running, open your browser and go to http://localhost:3000 to see mirrored blocks, validation results, and claim data in real time.
You should see a UI just like this:
The Mirroring UI provides a real-time view of blockchain state being mirrored into the Verifiable Settlement Layer (VSL). It displays the most recent Ethereum and Bitcoin blocks processed by the system, alongside key claim and verification metrics.
Each row includes:
Block Number: The on-chain block being mirrored.
Claim: A unique identifier for the verifiable claim generated from the blo
Verification Time: The time (in milliseconds) it took to validate the claim. For Ethereum, this includes separate times for Geth and Reth clients; for Bitcoin, it reflects the BTC verification process.
The interface auto-refreshes every ten seconds to show the latest block data as it becomes available.
Last updated
Was this helpful?