./research / verifiable-audit-layer
Yapay zeka için doğrulanabilir bir denetim katmanı.
Model çıkarımı ve ajan yürütmesi için kurcalamayı belli eden bir denetim katmanı: kanonik serileştirme, alan ayrımlı özetleme, DSSE imzaları, çalıştırma başına bir Merkle DAG ve hiçbir çalıştırmanın silinmediğini kanıtlayan çalıştırmalar arası bir Merkle Mountain Range. Her ilkel, gerçek alternatiflere karşı doğrudan bir kıyaslamadan seçildi ve ham veriler depoya işlendi. Bu not, tasarımın kendisi ve arkasındaki deneylerdir.
Tehdit modeli
Depolamayı denetleyen ve kayıtları sonradan yeniden yazabilen bir saldırgan varsayıyoruz; bunları üreten operatör dahil. Amaç, mühürlenmiş bir çalıştırmadaki her düzenlemenin saptanabilir olması, kaydın yıllarla ölçülen bir saklama süresi boyunca doğrulanabilir kalması ve doğrulamanın hiçbir özel girdiyi açığa çıkarmamasıdır. İki özellik baştan sona ayrı tutulur: tek bir çalıştırmanın bütünlüğü ve çalıştırmalar kümesinin eksiksizliği. Çalıştırma başına bir makbuz ilkini verir ve ikincisi hakkında bir şey söylemez, bu yüzden ikisi ayrı ayrı tasarlanır.
Aşağıdaki her seçim aynı biçimde yapıldı. Bir ilkelin en iyisi olduğunu öne sürmüyoruz; onu aynı makinede inandırıcı alternatiflere karşı kıyaslıyor ve ham veriyi işliyoruz, öyle ki buradaki her rakam tek bir komutla yeniden üretilir. Süreler, ısınma atıldıktan sonra birkaç çalıştırmanın en hızlısıdır; kararsız bir ölçüm gizlenmek yerine işaretlensin diye ortalama ve standart sapma saklanır. Sayılar CPython 3.14 üzerinde tek bir AMD64 ana bilgisayardan gelir ve mutlak değerler olarak değil, oranlar olarak anlamlıdır.
Deneyler ve sonuçlar
Her kilometre taşı, tek bir ölçüm değil, gerçek alternatiflere karşı doğrudan bir testti. Genel bakış aşağıda; her birinin ayrıntılı sonuçları izleyen bölümlerde.
| Kilometre taşı | Karşı test edildiği | Sonuç |
|---|---|---|
| Kanonik biçim | naif JSON, CBOR | JCS, bayt bayt aynı, ~3x maliyet |
| Özetleme | SHA-256, BLAKE3, keccak-256 | keccak yerel 17x, aynı baytlar |
| Yerel çekirdek | pip arka uçları vs Rust | mühürleme 6x, bayt bayt aynı kök |
| İmza | ECDSA, BLS, ML-DSA | Ed25519, 64 B, deterministik |
| Post-kuantum | ML-DSA 44 / 65 / 87 | aşamalı, doğrulama başa baş, 38x boyut |
| Çalıştırma başına iz | 8 sahtecilik saldırısı, ek yük | hepsi yakalandı, ~121 us / olay |
| Çalıştırmalar arası günlük | düz Merkle yeniden inşası | MMR, düz ekleme, 483x |
Kanonik serileştirme
Bir kapsül; Python çekirdeğimizde, TypeScript istemcimizde ve bir denetçinin kendi aracında aynı baytlara özetlenmelidir, yoksa geçerli bir kayıt doğrulamada başarısız olur. RFC 8785'i (JSON Canonicalization Scheme) kullanıyoruz; bu, sayı biçimlendirmesini, anahtar sırasını UTF-16 kod birimine göre ve sonlu olmayan değerlerin reddini sabitler. Onu naif anahtar sıralı JSON'a ve CBOR'a karşı test ettik.
| Yaklaşım | Python vs Node | Maliyet |
|---|---|---|
| Naif sıralı JSON | Unicode ve sayılarda ayrışır | taban çizgisi |
| RFC 8785 JCS | bayt bayt aynı | serileştirmede yaklaşık 3x |
| CBOR | ikili, okumak için bir kod çözücü gerektirir | derli toplu |
Naif JSON, çalışma zamanları arasında Unicode sıralamasında ve sayı biçimlendirmesinde ayrışır, böylece diller arası doğrulamayı sessizce bozar. JCS her ikisinde de bayt bayt aynıdır, serileştirme süresinin yaklaşık 3 katında; bu, özet başına bir kez ödenir ve çevresindeki özetleme ile ağ işine kıyasla ihmal edilebilir. Ondan tam olarak bir uygulama tutuyoruz. Yerel modülümüz kendi JSON serileştiricisini getirdiğinde onu kaldırdık, çünkü sıradan girdilerde uyuşup bir saldırganın seçebileceği sınır durumlarında ayrışan ikinci bir kanonikleştirici, hiçbirinden kötüdür.
Özetleme ve yerel çekirdek
Yapraklar BLAKE3 ile, Merkle düğümleri keccak-256 ile özetlenir; ikisi de bir iç düğümün yaprak gibi sunulduğu ikinci ön görüntü sınıfını kapatmak için RFC 6962 alan ayrımıyla (yapraklar ve iç düğümler için ayrı önekler). keccak-256, SHA3-256 değildir; ikisi bir permütasyonu paylaşır ama bir dolgu baytında ayrılır ve zincir üstü doğrulayıcı keccak konuşur, dolayısıyla sessiz bir ikame her kökü zincir üstünde başarısız kılar. Bu yüzden özetleme katmanı istenen algoritmayı hesaplar ya da hata fırlatır, asla bir benzerini değil, ve algoritmayı her kapsülde kaydeder, öyle ki bir doğrulayıcı, yerelde kurulu olandan çıkarım yapmak yerine tam işlevi yeniden üretir.
| İlkel, 64 B girdi | Verim | Not |
|---|---|---|
| SHA-256 (stdlib) | 1,50M ops/s | taban çizgisi, hep var |
| BLAKE3 (pip) | 1,44M ops/s | SHA-256 ile başa baş |
| keccak-256 (pip) | 99k ops/s | 15x daha yavaş, darboğaz |
| keccak-256 (Rust çekirdek) | 1,69M ops/s | pip'ten 17x daha hızlı |
keccak'in standart kütüphane uygulaması yoktur; yerel modülü inşaya değer kılan da budur. Fark, olay boyutundaki girdilerde en geniştir, çünkü pycryptodome'un oradaki maliyeti özetleme değil, çağrı başına nesne ayırmadır; tam da bir denetim izinin en çok özetlediği boyut. Uçtan uca, yerel çekirdek 1000 olaylık bir çalıştırmanın mühürlenmesini saniyede 78'den 491 mühre, yaklaşık 6x çıkarır. Kritik olan: hızlandırıcıyı etkinleştirmek sonucu değiştiremez: aynı çalıştırmayı crate ile ve crate olmadan mühürlemek bit bit aynı bir kök verir, bir uygunluk paketi her iki yolu da algoritma yazarlarının yayımladığı vektörlere karşı denetler ve CI tek bir kararlı ABI (abi3) tekerleği inşa edip bu tek yapıyı 3.10'dan 3.14'e her Python'da doğrular. Kurmak hızı değiştirir, başka bir şeyi değil.
On yıllık bir kayıt için imzalar
Bir denetim kaydındaki imza, kayıt tartışılabilir kaldığı sürece dayanmalıdır ve YZ günlükleme yükümlülükleri artık on yıla doğru gidiyor. Şema, bir kayıt hâlâ saklama penceresindeyken kırılırsa, bir saldırgan onu sahteleyip geriye tarihleyebilir, böylece tüm arşiv bir anda çöker. Ed25519'u ECDSA, BLS ve NIST post-kuantum ailesi ML-DSA'ya karşı, verim ve boyutlarda kıyasladık.
| Şema | Doğrulama (ops/s) | İmza boyutu |
|---|---|---|
| ECDSA P-256 | 16 887 | ~72 B |
| ML-DSA-44 (post-kuantum) | 10 725 | 2420 B |
| Ed25519 | 10 375 | 64 B |
| BLS12-381 | yalnız referans uygulama | 96 B, toplar |
İki sonuç, taşıdığımız varsayımları devirdi ve ikisini de kayda geçiriyoruz. Ed25519 doğrulamada en hızlı değildir: ECDSA P-256, optimize edilmiş kütüphane derlemesinde yaklaşık 1,6x daha hızlı ölçüldü. Ed25519, imza boyutu ve determinizm (RFC 8032) sayesinde varsayılan kalır; bu, imzalar hâlâ doğrulanırken özel anahtarı sızdıran ECDSA nonce yeniden kullanım arızasını ortadan kaldırır. Ve post-kuantum imzalar doğrulamada yavaş değildir: ML-DSA-44, Ed25519'u kıl payı geçti; maliyeti imzalamada (yaklaşık 13x daha yavaş) ve boyutta (yaklaşık 38x bayt). Bir iz bir kez imzalanıp yıllarca doğrulandığından, pahalı taraf en az yaptığımız taraftır. BLS bir sayıda değil, bir gereksinimde reddedildi: toplama, birçok imzayı 96 bayta katlar, ama bir toplam hep-ya-da-hiç doğrulanır ve her anahtar ile mesajı gerektirir; bu da bir kararın bir dalını gerisini açığa çıkarmadan ifşa etmekle bağdaşmaz.
Önemli olan yeniden çerçeveleme: imzalar gizli değildir, dolayısıyla "şimdi topla, sonra çöz" geçerli değildir ve gerçek tehdit, saklama penceresi içindeki geriye dönük sahteciliktir. Bir kökü kamusal bir deftere sabitlemek, bir kaydın ne zaman var olduğunu imza şemasından bağımsız kanıtlar, öyle ki kırık bir anahtar, bir kaydı kimin mühürlediğini kanıtlama yetisini götürür ama ne zaman ya da neyi değil. Bu yüzden sabitleme kritik yoldadır ve ML-DSA onun ardında aşamalanmıştır; DSSE zarfı algoritma-çevik tutulur ve algoritma kapsül başına kaydedilir.
Çalıştırma başına denetim izi
Her çalıştırma; yalnızca-ekle ve özet-zincirli bir olay dizisidir (LLM çağrıları, araç çağrıları, getirmeler, alt-ajan üretimleri, insan onayları, koruma bandı kararları), hepsinin üzerinde bir Merkle kökü ve kökün üzerinde bir DSSE imzasıyla. Yalnızca girdi ve çıktıların özetleri saklanır, asla yükler değil, dolayısıyla iz varsayılan olarak gizlilik korur. Doğrulayıcı yalnızca geçerli ya da geçersiz döndürmez; kırılan güvenceyi adlandırır.
| İşlem (102 olaylık çalıştırma) | Maliyet | Ölçekleme |
|---|---|---|
| Bir olay kaydetmek | ~121 us | düz, bir adımın %0,01'inin altında |
| Mühürlemek, kökü inşa etmek | 0,15 ms | olaylarda doğrusal |
| Doğrulamak, tüm yaprakları yeniden hesaplamak | 9,2 ms | doğrusal, mühürlemenin yaklaşık 60x'i |
Kaydetmek, model gidiş-dönüşünün baskın olduğu tipik bir ajan adımının yüzde birinin yüzde birinden azdır, dolayısıyla ek yük örnekleme için bir gerekçe değildir ve iz istatistiksel değil eksiksiz kalır. Doğrulama, mühürlemeden çok daha ağırdır çünkü her yaprağı içerikten yeniden hesaplar, oysa mühürleme ağacı yalnızca zaten var olan özetler üzerinde inşa eder. Bu asimetri, kaydetmenin sabit, doğrulamanın seyrek olduğu bir denetim izi için doğrudur ve toplu yeniden doğrulamayı, yerel çekirdek ile paralelliğin sırada karşılığını vereceği yer olarak işaretler. Güvenceleri somutlaştırmak için bir demo, mühürlenmiş bir çalıştırmaya sekiz biçimde saldırır; her biri belirli bir gerekçeyle reddedilir:
| Saldırı | Reddedildiği gerekçe |
|---|---|
| Bir model çıktısını yeniden yazmak | yaprak özeti uyuşmazlığı |
| Bir olayı silmek ya da eklemek | olay sayısı uyuşmazlığı |
| Olayları yeniden sıralamak | zincir kırılması |
| Çalıştırmayı budamak | zincir başı uyuşmazlığı |
| Özet algoritmasını düşürmek | yaprak özeti uyuşmazlığı |
| Yanlış anahtar altında sunmak | imza doğrulanmıyor |
Çalıştırmalar arası şeffaflık günlüğü
Çalıştırma başına geçerli bir kapsül, çalıştırmalar kümesinin eksiksiz olduğunu kanıtlayamaz. Rahatsız edici bir çalıştırmayı düşüren bir operatör, tek tek kusursuz kapsüllerden bir koleksiyona ve deliği olan bir tarihe sahiptir. Bunu, kapsül köklerinden oluşan tek bir yalnızca-ekle günlüğüyle kapatırız; bu günlük, içerme kanıtlarını (bir çalıştırma günlüktedir) ve tutarlılık kanıtlarını (daha erken bir boyuttaki günlük, şimdiki günlüğün tam bir önekidir) destekler. Tutarlılık sansürü yakalar: bir çalıştırması çıkarılıp yeniden inşa edilen bir günlük içsel olarak iyi biçimlidir ve hayatta kalan her kapsül hâlâ doğrulanır, ama önceden yayımlanmış köke karşı bir tutarlılık denetiminde başarısız olur ve aynı denetim geriye tarihli bir eklemeyi reddeder. Bu yalnızca kurcalamadan önce sabitlenmiş bir köke karşı işler, dolayısıyla o kök, operatörün gözden geçiremeyeceği bir yerde, örneğin kamusal bir çıpada yaşamalıdır.
Düz bir Merkle ağacı yerine bir Merkle Mountain Range kullanıyoruz, çünkü bir ekleme yalnızca düğüm ekler ve hiçbirini yeniden yazmaz; bu, günlüğün bir-kez-yaz ya da nesne deposunda yaşamasına izin verir ve günlük büyüdükçe eski içerme kanıtlarını geçerli tutar. Bu özellik yalnızca elverişli değil, neredeyse optimaldir: ePrint 2025/234, her özlü yalnızca-ekle taahhüdünün üst-doğrusal sayıda tanık güncellemesi doğurması gerektiğini kanıtlar ve yakın bir MMR varyantı sınıra esasen ulaşır.
| Günlük boyutu | MMR inşası | Düz yeniden inşa |
|---|---|---|
| 500 | 1,3 ms | 158 ms (120x) |
| 1000 | 2,6 ms | 618 ms (237x) |
| 2000 | 5,2 ms | 2491 ms (483x) |
Günlük büyüdükçe ekleme düz kalır (hem 100 hem 10 000 kayıtta saniyede yaklaşık 390k ekleme), oysa düz bir ağacı yeniden inşa aynı aralıkta saniyede 8176 kökten 84'e düşer; karesel-karşı-doğrusal-logaritmik imza. Depolama, kayıt başına 2,00 saklanan özette oturur ve içerme kanıtları 100 ile 100 000 kayıt arasında yalnızca 7 adımdan 17 adıma büyür. Kaybettiğimiz yer: tutarlılık kanıtlarımız O(log^2 n)'dir; ulaşılabilir O(log n) yerine eski günlüğün her tepesi için bir yol taşır, 100 000 kayıtta birkaç kilobayt ve bir gözden geçirenin okuyarak denetleyebileceği bir yapı için bilinçli bir takas.
Aşmadığımız sınırlar
Özetleme kurcalama kanıtı verir, kurcalanamazlık değil. Bir çalıştırmayı yeniden inşa edip kökünü yeniden hesaplayan bir saldırgan, kendi içinde tutarlı bir kayıt üretir, çünkü bir Merkle kökü olayların kökle uyuştuğunu kanıtlar, kökün yayımlanan kök olduğunu değil. İmza bunu yakalar ve kamusal çıpa zamanı kanıtlar. Şeffaflık günlüğü büyük ölçekte aynı varsayıma dayanır: silinmiş bir çalıştırmayı yalnızca silmeden önce sabitlenmiş bir köke göre saptar. Bu sınırları üründe ve demolarında beyan ederiz ve bir test, sahtecilik demosunun durdurmadığımız saldırıyı göstermeyi sürdürdüğünü doğrular, öyle ki dürüst durum sessizce yok olamaz.
Yeniden üretilebilirlik
Buradaki her rakam, tek bir komutla yeniden koşan işlenmiş bir kıyaslamadan gelir; testlerin, diller arası ve uygulamalar arası uygunluk paketlerinin ve Python 3.10'dan 3.14'e yerel çekirdekle ve çekirdeksiz çalıştıran CI matrisinin yanında. Yöntem, ham JSON ve karar notları (her seçimin kaybettiği boyutlar dahil) depodadır, çünkü YZ'yi denetlenebilir kılan bir katmanın kendisi de denetlenebilir olmalıdır.