Open this lesson in your favourite AI. It'll walk you through the why, explain the demo, and quiz you on the try-it list.
If you can't read Etherscan fluently, you can't debug on-chain issues, audit a token's behavior, or verify a counterparty's claim. Every blockchain dev skill composes on top of 'stare at a tx hash and understand what happened'. Treat the block explorer as your first real IDE.
Take a famous transaction: the first ETH ever sent, block 46147, tx hash 0x5c504e…a7b2f1. Open it on Etherscan. You'll see: a From address (0xa1e4380a3b1f749673e270229993ee55f35663b4 — Hal Finney's test address? actually Vitalik's), a To, a Value (31337 Szabo — a nerd reference), Gas Used, Gas Price (50 gwei), Block Number (46147), Confirmations (millions). Every field has a specific on-chain meaning we'll unpack across this course.
From address. Scroll its transaction list to the first outgoing tx — that's how you trace account history.Logs (any ERC-20 transfer works — e.g. a recent USDC transfer at 0xa0b8…eb48). Open the Logs tab and count the Transfer events.Contract → Read Contract and call factory(). Note that reading is free — no wallet needed.Use these three in order. Each builds on the one before.
What are the minimum fields every Ethereum transaction has? Go through them one by one and explain what each means.
What's the difference between a 'log' (event) and a 'state change' in Etherscan's view of a transaction? Which one costs gas, and which one can a frontend index cheaply?
I'm investigating a suspicious token contract at 0x[some address]. Walk me through how to use Etherscan to determine: (1) is the contract verified? (2) who deployed it and when? (3) how many holders? (4) are there owner-only functions that could rug? (5) has there been recent unusual activity? Name the tabs and fields I'd use.
// main.go — fetch a transaction by hash via JSON-RPC and pretty-print it
// Run: go run main.go (stdlib only)
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
const tx = "0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060"
func main() {
body := []byte(`{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["` + tx + `"],"id":1}`)
resp, err := http.Post("https://cloudflare-eth.com", "application/json", bytes.NewReader(body))
if err != nil {
panic(err)
}
defer resp.Body.Close()
var out struct {
Result json.RawMessage `json:"result"`
}
json.NewDecoder(resp.Body).Decode(&out)
var pretty bytes.Buffer
json.Indent(&pretty, out.Result, "", " ")
fmt.Println(pretty.String())
}
go run main.go