About this devnet

An Ethereum chain whose every block is made by a client written from scratch.

The blocks here are built and executed by wacuum, an execution client written in wac, a language for WebAssembly. The same program serves this site: the explorer, the faucet and the JSON-RPC your wallet talks to. There is no geth, no Reth and no JavaScript underneath it.

~10,700
lines of wac in the client
every
execution-spec-tests fixture passes, Cancun to Osaka
~770 KB
one module: the node, the explorer and the faucet
0
lines of script this site runs in your browser

One program, from your wallet to the disk

Everything to the right of Caddy is a single wac program, about 1,800 lines of its own on top of wacuum, compiled to one WebAssembly module.

You
a browser, a wallet, ethers, Foundry
Caddy
TLS, HTTP/2, and the patience slow clients need
wacuum-devnet · one wac program
Explorer
pages drawn on the server
JSON-RPC
eth_, net_, web3_ at /rpc
Faucet
signs its own transfers
wacuum's engine
the EVM, the state and its tries, the mempool, and a block every 2 seconds
Disk
every block logged before it is answered for; snapshots

wacuum, the client

An execution client is the half of an Ethereum node that runs transactions and keeps the state. wacuum is one, written without borrowing an EVM, a trie or a curve from anywhere else.

The EVM

Every opcode through Osaka, with each fork's gas rules. Calls run on a stack of the interpreter's own, so 1024-deep calls work on any host.

Every precompile

ecrecover, SHA-256, RIPEMD-160, MODEXP, bn254 and its pairing, BLAKE2F, KZG point evaluation, the seven BLS12-381 operations and P256VERIFY, all in wac.

State and tries

One journal undoes a failed call. The Merkle-Patricia tries are kept between blocks, and a root rehashes only the paths to what changed.

Blocks

Header rules, system calls, withdrawals, EIP-7685 requests and blob gas, with every root and the bloom checked. A block that fails leaves no trace.

Engine API and JSON-RPC

What a consensus client steers it with, and what wallets and libraries read it with, over HTTP with JWT authentication.

devp2p

RLPx, snappy, eth/69 and discovery v4. It syncs from geth, and geth syncs from it.

Against the reference tests

Every fixture of execution-spec-tests v5.4.0 passes, and every transition between forks.

CancunPragueOsaka
State tests16,84718,86919,517
Blockchain tests, from block RLP17,68520,85921,558
Engine API tests17,68520,87821,577
Blocks rebuilt from the mempool17,68520,87821,577

wac, the language

wac is a C-family language that compiles to WebAssembly with garbage collection. Its compiler is written in wac, and is built from a ladder of compilers whose lowest rung is WebAssembly text written by hand: no other language's toolchain is needed to have it.

A wac program reaches nothing it was not handed. This one was granted three things — to read files, to write them, and the network — and its built module says so; the host refuses it anything else.

The same module runs on Node, on V8 directly, and on wasmtime, which has no JavaScript in it at all.

The pages of this site are web's components, the ones a wac program mounts in a browser, rendered here on the server instead: every value from the chain is escaped on its way out, and the browser is sent HTML and a stylesheet, and a policy that lets it run nothing else.

Using it

  1. Add the network
    Network namewacuum devnet
    RPC URLhttps://wacuum.voltrevo.com/rpc
    Chain id20261117 (0x13528fd)
    CurrencyETH
  2. Take some ether

    The faucet sends 10 ETH to any address, once every 24 hours for each address and each visitor.

  3. Point your tools at it
    curl -s https://wacuum.voltrevo.com/rpc -H 'content-type: application/json' \
      -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
    cast block-number --rpc-url https://wacuum.voltrevo.com/rpc
    cast send --rpc-url https://wacuum.voltrevo.com/rpc --private-key $KEY 0x… --value 1ether

    Anything that speaks JSON-RPC works the same way: ethers, viem, web3.py, a wallet.

The fine print

  • The ether here is worth nothing, and the chain may be started again from nothing.
  • One node makes every block and there is no consensus layer, so each block is final the moment it is made.
  • The explorer keeps a day of blocks; older ones, and the receipts of transactions from before the node last restarted, are not kept.
  • Don't send anything here that is worth something anywhere else.

The source, on GitHub: wacuum · wac