코드체인과 HD Wallet

Photo by stevepb from Pixabay

코드박스 / 19. 11. 20. 오후 9:55

계정 관리의 번거로움

블록체인에서는 공개키 암호를 바탕으로 계정을 만들 수 있습니다. 키는 무작위로 생성할 수 있는데, 가능한 키의 가짓수는 secp256k1 기준 약 10⁷⁷개로 매우 많기 때문에 중복된 키가 생성되는 일은 없습니다.

문제는 계정 여러 개를 관리하는 것입니다. 예를 들어서, 앱에서 코인을 주고 받을 때 보안을 안전하게 유지하기 위해서는 돈을 받을 때마다 새로운 계정을 만드는 것이 중요합니다. 여러 유저가 있다면 각 유저마다 공개키와 비밀키를 잘 저장하고 있어야 하고, 각 비밀키가 어떤 유저의 것인지도 써놓아야 합니다. 또한 목적에 따라서 한 유저 당 여러 계정을 만들려고 하면 문제는 더 복잡해지죠. 코드박스의 GoCryptoBot에서도 비슷한 고민을 했었습니다.(medium 링크)

계정의 비밀키를 일일이 저장하는 번거로움을 피하려고 비밀키를 일정한 규칙성을 가지고 만드는 것은 암호학적으로 위험한 일입니다. 그렇다면 일일이 저장하지 않으면서 암호학적으로 안전하고 편리한 방법은 없는 것일까요?

HD Wallet이란 무엇인가?

HD Wallet은 Hierarchical Deterministic Wallet의 약자로, 시드(Seed) 값만 가지고 있으면 여러 개의 계정을 쉽게 생성할 수 있는 방법을 제공해줍니다.

HD Wallet을 통해 계정을 만들기 위해서는 크게 두 가지가 필요합니다. 하나는 앞서 언급한 시드라는 정수 값이고, 다른 하나는 그 계정까지의 경로입니다. HD Wallet의 경로는 여러 개의 정수로 구성되며 그 개수에 제한은 없습니다. 경로와 그 표기법은 아래에서 설명하겠습니다.

HD Wallet은 시드로부터 마스터 키를 생성합니다. 그리고 HD Wallet은 각 키마다 자식 키(Child Key)를 생성할 수 있는데, 자식 키들은 번호가 0번부터 2⊃3;⊃2;-1까지 붙어있어 총 2⊃3;⊃2;개의 자식 키가 존재합니다. 자식 키는 용도에 따라 Normal Child Key와 Hardened Child Key로 나뉩니다. 0번부터 2⊃3;⊃1;-1번까지는 Normal Child Key로 부모의 공개키를 통해서 해당 계정의 공개키를 구할 수 있습니다. 2⊃3;⊃1;번부터 2⊃3;⊃2;-1번까지는 Hardened Child Key로 부모의 비밀키를 알아야지만 공개키를 구할 수 있습니다. 만약 겉으로 부모와의 연관성이 없어보이는 자식 키를 만들고 싶다면 Hardened Child Key로 만들면 됩니다.

HD Wallet의 경로는 일반적인 표기법이 있습니다. 우선, 마스터 키의 공개키는 M, 비밀키는 m으로 표시합니다. 만약 어떤 키 x의 i번째 Normal Child Key를 표시하고 싶다면 x/i로 표시합니다. i번째 Hardened Child Key는 x/i’로 표시합니다. 앞서 예시로 들었던 마스터 키의 비밀키로부터 1번 Normal Child Key의 2번 Hardened Child Key를 나타내고 싶다면 m/1/2' 로 표기하면 됩니다.

https://github.com/bitcoin/bips/blob/master/bip-0032/derivation.png

보시다시피, HD Wallet은 시드와 경로가 있다면 항상 동일한 값의 자식 키를 구할 수 있습니다. 그리고 자식 키들은 Tree와 같이 계층적인 구조를 가집니다. Hierarchical Deterministic Wallet이라고 불리는 이유입니다.

HD Wallet에 대해서 더 자세히 알아보고 싶으시다면 Bitcoin의 BIP-0032에 대해 읽어보세요.

코드체인에서는 어떻게 HD wallet을 지원해주는가?

코드체인 KeyStore에서는 Bitcore library를 바탕으로 기본적인 HD Wallet 함수를 제공하고 있으며, HD Wallet의 시드 값을 암호화해서 저장하고 있습니다. 해당 함수들은 Keystore repository의 HDWKeyStore interface에 정의되어 있습니다.

이를 사용하시려면 CCKey 인스턴스를 생성한 뒤 hdwseed 멤버를 사용하면 됩니다. 이를 통해 다음과 같이 간단한 예시 코드 작성이 가능합니다. 이 예시는 “codechain” 이라는 비밀번호로 시드를 생성한 뒤, m/1/2/3 이라는 경로로 공개키를 만드는 코드입니다.

코드체인 지갑에서도 Keystore의 기능을 사용해 HD Wallet을 지원할 예정입니다.

Cross-chain multi-account HD Wallet에 대한 Bitcoin proposal인 BIP-0044에서는 각 coin마다 coin type 값을 부여하고 있는데, SatoshiLabs에서 SLIP-0044를 통해 이를 관리하고 있습니다. 코드체인에서는 최근 SLIP-0044에 3276번(0xCCC)로 CCC를 등록했습니다. 이를 통해 BIP-0044를 지원하는 지갑에서 코드체인 CCC를 쉽게 지원할 수 있습니다.

기업문화 엿볼 때, 더팀스

로그인

/