./research / verifiable-audit-layer
ชั้นตรวจสอบที่พิสูจน์ได้สำหรับ AI.
ชั้นตรวจสอบที่เผยร่องรอยการปลอมแปลงสำหรับการอนุมานของโมเดลและการทำงานของเอเจนต์: การทำอนุกรมแบบบัญญัติ, การแฮชแบบแยกโดเมน, ลายเซ็น DSSE, Merkle DAG ต่อการรัน และ Merkle Mountain Range ข้ามการรันที่พิสูจน์ว่าไม่มีการรันใดถูกลบ ทุกพรีมิทีฟถูกเลือกจากการวัดสมรรถนะแบบตัวต่อตัวกับทางเลือกจริง พร้อมข้อมูลดิบที่คอมมิตไว้ บันทึกนี้คือการออกแบบและการทดลองที่อยู่เบื้องหลัง
แบบจำลองภัยคุกคาม
เราสมมติผู้ไม่หวังดีที่ควบคุมที่จัดเก็บและสามารถเขียนบันทึกใหม่ในภายหลัง รวมถึงผู้ดำเนินการที่สร้างบันทึกนั้นเอง เป้าหมายคือการแก้ไขใด ๆ ต่อการรันที่ถูกผนึกต้องตรวจจับได้ บันทึกยังพิสูจน์ได้ตลอดช่วงเก็บรักษาที่วัดเป็นปี และการพิสูจน์ต้องไม่เผยอินพุตส่วนตัวใด ๆ มีสองคุณสมบัติที่แยกจากกันตลอด คือ ความสมบูรณ์ (integrity) ของการรันเดียว และ ความครบถ้วน (completeness) ของเซตการรัน ใบเสร็จต่อการรันให้อย่างแรกและไม่กล่าวถึงอย่างหลัง จึงออกแบบทั้งสองแยกกัน
ทุกทางเลือกด้านล่างทำด้วยวิธีเดียวกัน เราไม่อ้างว่าพรีมิทีฟหนึ่งดีที่สุด แต่เทียบกับทางเลือกที่น่าเชื่อถือบนเครื่องเดียวกันและคอมมิตข้อมูลดิบ เพื่อให้ตัวเลขใด ๆ ที่นี่ทำซ้ำได้ด้วยคำสั่งเดียว เวลาที่รายงานคือค่าที่เร็วที่สุดจากหลายการรันหลังตัดช่วงอุ่นเครื่องออก โดยเก็บค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐานไว้เพื่อให้การวัดที่ไม่นิ่งถูกทำเครื่องหมายแทนที่จะถูกซ่อน ตัวเลขมาจากโฮสต์ AMD64 เดียวบน CPython 3.14 และมีความหมายในฐานะอัตราส่วน ไม่ใช่ค่าสัมบูรณ์
การทดลองและผลลัพธ์
แต่ละหมุดหมายเป็นการทดสอบแบบตัวต่อตัวกับทางเลือกจริง ไม่ใช่การวัดครั้งเดียว ภาพรวมอยู่ด้านล่าง ส่วนผลละเอียดของแต่ละอย่างอยู่ในหัวข้อถัดไป
| หมุดหมาย | ทดสอบกับ | ผลลัพธ์ |
|---|---|---|
| รูปแบบบัญญัติ | JSON แบบง่าย, CBOR | JCS, เหมือนกันทุกไบต์, ~3x ต้นทุน |
| การแฮช | SHA-256, BLAKE3, keccak-256 | keccak เนทีฟ 17x, ไบต์เดียวกัน |
| แกนเนทีฟ | แบ็กเอนด์ pip กับ Rust | ผนึก 6x, รากเหมือนกันทุกไบต์ |
| ลายเซ็น | ECDSA, BLS, ML-DSA | Ed25519, 64 B, กำหนดได้แน่นอน |
| หลังควอนตัม | ML-DSA 44 / 65 / 87 | เป็นระยะ, พิสูจน์ทัดเทียม, 38x ขนาด |
| ร่องรอยต่อการรัน | 8 การโจมตีปลอมแปลง, ค่าใช้จ่ายเพิ่ม | จับได้ทั้งหมด, ~121 us / เหตุการณ์ |
| ล็อกข้ามการรัน | สร้าง Merkle ใหม่แบบง่าย | MMR, ต่อท้ายแบบราบ, 483x |
การทำอนุกรมแบบบัญญัติ
แคปซูลต้องแฮชเป็นไบต์เดียวกันในแกน Python ของเรา ในไคลเอนต์ TypeScript ของเรา และในเครื่องมือของผู้ตรวจสอบเอง มิฉะนั้นบันทึกที่ถูกต้องจะพิสูจน์ไม่ผ่าน เราใช้ RFC 8785 (JSON Canonicalization Scheme) ซึ่งตรึงการจัดรูปตัวเลข ลำดับคีย์ตามหน่วยรหัส UTF-16 และการปฏิเสธค่าที่ไม่จำกัด เราทดสอบกับ JSON ที่เรียงคีย์แบบง่ายและกับ CBOR
| แนวทาง | Python กับ Node | ต้นทุน |
|---|---|---|
| JSON เรียงแบบง่าย | เบี่ยงเบนที่ Unicode และตัวเลข | เส้นฐาน |
| RFC 8785 JCS | เหมือนกันทุกไบต์ | ราว 3x ตอนทำอนุกรม |
| CBOR | ไบนารี ต้องมีตัวถอดรหัสจึงอ่านได้ | กระชับ |
JSON แบบง่ายเบี่ยงเบนระหว่างรันไทม์ที่การเรียง Unicode และการจัดรูปตัวเลข จึงทำลายการพิสูจน์ข้ามภาษาอย่างเงียบ ๆ ส่วน JCS เหมือนกันทุกไบต์ในทั้งสอง ที่ราว 3x ของเวลาอนุกรม จ่ายครั้งเดียวต่อแฮชและเล็กน้อยเทียบกับการแฮชและงานเครือข่ายรอบข้าง เราเก็บการนำไปใช้ของมันไว้เพียงหนึ่งเดียว เมื่อโมดูลเนทีฟของเรานำตัวทำอนุกรม JSON ของมันเองมาด้วย เราลบมันออก เพราะตัวทำบัญญัติที่สองซึ่งตรงกันบนอินพุตทั่วไปและเบี่ยงเบนบนกรณีขอบที่ผู้ไม่หวังดีเลือกได้ นั้นแย่กว่าไม่มีเลย
การแฮชและแกนเนทีฟ
ใบไม้แฮชด้วย BLAKE3 และโหนด Merkle ด้วย keccak-256 ทั้งคู่ใช้การแยกโดเมนตาม RFC 6962 (คำนำหน้าต่างกันสำหรับใบไม้และโหนดภายใน) เพื่อปิดคลาสพรีอิมเมจที่สองซึ่งโหนดภายในถูกเสนอเป็นใบไม้ keccak-256 ไม่ใช่ SHA3-256 ทั้งสองใช้เพอร์มิวเทชันร่วมกันแต่ต่างกันที่ไบต์แพดดิงหนึ่งไบต์ และตัวพิสูจน์ออนเชนพูด keccak การแทนที่อย่างเงียบ ๆ จึงทำให้ทุกรากล้มเหลวออนเชน ชั้นการแฮชจึงคำนวณอัลกอริทึมที่ร้องขอหรือโยนข้อผิดพลาด ไม่เคยให้ตัวปลอมที่คล้ายกัน และบันทึกอัลกอริทึมในทุกแคปซูลเพื่อให้ตัวพิสูจน์สร้างฟังก์ชันที่ถูกต้องซ้ำแทนที่จะอนุมานจากสิ่งที่ติดตั้งไว้ในเครื่อง
| พรีมิทีฟ, อินพุต 64 B | ปริมาณงาน | หมายเหตุ |
|---|---|---|
| SHA-256 (stdlib) | 1.50M ops/s | เส้นฐาน มีอยู่เสมอ |
| BLAKE3 (pip) | 1.44M ops/s | ทัดเทียมกับ SHA-256 |
| keccak-256 (pip) | 99k ops/s | ช้ากว่า 15x จุดคอขวด |
| keccak-256 (แกน Rust) | 1.69M ops/s | เร็วกว่า pip 17x |
keccak ไม่มีการนำไปใช้ในไลบรารีมาตรฐาน ซึ่งเป็นเหตุให้โมดูลเนทีฟคุ้มที่จะสร้าง ช่องว่างกว้างที่สุดที่อินพุตขนาดเหตุการณ์ เพราะต้นทุนของ pycryptodome ตรงนั้นคือการจองอ็อบเจกต์ต่อการเรียก ไม่ใช่การแฮช ซึ่งเป็นขนาดที่ร่องรอยการตรวจสอบแฮชบ่อยที่สุดพอดี ตั้งแต่ต้นจนจบ แกนเนทีฟยกการผนึกของการรัน 1000 เหตุการณ์จาก 78 เป็น 491 การผนึกต่อวินาที ราว 6x สิ่งสำคัญ: การเปิดตัวเร่งความเร็วไม่อาจเปลี่ยนผลลัพธ์ การผนึกการรันเดียวกันโดยมีและไม่มี crate ให้รากที่เหมือนกันทุกบิต ชุดทดสอบความสอดคล้องตรวจทั้งสองเส้นทางกับเวกเตอร์ที่ผู้เขียนอัลกอริทึมเผยแพร่ และ CI สร้าง wheel แบบ ABI เสถียร (abi3) เพียงอันเดียวและพิสูจน์อาร์ติแฟกต์เดียวนั้นบน Python ทุกเวอร์ชันตั้งแต่ 3.10 ถึง 3.14 การติดตั้งมันเปลี่ยนความเร็วเท่านั้น ไม่มีอย่างอื่น
ลายเซ็นสำหรับบันทึกที่ยาวนานหนึ่งทศวรรษ
ลายเซ็นบนบันทึกการตรวจสอบต้องคงอยู่ตราบเท่าที่บันทึกยังโต้แย้งได้ และภาระการบันทึกล็อกของ AI ตอนนี้มุ่งไปสู่หนึ่งทศวรรษ หากสคีมแตกในขณะที่บันทึกยังอยู่ในหน้าต่างเก็บรักษา ผู้ไม่หวังดีสามารถปลอมและลงวันที่ย้อนหลังได้ ทั้งคลังจึงล้มลงพร้อมกัน เราวัดสมรรถนะ Ed25519 เทียบกับ ECDSA, BLS และตระกูลหลังควอนตัมของ NIST คือ ML-DSA ในด้านปริมาณงานและขนาด
| สคีม | การพิสูจน์ (ops/s) | ขนาดลายเซ็น |
|---|---|---|
| ECDSA P-256 | 16,887 | ~72 B |
| ML-DSA-44 (หลังควอนตัม) | 10,725 | 2,420 B |
| Ed25519 | 10,375 | 64 B |
| BLS12-381 | การนำไปใช้อ้างอิงเท่านั้น | 96 B, รวมได้ |
สองผลลัพธ์พลิกสมมติฐานที่เราแบกมา และเราเก็บทั้งสองไว้ในบันทึก Ed25519 ไม่ใช่ตัวที่พิสูจน์เร็วที่สุด ECDSA P-256 วัดได้เร็วกว่าราว 1.6x บนแอสเซมบลีไลบรารีที่ปรับให้เหมาะ Ed25519 ยังเป็นค่าตั้งต้นด้วยขนาดลายเซ็นและความกำหนดได้แน่นอน (RFC 8032) ซึ่งขจัดความล้มเหลวจากการใช้ nonce ซ้ำของ ECDSA ที่รั่วกุญแจส่วนตัวขณะที่ลายเซ็นยังพิสูจน์ได้ และลายเซ็นหลังควอนตัมพิสูจน์ไม่ช้า ML-DSA-44 เฉือน Ed25519 เล็กน้อย โดยต้นทุนอยู่ที่การเซ็น (ช้ากว่าราว 13x) และขนาด (ราว 38x ไบต์) เพราะร่องรอยเซ็นครั้งเดียวและพิสูจน์เป็นปี ด้านที่แพงจึงเป็นด้านที่เราทำน้อยที่สุด BLS ถูกปฏิเสธด้วยข้อกำหนด ไม่ใช่ด้วยตัวเลข การรวมยุบลายเซ็นจำนวนมากเหลือ 96 ไบต์ แต่ตัวรวมพิสูจน์แบบทั้งหมดหรือไม่มีเลยและต้องใช้ทุกกุญแจและทุกข้อความ ซึ่งเข้ากันไม่ได้กับการเปิดเผยกิ่งหนึ่งของการตัดสินใจโดยไม่เผยส่วนที่เหลือ
การจัดกรอบใหม่ที่สำคัญ: ลายเซ็นไม่เป็นความลับ ดังนั้น "เก็บเกี่ยวตอนนี้ ถอดรหัสภายหลัง" จึงไม่ใช้ และภัยที่แท้จริงคือการปลอมย้อนหลังภายในหน้าต่างเก็บรักษา การยึดรากไว้กับบัญชีแยกประเภทสาธารณะพิสูจน์ว่าบันทึกมีอยู่ เมื่อใด โดยไม่ขึ้นกับสคีมลายเซ็น กุญแจที่แตกจึงเสียความสามารถในการพิสูจน์ว่า ใคร ผนึกบันทึก แต่ไม่เสีย เมื่อใด หรือ อะไร การยึดจึงอยู่บนเส้นทางวิกฤต และ ML-DSA จัดเป็นระยะไว้ข้างหลัง โดยซองจดหมาย DSSE คงความคล่องตัวเชิงอัลกอริทึมและบันทึกอัลกอริทึมต่อแคปซูล
ร่องรอยการตรวจสอบต่อการรัน
แต่ละการรันเป็นลำดับเหตุการณ์แบบต่อท้ายอย่างเดียวและร้อยด้วยแฮช (การเรียก LLM, การเรียกเครื่องมือ, การเรียกค้น, การสร้างเอเจนต์ย่อย, การอนุมัติของมนุษย์, การตัดสินของราวกันตก) พร้อมราก Merkle เหนือทั้งหมดและลายเซ็น DSSE เหนือราก จัดเก็บเฉพาะแฮชของอินพุตและเอาต์พุต ไม่เคยเก็บเพย์โหลด ร่องรอยจึงรักษาความเป็นส่วนตัวโดยปริยาย ตัวพิสูจน์ไม่เพียงคืนค่าว่าถูกต้องหรือไม่ แต่ระบุชื่อการรับประกันที่แตก
| การดำเนินการ (การรัน 102 เหตุการณ์) | ต้นทุน | การขยายขนาด |
|---|---|---|
| บันทึกหนึ่งเหตุการณ์ | ~121 us | ราบ, ต่ำกว่า 0.01% ของหนึ่งขั้น |
| ผนึก, สร้างราก | 0.15 ms | เชิงเส้นตามเหตุการณ์ |
| พิสูจน์, คำนวณทุกใบไม้ใหม่ | 9.2 ms | เชิงเส้น, ราว 60x ของการผนึก |
การบันทึกเป็นน้อยกว่าหนึ่งในร้อยของหนึ่งเปอร์เซ็นต์ของขั้นเอเจนต์ทั่วไป ซึ่งถูกครอบงำด้วยการวิ่งไป-กลับสู่โมเดล ค่าใช้จ่ายเพิ่มจึงไม่ใช่เหตุให้สุ่มตัวอย่าง และร่องรอยยังครบถ้วนแทนที่จะเป็นเชิงสถิติ การพิสูจน์หนักกว่าการผนึกมากเพราะคำนวณทุกใบไม้ใหม่จากเนื้อหา ขณะที่การผนึกสร้างต้นไม้เหนือแฮชที่มีอยู่แล้วเท่านั้น ความไม่สมมาตรนั้นถูกต้องสำหรับร่องรอยการตรวจสอบ ที่การบันทึกคงที่และการพิสูจน์เกิดยาก และมันชี้ว่าการพิสูจน์ซ้ำจำนวนมากคือจุดที่แกนเนทีฟและการทำงานขนานจะคุ้มค่าลำดับถัดไป เพื่อทำให้การรับประกันเป็นรูปธรรม เดโมโจมตีการรันที่ผนึกไว้แปดวิธี แต่ละวิธีถูกปฏิเสธด้วยเหตุผลเฉพาะ
| การโจมตี | ถูกปฏิเสธว่า |
|---|---|
| เขียนเอาต์พุตของโมเดลใหม่ | แฮชใบไม้ไม่ตรง |
| ลบหรือแทรกเหตุการณ์ | จำนวนเหตุการณ์ไม่ตรง |
| จัดลำดับเหตุการณ์ใหม่ | โซ่ขาด |
| ตัดการรันให้สั้น | หัวโซ่ไม่ตรง |
| ลดระดับอัลกอริทึมแฮช | แฮชใบไม้ไม่ตรง |
| นำเสนอด้วยกุญแจผิด | ลายเซ็นพิสูจน์ไม่ผ่าน |
ล็อกความโปร่งใสข้ามการรัน
แคปซูลต่อการรันที่ถูกต้องพิสูจน์ไม่ได้ว่าเซตของการรันครบถ้วน ผู้ดำเนินการที่ทิ้งการรันที่ไม่สะดวกถือครองชุดแคปซูลที่แต่ละอันสมบูรณ์แบบ กับประวัติที่มีรูโหว่ เราปิดช่องนี้ด้วยล็อกแบบต่อท้ายอย่างเดียวเพียงล็อกเดียวของรากแคปซูล ซึ่งรองรับการพิสูจน์การรวม (การรันหนึ่งอยู่ในล็อก) และการพิสูจน์ความสอดคล้อง (ล็อกที่ขนาดก่อนหน้าเป็นคำนำหน้าตรงของล็อกตอนนี้) ความสอดคล้องจับการเซ็นเซอร์ได้ ล็อกที่สร้างใหม่โดยเอาการรันหนึ่งออกนั้นรูปแบบภายในถูกต้องและทุกแคปซูลที่รอดยังพิสูจน์ได้ แต่ล้มเหลวในการตรวจความสอดคล้องกับรากที่เผยแพร่ก่อนหน้า และการตรวจเดียวกันปฏิเสธการแทรกที่ลงวันที่ย้อนหลัง สิ่งนี้ได้ผลเฉพาะต่อรากที่คอมมิตก่อนการปลอมแปลง ดังนั้นรากนั้นต้องอยู่ที่ใดที่ผู้ดำเนินการแก้ไขไม่ได้ เช่นจุดยึดสาธารณะ
เราใช้ Merkle Mountain Range แทนต้นไม้ Merkle แบบง่าย เพราะการต่อท้ายเพียงเพิ่มโหนดและไม่เคยเขียนโหนดใดใหม่ ซึ่งให้ล็อกอยู่บนที่จัดเก็บแบบเขียนครั้งเดียวหรือแบบอ็อบเจกต์ และคงการพิสูจน์การรวมเก่าให้ใช้ได้ขณะที่ล็อกโต คุณสมบัตินั้นเกือบเหมาะที่สุด ไม่ใช่เพียงสะดวก ePrint 2025/234 พิสูจน์ว่าคำมั่นแบบต่อท้ายอย่างเดียวที่กระชับใด ๆ ต้องเหนี่ยวนำจำนวนการอัปเดตพยานแบบซูเปอร์เชิงเส้น และตัวแปร MMR ที่ใกล้เคียงบรรลุขอบเขตนั้นโดยพื้นฐาน
| ขนาดล็อก | สร้าง MMR | สร้างใหม่แบบง่าย |
|---|---|---|
| 500 | 1.3 ms | 158 ms (120x) |
| 1,000 | 2.6 ms | 618 ms (237x) |
| 2,000 | 5.2 ms | 2,491 ms (483x) |
การต่อท้ายคงราบขณะที่ล็อกโต (ราว 390k การต่อท้ายต่อวินาทีทั้งที่ 100 และ 10,000 รายการ) ขณะที่การสร้างต้นไม้แบบง่ายใหม่ลดจาก 8,176 เหลือ 84 รากต่อวินาทีในช่วงเดียวกัน อันเป็นลายเซ็นกำลังสองเทียบกับเชิงเส้น-ลอการิทึม ที่จัดเก็บนิ่งอยู่ที่ 2.00 แฮชที่เก็บต่อรายการ และการพิสูจน์การรวมโตเพียงจาก 7 เป็น 17 ขั้นระหว่าง 100 ถึง 100,000 รายการ จุดที่เราเสีย: การพิสูจน์ความสอดคล้องของเราเป็น O(log^2 n) โดยแบกหนึ่งเส้นทางต่อยอดของล็อกเก่าแทน O(log n) ที่ทำได้ ไม่กี่กิโลไบต์ที่ 100,000 รายการ และเป็นการแลกโดยตั้งใจเพื่อโครงสร้างที่ผู้ทบทวนตรวจได้ด้วยการอ่าน
ขอบเขตที่เราไม่ข้าม
การแฮชให้หลักฐานการปลอมแปลง ไม่ใช่ภูมิคุ้มกันการปลอมแปลง ผู้ไม่หวังดีที่สร้างการรันใหม่และคำนวณรากของมันใหม่ผลิตบันทึกที่สอดคล้องกับตัวเอง เพราะราก Merkle พิสูจน์ว่าเหตุการณ์ตรงกับราก ไม่ใช่ว่ารากคือรากที่ถูกเผยแพร่ ลายเซ็นจับสิ่งนี้ และจุดยึดสาธารณะพิสูจน์เวลา ล็อกความโปร่งใสในภาพใหญ่วางอยู่บนสมมติฐานเดียวกัน มันตรวจพบการรันที่ถูกลบเฉพาะเมื่อเทียบกับรากที่คอมมิตก่อนการลบ เราระบุขอบเขตเหล่านี้ในผลิตภัณฑ์และเดโม และการทดสอบยืนยันว่าเดโมการปลอมยังคงแสดงการโจมตีที่เราไม่หยุด เพื่อให้กรณีที่ซื่อตรงนี้ไม่อาจหายไปอย่างเงียบ ๆ
ความสามารถในการทำซ้ำ
ทุกตัวเลขที่นี่มาจากการวัดสมรรถนะที่คอมมิตไว้ซึ่งรันซ้ำได้ด้วยคำสั่งเดียว เคียงข้างชุดทดสอบ ชุดความสอดคล้องข้ามภาษาและข้ามการนำไปใช้ และเมทริกซ์ CI ที่รัน Python 3.10 ถึง 3.14 ทั้งที่มีและไม่มีแกนเนทีฟ ระเบียบวิธี, JSON ดิบ และบันทึกการตัดสินใจ (รวมถึงมิติที่แต่ละทางเลือกแพ้) อยู่ในที่เก็บโค้ด เพราะชั้นที่ทำให้ AI ตรวจสอบได้ต้องตรวจสอบตัวเองได้ด้วย