D-20260816-08|UGC Presentation Metadata 可變修訂¶
背景與驅動力¶
UGC 的 GLB、CID、PhysicsManifest、版權授權、作者與 lineage 必須不可變,但產品原始規劃允許
作者在不換 CID 的情況下修改顯示名稱、描述與 tags。先前把名稱與 tags 混入
UgcUploadEvent.metadata,會讓它們成為原 upload 簽章的一部分;若直接覆寫該事件,既有簽章必然
失效。另一方面,把可變欄位完全放在 ledger 外又無法建立跨 peer 一致的作者權威與 revision。
考慮過的選項¶
- 直接修改既有 upload event:破壞 append-only log 與原簽章,不採。
- presentation 完全留在本機或 provider:不影響簽章,但沒有全網權威、不同 provider 會分歧,不採。
- 保留不可變 upload,另寫作者簽署的 revision event:原簽章與 CID 不變,同時保有可驗權威;採納。
決定¶
UGCMetadata只含 admission/內容不可變欄;UgcUploadEvent.presentation建立 revision 0。- 新增永久單簽事件
ugc-metadata-update,內容為 exact CID、完整替換的UgcPresentationMetadata與下一個 revision。事件由原作者以 chain-bound ledger digest 簽署; 更新不修改或重新驗算舊 upload event。 - 只接受
currentRevision + 1;成功 presentation 之間至少相隔 1 小時。冷卻以事件進入 canonical fold 時已單調推進的state.derivedAt計算,成功後presentationUpdatedAt亦記錄 該 effective time;事件原始timestamp只供簽署與稽核,不作冷卻鐘。未知 CID 或 live state 尚未追上 revision 時 defer;作者不符、stale、冷卻未滿或黑名單 CID reject/fold no-op。 retired 與 similarity-pending 仍可更新,且更新不傳播到 successor CID。 - name 至多 256 UTF-8 bytes;description 至多 500 Unicode code points 且 2000 UTF-8 bytes; tags 至多 32 筆、每筆 64 UTF-8 bytes。文字必須 NFC 且不得含 control/format code point;UI 只能以純文字呈現。
metadata_update_minor預設 0。未來非零時,扣款與 revision 套用是單一原子 fold;失敗更新不扣款。 presentation、revision 與 updatedAt 都是 current checkpoint 必填資料。
後果與影響¶
既有 upload/asset 簽章與 CID 不會因改名失效;每次修改本身則有獨立、可驗、可重播的簽章。
事件目錄增加一種永久事件,main 與 pinning vendor 必須同步 exact schema。專案仍在 pre-launch,
因此直接採 current wire/checkpoint 形狀,不提供混合 metadata 或舊 checkpoint migration。
同一 canonical derivedAt 下連續倒填多筆 update 只會接受第一筆;下一筆須等 canonical clock
再前進至少 1 小時,不能以人為拉開事件 timestamp 繞過冷卻或造成自鎖。