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; } |
다음과 같이 실행결과를 확인해볼수 있습니다.
'비트코인 > Libbitcoin 프로그래밍' 카테고리의 다른 글
Libbitcoin 라이브러리를 사용하여 HD 지갑의 마스터키와 개인키/공개키 생성하기 (0) | 2018.03.21 |
---|---|
Libbitcoin 라이브러리를 사용하여 Private 키 포맷변환하기 (0) | 2018.03.21 |
첫번째 Libbitcoin 프로그램 (0) | 2018.03.19 |
Libbitcoin 라이브러리 (0) | 2018.03.19 |
libbitcoin 라이브러리를 사용하여 개인키,공개키,주소 생성해보기 (0) | 2018.03.03 |