서명된 메시지와 암호화된 메시지
모든 서명에 트랜잭션이 필요한 것은 아닙니다. 서명된 메시지는 돈을 옮기지도 수수료를 내지도 않고 키를 가지고 있음을 증명하며, 암호화된 메시지는 수신자만 읽을 수 있게 합니다. 이 문서는 둘 다를, 그리고 노드 API가 받아들이는 관련 서명 두 가지를 다룹니다.
주소를 통제하고 있음을 증명하기
사용자가 어떤 ZooBC 주소를 통제하는지 알고 싶은 웹사이트는 무작위 챌린지를 보냅니다. 사용자는 zbc-cli sign-message로, 또는 공개 명령줄 도구의 어느 포팅판에서든 같은 함수로 이에 서명하고, 사이트는 그 서명을 사용자의 주소와 대조합니다. 네이티브 ZBC_ 주소는 주소 자체가 공개 키이므로 그 밖에 필요한 것은 없습니다. 결제를 보내도 통제권을 증명할 수 있지만, 그것은 트랜잭션이므로 수수료가 듭니다. 대신 개인 키를 건네는 일은 결코 하지 마십시오.
이 방식을 ZBC-MSG-v2라고 합니다. Ed25519로 다음에 서명합니다.
SHA3-256("ZBC-MSG-v2" ‖ genesis hash ‖ message)
이 다이제스트의 두 부분이 중요합니다.
- 태그. 트랜잭션은 다른 태그 "ZBC-TX"로 서명합니다. 따라서 메시지 서명은 결코 트랜잭션으로 유효할 수 없고, 트랜잭션 서명도 결코 메시지로 유효할 수 없습니다.
- 제네시스 해시. 서명을 하나의 네트워크에 묶습니다. devnet을 위해 서명한 메시지는 testnet이나 mainnet에서 결코 검증되지 않습니다(체인 결속 서명).
전환 기간 동안 도구의 verify-message는 체인을 포함하지 않는 이전 형식인 ZBC-MSG-v1("ZBC-MSG"와 메시지의 SHA3-256)도 받아들입니다. 이 기간은 도구에 정해진 종료 시각에 끝나며, 그 뒤로는 ZBC-MSG-v2만 검증됩니다.
메시지 서명은 체인 기능이 아니라 공개 도구와 이를 채택한 서비스들의 관례입니다. 체인에는 아무것도 저장되지 않으며, 노드에는 이를 위한 엔드포인트가 없습니다.
암호화된 메시지
모든 트랜잭션은 메시지를 담을 수 있습니다(트랜잭션 봉투). 평문 메시지는 최대 256바이트입니다. 암호화된 메시지는 표시 "ZBE1"로 시작하고, 그 뒤에 수신자의 키로 보낸 libsodium 봉인 상자가 오며, 이는 수신자의 개인 키로만 열 수 있습니다. 암호화된 메시지는 최대 320바이트까지 될 수 있으며, 이는 텍스트를 최대 268바이트까지 담을 여유를 줍니다.
암호화되는 것은 메시지뿐입니다. 송신자, 수신자, 금액 같은 트랜잭션의 나머지는 다른 트랜잭션과 마찬가지로 공개됩니다.
서명된 API 요청
노드 API의 대부분은 공개 읽기이며, 트랜잭션은 자체 서명을 담고 있으므로 API 키가 필요하지 않습니다. 요청 자체에 서명이 필요한 곳에서는 텍스트 METHOD:PATH:TIMESTAMP:BODY에 대한 Ed25519 서명을 쓰며, 이는 300초 동안 유효합니다. 5분 안에 서명 인증에 20번 실패한 클라이언트는 300초 동안 차단됩니다.
대기 중인 트랜잭션 취소하기
노드의 풀에서 기다리고 있는 트랜잭션은 DELETE /api/v1/transactions/pending/ 뒤에 그 해시를 붙여 그 노드에서 회수할 수 있습니다. 요청은 다음에 대한 서명을 담습니다.
SHA3-256("ZBC-CANCEL" ‖ genesis hash ‖ transaction hash)
이는 그 노드의 풀에서만 사본을 제거합니다. 이미 그 트랜잭션을 가진 다른 노드들은 여전히 이를 블록에 포함할 수 있으므로, 취소는 보장이 아니라 요청입니다.