비트코인 백서 톺아보기- 2편
사토시는 비트코인 백서를 통해 은행이라는 신뢰할만한 제3자 없이 네트워크 참여자들에 의해 P2P 방식으로 스스로 작동하는 새로운 화폐 시스템을 제안하며 이 시스템을 구현하기 위한 기술적 설명을 하고 있습니다. 이 중 먼저 트랜잭션에 대해 알아보도록 하겠습니다.
트랜잭션(transactions, 거래)
우리는 전자코인을 디지털 서명들의 체인이라고 정의한다. 코인의 각 소유자는 이전의 트랜잭션 및 다음 소유자의 공개키에 대한 암호화 해시값에 디지털 서명을 하여 코인의 끝부분을 추가하여 다음 소유자에게 이전한다. 코인을 받은 사람은 서명에 대한 검증을 통해 소유권을 확인할 수 있다.
이 부분을 이해하기 위해 ‘디지털 서명, 해시’가 무엇인지 알아야 합니다.
1) 디지털 서명
디지털 서명이란 종이에 사인을 하거나 인감도장을 찍는 것처럼 디지털 데이터를 이용해 송신자의 신원을 증명하는 방법으로 송신자가 자신의 개인키(private key)로 암호화한 메시지를 수신자가 송신자의 공개키(public key)로 해독하는 과정을 말합니다.

예를 들어, 애니가 존에게 메시지를 보낼 때 개인키로 암호화하여 존에게 보냈다고 합니다. 그럼 존은 애니의 공개키를 이용해 그 메시지가 정말 애니가 보낸 것이 맞는지 확인하는데요. 바로 이것이 디지털 서명인 것입니다. 개인키는 나만 가질 수 있는 계좌 비밀번호와 같은 것으로 서명을 하는데 사용되며 공개키는 모든 사람에게 공개되는 계좌번호와 같은 것으로 검증하는데 사용됩니다.
2) 해시
해시는 암호학에 쓰이는 함수로 고정된 길이의 암호화된 문자열로 바꿔버리는 것을 의미합니다. 해시함수를 이용하면 고정된 길이의 데이터가 출력되는데요.
이렇게 출력된 테이터 값을 ‘해시값’이라고 하며 동일한 길이의 해시값을 갖도록 하는 과정을 해싱이라고 합니다.
예를 들어, 존이 애니에게 1코인을 보낸다고 해보겠습니다. 그렇다면 필요한 것은 애니의 주소(공개키), 존이 처음 돈을 가지게 된 거래를 해시한 값 그리고 존의 서명(개인 키 서명)으로 블록이 만들어 집니다. 존의 서명이 있으니 이 거래가 진짜 존이 애니에게 보내는 것이 맞는지 확인할 수 있겠죠?
그런데 이 방식에는 하나의 문제점이 존재합니다. 바로 이중지불이 되지 않았다는 것을 어떻게 증명하느냐의 문제입니다. 지금까지 우리는 은행이라는 신뢰할만한 제3자를 통해 이중지불 문제를 해결해 왔는데요. 은행이 없는 전자화폐 상에서는 어떻게 해결할까요? 이에 사토시는 다음과 같이 말하고 있습니다.
간략하게 정리하자면 모든 거래가 다 기록되어 공개되어야 하고 그중 어떤 거래가 가장 먼저인지 결정할 수 있는 시스템이 필요하다고 말하고 있는데요. 이것이 바로 타임스탬프입니다.
타임 스탬프 서버(timestamp server)
쉽게 말하면 모든 거래에 타임 스탬프를 찍어 순서를 비교한다는 것인데요.
여기서 말하는 블록에는 시간 단위별로 묶은 여러 개의 거래 내역이 담겨 있다고 생각하시면 됩니다. 이 블록을 해시하여 해시값이 만들어지는 시점이 곧 타임스탬프가 되는 것인데요. 종이신문을 보면 위에 날짜가 적혀 있죠? 그래서 어떤 신문이 먼저 발행이 됐는지 알 수 있는 것처럼 블록을 해시하여 타임스탬프를 찍어 시간 단위별로 묶어 모든 사람들이 볼 수 있게 배포하는 것입니다.
그렇게 1번 블록의 타임스탬프가 만들어지면 그 다음 거래 내역을 모아 만든 2번 블록을 해싱할 때 1번 블록의 해싱값을 넣어 해싱하는 것인데요. 이렇게 함으로써 1번 블록의 거래가 2번 블록의 거래보다 앞선 거래임을 증명할 수 있는 것입니다.
이것만 기억하자!
1) 트랜잭션(transactions, 거래)
소유자가 비트코인을 송금할 때 그 전까지의 거래 내역 및 다음 소유자 공개키를 덧붙인 뒤에 자신의 개인키로 서명하고 이 정보를 암호화한다. 이중지불을 방지하기 위해 이전 소유자가 다른 거래에 서명하지 않았는지 확인이 필요하다. 모든 거래를 반드시 공개적으로 알려 참가자들이 모든 거래를 확인할 수 있도록 한다.
2) 타임 스탬프 서버(timestamp server)
모든 거래를 시간 단위로 구별하기 위하여 타임 스탬프 서버를 통해 여러 거래를 시간 단위로 묶고 각 타임 스탬프는 직전 거래의 타임스탬프를 포함하도록 한다.