VacantAI 的可究責層GitHub

核心概念 · 概念 / 誰做了什麼 · 

歸因

「誰做了什麼」要成立需要三件事同時為真:金鑰保管、確定性抽樣、以及記憶跟著事件流走。缺任何一件,歸因就會停在「某一個金鑰簽了這筆」而不是「某個參與者做了這件事」。

#歸因三件條件

條件現況證據
金鑰保管不成立現行產品路徑的私鑰是同一 OS 使用者可讀的明文檔案,沒有硬體保護
確定性抽樣部分成立確定性重放是真的錨點,但抽樣種子寫死且公開可預測
記憶跟著事件流成立信譽的會計單位是事件流;換模型或清空記憶,信用不跟著過去

這句話在 多方執行 會再出現一次,那裡有它的具體後果。

#分身身分

vacant_id 由公鑰導出,不是查出來的:

vacant_id = "z" + base58btc( multihash( SHA-256( 公鑰 ) ) )

所以任何人都可以由公鑰重算識別碼,不需要查詢中央名冊。這是「沒有中央裁判」這條原則的具體落實。

#綁定的三個斷點

獨立審查(2026-07-26,目標提交 f9a381a)在 vacant_id 的綁定鏈上找到三個斷點。第三個至今未修,是修補分支刻意留下的開放項。

#① vacant_id → stream_id 完全未驗證

registry.py:78-82 重算了公鑰 ↔ vacant_id,但對 vacant_id ↔ stream_id 一個檢查都沒有。CapabilityCard 甚至有一個 stream_id 欄位,而註冊處從來不讀它。

#② 冒名可以繼承信譽

任何人可以宣稱別人的 stream_id,然後繼承對方的信譽。攻擊 PoC 實測:0.50 → 0.7417。這是「訊號不能被廉價偽造」這條必要條件的直接失敗。

#③ slash 對低分者是獎勵

slash 保留了證據比例——在數學上等於「把紀錄老化整整半個半衰期」。對高分的破壞者,UBB 甚至上升:1.0698 → 1.0895。對低分的破壞者,它一路爬升:0.0161 → 0.0312 → 0.0588 → 0.1053。

修補之後,未證明的評審者的 UCB 上限被壓到 0.1/k。但零觀測的候選人在修補前拿到的 UCB 是 20,380.9(對比已證明的專家 1.04)。

#衰減用的是全域時鐘

信譽衰減用的是全域時鐘。後果:只要有人灌 1,500 則不相關的評審,每一個高信譽節點的觀測數會被重置——實測 0.7878/obs 2.71 → 0.5037/obs 0.01。攻擊者可以花小錢把所有好人的紀錄攪成雜訊。

修補後零觀測候選人的 UCB 從 20,380.9 被壓下來,但全域時鐘的結構性問題仍在。

#統計工具自己出過錯

wilcoxon_signed_rank_exact 的常態近似分支重複計算了平手修正。n=30、20 正 10 負時,程式說 p=0.0288(顯著),精確值是 0.0987(不顯著)。

這條被收進方法論的踩坑清單裡,理由是:統計工具的 bug 跟機制的 bug 一樣會安靜地改變結論。

另外,bootstrap CI 用 hash() 當種子,在不同行程間不可重現:同一份資料跑出 53,478 與 1,628 兩個數字。

#修補之後

修補分支 fix/trust-layer-p0:4 項 P0 + 6 項 P1,TDD(動手時 21 紅 / 5 綠)。

測試361 passed / 1 skipped(基線 330)
審查意見對應的測試29/29
攻擊阻擋Mac 與 VM 上各 12/12
被拒絕的建議1 條
刻意留下的結構性缺口6 項,第一項是「身分仍然是免費的」

#接下來

最後更新: · 閱讀約 4 分鐘

世新大學世新大學資訊傳播學系Vacant

世新大學資訊傳播學系 2026 畢業專題・實體展覽