본문으로 바로가기

libbitcoin 라이브러리를 사용하여 HD 지갑의 키를 생성해보도록 하겠습니다.

(libbitcoin tutorial 사이트 참고 : http://aaronjaramillo.org/libbitcoin-hd-keys )


먼저 필요한 헤더와 namespace를 선언합니다.


#include <bitcoin/bitcoin.hpp>

#include <string.h>

#include <iostream>

 

using namespace bc;


다음으로 의사난수생성기를 통해서 Root seed 값을 생성합니다.


data_chunk seedChunk(16);

pseudo_random_fill(seedChunk);

std::cout << "\nHex Seed: " << std::endl;

std::cout << encode_base16(seedChunk)<< std::endl;


생성된 Seed값을 사용하여 연상기호 코드 워드를 생성하고 화면상에 출력해줍니다.


wallet::word_list writtenWord = wallet::create_mnemonic(seedChunk);


if(wallet::validate_mnemonic(writtenWord))

for(auto i = writtenWord.begin(); i != writtenWord.end(); ++i) 

std::cout << *i << ' '; 

}else

std::cout << "mnemonic invalid!" << std::endl; 

}


endcoded() 매쏘드를 통해서 Base58Check(WIF) 포맷의 개인키를 생성하고, to_hd_key() 매쏘드를 통해서는 Hex 포맷의 개인키를 생성합니다.


wallet::hd_private privateKey(seedChunk);

std::cout << "\n\nMaster Private Key: " << std::endl;

std::cout << privateKey.encoded() << std::endl;

 

wallet::hd_key keys = privateKey.to_hd_key();

std::cout << "\nHex Master Private Key: " << std::endl;

std::cout << encode_base16(keys) << std::endl;


개인키를 사용하여 공개키를 생성합니다.


wallet::hd_public publicKey = privateKey.to_public();

std::cout << "\nMaster Public Key: " << std::endl;

std::cout << publicKey.encoded() << std::endl;


부모의 개인키를 사용하여 유도된 자식의 개인키와 공개키를 생성합니다.


wallet::hd_private childPrivateKey = privateKey.derive_private(1);

std::cout << "\nChild Private Key: " << std::endl;

std::cout << childPrivateKey.encoded() << std::endl;


wallet::hd_public childPublicKey = privateKey.derive_public(1);

std::cout << "\nChild Public Key: " << std::endl;

std::cout << publicKey.encoded() << std::endl; 


마지막으로 자식의 공개키를 사용하여 주소를 생성합니다.


 std::cout << "\nPayment Adress: " << std::endl;

std::cout << wallet::ec_public(childPublicKey.point()).to_payment_address().encoded()<< "\n" << std::endl;


전체 코드는 다음과 같습니다.


#include <bitcoin/bitcoin.hpp>

#include <string.h>

#include <iostream>

 

using namespace bc;


int main(void)

{

data_chunk seedChunk(16);

pseudo_random_fill(seedChunk);

std::cout << "\nHex Seed: " << std::endl;

std::cout << encode_base16(seedChunk)<< std::endl;


wallet::word_list writtenWord = wallet::create_mnemonic(seedChunk);


if(wallet::validate_mnemonic(writtenWord))

for(auto i = writtenWord.begin(); i != writtenWord.end(); ++i) 

std::cout << *i << ' '; 

}else

std::cout << "mnemonic invalid!" << std::endl; 

}


wallet::hd_private privateKey(seedChunk);

std::cout << "\n\nMaster Private Key: " << std::endl;

std::cout << privateKey.encoded() << std::endl;

 

wallet::hd_key keys = privateKey.to_hd_key();

std::cout << "\nHex Master Private Key: " << std::endl;

std::cout << encode_base16(keys) << std::endl;


wallet::hd_public publicKey = privateKey.to_public();

std::cout << "\nMaster Public Key: " << std::endl;

std::cout << publicKey.encoded() << std::endl;


wallet::hd_private childPrivateKey = privateKey.derive_private(1);

std::cout << "\nChild Private Key: " << std::endl;

std::cout << childPrivateKey.encoded() << std::endl;


wallet::hd_public childPublicKey = privateKey.derive_public(1);

std::cout << "\nChild Public Key: " << std::endl;

std::cout << publicKey.encoded() << std::endl;


std::cout << "\nPayment Adress: " << std::endl;

std::cout << wallet::ec_public(childPublicKey.point()).to_payment_address().encoded()<< "\n" << std::endl;

}


다음과 같이 실행결과를 확인해볼수 있습니다.