트랜잭션 서명
서명은 계정 키의 보유자가 트랜잭션을 바이트 하나하나까지 승인했다는 증명입니다. ZooBC에서 서명자는 트랜잭션 자체에 그대로 서명하지 않습니다. 체인의 신원까지 포함하는 다이제스트에 서명하므로, 서명은 하나의 체인에서만 유효합니다. 여러 키 유형의 계정이 각자 원래 체인의 방식으로 서명할 수 있으므로, Bitcoin, Ethereum, Solana 키로 ZooBC 계정을 직접 통제할 수 있습니다.
서명하는 대상
서명자는 서명을 제외한 모든 필드, 즉 서명되지 않은 봉투를 가지고 다음 다이제스트에 서명합니다.
digest = SHA3-256( "ZBC-TX" ‖ genesis block hash ‖ unsigned bytes )
"ZBC-TX"는 ASCII 태그이고, ‖는 "뒤에 이어 붙임"을 뜻합니다. 이 체인 결속 다이제스트만 받아들여집니다. 버전 3 트랜잭션에서는 4바이트 만료 값이 서명되지 않은 바이트의 일부이므로, 다른 모든 필드와 마찬가지로 서명됩니다.
제네시스 블록 해시는 체인의 신원입니다. ZooBC에는 네트워크 id 필드가 없습니다. devnet, testnet, mainnet은 각자 자체 제네시스 해시를 가지므로, mainnet을 위해 만든 서명은 같은 키가 세 체인 모두에 자금을 가지고 있더라도 devnet이나 testnet에서 검증되지 않습니다. 노드들도 서로 연결하기 전에 제네시스 해시를 비교합니다. 이로써 누군가 한 체인의 트랜잭션을 다른 체인으로 복사하는 체인 간 재전송이 막힙니다. 체인 결속 서명을 참조하십시오.
해시와 id
서명이 끝나면 트랜잭션은 해시와 id로 식별됩니다.
hash = SHA3-256( unsigned bytes ‖ signature )
id = the first 8 bytes of the hash, read as a little-endian signed 64-bit integer
노드는 이미 확정된 id를 거부하므로, 같은 체인에서의 재전송도 막힙니다. IssueToken 트랜잭션의 id는 그 트랜잭션이 만드는 토큰의 id이기도 합니다(토큰 발행 참조).
서명할 수 있는 키 유형
주소는 유형 번호로 시작하며, 유형이 서명을 검사하는 방식을 정합니다.
| 키 유형 (번호) | 서명 방식 |
|---|---|
| ZooBC (0), Solana (11) | Ed25519 |
| Cardano (13), Tezos (16) | Ed25519, 공개 키를 98바이트 서명 필드에 담음 |
| Bitcoin 레거시 (1), P2PKH (5), P2SH로 감싼 P2WPKH (6), P2WPKH (7), Ripple (14) | 다이제스트의 이중 SHA-256에 대한 secp256k1 ECDSA, 공개 키를 함께 담음 |
| Ethereum (4), Tron (15) | 다이제스트의 Keccak-256에 대한 secp256k1. 키는 65바이트 r‖s‖v 서명에서 복원됨 |
| Bitcoin Taproot (9) | BIP-340 Schnorr |
| Polkadot (12) | sr25519 |
ECDSA 서명은 low-s 형식을 써야 합니다. 방식이 무엇이든 모든 키는 같은 체인 결속 다이제스트에 서명합니다.
어떤 주소 유형은 결코 서명할 수 없습니다. Empty(2), Estonia eID(3, 검증기가 없음), Bitcoin P2WSH 스크립트(8), 데이터셋(10)입니다. P2WSH 주소는 키 하나가 아니라 스크립트를 나타내고, 데이터셋 주소는 서명자가 아니라 데이터를 가리킵니다. 시스템 풀, 계정 그룹, 다중서명 계정 같은 키 없는 계정에는 키가 전혀 없으며, 자체 규칙을 통해서만 지출합니다.
외부 지갑으로 서명하기
외부 지갑은 자기 체인의 트랜잭션에 서명하고, 그것을 대응하는 ZooBC 트랜잭션 안에 메시지로 실어 보낼 수도 있습니다.
- Ethereum: 액세스 목록이 비어 있는 레거시, EIP-2930, EIP-1559 트랜잭션
- Solana: System 전송
- Bitcoin: 입력 하나, 출력 하나나 둘, 수수료 0
노드는 송신자, 수신자, 금액이 ZooBC 트랜잭션과 일치하는지 검사하며, 주어진 외부 페이로드는 한 번만 쓸 수 있습니다. 이런 메시지는 최대 4,096바이트까지 담을 수 있습니다. Ethereum 방식 접근은 MetaMask와 Ethereum 방식 접근을 참조하십시오.
그 밖의 서명 다이제스트
같은 체인 결속 방식이 매번 고유한 태그를 붙여 다른 동의에도 쓰입니다.
- 주소를 그룹에 연결하기와 그룹의 통제권 넘기기("ZBC-GROUP-LINK"와 "ZBC-GROUP-CONTROL")
- 노드에 풀의 대기 중인 트랜잭션 취소를 요청하기("ZBC-CANCEL")
- 다자간 에스크로의 공동 서명
트랜잭션이 아닌 오프체인 메시지는 Ed25519 키로 SHA3-256("ZBC-MSG-v2" ‖ genesis hash ‖ message) 형태로 서명합니다. 서명된 메시지와 암호화된 메시지를 참조하십시오.