ビットコインのアドレス生成の仕方

  • 19
    いいね
  • 0
    コメント

ビットコインのアドレス

ビットコインのアドレスは公開鍵と秘密鍵のペアです
ビットコインの公開鍵は特に暗号化するのに使うわけでもなくビットコインアドレスという支払い受付用の他人に見せてもよいアドレスにするためだけに使われます

秘密鍵はデジタル署名として使いトランザクションスクリプトを用いてビットコインの残高を動かすのに使います。
一般的な用途の公開鍵(暗号化)と秘密鍵(複合化)という使い方とは違った使い方をします。
(ただし、このアドレスは俺のものだと証明するのにk)

普段見かける1xxxxxxxxxx や 3xxxxxxxxxxxなどの形式はビットコインアドレスといい公開鍵にHash160とBase58Checkというチェックサム付きのエンコードをかけて表示しています

ビットコインアドレス生成の一連の流れ

bitcore-libというjavascriptのライブラリを用いてコードを記載します。
以下のコマンドでインストールできます

console
npm i bitcore-lib

秘密鍵->公開鍵->ビットコインアドレスと順番に生成していきますが逆にはたどれません。

※注意事項としてここでは秘密鍵を気軽にハードコードしてますがそれはかなり危険な行為です。

まずはランダムに秘密鍵の生成から

javascript
var bitcore = require('bitcore-lib');
var network = 'livenet';
var privateKey = new bitcore.PrivateKey(network);
console.log(privateKey.toString());
console
 69a97488152a6db9efe3f5c3d96b397cc09114c8267f4e0269830b47c9c04b69

生の秘密鍵からWIF形式の生成

  • WIFはウォレット間で秘密鍵を移動する場合に考案された方式
javascript
var bitcore = require('bitcore-lib');
var network = 'livenet';
var privkey = '69a97488152a6db9efe3f5c3d96b397cc09114c8267f4e0269830b47c9c04b69';
var privateKey = new bitcore.PrivateKey(privkey, network);
console.log(privateKey.toWIF());
console
 cR86SboG3dmS2u43hENCT2xfhtu8UkBcAqLFvJU55LvPw8CAjkFj

WIFから秘密鍵の取り込み

javascript
var bitcore = require('bitcore-lib');
var wif = 'cR86SboG3dmS2u43hENCT2xfhtu8UkBcAqLFvJU55LvPw8CAjkFj';
var privateKey = bitcore.PrivateKey.fromWIF(wif);
console.log(privateKey.toString());
console
 69a97488152a6db9efe3f5c3d96b397cc09114c8267f4e0269830b47c9c04b69

秘密鍵から公開鍵の取得

javascript
var bitcore = require('bitcore-lib');
var network = 'livenet';
var privkey = '69a97488152a6db9efe3f5c3d96b397cc09114c8267f4e0269830b47c9c04b69';
var privateKey = new bitcore.PrivateKey(privkey, network);
var publicKey = privateKey.toPublicKey();
console.log(publicKey.toString());
console
 02c8fa0c8d1edefcd78177af0d834cba9f49fd1396a214a204aaca81561eea02de

公開鍵からビットコインアドレスの取得

javascript
var bitcore = require('bitcore-lib');
var network = 'livenet';
var pubKey = '02c8fa0c8d1edefcd78177af0d834cba9f49fd1396a214a204aaca81561eea02de';
var publicKey = new bitcore.PublicKey(pubKey, network);
var address = publicKey.toAddress();
console.log(address.toString());
console
 1HGxskriFLBsnQcG2zb6LyZybJC97b3EZe

ビットコインアドレスを取得

javascript
var bitcore = require('bitcore-lib');
var network = 'livenet';
var btcAddr = '1HGxskriFLBsnQcG2zb6LyZybJC97b3EZe';
var address = new bitcore.Address(btcAddr, network);
console.log(address.toString());
console
 1HGxskriFLBsnQcG2zb6LyZybJC97b3EZe

ビットコインアドレスのバリデーションかける

javascript
var network = 'livenet';
var btcAddr = '1HGxskriFLBsnQcG2zb6LyZybJC97b3EZe';
var error = bitcore.Address.getValidationError(btcAddr, network);
if (error) {
  // 無効なアドレス
  var message = error.messsage;
}

参考ページ

技術者向けビットコイン講座 第2回 ビットコインアドレスと秘密鍵のフォーマット

ビットコインとは何か? 第3回:ビットコインの仕組み(アドレスの作成から送金まで)