勉強内容のアウトプットです。
// ライブラリ読み込み
const bitcoinjs = require('bitcoinjs-lib')
const crypto = require('crypto')
const base58Check = require('bs58check')
// 乱数(秘密鍵)を生成し、生成した秘密鍵から公開鍵を作成(非圧縮公開鍵)
const keyPair = bitcoinjs.ECPair.makeRandom({rng: crypto.randomBytes, compressed: false})
const publicKey = keyPair.publicKey
console.log('Public Key: ' + publicKey.toString('hex'))
// 公開鍵からビットコインブロックチェーンのアドレスを生成する。
// 最初に公開鍵のSHA256-RIPEMD160ダブルハッシュを生成。
const preHash = sha256(publicKey)
const publicKeyHash = ripemd160(preHash)
// 作成するアドレスは1から始まる(シングルシグアドレス)とし、この場合バージョンバイトは00となる。
const versionByte = Buffer.from('00', 'hex')
// 「バージョンバイト + 公開鍵SHA256-RIPEMDハッシュ」を作る。
let payload = Buffer.concat([versionByte, publicKeyHash])
console.log('Public Key Hash: ' + payload.toString('hex'))
// 今回はチェックサムを付与する
payload = concatCheckSum(payload)
console.log('Payload: ' + payload.toString('hex'))
// Base58エンコードして完成
const address = base58Check.encode(payload)
console.log('Address: ' + address)
// 関数群
// SHA256生成関数
function sha256(data) {
return crypto.createHash('sha256').update(data).digest()
}
// RIPEMD160生成関数
function ripemd160(data) {
return crypto.createHash('ripemd160').update(data).digest()
}
// チェックサム付与関数
function concatCheckSum(data) {
const checkSum = sha256(sha256(data)).slice(0, 4)
console.log('Check Sum: ' + checkSum.toString('hex'))
return Buffer.concat([data, checkSum])
}