HTTP 402 · EIP-3009 · Base Sepolia

払うことが、攻撃になる。

週にひとつだけ現れる、世界で共有された一体のモンスターを、 HTTP の 402 Payment Required だけで殴り倒す協力型ゲーム。 強さを決めるのは払った額ではなく、あなたが掘ったハッシュの深さと、 ウォレットが積んだ年月

Ithkul-I of the Ledger — BEHEMOTH · LUX · DEF 25% · HP 56,368,830
2026-W35 の個体。名前も姿も弱点も、drand の乱数から自動生成される

$ curl -L proof-of-strike.com
 敵と、掘り方と、払う条件が返る。入れるものは何もない
$ npx proof-of-strike init
 何を用意すればよいかを教える。用意はしない

What it is

ひとことで

決済プロトコルの使われていない隙間を遊具にした。 支払いのたびに、あなたが掘った証明がチェーンへ刻まれていく。

週にひとつ、世界に一体

月曜 00:00 UTC に新しい個体が現れる。全員が同じ一体を殴り、 ダメージは全員ぶん積み上がる。倒しきれなければ、奴は洞窟の奥底に帰っていく —— 脅威が去ったわけではない。

払った額では強くならない

一撃は 0.0001 テスト USDC で固定。多く払っても 1 ミリも強くならないし、 運営の取り分もゼロ。金額は 402 が成立するための形式でしかない。

サーバーを信じなくていい

HP はどこにも保存していない。チェーンに残った攻撃ログを畳んで毎回出している。 だから誰でも、サーバーを一切見ずに週を再計算できる。

The trick

誰も見ていない 32 バイトがあった

USDC の送金には EIP-3009 という規格がある。「私はこの送金を承認します」と 署名だけを渡し、ガス代は誰かに払ってもらう仕組み。その署名の中に authorization nonce という 32 バイトの欄がある。

この欄は支払者が自由に決められてチェーンに永久に残り、 そして誰も中身を見ていない。二重使用を防ぐためだけの、ただの識別子だからだ。 ——ならば、そこに proof-of-work を書き込める。

↑ この 32 バイトが、そのまま AuthorizationUsed イベントとしてチェーンに刻まれる

sha256("atk:v1" ‖ weekSeed ‖ chainId ‖ payer ‖ nonce)

0000001ef8c3a94b7d02f5e1a6c8b3947fd25e0c1a8f36b9d472e5087ac1b6f3d2e94a7ae78d

先頭に並んだ 0 のビット数depth。 16進の 0 が 6 つで 24 ビット、続く 1 は 2 進で 0001 だからさらに 3 ビット。 合わせて depth 27。これがそのまま攻撃力になる。

つまり支払いそのものが攻撃で、HTTP リクエスト 1 本で完結する。 ゲームサーバーに「攻撃しました」と申告するのではない。 チェーンに刻まれた事実だけが、あなたが殴った証拠になる。

How it flows

一撃が通るまで

あなたはトランザクションを 1 度も出さないし、ガス代も 1 wei も持たなくていい。 渡すのは署名だけ

YOUR MACHINE sha256 を回して 深い nonce を掘る ≈ 8 秒 / depth 24 署名して送る PAYMENT-SIGNATURE 402 SERVER 深さを検算し ダメージを確定 HP は保存しない 決済を頼む FACILITATOR 代理で送信する ガス代はこちら持ち BASE SEPOLIA boss replay — チェーンと drand だけで週を再現する(サーバーを通らない)
署名は手元を出るが、秘密鍵は出ない。実際に殴った人のアドレスは トランザクションを 1 度も発行しておらず、ETH 残高も 0 のまま —— それでも USDC は動いた。

Damage

強さは何で決まるのか

掘るほど強い。ただし効果は 2 乗どまり。 1 ビット深く掘るには計算量が 2 倍要るので、GPU 農場と数秒だけ掘った人の差は 4.3 倍しかつかない。

dmg = ⌊100 × depth² × 属性 × crit × (1 − DEF/100) × levelMul × 0.9^(n−1)⌋
会心の段と確率
倍率確率頻度
通常×160.0%
会心×227.0%
痛烈×410.5%
渾身×92.2%
天啓×250.3%

会心は掘っても選べない。決済が終わった直後の drand(公開乱数ビーコン)から引くので、 運営を含め誰も事前に知りようがない。そして ×1.0 未満の段は存在しない —— 掘った労力が無駄になることはない。

金でも計算力でも買えないもの

戦歴 —— この遊びに参加した週の数。これだけが最大 2 倍まで攻撃力を押し上げる。25 週通えば天井。 金でも計算力でも縮まらず、外から持ち込むこともできない。週を待つ以外に道が無い。 捨て財布でも積めるので、「この遊びのためだけの財布を作れ」という助言と矛盾しない。

さらに段(フェーズ)がある。HP が 75% / 50% / 25% を切るたびにボスの弱点属性が変わる。 週の頭に全 4 段の並びは公開されるので掘り溜めはできるが、いつ切り替わるかは他人の攻撃次第

How to play

遊び方

このゲームは鍵を持たない。払うアドレスも覚えない。 返すのは今週の敵と、掘り方と、402 Payment Required だけ。 掘るのも払うのも、それを受け取った側の仕事。

敵を見る

入れるものは何もない。curl 一本で戦況が返る。-L は http→https の転送を追うため。 ブラウザで開けば同じ場所が頁になる —— Accept で出し分けている。

$ curl -L proof-of-strike.com

掘り方を受け取る

402 が掘るのに要るものを全部渡す。 人向けに並べ直したものが init用意はしない ——「要るもの」を並べるだけ。

