ZooBC 위키
트랜잭션

블록당 계정당 트랜잭션 하나, 그리고 배치

버전 0.5.8부터 모든 블록에 단순한 유효성 규칙이 적용됩니다. 블록은 각 계정의 트랜잭션을 최대 하나만 담을 수 있습니다. 여러 일을 한꺼번에 하려면 계정은 한 종류의 여러 작업을 담은 트랜잭션 하나, 즉 배치를 씁니다. 두 규칙을 함께 쓰면 노드가 블록 전에 하는 검사가 정확하게 유지되면서도, 바쁜 계정이 한 블록 안에서 많은 사람에게 지불할 수 있습니다.

규칙

여기서 계정은 서명 주소를 말합니다. 같은 주소의 트랜잭션 두 개를 담은 블록은 모든 노드에서 무효이므로, 정직한 생산자는 그런 블록을 만들지 않습니다. 생산자는 각 계정에서 자격을 갖춘 가장 오래된 트랜잭션을 먼저 가져오고, 다음 것은 15초 뒤의 다음 블록으로 남겨 둡니다.

송신자 A의 트랜잭션 대기열이 가장 오래된 것부터 블록 N, N+1, N+2에 하나씩 들어가고, 송신자 B와 C의 트랜잭션이 같은 블록들을 채웁니다
송신자 A의 트랜잭션 대기열이 가장 오래된 것부터 블록 N, N+1, N+2에 하나씩 들어가고, 송신자 B와 C의 트랜잭션이 같은 블록들을 채웁니다

계정은 여전히 여러 트랜잭션을 연달아 제출할 수 있습니다. 노드의 풀은 송신자마다 최대 50개의 대기 트랜잭션을 보관하며(각 노드의 로컬 정책), 생산자는 이를 가장 오래된 것부터 블록마다 하나씩 포함합니다.

이 정의에서 두 가지 세부 사항이 따라 나옵니다.

  • 계정 그룹의 각 구성원은 자기 주소로 서명하므로, 구성원들이 잔액 하나를 공유하더라도 각자 자기 자리를 가집니다.
  • 다중서명 계정의 내부 트랜잭션이 실행될 때는 다중서명 계정의 트랜잭션으로 셉니다.

왜 도움이 되는가

노드는 트랜잭션을 확정된 상태에 비추어 두 번 검사합니다. 풀에 받아들일 때와 블록을 조립할 때입니다. 계정당 트랜잭션이 하나뿐이면 같은 계정의 다른 트랜잭션이 블록 안에서 그 상태를 바꿀 수 없습니다. 따라서 송신자 자신의 잔액과 자신의 객체처럼 송신자만 통제하는 모든 것에 대해 검사가 정확하게 유지됩니다.

서로 다른 계정 사이에서는 먼저 적용된 트랜잭션이 이깁니다. 두 계정이 같은 스왑 제안을 가져가려 하면 먼저 적용된 쪽이 가져가고, 두 번째 트랜잭션은 의미가 없어집니다. 그것은 수수료만 내고 다른 일은 하지 않는 무동작이 됩니다(트랜잭션 참조). 정직한 생산자는 이런 트랜잭션을 빼놓습니다. 객체별로 따로 정한 규칙은 없습니다.

배치

배치는 한 종류의 여러 작업을 담은 트랜잭션 하나입니다. 세 종류가 있습니다.

  • ZBC 결제: 한 배치에 최대 25건
  • 토큰 전송: 최대 32건, 어떤 토큰이든 가능하며 수수료는 ZBC로 냄
  • 저장 증명: 최대 1,000건, 노드마다 저장 에포크마다 배치 하나(분산 저장소 풀 참조)

배치는 전부 아니면 전무입니다. 모든 작업을 미리 검사하므로, 배치 안의 결제는 모두 이루어지거나 하나도 이루어지지 않으며, 배치 전체는 한 번만 서명합니다.

배치의 비용

여러 작업은 여러 트랜잭션만큼 냅니다. 배치의 최소 수수료는 그 작업들이 별도 트랜잭션일 때 낼 최소 수수료의 합, 즉 작업마다의 기본 수수료에 작업마다의 바이트 요금을 더한 값이며(수수료 참조), 배치의 메시지 요금은 한 번만 매겨집니다. 메시지가 없는 결제 세 건은 한 배치로 보내든 단일 트랜잭션 세 건으로 보내든 비용이 같습니다. 저장 증명의 배치는 아무것도 내지 않습니다. 저장 증명은 각각 수수료 없는 의무이므로 합이 0입니다.

각자 수수료를 낸 세 건의 별도 결제는, 같은 세 수수료를 담고 전부 아니면 전무로 표시되며 한 번 서명하는 결제 세 건짜리 배치 하나와 같습니다
각자 수수료를 낸 세 건의 별도 결제는, 같은 세 수수료를 담고 전부 아니면 전무로 표시되며 한 번 서명하는 결제 세 건짜리 배치 하나와 같습니다

배치가 절약하는 것은 주로 수수료가 아니라 네트워크의 일입니다. 검증할 서명이 셋이 아니라 하나이고, 블록의 자리도 셋이 아니라 하나입니다. 그리고 배치는 한 계정이 같은 블록에서 많은 수신자에게 지불하는 방법입니다.

같이 보기