0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ビットコインブロックチェーンのアドレスもどきを生成してみた

Last updated at Posted at 2021-04-15

勉強内容のアウトプットです。

// ライブラリ読み込み
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])
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?