pow-attest

PoW-gated Schnorr attestation oracle — dead man’s switch & bug bounty auto-release

BIP-340SchnorrPoW-gatedLightning-compatible

What it does

Register a condition. The oracle signs a Schnorr attestation when that condition is met. Verifiable offline against the oracle’s x-only pubkey — no trust in this server required.

Two products:

Quick start

# 1. Get a PoW challenge
curl https://attest.powforge.dev/api/v1/switch/challenge

# 2. Mine it (sha256(challenge + nonce) must have 18 leading zero bits)
# Use: https://github.com/powforge/pow-attest-client (coming soon)
# Or mine manually in Node:
#   node -e "const c=require('crypto'); let n=0;
#     while(true){ const h=c.createHash('sha256').update('CHALLENGE'+n).digest('hex');
#     if(h.startsWith('0000')){console.log(n);break;} n++; }"

# 3. Register a switch
curl -X POST https://attest.powforge.dev/api/v1/switch \
  -H 'Content-Type: application/json' \
  -d '{"owner_pubkey":"<64-hex x-only pubkey>","checkin_interval_hours":24,
       "pow_challenge":"<challenge>","pow_nonce":"<nonce>"}'

# 4. Check in (prove alive) every interval
curl -X POST https://attest.powforge.dev/api/v1/switch/SWITCH_ID/checkin \
  -H 'Content-Type: application/json' \
  -d '{"sig":"<128-hex BIP-340 schnorr sig>"}'

# 5. Anyone can read the attestation
curl https://attest.powforge.dev/api/v1/switch/SWITCH_ID

Oracle pubkey

2bc78390c94d8bbb96ac3e6940462ba2812418d871e701c1a845fdb1dfd4a0e5

Attestations signed with this key are verifiable offline using BIP-340 Schnorr verify against DLC/oracle/attestation/v0 tagged hash.


API reference

GET  /api/v1/info                      Service manifest + oracle pubkey
GET  /api/v1/switch/challenge          PoW challenge (free)
POST /api/v1/switch                    Register switch (PoW-gated)
POST /api/v1/switch/:id/checkin        Prove alive (Schnorr-gated)
GET  /api/v1/switch/:id                Read attestation (ALIVE or DEAD)
POST /api/v1/bounty                         Register bug bounty (PoW-gated)
GET  /api/v1/bounty/:id/announcement        Oracle announcement JSON (nonce, pubkey, outcome hash)
GET  /api/v1/bounty/:id/announcement.tlv    OracleAnnouncement binary TLV (dlcspecs type 55332)
GET  /api/v1/bounty/:id/status              Check condition + sign RELEASED if met
GET  /api/v1/bounty/:id                     Read bounty record

DLC integration

The /announcement endpoint returns the oracle’s pre-committed nonce (nonce_pubkey = R) and pre-computed outcome_hash. Counterparties can compute the DLC adaptor point T = R + H(R||P||outcome)·P at registration time and sign CET adaptors before the GitHub event occurs. Settlement is trustless: the oracle’s Schnorr scalar s (revealed in the attestation) is the discrete log of T.

Uses dlcspecs BIP-340 attestation format. Compatible with rust-dlc schnorrsig_compute_sig_point.

Full JSON manifest: /api/v1/infotest vectors


Built by PowForge — Bitcoin PoW primitives