용어집 / 주소와 키
체인 코드
- 체인 코드란 무엇입니까?
- 체인 코드는 HD 지갑에서 각 키와 함께 전달되는 32바이트의 추가 엔트로피로, 모든 하위 키 도출에 섞여 들어가 키를 형제 키로부터 추측할 수 없게 합니다.
BIP-32에 명시되어 있습니다.
확장 키의 절반은 키가 아닙니다. BIP-32는 512비트 해시를 256비트 키와 256비트 체인 코드로 나누며, xpub 문자열은 이 둘을 함께 담아 총 111자입니다. xpub을 건네는 순간 체인 코드도 함께 건네는 것이며, 그것이 수령자가 앞으로의 주소를 도출할 수 있게 하는 것입니다.
작동 방식
체인 코드는 HMAC 호출 한 번 안에서 역할을 합니다. 하위 키를 도출할 때 부모 체인 코드를 키로, 부모 공개 키와 4바이트 인덱스를 메시지로 하여 HMAC-SHA512를 실행합니다. 64바이트 결과는 가운데에서 나뉩니다. 왼쪽 32바이트를 부모 개인 키에 더한 뒤 그 합을 곡선 차수로 나눈 나머지가 하위 개인 키가 되고, 오른쪽 32바이트는 하위 키 자신의 체인 코드가 되며, 그 키는 이 체인 코드를 자신의 하위 키에 사용합니다.
이 솔트의 요점은 누가 트리를 따라 내려갈 수 있는가입니다. 공개 키만으로는 아무것도 도출되지 않습니다. 짝이 되는 체인 코드 없이는 도출 함수가 실행되지 않기 때문입니다. 그래서 확장 공개 키는 이름만 긴 공개 키가 아닙니다. 공개 키에 그 체인 코드를 더한 것이며, 이 둘을 누군가에게 건네면 곡선 위의 한 점이 아직 사용하지 않은 무한하고 열거 가능한 주소 가지로 바뀝니다.
BIP-32는 그에 따르는 위험한 지점을 기록합니다. 공격자가 여러분의 확장 공개 키를 가지고 있으면서 비경화 하위 개인 키 하나를 함께 손에 넣으면, 도출된 오프셋을 빼서 부모 개인 키를 복구할 수 있고, 그와 함께 모든 형제 키와 모든 하위 키도 복구됩니다. 경화 도출은 그 경로를 끊기 위해 존재합니다. 경화 단계에서는 해시 대상 메시지에 공개 키가 아니라 부모 개인 키가 들어가므로, 공개 자료를 아무리 모아도 아무도 위로 올라갈 수 없습니다.
확인할 수 있는 곳
체인 코드를 직접 입력하는 일은 없으며, 어떤 소비자용 지갑도 체인 코드를 따로 표시하지 않습니다. 체인 코드는 확장 키 안에서 이동합니다. xpub 또는 xprv로 시작하는 Base58Check 문자열은 78바이트로 디코딩되며, 4바이트 버전, 1바이트 깊이, 4바이트 부모 지문, 4바이트 하위 번호, 32바이트 체인 코드, 마지막으로 33바이트 키 순서로 배치됩니다. 그래서 xpub이 텍스트로 111자가 되는 것입니다.
필드가 필드로서 드러나는 곳은 개발자 도구입니다. Bitcoin Core의 deriveaddresses RPC는 확장 키를 내장한 디스크립터에서 작동하고, python-bip32 같은 라이브러리는 체인 코드를 별도 속성으로 반환하며, 감시 전용 설정을 위해 계정을 내보내는 서명 장치는 정확히 이 쌍을 내보냅니다.
적절한 주의 수준은 비밀번호에 적용할 수준이 아니라 전체 거래 내역에 적용할 수준입니다. 체인 코드는 서명할 수 없으므로 그 자체로는 잃을 것이 없습니다. 그러나 분석 업체, 클라우드 백업, 또는 xpub을 지원 요청서에 붙여 넣은 사람의 손에 들어가면 그 가지의 모든 결제를 과거와 미래까지 노출하며, 이후에 접근 권한을 취소할 방법은 없습니다.
체인 코드 vs 개인 키
체인 코드와 개인 키는 모두 32바이트의 무작위처럼 보이는 값이지만, 지출할 수 있는 것은 둘 중 하나뿐입니다. 개인 키는 서명을 만들어 냅니다. 체인 코드는 더 많은 도출 외에는 아무것도 만들어 내지 않으며, 바로 그 점 때문에 사람들이 이를 과소평가합니다. 돈을 옮길 수 없기 때문에 키라면 절대 하지 않을 일을 하면서 확장 공개 키를 공유 스프레드시트, 버그 보고서, 휴대폰 앱에 붙여 넣는 것입니다. 그 결과는 절도가 아니라 자신의 재정에 대한 영구적인 창이며, 두 실패에는 서로 다른 이름이 붙어야 합니다.