0016 실물 제품 이력: 공개 원장에는 사건 기록마다 지문 하나
provenance(노드원 실물 제품 이력, 첫 파일럿은 전통주 재현 2026-10 ~ 2027-01)가 hgp에 보낸 요청 다섯에 답한다. 병 하나의 QR을 찍으면 벼 수확부터 병입까지 사건 하나하나를 누구나 확인할 수 있게 하려는 일이다.
무엇을
섹션 제목: “무엇을”1. 공개 원장에는 사건 기록마다 지문 하나만
섹션 제목: “1. 공개 원장에는 사건 기록마다 지문 하나만”-
제품 이력의 사건 기록은 하나씩 공개 원장(블록체인처럼 누구나 보는 기록부)에 올릴 수 있다. 이것은 앵커(02-지문 6절, 하루 뿌리 하나)가 아니라 등록부 줄이다. 9월 규격 HGP-0005 9·10절의 「공개 원장 위의 등록부」, 03-manifest 9절의 「등록부」 자리다.
-
체인에 올리는 칸은 셋뿐이다.
uint16 schemaVersion 기록 모양의 판bytes32 recordHash 사건 기록 전체의 지문refUID 앞 기록의 등록부 줄 번호 (EAS 기본 칸) -
recordHash= 사건 기록(공개판)을 RFC 8785(JSON을 늘 같은 바이트로 적는 법)로 적은 바이트의 SHA-256. -
생산자, 대상, 사건의 갈래, 일어난 때, 근거 사진들의 지문, 비공개 값의 지문은 모두 기록 안에 둔다. 체인의 칸으로 따로 내지 않는다. 기록 안 칸 이름은 03-manifest와 06-관계망을 따른다:
hgp,id,subject,event_kind,when,at,prev,parent,replaces,source(근거 원본 지문 목록, 차례대로),source_root(그 목록의 뿌리, 02-지문 5절),sealed(비공개 값의 지문),scope,made_by. -
비공개 값의 지문에는 소금을 섞는다:
SHA-256(무작위 32바이트 ‖ 값). 온도, 시간처럼 경우의 수가 적은 값은 소금 없이 지문만 내면 하나씩 넣어 보고 맞힐 수 있다. 소금은 값과 함께 비공개로 둔다. 나중에 값을 보여 줄 때 소금도 함께 보이면 누구나 대조할 수 있다. -
기록 하나가 앞 기록 둘을 가리키면(같은 대상의 앞 사건
prev, 위 대상의 사건parent)refUID에는prev를, 없으면parent를 넣고, 둘 다 기록 안에 적는다. EAS의refUID는 하나뿐이다. -
범위가 「공개」인 기록만 하나씩 올린다. 공개가 아닌 기록은 있다는 것조차 드러내지 않는다 (06-관계망 1절 5번). 그런 기록은 하루 묶음 지문(02-지문 6절)에만 들어간다. 「비공개 값이 있는 사건」(화면에 「기록됨, 비공개」로 보이는 것)은 사건이 공개이고 값만 봉인한 것이므로 올려도 된다. 사건이 있었다는 것까지 숨기려면 그 기록은 공개가 아니다.
-
받는 이(
recipient) 칸은 비운다 (0 주소). 사람이나 양조장의 지갑 주소를 적지 않는다. -
거두면: 기탁자가 범위를 좁히거나 회수하면(07-기탁 7절) 화면과 저장고에서 닫는다. 공개 원장의 줄은 지울 수 없지만 지문 하나라서 그것만으로는 아무것도 알 수 없다. 스키마를 철회 가능(
revocable: true)으로 등록해 두고, 거둔 기록에는 EAS 철회 표시를 남긴다(줄은 남고 「철회됨」과 시각이 붙는다). 약정할 때 「지문 한 줄은 지울 수 없다」를 미리 알린다. -
겉으로 하는 말: 공개 원장은 「그 시각에 이 기록이 있었고, 그 뒤로 바뀌지 않았다」를 증명한다. 술이 진짜라거나 기록 내용이 참이라는 것은 증명하지 못한다 (02-지문 7절). 「위·변조 불가능」, 「블록체인으로 위조를 막는다」는 쓰지 않는다 (9월 외부 표준 매핑의 「쓰면 안 되는 말」).
2. 쓸 말
섹션 제목: “2. 쓸 말”| provenance가 임시로 쓴 말 | hgp 말 | 칸, 근거 |
|---|---|---|
| 제품 이력 (provenance) | 제품 이력. W3C PROV-O의 provenance와 같은 뜻이라 부딪치지 않는다 | PROV-O 참조 |
| 사건 (event) | 사건. 06-관계망의 사건 점(kind: "event")이고 갈래는 event_kind: harvest, milling, intake, soaking, mash, second_mash, ferment_check, press, aging, discard, bottling, seal, label, open, transfer |
칸 이름을 event, eventType으로 쓰지 않는다. event는 03-manifest의 장부 동작(받음, 만듦 등)이다 |
정정 (correction, supersedes) |
사건이 아니다. 새 기록이 replaces로 옛 기록을 가리킨다 |
06-관계망 4.1절 |
| 증거 (evidence) | 근거 원본. 사진과 영상은 원본(진본층)으로 맡기고, 사건 기록이 source로 가리킨다. 화면에서는 「증거」라고 써도 된다 |
06-관계망 4.2절 |
| 원료 단위, 담금, 병 (lot, batch, bottle) | 로트, 담금, 병. 06-관계망의 물건 점(kind: "thing"). 병에는 일련번호 |
9월 규격 HGP-0004 8절 「로트」, 「일련번호」 |
| 생산자 (producer) | 새 역할이 아니다. 소유자이자 기탁자다 (3번). 화면 말로는 「생산자」 | 07-기탁 2절 |
| 체인 기록 (attestation) | 등록부 줄. 앵커와 다르다: 앵커는 하루 뿌리 하나, 등록부 줄은 기록 하나 | HGP-0005 10절, 03-manifest 9절 |
3. 누가 기탁자인가
섹션 제목: “3. 누가 기탁자인가”- 양조장이 소유자(
owner)이자 기탁자다. 제품과 그 공정 기록의 주인이고, 무엇을 공개할지 정한다. 양조장은 무리이므로 권한은 대표 자리에 건다 (07-기탁 6절). - 사진을 찍은 사람은 만든 이(
made_by)다. 양조장 대표가 찍어 보낸 사진은 양조장 것이다. 노드원 사람이 찍은 사진은 저작권이 노드원 쪽에 있으므로 약정에 「양조장 기록으로 쓴다」를 적는다 (rights.basis: "contract", 07-기탁 3절). - 노드원은 저장고(관리자)다. 등록은 양조장이 맡긴 일을 대신 하는 것이다.
- 약정 전에는 하나씩 공개로 올리지 못한다. 약정 없이 운영자가 올리면 기탁자 자리 대신이고, 자리 대신은 범위를 공개로 넓히지 못한다 (결정 0011). 첫 사건 기록을 공개 원장에 올리기 전에 양조장 대표의 기탁 약정 한 장이 있어야 한다. 담을 것: 공개할 범위, 비공개로 둘 값, 공개 원장의 지문 한 줄은 지울 수 없다는 것, 대표 자리가 바뀌면 권한도 자리를 따라간다는 것. 약정서는 원본으로 맡기고 지문을 단다 (07-기탁 4절).
- 약정서의 모양: 종이 한 장에 양조장 대표가 서명하거나 도장을 찍고, 그 사진이나 스캔을 원본으로 맡겨 지문을 단다. 이것으로 07-기탁 4절을 채운다. 메신저로 받은 「동의합니다」도 원본으로 맡길 수는 있지만, 누가 보냈는지 증명이 약하다.
- 대학은 기탁자가 아니다. 사건의 참여자이고, 근거를 확인하는 이다.
- 사진에 나오거나 이름이 적히는 다른 사람(농부, 일꾼 등)은 기탁자가 아니다. 그래도 공개하려면 그 사람의 동의를 받는다. 다른 사람 목소리와 같은 규칙이다 (00-원칙 4절, 01-권한 5절). 알아볼 수 있는 얼굴이나 이름(농가 이름 포함)이 공개 화면에 나오면 동의가 필요하다. 동의는 짧아도 되고(종이 한 줄 서명, 그 자리에서 「나와도 됩니다」를 찍은 영상), 원본으로 맡긴다. 동의가 없으면 그 사진은 공개하지 않거나 알아볼 수 없게 만든 사본만 공개하고, 이름 없이 「한 농가」로 적는다. 원본은 그대로 둔다. 장부에는
voices처럼 누가, 무엇에, 언제 동의했는지 남긴다. - 공개 사본에서는 사진 속 위치 정보(EXIF GPS)를 뺀다. 논이나 집의 자리가 드러난다. 원본은 고치지 않는다.
4. 서명
섹션 제목: “4. 서명”- 운영자 지갑의 서명(secp256k1. 체인에 보내는 거래에 붙는 서명)은 저장고의 서명이다: 「노드원이 이 시각에 이 기록을 등록부에 올렸다」. 사람이 미리보기를 보고 하나하나 눌러 올리므로 01-권한 1절 3번(기계는 서명하지 못한다)에 어긋나지 않는다.
- 양조장의 서명은 아니다. 「누가 만들었나」는 이것으로 증명하지 못한다 (02-지문 7절). 화면에는 「기록: 노드원」으로 적고, 양조장과 대학의 뜻은 서명 위임서(원본으로 맡기고 지문을 단 것)로 보인다. 판매 단계에서 각자 자기 열쇠로 서명하면 그때 「만든 이의 서명」이 된다.
- 「눌러야 올라간다」는 약속으로 막는 것이다. 열쇠가 서버에 있으므로 프로그램은 혼자서도 서명할 수 있다. 01-권한 1절 4번대로 이것을 숨기지 않고 적는다.
- 02-지문 8절의 기탁자 서명(Ed25519, C2PA)은 그대로 열려 있다. 등록부 줄의 서명 방식으로 secp256k1을 더한다.
5. 두 번째 layer 1이 아니라 임시 저장고
섹션 제목: “5. 두 번째 layer 1이 아니라 임시 저장고”- provenance의 장부는 결정 0004의 임시 저장고다 (
store: "staging"). arkive로 옮기면(2027-02)store: "arkive". 0004를 깨지 않으므로 예외 장이 필요 없다. - 조건 넷:
- 장부 칸 이름은 03-manifest를 따른다. 장부를 03-manifest 모양의 JSONL 줄로 내보낼 수 있어야 한다 (옮길 때 그대로 넣게).
- 지문 묶는 법은 02-지문 5절: RFC 6962, 잎은 차례 그대로, 홀수일 때 마지막 것을 복사하지 않는다. 정렬해서 묶거나 마지막을 복사하는 법은 쓰지 않는다.
- 원본은 두 곳에 (결정 0010).
- 원본(사진 파일)은 이름도 EXIF도 고치지 않는다. 화면용 줄인 사본은 따로.
- 9월 규격에 이미 자리가 있다. HGP-0004 8절 「로트」(공정 단계마다 기록, 일련번호, 뜯으면 훼손되는 표시, 산출물이 로트를, 로트가 공정 기록을 가리킨다), HGP-0005 9절(「하루치 또는 회차치를 하나의 뿌리로」), 10절 등록부(「누구나 읽을 수 있고, 아무도 내용을 알 수 없어야 한다」). 새로 지어내지 않고 여기에 맞췄다.
- 칸을 셋으로 줄인 까닭:
- 스키마는 한 번 등록하면 못 바꾼다. 기록 안의 칸은 판을 올려 바꿀 수 있다.
- 사건의 갈래와 일어난 때가 칸으로 나가면, 담금에서 채주까지 며칠 걸렸는지가 공개 원장에 영원히 남는다. provenance 설계가 비공개로 두려는 「시간」 노하우다.
- 생산자 번호가 칸으로 나가면, 그 양조장의 모든 제품이 체인 위에서 영원히 이어진다. 양조장이 나중에 빠져도 끊을 수 없다.
- 소금 없는 비공개 지문은 맞혀 볼 수 있다.
- 확인하는 힘은 같다. 화면이 기록을 보여 주고, 누구든 그 기록의 지문을 다시 떠서 체인의 줄과 맞춰 본다.
- 개인 기록과 제품 이력의 차이는 「범위가 공개인 기록만 하나씩 올린다」로 담긴다. 개인 기록은 닫힌 것이 기본이라 대부분 하루 뿌리에만 들어가고, 제품 이력은 처음부터 공개로 맡기니 하나씩 올라간다. 새 원칙이 아니라 범위 규칙을 그대로 적용한 것이다.
다른 선택지
섹션 제목: “다른 선택지”| 선택지 | 안 고른 이유 |
|---|---|
| provenance 설계의 넓은 칸 아홉 (생산자, 대상, 갈래, 때, 근거 뿌리, 비공개 지문, 공개 여부 등) | 노하우의 때, 생산자 연결, 소금 없는 비공개 지문이 지울 수 없게 남는다. 스키마를 못 고친다 |
| 하루 뿌리만 (02-지문 6절 그대로) | 병 하나를 찍어 사건마다 확인할 수 없다. 이 일의 목적을 못 한다 |
| 「실물 제품 이력」 장(09)을 지금 새로 | 파일럿을 해 보기 전에 장을 쓰면 지어내게 된다. 이 결정으로 시작하고, 파일럿이 끝날 때(2027-01) 겪은 것으로 장을 쓴다 |
| provenance를 두 번째 layer 1로 예외 | 0004의 임시 저장고로 충분하다. 예외가 늘면 「저장고는 하나」가 흐려진다 |
어디에 영향이 가나
섹션 제목: “어디에 영향이 가나”- provenance:
- EAS 스키마
uint16 schemaVersion, bytes32 recordHash,revocable: true,recipient0 주소. 기록 지문은 RFC 8785로 적은 바이트에서. - 비공개 값의 지문에 소금.
- 머클은 RFC 6962 (정렬과 마지막 복사를 뺀다).
- 첫 공개 등록 전에 양조장 대표의 기탁 약정.
- 약정이 아직이면 설계 문서의 수동 방법을 쓴다: 그날 사진들의 지문을 묶은 뿌리 하나만 올린다. 뿌리와 시각만 나가므로 02-지문 6절의 앵커 그대로이고 지금 규격으로도 된다. 약정 뒤 사건 기록을 만들고 그 뿌리를 「처음 새긴 때」의 근거로 잇는다.
- EAS 스키마
- hgp: 반영했다 (2026-10-13): 02-지문 6·8절 (v0.4), 03-manifest 9절 (v0.6), 05-용어 11절 (v0.2), 06-관계망 5절
event_kind(v0.4), 07-기탁 7절 (v0.2). 규칙표와 이름표는 v1을 고치지 않고 v2에 넣는다. 파일럿이 끝나면 09 장. - arkive: 2027-02에 provenance 장부를 받는다. 기록 지문과 등록부 줄 번호를 그대로 둔다.
- secretary: 없다. 녹음은 공개 범위가 아니면 하루 뿌리에만 들어간다.
체인 수수료(가스비)뿐이다. provenance 설계 기준 파일럿 전체(사건 100~200건) 수천 원. 칸이 적어 조금 더 싸다.
바로잡음 (2026-10-13)
섹션 제목: “바로잡음 (2026-10-13)”- 「머클은 RFC 6962 (정렬, 마지막 복사 빼기)」를 「(정렬과 마지막 복사를 뺀다)」로 고쳤다. 뜻은 처음부터 5번 조건 2와 같다.
- 3번의
rights.basis: "agreement"를"contract"로 고쳤다. 03-manifest의 값 이름표에 맞춘 것이다. parent칸과 소금 문장은 결정 0017이 대신한다 (parents, 항목별 봉인 지문).- 「파일럿이 끝나면 09 장」의 번호: 09는 열쇠 문서가 먼저 썼다 (결정 0018). 제품 이력 장의 번호는 쓸 때 정한다.