BIP for HD Wallet

BIPλž€ 무엇인가

BIPλŠ” Bitcoin Improvement Proposals의 μ•½μžλ‘œμ„œ, λΉ„νŠΈμ½”μΈ κΈ°λŠ₯ κ°œμ„ μ„ μœ„ν•œ μ œμ•ˆμ„ 담은 λ¬Έμ„œμ΄λ‹€.

BIPλž€ λΉ„νŠΈμ½”μΈμ„ κ°œμ„ ν•˜κ³ μž μ œμ•ˆν•˜λŠ” κ°œμ„ μ•ˆ μˆ˜μ • 및 κ°œμ„ μ΄ ν•„μš”ν•œ λΉ„νŠΈμ½”μΈμ˜ 사항에 λŒ€ν•˜μ—¬ 문제λ₯Ό μ œκΈ°ν•˜κ³  ν•΄λ‹Ή 쟁점이 νƒ€μΈλ“€λ‘œλΆ€ν„° μΌμ •ν•œ 규λͺ¨ μ΄μƒμ˜ μ§€μ§€λ₯Ό μ–»κ²Œ 되면 곡식적인 절차λ₯Ό ν†΅ν•˜μ—¬ BIP ν”„λ‘œμ„ΈμŠ€μ— νšŒλΆ€λ˜λŠ” 것이닀.

BIPμ—λŠ” μ—¬λŸ¬ κ°€μ§€ μ’…λ₯˜κ°€ μžˆλ‹€. 이 κΈ€μ—μ„œλŠ” HD wallet을 κ΅¬μΆ•ν•˜κΈ° μœ„ν•΄ κΌ­ μ•Œμ•„μ•Ό ν•˜λŠ” λͺ‡ κ°€μ§€λ§Œ 짚고 λ„˜μ–΄κ°€κ² λ‹€.

  • BIP32: HD μ§€κ°‘μ˜ 일반적인 ν˜•μ‹κ³Ό HD 지갑을 κ΅¬μΆ•ν•˜λŠ” 방법을 μ„€λͺ…ν•œ λ¬Έμ„œ.

  • BIP39: κ²°μ •μ„± μ—΄μ‡ λ₯Ό νŒŒμƒν•˜κΈ° μœ„ν•œ λ‹ˆλͺ¨λ‹‰ μ½”λ“œμ˜ μœ ν˜• 및 BIP32 μ‹œλ“œλ‘œ μ „ν™˜ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€

  • BIP44: BIP32 μ§€κ°‘μ˜ νŠΉμ • ν˜•μ‹, λͺ©μ μ„ 44둜 μ„€μ •ν•΄μ„œ λ‚˜νƒ€λ‚˜λŠ” 닀쀑 화폐 λ‹€ 계정 μ£Όμ†Œλ₯Ό μ œμ•ˆ

  • BIP84: P2WPKH 기반 κ³„μ •μ˜ μœ λ„ μŠ€ν‚€λ§ˆ

BIP32와 HD Wallet

BIP32κ°€ νƒ„μƒν•˜κ²Œ 된 배경은 ν•˜λ‚˜μ˜ λΉ„νŠΈμ½”μΈ μ£Όμ†Œλ³΄λ‹€ μ—¬λŸ¬ 개의 λΉ„νŠΈμ½”μΈ μ£Όμ†Œλ₯Ό κ°€μ§€κ³  μž…μΆœκΈˆμ„ ν•˜λ©΄ 훨씬 더 μ•ˆμ „ν•˜λ‹€λŠ” κ²ƒμ—μ„œ λΆ€ν„° μΆœλ°œν•˜μ—¬ ν˜„μž¬λŠ” λ‹€μ–‘ν•œ μš©λ„λ‘œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

BIP32λŠ” 처음으둜 HD 지갑에 λŒ€ν•œ ꡬ쑰λ₯Ό μ œμ•ˆν–ˆλŠ”λ°, HD 지갑은 결정적 계측 ꡬ쑰 μ§€κ°‘μœΌλ‘œ 2μ§„ 트리처럼, λΆ€λͺ¨ μžμ† 관계λ₯Ό μ΄μš©ν•΄ 끝없이 νŒŒμƒμ‹œν‚¬ 수 μžˆλŠ” μ§€κ°‘μœΌλ‘œ BIP32 이외에도 BIP39, BIP44λ“± μ—¬λŸ¬ 버전이 있으며 BIP39둜 λ§Œλ“€μ–΄μ§„ ν”„λ‘œκ·Έλž¨μ€ λ‹€λ₯Έ λΈ”λ‘μ²΄μΈμ—μ„œλ„ ν”νžˆ μ‚¬μš©λœλ‹€.

μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 HD 지갑은 ν•˜λ‚˜μ— μ‹œλ“œμ—μ„œ νŒŒμƒλœλ‹€.

BIP39와 HD Wallet

μš°λ¦¬κ°€ ν”νžˆ μ•„λŠ” λ‹ˆλͺ¨λ‹‰μ€ BIP39에 μ˜ν•΄ ν‘œμ€€ν™” λ˜μ–΄μžˆλ‹€.

λ‹ˆλͺ¨λ‹‰μ΄λž€ 단어 μ‹œν€€μŠ€λ₯Ό μ‚¬μš©ν•œ λ°©λ²•μœΌλ‘œ λͺ‡ 개의 λ‹¨μ–΄λ“€μ˜ λ‚˜μ—΄μ„ μ‚¬μš©μžμ—κ²Œ κΈ°μ–΅ν•˜κ²Œ ν•¨μœΌλ‘œμ¨ 이 λ‹¨μ–΄λ“€μ˜ λ‚˜μ—΄μ€ λ‚˜μ€‘μ— μ§€κ°‘ 볡ꡬ에 μ‚¬μš©λœλ‹€.

λ‹ˆλͺ¨λ‹‰κ³Ό μ‹œλ“œμ˜ 생성과정에 λŒ€ν•΄μ„œ μž μ‹œ μ•Œμ•„λ³΄μž.

  1. 128~256 λΉ„νŠΈμ˜ λ¬΄μž‘μœ„ μ•”ν˜Έν™” μ‹œν€€μŠ€ Sλ₯Ό μƒμ„±ν•œλ‹€.

  2. 128λΉ„νŠΈλ₯Ό 32둜 λ‚˜λˆ„μ–΄μ„œ 4λΌλŠ” 값을 μ–»λŠ”λ‹€. (256λΉ„νŠΈλΌλ©΄ 256/32 => 8)

  3. μ‹œν€€μŠ€ Sλ₯Ό SHA-256λ₯Ό λ„£μ–΄ κ²°κ³Ό 값을 μ–»λŠ”λ‹€. (e.g. 011100011001010…)

    1. 이제 μš°λ¦¬λŠ” 이 κ²°κ³Όκ°’μ˜ 첫 4λΉ„νŠΈλ§Œ μ‚¬μš©ν•œλ‹€. (256λΉ„νŠΈμ˜€λ‹€λ©΄ 8λΉ„νŠΈ)

  4. S의 λ§ˆμ§€λ§‰μ— 3번의 첫 4λΉ„νŠΈλ₯Ό μΆ”κ°€ν•œλ‹€. (e.g. 0111….0111)

    1. μ—¬κΈ°μ„œ ν—·κ°ˆλ¦¬μ§€ 말아야 ν•  것은 μš°λ¦¬λŠ” μ§€κΈˆ 원본 S와 ν•΄μ‹œν•¨μˆ˜μ— 넣은 S의 일뢀 λ‘˜ λ‹€ μ‚¬μš©ν•˜κ³  μžˆλ‹€λŠ” 점이닀.

  5. 4번의 결과값을 S’라고 ν•˜μž. S’을11λΉ„νŠΈ λ‹¨μœ„λ‘œ λ‚˜λˆˆλ‹€.

  6. 2048 λ‹¨μ–΄λ‘œ κ΅¬μ„±λœ BIP-39 μ˜μ–΄ 단어 λͺ©λ‘μ—μ„œ 각 11λΉ„νŠΈλ§ˆλ‹€ λ§€μΉ­λ˜λŠ” 단어λ₯Ό λ‚˜μ—΄ν•˜μ—¬ λ‹ˆλͺ¨λ‹‰ μ½”λ“œλ₯Ό μƒμ„±ν•œλ‹€.

    1. 예λ₯Ό λ“€λ©΄ 첫 11λΉ„νŠΈκ°€ 01110000111라면 μ˜μ–΄ 단어 λͺ©λ‘μ— 01110000111: 'lion' 이런 μ‹μœΌλ‘œ 각 단어가 λ§€μΉ­λ˜μ–΄ μžˆλ‹€.

    2. 즉, S`은 128 + 4 = 132λΉ„νŠΈμ΄κ³  132λΉ„νŠΈλ₯Ό 11λΉ„νŠΈ λ‹¨μœ„λ‘œ λ‚˜λˆ„μ—ˆμœΌλ‹ˆ 총 12개의 단어λ₯Ό 얻을 수 μžˆλ‹€.

이제 λ‹ˆλͺ¨λ‹‰μ„ λ§Œλ“€μ—ˆλ‹€. 그러면 λ‹ˆλͺ¨λ‹‰μ„ 기반으둜 μ‹œλ“œλ₯Ό λ§Œλ“œλŠ” 법을 보자.

μ‹œλ“œλŠ” PBKDF2λΌλŠ” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ§Œλ“€κ²Œ λ˜λŠ”λ° 이 ν•¨μˆ˜λŠ” 2κ°€μ§€ parameterλ₯Ό ν•„μš”λ‘œ ν•œλ‹€.

ν•œ κ°€μ§€λŠ” μœ„μ—μ„œ κ΅¬ν•œ λ‹ˆλͺ¨λ‹‰ 단어듀이고 λ‚˜λ¨Έμ§€ ν•˜λ‚˜λŠ” salt이닀.

saltλž€ μ‚¬μš©μžκ°€ μΆ”κ°€λ‘œ μ •ν•˜λŠ” μ•”ν˜Έλ‘œ λ§Œμ•½ μ„ νƒν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 기본값인 mnemonic 으둜 μ„€μ •λ˜κ³ , λ§Œμ•½ μ‚¬μš©μžκ°€ μ§€μ •ν•œλ‹€λ©΄ 기본값인 "mnemonic"에 μΆ”κ°€λ˜μ–΄μ§„λ‹€.

예λ₯Ό λ“€μ–΄ μ‚¬μš©μžκ°€ "secretkey123"μ΄λž€ μ•”ν˜Έλ₯Ό μΆ”κ°€ν–ˆλ‹€λ©΄ saltλŠ” "mnemonicsecretkey123"이 λ˜λŠ” 식이닀.

PBKDF2λŠ” HMAC-SHA512 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 우리의 λ‹ˆλͺ¨λ‹‰ 단어듀과 saltλ₯Ό 인자둜 μ§‘μ–΄λ„£μœΌλ©΄

λ‚΄λΆ€μ μœΌλ‘œ 2048 ν•΄μ‹œ λΌμš΄λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ΅œμ’… κ²°κ³Ό κ°’μœΌλ‘œ 512λΉ„νŠΈ 값을 좜λ ₯ν•˜κ²Œ λ˜λŠ”λ°, 이게 λ°”λ‘œ μ‹œλ“œλ‹€.

2048λΌμš΄λ“œλž€ 예λ₯Ό λ“€μ–΄ ν•΄μ‰¬ν•¨μˆ˜ f(x)κ°€ 있고 f(1)의 결과값이 2라면 이 결과값을 λ‹€μ‹œ f(x)에 λ„£λŠ”λ‹€.

그럼 2λΌμš΄λ“œλ₯Ό 돌린 것이고, 이걸 2048 λΌμš΄λ“œλ₯Ό ν•˜κ² λ‹€λŠ” 것이닀.

λ‹Ήμ—°ν•œ μ΄μ•ΌκΈ°μ§€λ§Œ 같은 λ‹ˆλͺ¨λ‹‰ 단어듀이여도 salt값이 λ‹€λ₯΄λ‹€λ©΄ μ‹œλ“œ 값은 달라진닀.

BIP44

λ³΅μˆ˜ν™”ν(multicurrency) 및 λ³΅μˆ˜κ³„μ •(multiaccount) 지갑을 μ„€λͺ…ν•˜λŠ” 일반적인 μ‚°μ—… ν‘œμ€€μ΄λ‹€.

BIP44λŠ” BIP43의 μŠ€νŽ™μ„ ν™•μž₯ν•˜μ—¬ λͺ©μ  번호λ₯Ό 44'둜 μ„€μ •ν•˜μ—¬ 볡수 화폐 볡수 계정 ꡬ쑰λ₯Ό μ œμ•ˆν•œλ‹€.

BIP44의 ꡬ쑰λ₯Ό λ”°λ₯΄λŠ” λͺ¨λ“  HD μ§€κ°‘ κ΅¬μ‘°λŠ” ν•˜λ‚˜μ˜ 트리 λΆ„κΈ°(m/44'/*)만 μ‚¬μš©ν•˜μ—¬ μ‹λ³„λœλ‹€.

BIP44λŠ” 미리 μ •μ˜λœ λ‹€μ„― κ°€μ§€ 트리 레벨둜 κ΅¬μ„±λœ ꡬ쑰λ₯Ό μ§€μ •ν•œλ‹€.

λͺ©μ  (purpose)

첫 번째 레벨인 λͺ©μ μ€ 항상 44둜 μ„€μ •λœλ‹€.

코인 μ’…λ₯˜ (coin_type) :

코인 μ’…λ₯˜λŠ” μ•”ν˜Έν™”νμ˜ μœ ν˜•μ„ μ§€μ •ν•œλ‹€.

이더리움은 m/44’/60’, λΉ„νŠΈμ½”μΈμ€ m/44’/0’, λͺ¨λ“  ν…ŒμŠ€νŠΈλ„·μ€ m/44’/1’이닀.

계정 (account)

μ‚¬μš©μžλŠ” 지갑을 m/44’/0’/0’, m/44’/0’/1’ 처럼 HD μ§€κ°‘μ—λŠ” 2개의 λΉ„νŠΈμ½”μΈ 계정을 포함할 수 μžˆλ‹€.

μž”κ³  (change)

BIP44λŠ” μ›λž˜ λΉ„νŠΈμ½”μΈμ„ μœ„ν•΄ μ œμž‘λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이더리움 세계와 관련이 μ—†λŠ” '특이점'(quirk)이 ν¬ν•¨λ˜μ—ˆλ‹€.

HD μ§€κ°‘μ—λŠ” 2개의 ν•˜μœ„ νŠΈλ¦¬κ°€ μžˆλŠ”λ° ν•˜λ‚˜λŠ” μž…κΈˆ μ£Όμ†Œ μž‘μ„±μš©μ΄κ³  λ‹€λ₯Έ ν•˜λ‚˜λŠ” μž”μ•‘ μ£Όμ†Œ μž‘μ„±μš©μ΄λ‹€.

이더리움은 λΉ„νŠΈμ½”μΈμ— μžˆλŠ” μž”μ•‘ μ£Όμ†Œκ°€ ν•„μš” μ—†μœΌλ―€λ‘œ 단지 'μž…κΈˆ' 경둜만 μ‚¬μš©ν•˜μ—¬ 항상 0이닀.

이전 λ ˆλ²¨μ€ κ°•ν™”νŒŒμƒλ§Œ μ‚¬μš©ν–ˆμ§€λ§Œ 이 λ ˆλ²¨μ€ λΉ„λ³΄μ•ˆ ν™˜κ²½μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν™•μž₯된 κ³΅κ°œν‚€λ₯Ό 트리의 계정 μˆ˜μ€€μ—μ„œ 내보낼 수 있게 ν•˜κΈ° μœ„ν•΄μ„œ 일반 νŒŒμƒμ„ μ‚¬μš©ν•œλ‹€.

μ‚¬μš©κ°€λŠ₯ν•œ μ£Όμ†Œ 인덱슀 (address_index)

트리의 λ‹€μ„―λ²ˆμ§Έ λ ˆλ²¨μ€ μ‚¬μš© κ°€λŠ₯ν•œ μ£Όμ†Œ 인덱슀둜 λ§Œλ“œλŠ” 것이닀. 예λ₯Ό λ“€μ–΄ μ£Ό 메인 κ³„μ •μ—μ„œ 이더리움 지급을 μœ„ν•œ μ„Έ 번째 μž…κΈˆ μ£Όμ†ŒλŠ” m/44'/60'/0'/0/2κ°€ 될 것이닀. 이것은 HD μ§€κ°‘μ—μ„œ νŒŒμƒλœ level-4의 μžμ‹μ΄λ‹€.

BIP84

BIP84λŠ” κΈ°λ³Έ Segwit P2WPKH μ£Όμ†Œμ— λŒ€ν•œ HD μ§€κ°‘μ˜ κ΅¬ν˜„μ„ μ •μ˜ν•œλ‹€.

μ£Όμ†Œ μœ ν˜•μ„ μ œμ™Έν•˜λ©΄ BIP44와 μœ μ‚¬ν•˜λ‹€.

Segwitκ³Ό P2WPKH κ°œλ…μ΄ 쑰금 μ–΄λ €μš΄λ°, κ΄€λ ¨ 글을 λ”°λ‘œ μž‘μ„±ν•œ 적이 μžˆμœΌλ‹ˆ μ•„λž˜ λ§ν¬μ—μ„œ μ°Έκ³ ν•˜λ©΄ 쒋을 것 κ°™λ‹€.

Last updated