Every detail of how MeterCall L4 nodes register, serve, prove, and claim — in one place. Reference implementation: /node/index.js.
node_id = sha256(stake_address || name || started_at)[:32]./api/node/register with { node_id, operator_address, metadata_uri, stake_pcp, regions, chains_supported }.operator_address has ≥ 10,000 PCP staked in NodeStaking. If not, the node is accepted but ineligible for rewards until stake lands.{ ok, registered_at, coordinator_signature }. Node keeps the signature as proof of acceptance.Every served request carries a client signature in header x-request-id (or is auto-generated). The node returns { result, receipt } where receipt is:
{
"request_id": "hex", // unique per call
"node_id": "0x...", // the serving node
"chain_id": "ethereum", // or real-world API identifier
"result_hash": "0x...sha256...", // hash of the JSON result
"timestamp": 1714512000000,
"signature": "0x..." // HMAC-SHA256(NODE_KEY, canonical json)
}
EIP-712 type hash (for 0.2.0 when secp256k1 lands):
Receipt( bytes32 request_id, bytes32 node_id, string chain_id, bytes32 result_hash, uint256 timestamp )
sha256(canonical_json(receipt))sha256(left || right). Odd leaves duplicate the last.floor(now_ms / 86_400_000)./api/node/proof with { node_id, epoch, merkle_root, receipt_count, stake_address }.merkleRoot() in /node/index.js.The coordinator is not trusted blindly — its job is to catch cheaters, not approve rewards by fiat.
sha256(coordinator_result) == receipt.result_hash → honest.NodeRegistry.challengeReceipt() on-chain with a Merkle proof; a successful challenge also triggers slashing.Transitions are one-way except HEALTHY ↔ WARNED which decays back to healthy after 30 days of clean operation. BANNED is terminal — a new node_id + fresh stake is required to re-enter.
merkle_root to coordinator.NodeStaking.creditRewards(operator, amount).NodeRegistry.publishEpochRoot(epoch, merkleRoot, receiptCount) — public transparency.NodeStaking.claim() whenever they want to harvest. No time limit; rewards accrue.A fully trustless variant (claim-via-Merkle-proof without coordinator credit) is specified for 0.3.0; it requires on-chain secp256k1 receipt verification which is too gas-heavy at 0.1.0 scale.
/node/index.js — canonical TypeScript-free Node.js reference (zero deps)./contracts/NodeStaking.sol — stake, delegate, unbond, slash, claim./contracts/NodeRegistry.sol — registration, heartbeat flag, epoch roots, challenges./contracts/nodes/README.md — deploy + wire-up guide.