---
type: explanation
title: Proof of work
summary: なぜ Caputchin はトークンを発行する前にブラウザに少しの計算をさせるのか、そしてそれがどう濫用のコストを上げるか。
---

すべての検証は、Caputchin がトークンを発行する前に、訪問者のブラウザに小さな計算のパズルを解かせます。そのパズルが proof of work です。

## どう動くか

Caputchin はブラウザにチャレンジを渡し、チャレンジと一緒にハッシュしたとき、必要な数の先頭ゼロで始まるハッシュを生む数（ナンス）を見つけるよう頼みます。近道はありません。ブラウザは、たまたま 1 つが効くまで、ナンスをまた 1 つ、また 1 つと試さなければなりません。有効なナンスを見つけるのは多くの試行を要し、1 つを確かめるのは 1 回のハッシュです。なので、作業はやるのが難しいが確かめるのは安く、Caputchin はその答えが必要な難易度をクリアすることを確認します。

## Content-Security-Policy

ソルバーは Web Worker の中で走り、ウィジェットはそれを `blob:` URL から作るので、埋め込み先のページの Content-Security-Policy は worker に対して `blob:` を許可しなければなりません（`worker-src blob:`、またはフォールバックの連鎖として `child-src` / `default-src`）。この部分は必須です。メインスレッドのフォールバックがないので、worker をブロックするポリシーは検証をブロックします。別に、ソルバーは速度のために WebAssembly のルーチンをコンパイルし、それには `script-src` の `'wasm-unsafe-eval'` が要ります。その部分は任意です。なしでも、同じソルバーが Worker の中で純粋な JavaScript としてより遅く走ります。完全なホストページのポリシーは [ゲームのサンドボックス化](/docs/understanding-caputchin/game-sandboxing#the-csp-you-set-on-your-own-page) を参照してください。

## なぜそれが濫用を抑止するか

要点は、どの単一の解も不可能にすることではありません。大規模な濫用を不経済にすることです。

本物の訪問者は 1 つのパズルを 1 秒の何分の一かで解き、決して気づきません。何千ものリクエストを撃ちたいボットは、その計算コストを何千回も払います。チャレンジをクリアするのがスパムの価値より高くつくなら、攻撃は金銭的に割が合わなくなります。proof of work は目標を「破れない」から「割に合わない」へずらします。

## つまみ

キーの [セキュリティ](/docs/site-keys/security) ページの 2 つの設定が、コストを調整します：

- **難易度** は、ハッシュがいくつの先頭ゼロを持たねばならないかを設定し、それが各解のコストを上げます。
- **リクエストごとのチャレンジ数** は、一度に複数の解を求めることで、そのコストを倍増させます。

## 正直な限界

破れないチャレンジはありません。十分なお金があれば、何でも解けます。proof of work はそれを受け入れ、代わりにコストで競います。それはまた、*労力* が費やされたことを証明するだけで、本物のブラウザがそれを費やしたことは証明しません。だからこそ Caputchin は、環境もチェックするために、それを [計測](/docs/understanding-caputchin/instrumentation) と組み合わせます。