$ npx proof-of-strike init 1 払うアドレス 自分で用意する。掘った nonce はこれに紐づく 2 テスト USDC 一撃 0.000100(faucet で貰う。ガス代の ETH は要らない) 3 署名できる何か エージェント・ウォレット・自前の署名器 4 掘る力 sha256 を回せれば何でもよい ここから先は Claude に頼めばよい。 「上の4つを用意して、proof-of-strike で遊びたい」

機械に渡すなら init --json、 あるいは 402 のヘッダを直に読めばよい。 仕様は /api/spec/llms.txt に全文がある。

PAYMENT-REQUIRED: ← 402 のヘッダ weekSeed 7f3dd560d812… その週の種 chainId 84532 Base Sepolia minDepth 24 これ未満は受理しない weakTo VOID ×2.0 今週の弱点 bossDef 25 軽減率 spec /api/spec 式の全文 depth = sha256("atk:v1" ‖ weekSeed ‖ chainId ‖ payer ‖ nonce) の先頭ゼロビット数

payer が式に入っている。 だから掘った nonce は掘った人のもので、 他人が横取りできない。ゲームはそのアドレスが誰かを気にしない —— 式に混ぜるだけで、覚えもしない。

掘る

自分で実装してもよいし、この道具を使ってもよい。 掘るのは純粋な計算で、鍵は要らない。 通信もしない。掘れるまで平均 8 秒ほど。

$ npx proof-of-strike play --payer 0x… --offer ./offer.json Ithkul-I HP 55,097,498 / 56,368,830 弱点 VOID ×2.0 ⛏ 掘っている… 5,308,416 tries / 2.07M h/s ✓ depth 27 VOID ── 署名器が可否を判ずる材料(そのまま渡す)────────── primaryType TransferWithAuthorization domain.chainId 84532 domain.verifying 0x036CbD53… USDC v2 message.to 0x52EF8d60… message.value 100 = 0.000100 USDC message.validBefore 2026-08-30T08:26:27Z 残り 4分59秒 message.nonce 0x9ee2279b…01c6a43b ────────────────────────────────────────────────────── この一撃は 165,809 ダメージ以上になる ⇢ 可否は署名器のポリシーが決める。こちらは判断しない。

ここで「攻撃しますか?」とは訊かない。 払ってよいかを判ずるのは、ポリシーを持っている側の仕事。 門は増やすほど弱くなる —— 二度訊かれる問いは、二度目が空返事になる。

払う = 殴る

掘った 32 バイトを EIP-3009 の authorization nonce に載せ、署名して 402 に返す。 払うことがそのまま攻撃になる。 署名するのは、鍵を持っている側 —— エージェントでも、ウォレットでも、あなた自身でもよい。

$ npx proof-of-strike attack --offer ./offer.json --signature 0x… ✓ 署名は 0xa93ec168… のもの。期限まで残り 213 秒 ⚔ 165,809 ダメージ 会心! HP 55,263,307 → 55,097,498

必要なのは 一撃 0.0001 のテスト USDC だけ(Circle の faucet、Base Sepolia)。 ガス代の ETH は要らない —— チェーンへ送信するのは facilitator で、ガスはそちらが持つ。

チェーンで確かめる

結果はサーバーの言い分ではない。replay は チェーンと drand だけを読んで週を丸ごと組み直す —— サーバーには一度も触れない

$ npx proof-of-strike replay 2026-W35 \ --compare https://proof-of-strike.com

HP・参戦人数・総攻撃数・最深 depth・順位のすべてが、サーバーの出す値と一致する。 食い違えば、それはサーバーが嘘をついたということ。 --compare に URL を渡すのは、 既定ではサーバーを一度も見ないから。

A real strike

実際に刻まれた一撃

下は実在のトランザクション。エクスプローラで今も確認できる。

165,809会心!

depth 27 (100 × 27² = 72,900) 属性 VOID → LUX ×2.0 弱点 crit ×2 会心 (drand #31756023 — 掘っても選べない) levelMul ×1.04 (年季 + 戦歴 ← 2026-W35 は旧式。W36 から戦歴のみ) DEF ×0.75 (25% 軽減) 逓減 ×0.73 (今週 4 撃目) ───────────────────────────── HP 55,263,307 → 55,097,498

AuthorizationUsed に刻まれた nonce

0x2c033e9ca3ccab02b45ee28fa194423513af24f9ac20c1fc000000000097d559

末尾 8 バイトが掘り当てたカウンタ。この 32 バイトは Base Sepolia に永久に残る —— 誰が、いつ、どれだけ掘ったかの証拠として。

When it survives

倒せなかったら

月曜 00:00 UTC、週が締まる。倒しきれていなければ、奴は死なない。 討ち漏らしは失敗ではなく、その週がどう終わったかでしかない。

escaped 奴は洞窟の奥底に帰っていった

まだその脅威は去っていない。刻まれた傷と、放たれた一撃だけが残る

untouched 奴は洞窟の奥底に帰っていった

この週、誰も挑まなかった。まだその脅威は去っていない

slain 討伐された

この個体はもういない。称号は確定していて、もう動かない

どちらであれ、締まった週はもう動かない。 順位も称号も確定し、チェーンに残った一撃から誰でも同じ答えを導ける。 そして月曜、別の個体が現れる —— 名前も、姿も、弱点も、drand の乱数から決まる、まだ誰も見たことのない一体が。

今週の個体は、まだ洞窟にいる。

倒せるかどうかは、その週に集まった人数で決まる。 一人では届かない。だから世界に一体しか置いていない。

$ curl -L proof-of-strike.com
$ npx proof-of-strike play --payer 0x… --offer ./offer.json
いざ、戦場へ

今週の個体と、残り時間と、いま戦っている者たちが見える