블록당 계정당 트랜잭션 하나, 그리고 배치
버전 0.5.8부터 모든 블록에 단순한 유효성 규칙이 적용됩니다. 블록은 각 계정의 트랜잭션을 최대 하나만 담을 수 있습니다. 여러 일을 한꺼번에 하려면 계정은 한 종류의 여러 작업을 담은 트랜잭션 하나, 즉 배치를 씁니다. 두 규칙을 함께 쓰면 노드가 블록 전에 하는 검사가 정확하게 유지되면서도, 바쁜 계정이 한 블록 안에서 많은 사람에게 지불할 수 있습니다.
규칙
여기서 계정은 서명 주소를 말합니다. 같은 주소의 트랜잭션 두 개를 담은 블록은 모든 노드에서 무효이므로, 정직한 생산자는 그런 블록을 만들지 않습니다. 생산자는 각 계정에서 자격을 갖춘 가장 오래된 트랜잭션을 먼저 가져오고, 다음 것은 15초 뒤의 다음 블록으로 남겨 둡니다.
계정은 여전히 여러 트랜잭션을 연달아 제출할 수 있습니다. 노드의 풀은 송신자마다 최대 50개의 대기 트랜잭션을 보관하며(각 노드의 로컬 정책), 생산자는 이를 가장 오래된 것부터 블록마다 하나씩 포함합니다.
이 정의에서 두 가지 세부 사항이 따라 나옵니다.
- 계정 그룹의 각 구성원은 자기 주소로 서명하므로, 구성원들이 잔액 하나를 공유하더라도 각자 자기 자리를 가집니다.
- 다중서명 계정의 내부 트랜잭션이 실행될 때는 다중서명 계정의 트랜잭션으로 셉니다.
왜 도움이 되는가
노드는 트랜잭션을 확정된 상태에 비추어 두 번 검사합니다. 풀에 받아들일 때와 블록을 조립할 때입니다. 계정당 트랜잭션이 하나뿐이면 같은 계정의 다른 트랜잭션이 블록 안에서 그 상태를 바꿀 수 없습니다. 따라서 송신자 자신의 잔액과 자신의 객체처럼 송신자만 통제하는 모든 것에 대해 검사가 정확하게 유지됩니다.
서로 다른 계정 사이에서는 먼저 적용된 트랜잭션이 이깁니다. 두 계정이 같은 스왑 제안을 가져가려 하면 먼저 적용된 쪽이 가져가고, 두 번째 트랜잭션은 의미가 없어집니다. 그것은 수수료만 내고 다른 일은 하지 않는 무동작이 됩니다(트랜잭션 참조). 정직한 생산자는 이런 트랜잭션을 빼놓습니다. 객체별로 따로 정한 규칙은 없습니다.
배치
배치는 한 종류의 여러 작업을 담은 트랜잭션 하나입니다. 세 종류가 있습니다.
- ZBC 결제: 한 배치에 최대 25건
- 토큰 전송: 최대 32건, 어떤 토큰이든 가능하며 수수료는 ZBC로 냄
- 저장 증명: 최대 1,000건, 노드마다 저장 에포크마다 배치 하나(분산 저장소 풀 참조)
배치는 전부 아니면 전무입니다. 모든 작업을 미리 검사하므로, 배치 안의 결제는 모두 이루어지거나 하나도 이루어지지 않으며, 배치 전체는 한 번만 서명합니다.
배치의 비용
여러 작업은 여러 트랜잭션만큼 냅니다. 배치의 최소 수수료는 그 작업들이 별도 트랜잭션일 때 낼 최소 수수료의 합, 즉 작업마다의 기본 수수료에 작업마다의 바이트 요금을 더한 값이며(수수료 참조), 배치의 메시지 요금은 한 번만 매겨집니다. 메시지가 없는 결제 세 건은 한 배치로 보내든 단일 트랜잭션 세 건으로 보내든 비용이 같습니다. 저장 증명의 배치는 아무것도 내지 않습니다. 저장 증명은 각각 수수료 없는 의무이므로 합이 0입니다.
배치가 절약하는 것은 주로 수수료가 아니라 네트워크의 일입니다. 검증할 서명이 셋이 아니라 하나이고, 블록의 자리도 셋이 아니라 하나입니다. 그리고 배치는 한 계정이 같은 블록에서 많은 수신자에게 지불하는 방법입니다.