persistentHash(GPS) — a bare hash with no nonce. Because GPS coordinates have finite precision, this hash is reversible by brute force. We confirmed the exposure: recomputing the hash from known coordinates matched the on-chain value for 64 of 66 mainnet records. v3 replaces the bare hash with a hiding commitment — persistentCommit(GPS, secret_nonce) — making GPS recovery computationally infeasible. The region is still provable via ZK range checks against a public bounding box. To let third parties verify without trusting GYOTAK, we deployed verify_catch as an MCP tool: it reads on-chain state directly from the Midnight indexer, returns raw bytes plus decoded fields, and never touches GYOTAK’s database. An end-to-end test from Claude Desktop confirmed that the AI recovered region and fish species from the chain, and correctly concluded that GPS is not recoverable.
persistentHash(GPS) — ノンスなしのハッシュ — で保存していた。GPS座標の精度は有限であるため、このハッシュは総当たりで復元可能である。実際にメインネットの66件中64件で、既知の座標からハッシュを再計算してオンチェーンの値と一致することを確認した。v3ではハッシュをhiding commitment — persistentCommit(GPS, secret_nonce) — に置き換え、GPS復元を計算的に不可能にした。地域はZK range checkにより公開バウンディングボックスとの照合で引き続き証明可能。第三者がGYOTAKを信頼せずに検証できるよう、verify_catch MCPツールを公開した。Midnight indexerからオンチェーンstateを直接読み取り、生バイト+デコード済みフィールドを返す。GYOTAKのデータベースには一切触れない。Claude Desktopからのエンドツーエンドテストで、AIがチェーン上のデータから地域と魚種を復元し、GPSは復元不可能と正しく結論したことを確認した。
persistentHash(GPS) — แฮชโดยไม่มี nonce เนื่องจากพิกัด GPS มีความแม่นยำจำกัด แฮชนี้สามารถย้อนกลับได้ด้วย brute force เรายืนยันการรั่วไหล: การคำนวณแฮชใหม่จากพิกัดที่รู้ตรงกับค่าบนเชนสำหรับ 64 จาก 66 รายการบน mainnet v3 แทนที่แฮชด้วย hiding commitment — persistentCommit(GPS, secret_nonce) — ทำให้การกู้คืน GPS เป็นไปไม่ได้ในเชิงการคำนวณ ภูมิภาคยังคงพิสูจน์ได้ผ่าน ZK range check กับ bounding box สาธารณะ เพื่อให้บุคคลที่สามตรวจสอบโดยไม่ต้องเชื่อถือ GYOTAK เราเปิดตัวเครื่องมือ MCP verify_catch: อ่าน state บนเชนจาก Midnight indexer โดยตรง ส่งคืนไบต์ดิบพร้อมฟิลด์ที่ถอดรหัสแล้ว และไม่เข้าถึงฐานข้อมูลของ GYOTAK การทดสอบจาก Claude Desktop ยืนยันว่า AI กู้คืนภูมิภาคและชนิดปลาจากเชน และสรุปอย่างถูกต้องว่า GPS ไม่สามารถกู้คืนได้
gyotak-catch v2 stored the catch location as gpsHash = persistentHash(GPS), with no random nonce. Because GPS coordinates have finite precision (typically 7 decimal places ≈ 1 cm), a hash without a nonce can be reversed by brute force over the plausible coordinate space.
gyotak-catch v2は漁獲位置を gpsHash = persistentHash(GPS)(ランダムノンスなし)で保存していた。GPS座標は有限精度(通常小数7桁 ≈ 1cm)であるため、ノンスなしのハッシュは座標空間の総当たりで復元可能である。
gyotak-catch v2 เก็บตำแหน่งจับปลาเป็น gpsHash = persistentHash(GPS) โดยไม่มี random nonce เนื่องจากพิกัด GPS มีความแม่นยำจำกัด (ทศนิยม 7 ตำแหน่ง ≈ 1 ซม.) แฮชที่ไม่มี nonce สามารถถอดรหัสด้วย brute force ได้
We confirmed the exposure against live mainnet data: recomputing persistentHash from the GPS coordinates stored in GYOTAK’s database reproduced the on-chain gpsHash for 64 of 66 records (the remaining 2 are early test records with no GPS). Because no nonce is present, a third party who does not hold the coordinates can also recover them by brute force — demonstrated on preprod, where a 10,201-point search over the district recovered the coordinates of one record.
メインネットの実データで露出を確認した: GYOTAKデータベースのGPS座標から persistentHash を再計算し、オンチェーンの gpsHash と比較したところ、66件中64件が一致した(残り2件はGPSのない初期テストレコード)。ノンスがないため、座標を保持しない第三者も総当たりで復元可能である — preprodで10,201点の探索により1レコードの座標復元を実証した。
เรายืนยันการรั่วไหลกับข้อมูล mainnet จริง: คำนวณ persistentHash ใหม่จากพิกัด GPS ในฐานข้อมูล GYOTAK แล้วเทียบกับ gpsHash บนเชน ตรงกัน 64 จาก 66 รายการ (2 รายการที่เหลือเป็นรายการทดสอบเริ่มต้นที่ไม่มี GPS) เนื่องจากไม่มี nonce บุคคลที่สามที่ไม่มีพิกัดก็สามารถกู้คืนได้ด้วย brute force — สาธิตบน preprod โดยค้นหา 10,201 จุดทั่วอำเภอเพื่อกู้คืนพิกัดของหนึ่งรายการ
v3 changes two things: v3では2点を変更した: v3 เปลี่ยนสองสิ่ง:
1. GPS is hidden with a commitment, not a bare hash:1. GPSはハッシュではなくコミットメントで秘匿:1. GPS ถูกซ่อนด้วย commitment ไม่ใช่แฮชเปล่า:
gpsCommitment = persistentCommit(GPS, secret_nonce)
The nonce is 32 random bytes, never written on-chain. Without it, the commitment reveals nothing about the coordinates. ノンスは32バイトのランダム値で、オンチェーンには書き込まれない。ノンスなしではコミットメントから座標は一切わからない。 Nonce เป็น 32 ไบต์สุ่ม ไม่เคยเขียนบนเชน หากไม่มี nonce commitment จะไม่เปิดเผยอะไรเกี่ยวกับพิกัด
2. The region is proven, not asserted:2. 地域は主張ではなく証明される:2. ภูมิภาคถูกพิสูจน์ ไม่ใช่แค่ประกาศ:
assert gps.lat >= latMin // south boundary assert gps.lat <= latMax // north boundary assert gps.lon >= lonMin // west boundary assert gps.lon <= lonMax // east boundary gpsCommitment == persistentCommit(gps, nonce)
The bounding box (latMin..lonMax) is a public argument, taken verbatim from OpenStreetMap Nominatim administrative boundaries. regionLabel (e.g. “Pran Buri, Prachuap Khiri Khan”) is a display-only label; the circuit does not prove the label, it proves the coordinates lie inside the box.
バウンディングボックス(latMin..lonMax)はOpenStreetMap Nominatimの行政区画境界から取得した公開引数である。regionLabel(例: 「Pran Buri, Prachuap Khiri Khan」)は表示用ラベルに過ぎず、回路はラベルを証明するのではなく、座標がボックス内にあることを証明する。
Bounding box (latMin..lonMax) เป็นอาร์กิวเมนต์สาธารณะ นำมาจากเขตแดนการปกครองของ OpenStreetMap Nominatim regionLabel (เช่น “Pran Buri, Prachuap Khiri Khan”) เป็นป้ายแสดงเท่านั้น วงจรไม่ได้พิสูจน์ป้าย แต่พิสูจน์ว่าพิกัดอยู่ภายในกล่อง
Preprod verification: Preprod検証結果: ผลการตรวจสอบ Preprod:
| Testテストทดสอบ | Result結果ผลลัพธ์ |
|---|---|
| GPS inside bounding boxGPS: ボックス内GPS ภายในกล่อง | PASS — record written on-chainオンチェーンに記録บันทึกบนเชน |
| GPS in Tokyo against Pran Buri boxGPS: 東京(Pran Buriボックス)GPS ที่โตเกียว กับกล่อง Pran Buri | REJECTED — “GPS latitude above maximum” at proof generation; tx never reaches chain証明生成時に「GPS latitude above maximum」; txはチェーンに到達しない“GPS latitude above maximum” ที่การสร้าง proof; tx ไม่ถึงเชน |
| Same GPS, two different nonces同一GPS、異なるノンス2つGPS เดียวกัน nonce ต่างกัน 2 ตัว | PASS — two different commitments (hiding property confirmed)異なるコミットメント2つ(hiding性を確認)commitment ต่างกัน 2 ค่า (ยืนยัน hiding property) |
A chat AI given only a decoding guide cannot verify anything, because it cannot issue the GraphQL query to fetch the on-chain state. In our test, one chat model, unable to fetch, produced a fabricated region and fish species (a hallucination). A verifier needs a way to actually read the chain. デコードガイドのみを渡されたチャットAIは何も検証できない。GraphQLクエリを発行してオンチェーンstateを取得する手段がないためである。テストでは、取得できないチャットモデルが捏造した地域名と魚種を出力した(ハルシネーション)。検証者にはチェーンを実際に読む手段が必要である。 AI แชทที่ได้รับเฉพาะคู่มือถอดรหัสไม่สามารถตรวจสอบอะไรได้ เพราะไม่สามารถส่ง GraphQL query เพื่อดึง state บนเชน ในการทดสอบ โมเดลแชทหนึ่งที่ไม่สามารถดึงข้อมูลได้สร้างภูมิภาคและชนิดปลาปลอมขึ้นมา (hallucination) ผู้ตรวจสอบต้องมีวิธีอ่านเชนจริง ๆ
verify_catch MCP tool
3.2 verify_catch MCPツール
3.2 เครื่องมือ MCP verify_catch
GYOTAK added verify_catch to its existing MCP server (registered on Smithery). The tool:
GYOTAKは既存のMCPサーバー(Smithery登録済み)に verify_catch を追加した。このツールは:
GYOTAK เพิ่ม verify_catch ในเซิร์ฟเวอร์ MCP ที่มีอยู่ (ลงทะเบียนบน Smithery) เครื่องมือนี้:
gps_recoverable: falsegps_recoverable: false を付与するgps_recoverable: falseA real transaction was recorded on preprod, then verified from Claude Desktop through the GYOTAK MCP server — without trusting GYOTAK’s database. preprodに実トランザクションを記録し、GYOTAK MCPサーバー経由でClaude Desktopから検証した — GYOTAKのデータベースを一切信頼せずに。 ธุรกรรมจริงถูกบันทึกบน preprod จากนั้นตรวจสอบจาก Claude Desktop ผ่านเซิร์ฟเวอร์ GYOTAK MCP — โดยไม่เชื่อถือฐานข้อมูลของ GYOTAK
record: CR-TESTV3-INSIDE-02 contract: 2e519c349331a6aaee82a7ed31aa5e39d6a3995f6cf85ec2256c97cda9a8c302 tx: b32f3328a0e1ac73adf41ce3ac665626b7a98f9e921ce7885a52b83e83ad078a block: 1602801 network: preprod
| Fieldフィールドฟิลด์ | Result結果ผลลัพธ์ |
|---|---|
| Region | ✓ Pran Buri, Prachuap Khiri Khan — recovered from on-chain stateオンチェーンstateから復元กู้คืนจาก state บนเชน |
| Fish | ✓ Kuro-Aji-Modoki 1.28 kg, He-Dai 0.5 kg |
| Photo hash | ✓ 80938b94… — tamper check available改ざん検出可能ตรวจสอบการปลอมแปลงได้ |
| GPS | ✗ Hidden as persistentCommit (f50ef64d…) — NOT recoverable. Only “within Pran Buri district” is provable.persistentCommitで秘匿(f50ef64d…)— 復元不可。「Pran Buri地区内」のみ証明可能。ซ่อนด้วย persistentCommit (f50ef64d…) — กู้คืนไม่ได้ พิสูจน์ได้เฉพาะ “ภายในอำเภอปราณบุรี” |
As of 2026-07-11, the v3 contract is also deployed and live on Midnight mainnet (contract: bc33d8c05852decd4ef183201a8a9f3c25eabaa46a81786f306b95397ed118ab). It currently holds no records; the first will be inscribed with the next real catch. The demonstration above was performed on preprod, where test records were freely created; mainnet carries no test records.
2026年7月11日現在、v3コントラクトはMidnight mainnetにもデプロイ・稼働中である(コントラクト: bc33d8c05852decd4ef183201a8a9f3c25eabaa46a81786f306b95397ed118ab)。現時点ではレコード0件であり、次の実際の漁獲時に最初のレコードが刻まれる。上記の実証はpreprodで行ったものであり、mainnetにはテストレコードは存在しない。
ณ วันที่ 2026-07-11 สัญญา v3 ยังถูก deploy และใช้งานบน Midnight mainnet ด้วย (คอนแทรกต์: bc33d8c05852decd4ef183201a8a9f3c25eabaa46a81786f306b95397ed118ab) ปัจจุบันยังไม่มีรายการ รายการแรกจะถูกจารึกเมื่อจับปลาจริงครั้งถัดไป การสาธิตข้างต้นดำเนินการบน preprod ซึ่งสร้างรายการทดสอบได้อย่างอิสระ mainnet ไม่มีรายการทดสอบ
https://line-harness.gyotak.workers.dev/mcp)verify_catch, fetches on-chain state, and reports region / fish / whether GPS is recoverable.https://line-harness.gyotak.workers.dev/mcp)verify_catch を呼び、オンチェーンstateを取得し、地域・魚種・GPSが復元可能かを報告する。https://line-harness.gyotak.workers.dev/mcp)verify_catch ดึง state บนเชน และรายงานภูมิภาค / ปลา / GPS กู้คืนได้หรือไม่preprod: https://indexer.preprod.midnight.network/api/v4/graphqlmainnet: https://indexer.mainnet.midnight.network/api/v4/graphqlquery { contractAction(address:"<contract>") { state } }0x01 separator between 32-byte gpsCommitment and 32-byte photoHash. After photoHash, read length-prefixed strings: regionLabel, catchDate, fishSpecies, fishManifest (10 slots).gpsCommitment without the secret nonce.preprod: https://indexer.preprod.midnight.network/api/v4/graphqlmainnet: https://indexer.mainnet.midnight.network/api/v4/graphqlquery { contractAction(address:"<contract>") { state } }gpsCommitment と32バイトの photoHash の間の 0x01 セパレータをスキャンする。photoHash以降は長さプレフィクス付き文字列: regionLabel, catchDate, fishSpecies, fishManifest(10スロット)を読む。gpsCommitment からGPSを復元できない。preprod: https://indexer.preprod.midnight.network/api/v4/graphqlmainnet: https://indexer.mainnet.midnight.network/api/v4/graphqlquery { contractAction(address:"<contract>") { state } }0x01 ระหว่าง gpsCommitment 32 ไบต์ และ photoHash 32 ไบต์ หลัง photoHash อ่านสตริงที่มี length prefix: regionLabel, catchDate, fishSpecies, fishManifest (10 สล็อต)gpsCommitment ได้หากไม่มี secret nonceverify_catch MCP tool live on production Worker (7 tools total), successfully called from Claude Desktop.persistentHash.bc33d8c05852decd4ef183201a8a9f3c25eabaa46a81786f306b95397ed118ab). Mainnet carries a single production contract and no test records; the first catch record will appear with the next real catch.verify_catch MCPツールが本番Worker上で稼働中(全7ツール)。Claude Desktopからの呼び出し成功。persistentHash が一致。bc33d8c05852decd4ef183201a8a9f3c25eabaa46a81786f306b95397ed118ab)。メインネットには単一の本番コントラクトのみ、テストレコードなし。最初の漁獲記録は次の実際の漁獲時に刻まれる。verify_catch ทำงานบน production Worker (ทั้งหมด 7 เครื่องมือ) เรียกจาก Claude Desktop สำเร็จpersistentHash ตรงกันbc33d8c05852decd4ef183201a8a9f3c25eabaa46a81786f306b95397ed118ab) Mainnet มีคอนแทรกต์ production ตัวเดียว ไม่มีรายการทดสอบ รายการจับปลาแรกจะปรากฏเมื่อจับปลาจริงครั้งถัดไป| Fieldフィールドฟิลด์ | Value値ค่า |
|---|---|
| Document ID | ECOSUS-TR-2026-012 |
| Publisher発行者ผู้เผยแพร่ | ECOSUS CO., LTD. · 0205562030631 · Pranburi, Thailand |
| Class区分หมวดหมู่ | Public Defensive Publication |
| Licenseライセンスใบอนุญาต | CC BY 4.0 |
| Date日付วันที่ | 2026-07-11 |
| Prior Report先行報告รายงานก่อน | TR-2026-011 · gyotak-temp-log Cold-Chain ZKP |
| Related関連ที่เกี่ยวข้อง | MCP Server · Smithery · Endpoint |
| Author著者ผู้เขียน | Takuya Ogura, Chairman, ECOSUS CO., LTD. |
| Archiveアーカイブจัดเก็บ | (Perma.cc — assigned at publication)(Perma.cc等 — 発行時に付与)(Perma.cc — กำหนดเมื่อเผยแพร่) |