A relay link bridge is not a single contract; it is a pipeline in which an off-chain relayer observes a source-chain event, packages the evidence, and submits it to a destination-chain verifier that decides whether the action is valid. The relayer supplies transport and liveness, while the verifier supplies security. This article explains that split, shows how to trace a bridge transaction across both chains with runnable RPC calls, and describes how to measure the RPC layer that relayers and integrators depend on. It separates documented bridge behavior from the measurements you must run yourself against your own endpoints.
What a relay link bridge actually is
The phrase "relay link bridge" describes a cross-chain system in which a relayer moves a message, proof, or attestation from a source chain to a destination chain, and a verifier on the destination chain decides whether that evidence is acceptable. The relayer is the transport layer; the verifier is the trust layer. Confusing the two is the most common source of bad assumptions about bridge security.
A blockchain is excellent at agreeing on its own state and poor at learning facts about another chain on its own. Even when a destination contract can check a foreign block header or a signature set, someone must fetch that header, assemble the payload, and pay gas to submit it. That someone is the relayer. If no relayer shows up, the bridge may remain safe but stops being useful, because liveness lives off-chain even when security lives on-chain.
This article covers the general relay link bridge model rather than endorsing a specific product. Named bridges such as Relay, Wormhole, LayerZero, and IBC-based systems implement the model differently, and you should read each protocol's own documentation for its exact trust assumptions. What follows is a mental model, a diagnostic procedure, and a measurement method you can apply to any of them.
- Relayer: observes source-chain events, packages evidence, submits destination-chain transactions.
- Verifier: light client, validator set, guardian committee, or oracle that decides validity.
- Executor or solver: in intent-based designs, fronts liquidity and is repaid after verification.
- User-facing app: the "link" or web interface that constructs the source transaction.
Assumptions and prerequisites before you trace a transfer
To follow a bridge transaction end to end you need read access to both the source and destination chains, the source transaction hash, and the bridge contract addresses on each side. You do not need a funded wallet for tracing, but you do need a reliable RPC endpoint per chain. Public endpoints are fine for a one-off lookup; for repeated diagnostics or relayer monitoring, use a managed provider. OnFinality's multi-chain RPC endpoints guide explains how to structure endpoint access across several networks, and the networks directory lists the chains available.
Record four facts before you start: the source chain ID, the destination chain ID, the source transaction hash, and the bridge contract address on the destination chain. Without the destination contract address you cannot filter logs efficiently, and without both chain IDs you cannot confirm that the relayer submitted to the chain you expect.
The relay pipeline: observe, package, submit, verify
Every relay link bridge follows the same four-stage pipeline, even when the implementation details differ.
Observe. The relayer watches source-chain logs for events emitted by the bridge contract, such as a deposit, lock, or message-sent event. It must track finality: a deposit that is later reorged out must not be relayed. This is why relayers wait for a confirmation depth that varies by chain.
Package. The relayer assembles the evidence the destination verifier needs. In a light-client bridge this is a block header plus a Merkle proof. In an attestation bridge it is a set of signatures from a guardian or validator committee. In an oracle-based design it may be a price or state attestation produced by a separate network.
Submit. The relayer sends a destination-chain transaction carrying the payload and pays gas for it. Some designs let anyone submit and reward the submitter; others restrict submission to an allowlisted set.
Verify and execute. The destination contract checks the evidence against its stored state, then mints, unlocks, or executes the message. Only this step decides validity. The relayer's opinion never does.
- Security boundary: the verifier contract and its trust assumptions.
- Liveness boundary: the relayer set and its incentives.
- Finality boundary: the confirmation depth the relayer waits for on the source chain.
Tracing a bridge transfer with RPC calls
The fastest way to understand a relay link bridge is to watch one transaction cross it. Start by reading the source transaction receipt and extracting the bridge event. The following curl call uses a placeholder endpoint; substitute your own RPC_URL for the source chain.
- Check status is 0x1 before trusting any logs.
- Note the blockNumber; you will need it to confirm finality depth.
- Identify the bridge contract address among the log emitters.
- Decode the first topic to confirm it matches the bridge's documented event signature.
curl -s -X POST "$RPC_URL" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_getTransactionReceipt",
"params": ["0xSOURCE_TX_HASH"]
}'Finding the matching destination transaction
Once you have the source event, search the destination chain for the relayer's submission. The most reliable method is to filter destination logs by the bridge contract address and the message identifier emitted on the source chain. The following JavaScript uses a standard JSON-RPC client and placeholder values.
- If the log range is huge, narrow fromBlock using the source transaction timestamp.
- If no logs appear, the relayer may not have submitted yet, or the event signature may differ.
- Confirm the destination transaction status with a receipt before concluding success.
import { createPublicClient, http, parseAbiItem } from 'viem';
const dest = createPublicClient({ transport: http(process.env.DEST_RPC_URL) });
const event = parseAbiItem(
'event MessageReceived(bytes32 indexed messageId, address indexed recipient)'
);
const logs = await dest.getLogs({
address: '0xDESTINATION_BRIDGE_CONTRACT',
event,
args: { messageId: '0xSOURCE_MESSAGE_ID' },
fromBlock: 0n,
toBlock: 'latest'
});
for (const log of logs) {
console.log(log.transactionHash, log.blockNumber);
}Expected verification result and what it proves
A successful trace yields a source receipt with status 0x1, a decoded source event containing a message identifier, and a destination receipt with status 0x1 whose logs contain the same identifier. That chain of evidence proves the relayer transported the message and the destination verifier accepted it. It does not prove the bridge is trustless; that depends on what the verifier checked.
Record the timestamps of both blocks and the difference between them. That delta is the observed relay latency for this transfer, and it is the number you should compare against the bridge's documented expectations. Do not generalize from one transaction; collect a sample before drawing conclusions.
- Source status 0x1 and destination status 0x1.
- Matching message identifier on both sides.
- Destination block timestamp minus source block timestamp equals observed latency.
- Verifier type identified from the destination contract's documented design.
Measuring the RPC layer that relayers depend on
Relayers are RPC-heavy clients: they poll logs, read headers, and submit transactions continuously. If your own integration or monitoring depends on a relay link bridge, measure the RPC endpoints you use rather than assuming provider marketing claims. The procedure below produces a results table you fill in yourself; no numbers are supplied here because they depend on your region, chain, and endpoint.
For each candidate endpoint, run a fixed number of requests over a fixed window and record the metrics in the table. Use the same method for every endpoint so the comparison is fair.
- | Endpoint | Chain | p50 latency (ms) | p95 latency (ms) | Error rate | Max block lag |
- | RPC_URL_A | source | measure | measure | measure | measure |
- | RPC_URL_B | destination | measure | measure | measure | measure |
- Block lag: compare eth_blockNumber against a reference node or explorer height.
- Run the test at the same time of day for each endpoint to reduce diurnal bias.
import time, statistics, requests
RPC_URL = "https://your-endpoint.example"
N = 50
latencies = []
errors = 0
for _ in range(N):
start = time.perf_counter()
try:
r = requests.post(RPC_URL, json={
"jsonrpc": "2.0", "id": 1,
"method": "eth_blockNumber", "params": []
}, timeout=5)
r.raise_for_status()
r.json()["result"]
except Exception:
errors += 1
latencies.append((time.perf_counter() - start) * 1000)
latencies.sort()
print("p50_ms", statistics.median(latencies))
print("p95_ms", latencies[int(len(latencies) * 0.95) - 1])
print("error_rate", errors / N)Troubleshooting stalled or mismatched relays
Most relay problems fall into a small number of categories. Work through them in order rather than guessing.
No destination transaction. The relayer may still be waiting for source finality, may be underfunded for gas, or may have dropped the message. Check the source confirmation depth against the bridge's documented requirement first.
Destination transaction reverted. Read the revert reason if the contract exposes one. Common causes are an expired message deadline, a replay guard rejecting a duplicate, or a verifier rejecting evidence that did not match its stored state.
Message identifier mismatch. If the destination log exists but the identifier differs, you may be decoding the wrong event or looking at a different bridge route. Confirm the contract address and event signature against the protocol documentation.
RPC inconsistency. If one endpoint reports a source event and another does not, you are likely reading a lagging node. Compare block heights and re-query after the lagging endpoint catches up.
- Confirm source finality depth before assuming a relayer failure.
- Check relayer gas balance if the design uses permissionless submission.
- Verify you are querying the correct bridge contract on each chain.
- Re-run log queries against a second endpoint to rule out node lag.
Limitations and tradeoffs of the relay model
Relay link bridges trade some decentralization for speed and cost. Off-chain relayers can respond in seconds, but they add a liveness dependency and, in attestation designs, a trust dependency on the signing committee. Light-client bridges reduce trust but increase destination-chain gas costs because verification happens on-chain.
Finality assumptions matter as much as cryptography. A relayer that submits before source finality risks relaying a transaction that later disappears in a reorg. A relayer that waits too long is safe but slow. Every bridge picks a point on that curve, and integrators should know where their bridge sits.
Finally, the user-facing "link" is not the protocol. A web interface can be unavailable while the underlying contracts and relayers continue to operate, and the reverse is also true. Diagnose at the contract and relayer level, not the interface level.
Next steps for integrators and operators
If you are integrating a relay link bridge into a wallet or payment flow, start by documenting the verifier type and finality requirement for each route you support. Then build a monitor that traces source events to destination receipts using the procedure above, and alert when the observed latency exceeds your threshold.
For the RPC layer, run the measurement procedure against every endpoint in your failover set and keep the results table current. If you need dedicated throughput for relayer infrastructure, review dedicated node options and RPC pricing before committing. For concrete endpoint and provider recommendations per network, RPC Assistant covers that directly; this page stays focused on the relay mechanism and the measurement method. You can also review the API service overview to understand how managed access fits alongside your own relayer stack.
- Document verifier type and finality depth per route.
- Build a source-to-destination trace monitor with latency alerts.
- Maintain a current RPC results table for every failover endpoint.
- Re-test after any bridge contract upgrade or relayer set change.