이번 글의 선수지식으로는 공개키가 어떻게 생성되는지 알고 있으면 좋지만 필수는 아닙니다. 궁금하신 분은 아래 링크를 참고해주세요.
비트코인과 이더리움의 개인키, 공개키 생성원리: up-to-date-items.tistory.com/98
비트코인의 주소는 공개키로부터 파생되어집니다. 과정은 아래와 같습니다.
공개키 -> SHA256 함수에 넣음 -> RIPEMD160 함수에 넣음 -> 공개키 Hash가 생성됨(160bit)
이 공개키 Hash를 약간의 추가작업을 거쳐 Base58 인코딩을 하면 비트코인의 주소가 나오게 됩니다.
그럼 이제 Base58 인코딩에 대해 알아보겠습니다.
보통 많은 곳에서 엄청 긴 비트로 이루어진 숫자를 좀 더 짧게 보기 위해 10진수보다 큰 인코딩 체계를 이용합니다. 대표적인 예로 SHA-256함수의 결과값은 256비트로 이루어진 이진수 이지만 16진수로 표현해서 우리들에게 보여줍니다.
Base58은 Base64로부터 나오게 된 것인데 Base64는 64진수를 이용한 인코딩 체계입니다. 0~9, a~z, A~Z에다가 특수기호 2개(+, /)를 사용한 64진수 체계입니다.
그런데 숫자0과 알파벳 O, 알파벳 소문자 l(아이)과 알파벳 대문자 I(엘) 등 조금 햇갈리는 부분들을 제거하여 사용자들이 주소를 실수하지 않게 하기위해 나온 것이 Base58 인코딩 체계입니다. (0, O, I, l) 에다가 특수기호 2개를 빼서 58개입니다.
이렇게해도 여전히 실수할 우려가 있기 때문에 Base58 encoding전에 해야할 추가작업이 Base58Check입니다. 끝에 4bytes의 checksum을 추가로 더하여 실수를 방지하기 위한 체계입니다. (시스템이 이 checksum을 보고 유효한 주소인시 검사합니다.)
우선 checksum이 만들어지는 과정에 대해 알아보겠습니다.
먼저 위에서 구한 공개키 Hash 앞부분에 version byte란걸 더해야 합니다. version byte란 인코딩된 데이터의 유형을 쉽게 파악하기 위해 더해주는 데이터라고 보시면 됩니다. 비트코인의 주소는 0x00(16진수)를 더하면 됩니다. 그럼 현재 우리가 가지고 있는건 아래와 같습니다.
0x00(hex) + 공개키 Hash 이제 이걸 편의상 P`라고 부르겠습니다.
이제 P`를 SHA-256함수에 2번 돌려줍니다.
result = SHA256(SHA256(P`)) 이런식으로 말입니다.
result는 SHA256함수의 output이므로 256bit로 이루어져있습니다.
여기서 앞 4bytes(32bit)를 가져오면 그게 checksum이 됩니다.
위에서 구한 checksum을 P` 뒤에 붙여줍니다. 그럼 우리가 지금까지 구한 값은 아래와 같습니다.
P` = 0x00 + 공개키 Hash + checksum
이제 P`에 Base58 encoding을 적용하면 비트코인 주소가 나오게 됩니다.
'Bitcoin' 카테고리의 다른 글
비트코인의 지갑 (0) | 2021.03.19 |
---|---|
비트코인의 채굴원리 (0) | 2021.03.19 |
비트코인의 머클트리(Merkle Tree) (0) | 2021.03.17 |
비트코인의 블록구조와 체이닝 (0) | 2021.03.17 |
비트코인의 Bloom Filters (0) | 2021.03.16 |