만료와 타임스탬프
모든 ZooBC 트랜잭션은 자신이 만들어진 순간을 유닉스 초 단위로 서명된 바이트 안에 담습니다. 이 타임스탬프가 유효 기간을 엽니다. 블록은 그 기간 안에서만 트랜잭션을 포함할 수 있으며, 기간이 지나면 트랜잭션은 효력을 잃어 다시 서명해야 합니다. 이 유효 기간은 서명자를 보호합니다. 혼잡한 순간에 블록에 들어가지 못한 결제가 며칠 동안 남아 있다가 뜻밖에 처리되는 일이 없습니다. 그저 만료되며, 서명자는 다시 결정할 수 있습니다.
기본 유효 기간: 1시간
기본적으로 블록은 트랜잭션의 타임스탬프 이후 3,600초까지 그 트랜잭션을 포함할 수 있습니다. 1시간, 즉 15초마다 블록 하나 기준으로 240블록입니다. 그 뒤로는 노드가 "...sign it again"으로 끝나는 메시지와 함께 거부합니다.
유효 기간에는 앞쪽 경계도 있습니다. 3,600초보다 더 미래의 시각이 찍힌 트랜잭션도 서명자의 시계를 확인하라는 안내와 함께 거부됩니다. 이로써 시계가 잘못된 기기를 잡아냅니다.
유효 기간 정하기: 버전 3
버전 3 트랜잭션은 수수료와 생존 필드 바로 뒤에 4바이트 만료 필드를 담아, 자체 유효 기간을 초 단위로 명시합니다.
- 0은 기본값인 1시간을 뜻합니다.
- 더 작은 값은 유효 기간을 줄입니다. 곧 이루어지지 않으면 의미가 없는 결제에 씁니다.
- 허용되는 최대값은 86,400초, 즉 하루입니다. 더 큰 값은 거부됩니다.
버전 1이나 2 트랜잭션에는 만료 필드가 없으며, 그런데도 만료를 명시한 트랜잭션은 거부됩니다. 버전이 무엇이든 미래 방향 1시간 한도는 그대로 적용됩니다.
더 긴 유효 기간은 서명을 모으는 데 시간이 걸릴 때 도움이 됩니다. 하드웨어 지갑에서 서명하거나, 다중서명 계정의 참여자들 사이에서 서명을 모을 때입니다.
풀과 체인이 따라가는 방식
두 가지 동반 규칙이 하루짜리 유효 기간을 안전하게 만듭니다.
- 노드의 트랜잭션 풀은 각 트랜잭션을 그 트랜잭션이 명시한 기간 동안 보관합니다.
- 모든 체인은 트랜잭션 id를 최소 25시간 동안 보관합니다. 가장 긴 유효 기간에 미래 방향 1시간 허용 오차를 더한 시간입니다.
노드는 이미 확정된 id를 거부하므로(트랜잭션 서명 참조), 트랜잭션이 아직 유효한 동안에는 결코 재전송될 수 없습니다.
블록 안의 시간
블록도 같은 유효 기간을 기준으로 검사되므로 모든 노드가 같은 판정에 이릅니다.
- 타임스탬프가 트랜잭션의 타임스탬프에 유효 기간을 더한 시각을 넘은 블록은 무효입니다.
- 블록보다 3,600초 넘게 뒤의 시각이 찍힌 트랜잭션을 담은 블록도 무효입니다.
어떤 정산은 블록마다 저절로 일어납니다. 에스크로 기한, 리퀴드 페이먼트의 완료, 기한이 된 예약 이체, 마켓에 걸려 있는 주문의 만료, 수수료 투표의 단계가 그렇습니다. 이것들은 블록 자신의 타임스탬프가 아니라 이전 블록의 타임스탬프를 읽습니다. 따라서 생산자는 블록의 타임스탬프를 조금 앞당겨 찍어 지급을 자기 블록으로 끌어올 수 없습니다.
블록 사이의 시간 간격은 블록과 시간에서 설명합니다.