ZooBC 위키
보안과 아키텍처

체인 결속 서명

ZooBC 서명은 하나의 체인에서만 유효합니다. 지갑은 트랜잭션에 서명하기 전에 체인의 제네시스 해시를 포함하는 다이제스트를 계산하므로, 같은 키가 모든 체인에서 같은 주소를 만들더라도 testnet에서 서명한 결제는 mainnet이나 devnet에서 검증되지 않습니다. 같은 결속이 노드 사이의 연결과 체인 밖에서 서명한 메시지도 보호합니다.

다이제스트

서명자는 결코 원시 트랜잭션 바이트에 서명하지 않습니다. 다음 다이제스트에 서명합니다.

digest           = SHA3-256("ZBC-TX" ‖ genesis hash ‖ unsigned transaction bytes)
transaction hash = SHA3-256(unsigned transaction bytes ‖ signature)
transaction id   = the first 8 bytes of the transaction hash, little-endian

태그 "ZBC-TX"는 다이제스트가 트랜잭션의 것임을 표시합니다. 다른 서명 작업은 다른 태그를 씁니다(아래 참조). 제네시스 해시는 서명을 하나의 체인에 묶습니다. 이 체인 결속 다이제스트만 받아들여집니다. 체인이 묶이지 않은 바이트 자체에 대한 서명은 모든 체인에서 거부됩니다. 전체 서명 절차는 트랜잭션 서명을 참조하십시오.

ZBC-TX, 제네시스 해시(체인의 신원), 트랜잭션 바이트로 만든 다이제스트가 SHA3-256을 거쳐 서명됩니다. testnet의 제네시스로는 서명이 맞고, mainnet의 제네시스로는 다이제스트가 달라져 트랜잭션이 거부됩니다.
ZBC-TX, 제네시스 해시(체인의 신원), 트랜잭션 바이트로 만든 다이제스트가 SHA3-256을 거쳐 서명됩니다. testnet의 제네시스로는 서명이 맞고, mainnet의 제네시스로는 다이제스트가 달라져 트랜잭션이 거부됩니다.

제네시스 해시가 체인의 신원입니다

제네시스 해시는 체인의 맨 첫 블록의 해시입니다. 체인의 제네시스 구성에서 도출되므로, 그 구성에서 확정에 포함된 값을 하나라도 바꾸면 새 해시, 즉 다른 체인이 됩니다(제네시스 블록 참조). ZooBC 어디에도 별도의 네트워크 ID 바이트는 없습니다. 제네시스 해시가 체인의 유일한 신원입니다. devnet, testnet, mainnet은 각자 자기 해시를 가지며(devnet, testnet, mainnet 참조), 다시 출시된 테스트 네트워크는 새 해시를 받습니다.

노드는 정보 경로 /api/v1/node/info에서 자기 체인의 genesis_hash와 signing_version을 알려 주므로(노드 API 참조), 지갑이나 도구는 자신이 어느 체인을 위해 서명하는지 알 수 있습니다.

체인 간 재전송

testnet에서 서명한 결제를 누군가 mainnet으로 복사한다고 합시다. mainnet 노드는 mainnet의 제네시스 해시로 다이제스트를 계산해 다른 값을 얻고, 서명은 검증되지 않습니다. 트랜잭션은 "not signed for this chain"으로 거부됩니다. 금액은 아무 역할도 하지 않으며, 지갑이 무엇을 더할 필요도 없습니다.

같은 키는 모든 ZooBC 체인에서 같은 주소를 만들며, 한 체인에서 자금을 받은 주소는 다른 체인에서 그저 잔액 0으로 표시됩니다. 바로 그래서 결속이 중요합니다. 결속이 없다면 한 체인에서 한 결제를 다른 체인으로 복사해 그곳의 코인을 옮길 수 있을 것입니다.

모든 계정 유형, 모든 서명자

ZooBC 계정은 ZooBC 자체의 Ed25519 키, Bitcoin과 Ethereum 키 등 여러 종류의 키로 통제할 수 있습니다(키와 계정 유형 참조). 모든 계정 유형은 같은 체인 결속 다이제스트에 서명하며, 일부는 원래 체인의 서명 방식이 요구하는 대로 먼저 이를 다시 해시합니다(예를 들어 Ethereum 방식 키는 그 Keccak-256 해시에 서명합니다). 다중서명 계정의 참여자들은 내부 트랜잭션의 체인 결속 다이제스트에 서명합니다.

다른 서명 작업들은 역시 체인에 결속된 자체 다이제스트를 씁니다. 계정 그룹을 연결하거나 통제하는 동의("ZBC-GROUP-LINK", "ZBC-GROUP-CONTROL"), 다자간 에스크로의 공동 서명, 그리고 노드의 풀에서 대기 중인 트랜잭션을 취소하는 요청("ZBC-CANCEL")입니다.

노드와 메시지

체인 결속은 트랜잭션에서 그치지 않습니다.

  • 피어 핸드셰이크. 두 노드가 연결할 때 핸드셰이크는 노드 키로 서명되며 제네시스 해시를 담습니다. 다른 체인의 피어는 "Genesis hash mismatch"로 거부되므로, 한 체인의 노드는 결코 다른 체인의 노드와 피어가 되지 않습니다.
  • 서명된 메시지. 도구로 체인 밖에서 서명한 메시지는 다이제스트 SHA3-256("ZBC-MSG-v2" ‖ 제네시스 해시 ‖ 메시지)를 쓰므로, devnet에서 서명한 메시지는 testnet이나 mainnet에서 결코 검증되지 않습니다(서명된 메시지와 암호화된 메시지 참조).

영수증은 프로토콜 안의 예외입니다. 영수증은 어떤 체인도 명시하지 않으므로 자체 체인 결속이 없습니다. 다만 영수증은 참조 블록을 높이와 해시로 지정하며, 검증자는 이를 검사합니다.

같이 보기