Skip to content
Blockchain Association of Cameroon
BAC-L0-FOUND-1143 h

Reading a blockchain critically

Explorers, indexers and dashboards display interpretations, not raw facts. This workshop teaches how to get back to the verifiable source.

  • Verify an explorer figure directly against a node
  • Identify what an indexer adds, aggregates or assumes
  • Recognise a misleading on-chain metric

Almost everything you know about a blockchain, you read on a screen built by someone else: an explorer, a dashboard, a wallet app. That screen shows interpretations — decoded, labelled, dollar-converted, aggregated data — not the raw facts that blocks contain. In this workshop you learn to trace from the display to the verifiable source: query a node directly, spot what an indexer adds or assumes, recognise a metric that misleads, and detect the classic traps (fake tokens, deceptive addresses). The aim is not to reject explorers, which are very useful, but to know exactly what they prove and what they do not.

Lessons 1/4 · 20 min

Raw fact or interpretation: how a screen is produced

A starting question

You open an explorer and read: "Transfer of 150 USDT from Alice (Exchange X) to Bob, 3 minutes ago, fee $0.40". How many of these words are facts written in a block? Very few. To see it, follow the data's path.

The data's path

node (blocks, state)  ->  indexer (decodes, files)  ->  database
                      ->  API  ->  website or app  ->  your screen
  1. The node (the program that downloads blocks, checks the rules and holds the state; workshop 113) holds the blocks and state. It is the only stage that holds consensus bytes.
  2. The indexer is software that reads the blocks, decodes them (which function was called? what amount?), and files them in an ordinary database so it can answer "all transactions of this address" quickly. It decides what it keeps and how to show it.
  3. The API and the site add labels, prices, converted timestamps and charts.

Each stage is software written by a team, with its bugs, delays and choices.

Sorting the example

What the screen saysNatureWho asserts it
The amount 150Decoded from the transaction dataThe indexer (from block bytes)
"USDT"A name chosen by the contract's deployer; nothing prevents it being copiedThe contract, relayed by the indexer
"Alice (Exchange X)"A label assigned by the explorer or third partiesThe explorer: not blockchain data
"3 minutes ago"Block time declared by the block producer (on Bitcoin and Ethereum-style chains), compared with the server's clockThe producer + the explorer
"$0.40"Fee in native units × a price taken from a price providerAn external price service
Status "Success"Execution result recorded in a receipt (raw) or inferred by the indexer (derived): check whichDepends on the chain (see lesson 2)

Out of six lines, only the amount and the status come from consensus data (the amount after decoding, the status after reading the receipt when the chain produces one); the relative time, the token's name, the label and the dollar price are derived or supplied by third parties. Even the amount is not "directly in the bytes": for a token, the indexer computes it from an event or the call data, and from a token metadata item (its number of decimals).

What is raw, what is not

Raw (consensus): a block's header and body, the signed transactions, the result of applying the rules (the state after the block, and receipts when the protocol produces them).

Derived: any interpretation, any grouping, any fiat value, any label ("Exchange X"), any ranking ("top holders"), any "internal transfer" reconstructed by replaying calls.

Example: a block's time

