BIP49
BIP49는 분리된 감시 트랜잭션을 위해 P2WPKH-Nested-in-P2SH (BIP 141) 직렬화 형식을 사용하여 HD 지갑의 파생 체계를 정의한다.[1]
개요
BIP-32의 개념을 구현하여 특정 파생어를 작성하는 몇 가지 표준이 있다. BIP-44 는 Ethereum 및 일반 Bitcoin 주소를 가져오는 데 사용되며, BIP-49 는 Bitcoin Segwit 호환 주소에 사용되고 BIP-84 는 기본 Bitcoin Segwit 주소에 사용된다.[2]
배경
P2WPKH 중첩 P2SH(BIP141) 트랜잭션의 사용으로 공통 유도 체계를 가질 필요가 있다. 사용자가 동일한 마스터시드 및 단일 계정으로 서로 다른 HD 지갑을 원활하게 사용할 수 있다. 따라서 사용자는 이 BIP와 호환되는 지갑만이 계정을 감지하고 적절하게 처리할 수 있도록 하는 전용 분리 증인 계정을 만들어야 한다.[1]
구현
이 BIP는 BIP 32 루트 계정을 기반으로 여러 결정적 주소를 유도하기 위해 필요한 두 단계를 정의한다.[1]
공개키 파생
루트 계정에서 공개 키를 파생시키기 위해 이 BIP는 BIP44에 정의 된 것과 동일한 계정 구조를 사용하지만 다른 용도의 값만 사용하여 다른 트랜잭션 직렬화 방법을 나타낸다. '목적'경로 레벨의 경우 '49'를 사용합니다. 나머지 레벨은 BIP44에 정의 된 대로 사용된다.
m / purpose' / coin_type' / account' / change / address_index
주소 유도
위의 계산 된 공개 키에서 P2SH 주소를 유도하기 위해 BIP141에 정의 된 캡슐화를 사용한다.[1]
<pubkey> scriptSig : <0 <20 바이트 키 해시> (0x160014 {20 바이트 키 해시}) scriptPubKey : HASH160 <20 바이트 스크립트 해시> EQUAL (0xA914 { 20 바이트 스크립트 해시} 87)
- Nested SegWit
- 정식 SegWit 구현이 아닌 HD Wallet의 실장에는 BIP49를 사용한다. 기존 주소를 사용한 HD Wallet 구현은 BIP44를 그대로 사용하지만, P2PKH는 송금 및 수령의 논리가 다르므로 HD Wallet의 경로를 변경한다. BIP49에서는 P2WPKH nested in P2SH를 대상으로 하고 있다. 기본적으로는 purpose만 49`가 되는 외에는 p 같다. P2WPKH을 P2SH에서 랩 할 뿐이므로, 주소는 3 시작 P2SH주소로 된다. 주소를 생성할 때는 아래 scriptPubKey에 포함되는 공개키 해시 20바이트를 Bech32의 어드레스 포맷에 따라서 생성한다. [3]
- P2WPKH(Pay to Public Key Hash)
scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG scriptSig: <sig> <pubKey>
- scriptSig에는 발신인 공개키와 발신인의 서명이 포함되어 있다. scriptPubKey에는 수신기의 공개키 해시가 포함되어 있다. P2PKH 비트코인 거래의 수신자는 서명과 공개키 해시를 확인한다. 공개키는 pubKeyHash와 일치하는 해시를 생성해야 한다. 발신인 서명은 발신인의 공개키를 이용하여 확인할 수 있다. scriptSig 부분은 수신자가 P2PKH로부터 받은 돈을 쓰기 위해 사용하는 것이다. 그들이 돈을 쓰고 있기 때문에, 그 시점에서 그들은 새로운 발신자가 될 것이다. 이 새로운 거래를 위한 <pubKey>는 처음 돈을 받았을 때의 구 거래로부터 수신자의 <pubKeyHash>에 부친다. [4]
- P2SH(Pay to Script Hash)
- P2SH는 송신자가 20바이트 해시를 이용하여 거래 자금을 조달할 수 있도록 한다. 보안을 위해 제공된 스크립트는 scriptHash에 해시해야 한다.
- P2SH가 없는 경우 스크립트는 다음과 같이 표시된다.
locking script: 2 <pubKey1> <pubKey2> <pubKey3> 3 OP_CHECKMULTISIG unlocking script: <sig1> <sig2>
- P2SH를 사용하면 스크립트가 다음과 같이 된다.
redeem script: 2 <pubKey1> <pubKey2> <pubKey3> 3 OP_CHECKMULTISIG locking script: OP_HASH160 <redeem script Hash> OP_EQUAL unlocking script: <sig1> <sig2>
- 그래서 P2SH를 사용하면 잠금 스크립트가 단순해진다. 트랜잭션의 실제 스크립트는 다음과 같다.
scriptPubKey: OP_HASH160 <scriptHash> OP_EQUAL scriptSig: <sig1> <sig2> OP_m <pubKey1> ... OP_n OP_CHECKMULTISIG
- 잠금 스크립트는 OP_HASH160 <scriptHash> OP_EQUAL이며, 잠금 스크립트는 다중 사이트 스크립트의 단순화된 형태다. 멀티시그 스크립트: 2 <pubKey1> <pubKey2> <pubKey3> 3 OP_CHECKMULTISIG에서 돌연변이 스크립트는 8ac1d7a2204a16dc984pa81cf86a2a2a4e1731의 20바이트 값으로 해시 된다. 따라서 잠금 스크립트는 OP_HASH160 8ac1d7a2fa204a16dc984f81cfdf86a2a4e1731 OP_EQUAL이 된다. scriptSig <sig1> <sig2> OP_2 <pubKey1> <pubKey2> <pubKey3> OP_3 OP_CHECKMULTISIG는 수신자가 비트코인을 사용하고자 할 때 제시된다.[4]
각주
- ↑ 1.0 1.1 1.2 1.3 〈https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki#considerations BIP49 깃허브]〉, 《깃허브》
- ↑ 탈 Be'ery, 〈https://zengo.com/the-wallet-seed-saviors/ 월렛 씨앗 구원자]〉, 《Zengo》, 2019-01-22
- ↑ 코우즈마 토모카즈, 〈HD Wallet에서 Bitcoin의 SegWit 주소를 처리하려면 BIP49과 BIP84를 사용〉, 《블록 체인 엔지니어로 사는》, 2019-05-16
- ↑ 4.0 4.1 Victor, 〈http://embedded-design-vic.blogspot.com/2017/11/bitcoin-core-tutorial-and-source-code_10.html Bitcoin core tutorial & code walk through (Part 9) - P2PKH/P2SH]〉, 《EMBEDDED》, 2017-11-16
참고자료
- 〈https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki#considerations BIP49 깃허브]〉, 《깃허브》
- 탈 Be'ery, 〈https://zengo.com/the-wallet-seed-saviors/ 월렛 씨앗 구원자]〉, 《Zengo》, 2019-01-22
- 코우즈마 토모카즈, 〈HD Wallet에서 Bitcoin의 SegWit 주소를 처리하려면 BIP49과 BIP84를 사용〉, 《블록 체인 엔지니어로 사는》, 2019-05-16
- Victor, 〈http://embedded-design-vic.blogspot.com/2017/11/bitcoin-core-tutorial-and-source-code_10.html Bitcoin core tutorial & code walk through (Part 9) - P2PKH/P2SH]〉, 《EMBEDDED》, 2017-11-16
같이 보기