---
status: SIGNED_EVENT_AND_REBUILDABLE_PROJECTION_PROTOCOL_SELF_TESTED_NOT_CONNECTED
production_write_changed: false
chain_write_performed: false
operator_signing_used: false
main_server_outage_continuity_proven: false
---

# 서명 이벤트·재생 가능한 projection staging

중앙 Mongo/Redis를 바로 교체하지 않고 write 경로를 단계적으로 옮길 수 있도록 `E:\aisfor\services\signedEventProjectionProtocol.js`를 추가했다.

## 이벤트 규칙

- 사용자/stream에 묶인 별도 Ed25519 key 서명
- chain ID, stream hash, event ID, idempotency key, sequence, 이전 event hash 포함
- plaintext 대신 encrypted payload의 ciphertext hash만 이벤트에 포함
- 초기 event type은 `projection.put`, `projection.delete`만 허용
- 사용자 key와 stream binding이 finalized identity proof에 포함돼야 함
- 각 event hash가 finalized block proof와 일치해야 함
- payload/signature/hash 변조는 fail-closed
- 같은 event/idempotency의 동일 재전송은 한 번만 적용
- 같은 idempotency key에 다른 event를 넣으면 충돌로 거부
- value version rollback과 event hash-chain 단절 거부

## projection rebuild

finalized event를 sequence 순서로 검증한 뒤 key hash별 ciphertext hash/version projection을 처음부터 재생한다. 입력 배열 순서를 바꿔도 같은 projection commitment가 나온다. 로컬 DB는 이 commitment로 검증 가능한 cache/projection이 될 수 있다.

self-test는 서명 이벤트 3개, 동일 event 중복, delete, 순서가 뒤섞인 rebuild를 검증했다. 최종 projection에는 한 entry가 남았고 commitment는 `5e5e15126a1e1bea747562fc818f2fa41f0113221142dfe47433d1a54480829a`였다. 변조, non-finalized proof, idempotency 충돌은 모두 거부됐다.

## 현재 경계

이 모듈은 production write route, canonical chain transaction, Mongo collection에 연결하지 않았다. operator key나 validator key를 사용하지 않았으며 외부 전송도 하지 않았다.

다음 live gate는 개인정보가 없는 synthetic stream으로 다음을 증명하는 것이다.

1. 사용자 test key가 encrypted payload commitment event를 서명
2. canonical finalized proof를 read-only quorum으로 검증
3. 여러 PC가 event와 encrypted chunk를 cache
4. 빈 projection에서 동일 commitment로 rebuild
5. 그 뒤에만 하나의 제한 기능에 dual-write/shadow-read 검토
