Node
비트코인 지갑 생성하기 (node.js) 및 잔액 확인
citron031
2023. 1. 28. 15:16
- 비트코인은 bip 44, bip49, bip 84와 같이 지갑을 생성하는 표준이 형성되어 있다.
🍸 bip 44는 계층지갑, bip49는 P2WPKH-nested-in-P2SH 기반 계정, bip84는 P2WPKH 기반 계정을 생성하는 표준이다.
https://trezor.io/learn/a/what-are-bips-slips
https://trezor.io/learn/a/what-are-bips-slips
trezor.io
- 자바스크립트로 비트코인 지갑을 생성하는 코드를 작성하였다.
- ecpair 라이브러리를 통해서 비트코인 지갑 키쌍을 생성할 수 있다.
const bip39 = require("bip39");
const { ECPairFactory } = require("ecpair");
const bitcoin = require("bitcoinjs-lib");
const { BIP32Factory } = require("bip32");
const ecc = require("tiny-secp256k1");
const base58 = require("bs58");
const crypto = require("crypto");
const fetch = require("node-fetch"); // node-fetch@2
const ecpair = ECPairFactory(ecc);
const bip32 = BIP32Factory(ecc);
const dummyData = "dummy data";
const entropy = crypto.createHash("sha256").update(dummyData).digest("hex");
const mnemonic = bip39.entropyToMnemonic(entropy);
bip39.mnemonicToSeed(mnemonic).then((seed) => {
const rootNode = bip32.fromSeed(seed);
const childNode = rootNode.derivePath("m/84'/0'/0'/0/0");
const bitcoinKeyPair = ecpair.fromPrivateKey(childNode.privateKey);
console.log(
base58.encode(bitcoinKeyPair.publicKey),
base58.encode(bitcoinKeyPair.privateKey)
);
const payment = bitcoin.payments.p2pkh({
pubkey: bitcoinKeyPair.publicKey,
});
console.log("address", payment.address);
fetch(`https://blockchain.info/rawaddr/${payment.address}`).then(
(balance) => {
balance.json().then((jsonBalance) => {
console.log("balance", jsonBalance.final_balance);
});
}
);
});
- 비트코인의 잔액을 확인하는 방법으로 외부 API를 사용하였다.
- https://www.blockchain.com/explorer/api/blockchain_api
Blockchain Developer APIs
The most popular and trusted block explorer and crypto transaction search engine.
www.blockchain.com
- bip32 라이브러리를 사용하여 HDNode를 생성, 비트코인 path의 첫 번째 index 지갑을 생성하였다.
- ecpair 라이브러리로 비트코인 키페어를 생성하였고, bitcoinjs-lib 라이브러리로 결제 주소를 생성할 수 있었다.
- 비트코인은 다양한 지갑 주소를 생성할 수 있고, 필요에 따라서 선택할 수 있다.
- 만약 Segwit이 적용된 트랜잭션을 사용한다면, 다음과 같이 주소를 생성한다.
const paymentP2wpkh = bitcoin.payments.p2wpkh({
pubkey: bitcoinKeyPair.publicKey,
network: bitcoin.networks.bitcoin,
});
- 위와 같이 주소 생성 시, 두번째 인자로 네트워크를 전달할 수도 있다.
- 비트코인 주소의 잔액을 확인하는 방법으로 API 요청을 보낼 수 있다.
- https://www.blockchain.com/explorer/api/blockchain_api 의 API를 사용하면, 다음과 같이 비트코인 주소의 잔액을 확인할 수 있다.
const balance = await fetch(
`https://blockchain.info/rawaddr/${address}`,
);
const jsonBalance = await balance.json();
console.log('balance', jsonBalance.final_balance);
Blockchain Developer APIs
The most popular and trusted block explorer and crypto transaction search engine.
www.blockchain.com
생성한 bitcoinKeyPair는 복구를 위한 값인 wif로 변환할 수 있다.
const wif = bitcoinKeyPair.toWIF();
console.log('wif', wif); // 지갑 복구를 위한 값
const restoreKeyPair = ecpair.fromWIF(wif); // 복구
wif로 키쌍을 복구하는 메서드가 제공되므로, wif값만 알고 있어도 지갑에 대한 정보를 복구할 수 있다.