마스터 체인 코드 (Master Chain Code)

고급지갑·키수정일

마스터 체인 코드(master chain code)는 BIP32 계층적 결정적(HD) 지갑에서 시드로부터 마스터 개인 키와 함께 만들어지는 32바이트(256비트) 값입니다. 하위 키를 파생할 때 키와 짝을 이루어 쓰이는 추가 엔트로피이며, 체인 코드 하나만으로는 어떤 개인 키도 계산할 수 없습니다.

자세히 알아보기

BIP32는 먼저 128~512비트(권장 256비트)의 시드 S를 준비하고 I = HMAC-SHA512(Key = "Bitcoin seed", Data = S)를 계산합니다. 512비트 결과를 32바이트씩 둘로 나누어 왼쪽 절반(IL)을 마스터 개인 키로, 오른쪽 절반(IR)을 마스터 체인 코드로 씁니다.

키와 체인 코드를 묶은 것을 확장 키라고 합니다. 개인 키 k와 체인 코드 c의 쌍 (k, c)는 확장 개인 키, 공개 키 K와 같은 체인 코드의 쌍 (K, c)는 확장 공개 키입니다. 확장 키는 78바이트로 직렬화되고 Base58Check로 인코딩되면 111자 문자열이 되며, 메인넷에서는 xprv와 xpub로 시작합니다. 자식 키를 만들 때는 부모 체인 코드를 HMAC-SHA512의 키로, 부모 키와 인덱스를 데이터로 넣습니다. 결과의 왼쪽 절반은 자식 키 계산에, 오른쪽 절반은 자식 체인 코드로 쓰입니다. 공개 키만 알고 체인 코드를 모르면 하위 키를 계산할 수 없다는 점이 체인 코드의 역할입니다.

보안상 경계는 다음과 같습니다. 체인 코드만 유출되면 키는 드러나지 않습니다. 확장 공개 키(xpub)가 유출되면 그 아래의 일반(비강화) 자식 공개 키와 주소를 모두 계산할 수 있어 자금은 안전해도 거래 내역의 프라이버시가 사라집니다. 더 나아가 부모 확장 공개 키와 그 아래 비강화 자식 개인 키 하나가 함께 유출되면 부모 확장 개인 키를 계산할 수 있습니다. 강화 파생(hardened derivation)은 부모 개인 키를 입력으로 쓰므로 이 경로를 막으며, BIP32는 계정 단계에 강화 파생을 쓰도록 권합니다.

마스터 체인 코드는 시드에서 언제든 다시 계산되므로 따로 백업할 대상이 아닙니다. 백업해야 하는 것은 시드(또는 시드를 만드는 니모닉 문구)입니다.

블록체인·암호화폐에서는

지갑은 확장 공개 키를 이용해 개인 키 없이도 새 수신 주소를 계속 만들 수 있습니다. 예를 들어 결제 서버에는 xpub만 두어 주문마다 다른 주소를 발급하고, 개인 키는 오프라인 기기에 보관하는 방식입니다. 이 경우 서버가 침해되어도 공격자는 주소 목록을 알 수 있을 뿐 자금을 옮길 수 없습니다. 다만 같은 계층의 비강화 자식 개인 키가 함께 새어 나가면 위에서 설명한 조건이 성립하므로, 개인 키는 xpub와 같은 곳에 두지 않는 것이 원칙입니다.

쉽게 말하면

체인 코드는 도장과 함께 보관하는 "새 도장을 새기는 규칙표"와 비슷합니다. 규칙표만 가지고는 어떤 도장도 찍을 수 없지만, 원래 도장과 규칙표가 함께 있으면 정해진 순서대로 하위 도장을 계속 새길 수 있습니다.

예시

경로 m/0'/1에서 m은 마스터 확장 키(마스터 개인 키 + 마스터 체인 코드), 0'은 강화 파생으로 만든 첫 번째 자식, 1은 그 아래 인덱스 1의 비강화 자식을 뜻합니다. 각 단계에서 부모의 체인 코드가 다음 자식 키와 자식 체인 코드를 정합니다.

이 글은 학습을 위한 일반 정보이며 투자 권유나 법률 자문이 아닙니다. 가상자산은 가격 변동이 크고 원금 손실 위험이 있습니다.