公開されている暗号パズルとバウンティを、型付きレコードとして提供します。パズルを要求すると、そのアドレス、鍵素材、そしてオンチェーンで何が起きたかが返ってきます。
どのパズルスレッドにも同じ3つの要素があります。アドレス、賞品、そして誰が何を解いたかです。あらゆるスキャナーやトラッカーが、スレッドからそれらを毎回少しずつ異なる形で打ち直しています。そこで、ここに一度だけコードとして置くことにしました。パズルはTypeScriptのレコードです。テストより先に型チェッカーがそれを読みます。CLI、MCPサーバー、そしてPiとOMPの拡張機能は、1つのレジストリを読みます。
ドキュメント、パズルごとに1ページ、そしてライブプレイグラウンド:puzzles.agntn.dev。
[!WARNING] 1.0未満です。API、CLIフラグ、データモデルはまだ変わる可能性があります。その上に構築する場合は、正確なバージョンを固定してください。
PuzzleSpecリテラルを、すべてのチェーン共通のpuzzle()ファクトリで構築します。JSONもビルドステップもありません。get("bits/71")は1つのコレクションモジュールをインポートします。@agntn/explorers経由のpuzzle.balance()。基本単位はbigint、APIキーはエラーから伏字化されます。puzzles watchは、レコードが見落としている入金と出金、移動した賞品、出金によって漏れた公開鍵、変更されたソースページを一覧表示します。レコードを編集することは決してありません。編集するのはあなたです。puzzles eligibilityは、ソース、アドレス、エクスプローラーからの累計、根拠付きのステータス、そして何が解決とみなされるかを集めます。誰も埋められないものはmissing行として返り、推測にはなりません。puzzles_assetsはモデルに、ヒントの背後にある画像、ステージファイル、アーカイブされた投稿を、レコードが固定したSHA-256と照合した上で渡します。リンクは腐ります。これらは腐りません。pnpm add @agntn/puzzles
Node.js 26 以降(CLI 用)。
npx @agntn/puzzles stats
これにより、合計、ステータスごとの件数、および既知の公開鍵を持つパズルの数が出力されます。鍵も設定もネットワークも不要です。レコードはパッケージ内に同梱されています。以下の素の puzzles は、ローカルで pnpm add した後の pnpm exec puzzles、または pnpm add -g @agntn/puzzles の後の単なる puzzles を指します。
puzzles show hash-collision/sha256
hash-collision/sha256 unsolved 0.27734251 BTC 35Snmmy3uhaer2gTboc81ayCip4m9DT4ko
chain: bitcoin address kind: p2sh
hash160: 292fb39df7cd619a396069383928e6bfb74ebec5
redeem script: 6e879169a87ca887 (hash 292fb39df7cd619a396069383928e6bfb74ebec5)
public key: unknown
private key: unknown
started: 2013-09-13 05:59:09
transactions: 1
funding 2013-09-13 05:59:09 0.1 BTC 397f12ee15f8a3d2ab25c0f6bb7d3c64d2038ca056af10dd8251b98ae0f076b0
explorer: https://blockstream.info/address/35Snmmy3uhaer2gTboc81ayCip4m9DT4ko
source: https://bitcointalk.org/index.php?topic=293382.0
| コマンド | 出力内容 |
|---|---|
puzzles stats | 合計、ステータス別件数、賞金合計、データバージョン |
puzzles collections | コレクションごとに1行: キー、件数、作者 |
puzzles authors [key] | 作者ごとに1行、または出典付きの事実を含む1人の作者レコード |
puzzles author <key> | puzzles_author ツールから直接取得した1人の作者レコード |
puzzles solvers [key] | 名前付きソルバーごとに1行、または1人のソルバーレコード: すべての解答、プロフィール、出典付きの事実 |
puzzles solver <key> | puzzles_solver ツールから直接取得した1人のソルバーレコード |
puzzles show <id> | 1つのパズルのレコード: キーマテリアル、トランザクション、ヒント、リンク。データには --json |
puzzles hints <id> | コレクションのヒント、パズル自身のヒント、続いてそのヒントファイル。両方には --json |
puzzles stages <id> | マルチステージパズルのステージとそのページ、ファイル、公開された回答。リストには --json |
puzzles assets <id> | パズルに同梱されるファイルの SHA-256 とサイズ、および参照するアーカイブ済みページ。--read <path> で1つを書き出し、--check/--live で検証 |
puzzles list [collection] | 1行につき1つのパズル。--address、--chain、--status、--technique、--with-pubkey で絞り込み、--limit と --offset でページング |
puzzles verify [id] | 公開されたキーとそのレシピをアドレスに対して検証。セットには --all または list フィルタ、不一致時は終了コード1 |
puzzles balance [id] | ライブ残高。list フィルタでセット全体を1行ずつ確認。--api-key、またはチェーンごとに1つの変数 |
puzzles watch [id] | チェーンが知っていてレコードにないもの。--since はソースページも確認し、何か見つかれば終了コード1 |
puzzles eligibility <query> | 賞金に取り組む前のチェックリスト。id またはアドレスで指定。いずれかのフィールドが欠けている間は終了コード1 |
puzzles export | data_version を含むデータセット全体 |
puzzles mcp | stdio 経由の MCP サーバー |
--json はテキストの背後にあるデータを出力し、bigint は文字列として、存在しないフィールドは省略されます。コマンドはエージェントが受け取るものと同じツール定義に由来するため、フラグのタイプミスはモデルに対して失敗するのと同じようにここでも失敗します。フラグと終了コードは CLI ガイド に記載されています。
import { get, stats, verify } from "@agntn/puzzles";
import { bits } from "@agntn/puzzles/collections/bits";
const puzzle = await get("bits/71"); // loads the bits collection, nothing else
puzzle?.address().value; // "1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU"
puzzle?.keyRange(); // [2n ** 70n, 2n ** 71n - 1n]
(await verify(bits.require(1))).verified; // true, key 1 derives its address
(await stats()).unsolved; // how many are still waiting for a key
(await bits.require(71).balance()).totalUnits(); // 7.10190014 when I ran it, mempool.space decides
だいたいそんなところです。コレクションはそれ自体が1つのエントリであり、その上のすべては同期的です。コレクションをまたぐビューはロードを待機します。エラーは PuzzlesError から派生し、残高には BalanceError の下に独自のファミリーがあります。残りはガイドにあります:records、registry、lookups、verification、balances。