어떻게 새기나
새김은 비트코인에 아무것도 직접 쓰지 않는다. 우리가 하는 일, 남이 하는 일, 돈이 드는 곳을 그대로 적는다. 믿으라는 말 대신 계산할 수 있는 것만 남긴다.
새김이 한다
- 1받은 파일의 sha256 을 계산하고 접수 시각(UTC)을 적는다. 파일 바이트는 그대로 보관하고 다시 쓰지 않는다.
- 210분마다 그 사이 접수된 해시를 머클 트리로 묶어 루트 하나를 만든다. 항목마다 "내 해시에서 루트까지" 가는 길을 남긴다.
- 3그 루트를 OpenTimestamps 공개 캘린더 4곳에 제출한다. 1곳만 받아도 성공이다.
- 41시간마다 캘린더에 "블록에 들어갔나" 묻고, 들어갔으면 확정으로 표시한다. 14일이 지나도 안 들어가면 항목을 풀어 다음 묶음에 다시 싣는다.
- 5둘째 앵커로 RFC 3161 시각 도장(FreeTSA)을 받아 둔다. 비트코인이 아닌 다른 종류의 증인이다.
- 6내려받을 때 길과 캘린더의 증명을 합쳐 표준 .ots 파일을 만든다. 꾸러미 ZIP 에는 원본, .ots, RFC 3161 토큰, 검증 설명서가 들어간다.
캘린더가 한다
- 1전 세계에서 들어온 루트들을 자기 트리에 쌓았다가, 몇 시간에 한 번 그 트리의 루트 32바이트를 비트코인 트랜잭션 한 건의 OP_RETURN 에 실어 보낸다.
- 2그 트랜잭션 수수료를 낸다. 한 건에 수천 개 증명이 실리므로 한 사람 몫은 사실상 0이다.
- 3블록에 들어간 뒤 "네 루트가 이 트랜잭션, 이 블록에 있다"는 경로를 돌려준다.
비트코인이 한다
- 1그 트랜잭션을 블록에 넣고, 블록 헤더의 머클 루트에 그 사실을 고정한다. 블록은 그 뒤에 쌓이는 블록들이 지킨다.
- 2이 시점부터 증명은 캘린더도 새김도 필요 없다. 파일, .ots, 그리고 비트코인 블록 헤더만 있으면 누구나 다시 계산한다.
돈은 어디에 드나
| 무엇 | 누가 내나 | 설명 |
|---|---|---|
| 원본 보관 | 새김 | 우리 저장소 비용. 사용자에게는 무료다. |
| 비트코인 트랜잭션 | 캘린더 운영자 | 기부로 충당한다. 새김은 지갑도 노드도 없고 트랜잭션을 만들지 않는다. |
| RFC 3161 도장 | FreeTSA | 자원봉사 무료 서비스. |
| 검증 때 블록 대조 | 공개 탐색기 | blockstream.info · mempool.space 공개 API. 로컬 비트코인 노드가 있으면 그것으로도 된다. |
사용자 1명이 올리든 1만 명이 올리든 새김이 비트코인에 내는 돈은 0원이다. 공개 캘린더가 전부 사라지는 날에만 새김이 직접 하루 한 건 트랜잭션을 보내면 되고, 그 수수료는 수천 원 단위다.
캘린더는 누가 운영하나
새김이 제출하는 곳은 넷이다. alice.btc.calendar.opentimestamps.org 와 bob.btc.calendar.opentimestamps.org 는 OpenTimestamps 를 만든 비트코인 코어 개발자 Peter Todd 가 2016년부터 운영하는 캘린더다. a.pool · b.pool 은 그 앞단의 집계기로, 1초 안에 들어온 해시를 묶어 캘린더에 넘긴다. 운영비는 기부로 충당한다.
한 사람에게 기대는 것 아니냐는 물음에는 이렇게 답한다. 캘린더가 필요한 시간은 제출부터 블록 확정까지 몇 시간뿐이다. 확정된 증명은 캘린더가 아니라 비트코인 블록을 가리키므로, 캘린더가 내일 사라져도 어제 확정된 증명은 그대로 검증된다. 그 몇 시간을 위해 넷에 동시에 제출한다.
왜 보관하고, 무엇이 남나
원본을 왜 새김이 갖고 있나
증명은 바이트열 하나에 묶인다. 한 비트만 달라도 다른 파일이다. 폰을 바꾸거나 대화방이 지워지면 증명만 남고 원본이 없어 아무것도 못 보인다. 그래서 받은 그 순간의 바이트를 그대로 둔다. 압축·변환·재저장을 하지 않는다. 원본을 내 기기에만 두고 싶으면 "해시만 올리기"를 쓴다. 그때는 보관 책임이 본인에게 있다.
증명(.ots)은 왜 두 곳에 두나
새김은 항목마다 "내 해시에서 묶음 루트까지"의 길과 캘린더가 준 루트 증명을 따로 저장하고, 내려받을 때마다 둘을 합쳐 .ots 를 만든다. 그러니 언제든 다시 받을 수 있다. 그래도 꾸러미 ZIP 을 한 번은 내 기기에 두라고 권한다. 증명은 새김이 없어져도 유효해야 하고, 그 말이 진짜이려면 사본이 본인 손에 있어야 한다.
원본을 지웠는데 왜 원장 행이 남나
삭제는 파일 바이트만 지운다. 해시·접수 시각·머클 길·블록 번호는 남는다. 이미 비트코인 블록에 박힌 사실은 누구도 지울 수 없어서, 남겨 두는 편이 본인에게 유리하다. 나중에 원본을 다른 곳에서 찾으면 그 행으로 다시 증명할 수 있다. 원장은 지우지 않는다. 원장이 지워질 수 있으면 원장이 아니다.
원본이 지워지면 비트코인에서 가져올 수 있나
없다. 비트코인에는 원본도 해시도 없고, 캘린더 트리의 루트 32바이트만 있다. 검증에 필요한 것은 셋이다. 원본 파일, .ots, 그리고 블록 헤더. 앞의 둘은 본인(또는 새김)이 가져야 하고, 블록 헤더는 세상 모든 비트코인 노드가 갖고 있다. .ots 안에는 앵커 트랜잭션의 원시 바이트와 블록 안 머클 길까지 들어 있어서, 트랜잭션 본문을 지운 노드(pruned)만 있어도 헤더만으로 검증된다. 그러니 지켜야 할 것은 원본과 .ots 둘뿐이고, 새김이 그 둘을 보관하는 이유이자 본인도 한 부 더 두라는 이유다.
얼마나 가나
원본은 본인이 지울 때까지. 증명은 기한이 없다. 비트코인 블록이 존재하는 한, 그리고 본인이 .ots 와 원본을 가진 한 검증된다. 새김의 서버가 필요한 건 접수부터 확정까지의 몇 시간과, 편의로 대신 계산해 주는 검증 화면뿐이다.
해시 조회는 왜 아무나 할 수 있나
해시 64자로는 원본을 되짚을 수 없다. 반대로 원본을 가진 사람은 해시를 계산해 "이 파일이 새김에 언제 접수됐나"를 물을 수 있다. 그게 이 서비스의 용도다. 상대에게 파일을 보여 주면서 "직접 확인하세요"라고 말할 수 있어야 한다. 조회는 누가 올렸는지, 메모가 무엇인지 알려 주지 않는다.
둘째 앵커(RFC 3161)는 왜 두나
비트코인 확정은 몇 시간 걸린다. 그 사이의 공백을 공인 시각 도장이 메운다. 종류가 다른 증인 둘이 같은 해시를 같은 시간대에 봤다고 말하면, 하나가 의심받아도 다른 하나가 남는다. 이 도장은 접수 직후 자동으로 받고, 못 받으면 24시간 안에 다시 시도한다.
무엇을 증명하고 무엇은 아닌가
증명하는 것
이 바이트열이 늦어도 이 블록 시각에 존재했다. 그 뒤 한 비트도 바뀌지 않았다.
증명하지 않는 것
내용이 사실인지, 누가 만들었는지, 법적 효력이 있는지. 새김은 공증·인증·확정일자가 아니다.
서버 없이 직접 확인하기
- 1. 원본 파일의 sha256 을 계산해 .ots 안의 다이제스트와 같은지 본다.
- 2. .ots 의 경로를 따라가면 원시 트랜잭션이 나온다. 그것을 sha256 두 번 하면 txid 다. 아무 탐색기에서 그 txid 가 어느 블록에 있는지 본다.
- 3. 그 블록의 헤더 80바이트를 받아 sha256 두 번 하면 블록 해시가 나온다. 헤더 안 머클 루트가 .ots 경로의 마지막 값과 같으면 끝이다.
공식 클라이언트는 이 계산을 한 줄로 한다.
pip install opentimestamps-client ots verify 파일.ots
화면에서 하려면 증명 검증 에 파일과 .ots 를 넣는다. 새김 서버가 같은 계산을 대신할 뿐이고, 결과를 믿을 필요는 없다. 위 절차로 언제든 다시 계산할 수 있다.