歸因
「誰做了什麼」要成立需要三件事同時為真:金鑰保管、確定性抽樣、以及記憶跟著事件流走。缺任何一件,歸因就會停在「某一個金鑰簽了這筆」而不是「某個參與者做了這件事」。
#歸因三件條件
| 條件 | 現況 | 證據 |
|---|---|---|
| 金鑰保管 | 不成立 | 現行產品路徑的私鑰是同一 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 項,第一項是「身分仍然是免費的」 |