On Bitcoin and Ethereum-style chains, the displayed time is the timestamp the block producer wrote in the header, within limits the protocol checks only loosely. It does not come from a trusted clock. (On CometBFT, the time comes from a computation among validators: each chain family has its own rule.) The explorer converts it to a time zone (often UTC or your browser's). Two explorers may thus show "different" times for the same block without either lying: one shows UTC, the other local time (UTC+1 in Cameroon, with no daylight saving).

What this does NOT guarantee

  • A well-known explorer is not an authority: it can lag, have a bug, be hacked (web page or domain) or be slow to follow a chain reorganisation.
  • A figure consistent across three sites is not verified: they may read the same indexer or the same node provider.
  • "It's on the blockchain" does not mean "it's true": it means "a participant signed it and the chain accepted it".

Recap

For each line on a screen, ask: is this fact in the block's bytes, or did someone compute, guess or add it? Only the first case can be verified directly against a node.

Lessons 2/4 · 25 min

Verifying a figure directly against a node

The problem

An explorer shows: "Block 9,000,010, contains your payment, 12 confirmations". How do you verify it without believing the explorer? By querying a node — ideally your own (workshop 113) — through its JSON-RPC interface.

JSON-RPC 2.0 in three lines

JSON-RPC 2.0 is a convention: you send a JSON object with four main fields, the server answers with an object carrying the same id.

-> {"jsonrpc":"2.0","method":"chain_getBlockByNumber","params":[9000010,false],"id":7}
<- {"jsonrpc":"2.0","result":{"number":9000010,"hash":"0x…","txCount":142},"id":7}
  • jsonrpc is always "2.0"; method is the call's name; params the argument list; id links the response to the request. In the specification, params and id are optional (a request without id is a notification: the server does not answer it); in this course we always write them.
  • On failure, the response contains error instead of result. The specification defines standard codes: -32700 (unparseable JSON), -32600 (invalid request), -32601 (unknown method), -32602 (invalid params), -32603 (internal error). Codes -32000 to -32099 are reserved for server-defined errors: real nodes use them for their own messages, hence the value of reading their documentation.

Three checks you can run

  1. Does the block exist, with this hash? Ask for the block at the given number and compare the hash with the explorer's. If hashes differ, one of the two follows another branch or is behind.
  2. Is the transaction in this block? The body is summarised by a Merkle root (workshop 106) in the header. A full node can give you the list; a light client asks for an inclusion proof and recomputes it: leaf, siblings, root. In the Merkle explorer, edit a leaf: the root changes, so the proof fails. With the hash tool, recompute a parent node yourself from two children.
  3. What was the execution result? On chains that produce receipts, the "status" is in the receipt; ask the node for the receipt, do not trust a green icon.

Confirmations and finality

"12 confirmations" usually means that the transaction has 12 blocks in total since its inclusion block, that block included: it counts as the first confirmation, then 11 more blocks have been built after it (the workshop 109 convention; some tools count differently). It is not a finality guarantee. On a deterministic-finality chain (workshop 109), a transaction is final when the protocol says so, regardless of the number of blocks. On a probabilistic-finality chain, the more blocks, the less likely a reorganisation, without it becoming impossible.

Some node interfaces let you query state at a finality tag ("latest", "finalized" …). When your chain offers them, use them: reading "the most recent" and reading "the finalised" are two different claims.

Worked example: three sources, one disagreement

You are given:

  • Explorer A: block 9,000,010, hash starting 0x4f3a.
  • Explorer B: block 9,000,010, hash starting 0x4f3a.
  • Your node: block 9,000,010, hash starting 0x91c2.

Two sources out of three agree, so A and B are right? No. A disagreement is a question, not a vote. Hypotheses: A and B read the same provider; your node is still syncing; or a reorganisation happened. You resolve it by asking your node for the finalised height and querying again later, not by counting heads.

Your own node is itself an assumption

If you query a provider's node, you trust that provider. If you query your own node, you trust your software, your version and the peers it is connected to (a node surrounded by malicious peers can be deceived, see workshop 113).

What this does NOT guarantee

  • A node's answer is not a proof: it is an answer. Only a proof (Merkle, signatures) recomputed against a trusted header is one.
  • Comparing block hashes does not verify that the rules were obeyed: only a full node that replays the block does.
  • Querying once says nothing about finality.

Recap

To verify: ask a node for the raw data, recompute what can be recomputed, treat any disagreement as an investigation, and distinguish "most recent" from "final".

Interactive tool

SHA-256 of hex bytes

Paste bytes as hex: the hash covers the bytes, not the text of the digits. A second field is concatenated after the first.

Digest

…

Spaces, newlines and 0x prefixes are ignored.

Interactive tool

Merkle tree explorer (toy)

One leaf per line (2 to 8). Pick a leaf to see its inclusion proof; edit a text to see which nodes change.

5 leaves

Nodes changed since the last valid input are underlined and marked "changed". Nodes on the chosen leaf's path are outlined. Last node of an odd level: it is duplicated as its own sibling.

Convention: leaf = SHA-256(UTF-8 text); parent = SHA-256(left ‖ right, raw bytes); odd node duplicated. Toy tree: Bitcoin double-hashes and serialises differently.

Lessons 3/4 · 25 min

What an indexer adds, and metrics that mislead

The problem

A dashboard announces: "1,000 active addresses per day". A young start-up uses it to say it has "1,000 users". Is that true? To find out, you must know each figure's definition, window and source.

What an indexer does — and assumes

An indexer turns blocks into queryable tables. In doing so it:

  • decodes data: it must know the structure of calls (a contract's interface). If it is unknown or wrong, it shows raw bytes or a wrong name;
  • chooses what to keep: some ignore failed transactions, malformed events or internal traces;
  • handles reorganisations: when a block is replaced, it must undo what it filed. A poor indexer can keep data from an abandoned branch;
  • lags by a variable number of blocks: it reads the chain, then writes to the database;
  • adds external data: entity labels, fiat prices, rankings.

These are design choices, not errors. The danger is reading the result as a raw fact.

Metrics: ask three questions

For any figure:

  1. Definition: what exactly is counted?
  2. Window: over what period, with what cut-off time?
  3. Reproducibility: can I recompute the figure from node data? If not, it is a claim, not a measurement.

Four traps with numbers

1. "Active addresses" ≠ users. An address is a key, not a person (workshop 112). One person can have hundreds of addresses; a script can create thousands in minutes. Example: the dashboard says 1,000 active addresses; an analysis shows 600 of them are controlled by one operator. There are therefore at most 400 + 1 = 401 distinct operators, and probably fewer. The most flattering figure is not the most accurate one.

2. Volume can be manufactured. An actor trading an asset with itself (wash trading) inflates "volume" without changing who holds what. Example: account A sends 100 units to an account B it controls, B sends them back, and this round trip repeats 50 times: displayed volume 10,000 units (50 × 2 × 100), capital actually at stake 100.

3. Locked value can be counted several times. Alice deposits 100 units into protocol P1 and receives 100 receipt tokens. She deposits those receipt tokens into P2 and receives 100 P2 receipt tokens, which she deposits into P3. Each protocol announces 100 of "value locked": the dashboard sum is 300 while the real distinct capital is 100.

4. Off-chain definitions. A "circulating supply" is not in the chain: the team decides which accounts do not count (reserves, locked). It is a published judgment, not a fact computed by the protocol.

Example: redoing a calculation

Figure to check: "1,000 transactions per day on average". Procedure: take a day's blocks (fixed cut-off time), count each block's transactions (txCount), add them up, compare. If the gap exceeds a few percent, look for the cause: failed transactions counted or not? time zone? blocks in the middle of a reorganisation?

What this does NOT guarantee

  • Reproducing a figure does not make it relevant: a definition can be consistent and useless for your question.
  • An "official" indexer is no more consensus than another: it is one more program.
  • The absence of visible manipulation is not proof of its absence: read the definition before interpreting.

Recap

Every aggregate figure carries a definition, a window and assumptions. If it is not reproducible from node data, treat it as an opinion with a source, not as a fact.

Lessons 4/4 · 25 min

Display traps, fake tokens and trust assumptions

The problem

Someone receives 200 "BACUSD" in their wallet and thinks it is a gift. The token is worthless: it is a decoy, and the "approval" page they are then offered can be used to obtain a signature that gives access to valuable funds. Display traps exploit a simple fact: names are not identities.

A token's identity = the contract address

A token's name ("BACUSD") and symbol are strings chosen by whoever deploys the contract. Nothing in the protocol stops two contracts having the same name or logo. The identity is the chain + the contract address, to be compared with the project's official source (its documentation or repository).

Fictitious example:

Official token contract (from the project's docs):  0xAAAA...0001
Token transfers received by your account:
 +500  "BACUSD"  from contract 0xAAAA...0001
 +200  "BACUSD"  from contract 0xBBBB...0042

The two lines look the same; only one is the real token. An identical symbol, a copied logo, a "verified" badge on a platform: none of these replaces the address comparison.

Other classic traps

  • Address poisoning: an attacker sends you a tiny transaction from an address whose start and end resemble your contact's. Later you copy the address "from history" and send to the attacker. Defence: compare the full address, character by character or through a trusted address book, and never copy from history.
  • Name-squatting contracts: a contract carries a name close to a known project's. A contract's name is not unique.
  • Unsolicited transfers: anyone can send you a token; receiving it does not mean you asked for it or that it has value. An interaction (approving, signing) is a separate act.
  • Dollar values without a market: an illiquid token can show a fanciful price. The displayed value comes from a provider, not from the chain.

Centralisation and trust assumptions

An explorer or node provider is a centralised service: a company, a domain, servers, a team.

What is assumedWhat can go wrong
The domain name is really theirsThe domain or DNS is hijacked and shows false data (workshop 101)
Their indexer is correctBug, lag, wrong decoding
Their node provider is honestThe provider filters or returns stale data
Their labels are rightA labelling error makes an address look like an exchange
The service stays onlineOutage: the application relying on it stops

A "decentralised" dashboard may depend on a single node provider or a single database. Before believing a system, look for its single point of failure.

What an explorer can — and cannot — prove

An explorer proves nothing by itself: it is a witness, not a proof. It can point you to a block and a transaction that you then verify (lesson 2). It cannot prove:

  • that the label "Exchange X" is accurate;
  • that the block is final (it often shows the latest);
  • that the token shown is the right one;
  • that the dollar price is that of a real market;
  • that you see the same thing as everyone else.

A reasonable practice

For any decision involving money: (1) read the full address and the contract's address; (2) confirm the data over a second, independent path, ideally your node; (3) wait for the finality suited to the amount; (4) sign nothing you do not understand.

What this does NOT guarantee

  • Comparing a contract's address with the official documentation does not protect you if the documentation itself is spoofed: check that you are on the official source (site address typed by hand, or the organisation's official repository).
  • A verified contract (published source code) is not an honest contract: "verified" means the published code matches the deployed code, not that it is safe.
  • These rules reduce risk, they do not remove it.

Recap

Names and logos are not identities; the address is. An explorer is a centralised witness. For a money decision, confirm over an independent path.

Guided lab

The browser cannot open three real explorers for you, nor query a real node: this lab trains reasoning from excerpts made up for the exercise and from JSON-RPC requests generated against a fictitious practice node. The real work — comparing three explorers on the same test-network transaction and querying your own node — happens in the independent lab. In each step, explain the divergence or the figure by its cause, not by a majority vote.

A browser is no substitute for a real terminal: this lab trains reading and reasoning; the real hands-on practice is in the independent lab.

A certified account is required

Graded activities record results in your name and are the basis for a credential. They therefore need a complete certified file and a current consent. Filling in the file does not verify your identity; the Secretariat can verify it afterwards ("Verified" badge).

  1. 1.Write a JSON-RPC request to a node

    A task generated for you describes a piece of data to request from a practice node (a balance, a block or the current height) with a method name and an id imposed. Write the full JSON body of the request (jsonrpc, method, params, id), respecting parameter order and type, with no extra field. Empty parameters are written with an empty list.

  2. 2.Read an error returned by the node

    The practice node answers a request with an object containing error. Read the numeric code of the response shown in the task generated for you, recall the five standard codes of the JSON-RPC 2.0 specification from the second lesson, and choose the exact meaning. Do not rely on the message text alone: the code is the standardised part.

  3. 3.Reconcile three displays of the same transaction

    The question shown under this step presents three displays, made up for the exercise, of the same transaction. Read them while separating what is raw from what is derived (first lesson), then answer the question shown under this step. The hash tool can be used to check a proof's parent node by hand if you need it.

    Interactive tool

    SHA-256 of hex bytes

    Paste bytes as hex: the hash covers the bytes, not the text of the digits. A second field is concatenated after the first.

    Digest

    …

    Spaces, newlines and 0x prefixes are ignored.

  4. 4.Spot a misleading metric

    A dashboard announces an adoption figure, and a node-based analysis explains its composition. Apply the three questions of the third lesson (definition, window, reproducibility) and compute the bound asked in the question shown under this step. Write the calculation, do not guess.

Security exercise — Fake token, real loss

Adèle, a trader in Douala, receives payments in a stable token "BACUSD" on an Academy test network. In her wallet she sees:

Official BACUSD contract (from the project's documentation): 0xAAAA...0001   [fictitious address]

Token transfers received by Adèle:
  +500  "BACUSD"  from contract 0xAAAA...0001   (customer payment)
  +200  "BACUSD"  from contract 0xBBBB...0042   (unsolicited)

A message tells her: "Your BACUSD is locked, click the link to activate it". The link leads to a site asking her to sign an "approval" whose screen does not clearly say which token or which beneficiary is targeted. She hesitates: both lines have the same name, the same logo, and the explorer shows a green "verified contract" badge on both.

Your task: say which of the two lines is the real token, what the green badge does and does not prove, and the rule to follow before signing anything. Answer the application question shown under this exercise.

Workshop quiz

Eight questions drawn from a larger pool, 70% to pass. It opens once every lab checkpoint is passed. You can retake it: the draw changes.

A certified account is required

Graded activities record results in your name and are the basis for a credential. They therefore need a complete certified file and a current consent. Filling in the file does not verify your identity; the Secretariat can verify it afterwards ("Verified" badge).

Independent lab (outside the site)

Not graded online: do it on your own machine and publish it to your Git repository.

Reproduce a statistic from a node's raw data

To do on your machine, outside the site, on a public test network (never with real funds).

  1. Choose a test network whose official documentation describes how to run or reach a node (see the Academy's documentation registry), and an explorer for that network. Note the date and time of your work: figures change.
  2. Take one recent transaction. Record in three explorers (or three pages of the same one): block, hash, status, fee, time. Make a table of discrepancies and, for each, name the cause (time zone, rounding, external price, lag, other).
  3. Then query a node over JSON-RPC (curl or a small script): the block, the receipt or your chain's equivalent data. Show that hash and status match, or explain the gap.
  4. Choose one statistic published by a dashboard (for example a day's transaction count). Recompute it by reading the blocks of the period: fix the time zone, the daily cut-off, and say whether failed transactions count. Report the gap as a percentage.
  5. Write a critical analysis of one page: for each claim, note its source (block bytes, indexer, label, external price) and its traceability. Mark anything you could not verify as "unverified".

Success criterion: every claim in your report is tied to a query that someone else can replay.

Takeaways

  • A blockchain screen is an interpretation: only block bytes and the result of the rules are consensus; decoding, labels, prices and aggregates are derived.
  • To verify, ask a node for the raw data (ideally your own), recompute what can be recomputed and treat a disagreement as an investigation, not a vote.
  • "Confirmations" is not "finality"; distinguish the latest from the finalised.
  • Every aggregate figure has a definition, a window and assumptions; if not reproducible from a node, it remains a claim.
  • Names and logos are not identities: the contract address is. An explorer is a centralised witness, not a proof.

Common misconceptions

  • Misconception : If three explorers show the same thing, it is verified.

    In fact : They may read the same indexer or the same node provider; agreement is not verification. Query a node and recompute.

  • Misconception : An active address is a user.

    In fact : An address is a key: a person can have hundreds, a script thousands. The number of users cannot be read directly from the chain.

  • Misconception : A token with the right name, right logo and a "verified" badge is the right token.

    In fact : Only the contract address, compared with the project's official source, identifies a token. "Verified" means the published code matches the deployed code, not that the contract is legitimate.

Glossary

Indexer
Software that reads blocks, decodes data and files it in a queryable database; it makes decoding choices and can lag.
JSON-RPC
A remote-call convention where you send a JSON object (jsonrpc, method, params, id) and receive result or error.
Confirmations
Number of blocks since the one containing a transaction, that block included (workshop 109 convention); a prudence indicator, not a finality guarantee.
Label
A name assigned to an address by a third party (for example "Exchange X"); not chain data.
Wash trading
Trading an asset with oneself to artificially inflate the displayed volume.
Address poisoning
Sending a small transaction from an address with a similar start and end so the victim copies it by mistake from their history.