ビットコインアドレス生成Nodejs実現例

8118 ワード

ビットコインアドレス生成——Nodejs実施例参照:
https://en.bitcoin.it/wiki/Technical_background_of_ヴェシオン1_Bitcoin_address
アドレス生成フロー:
0-ランダム32バイトの秘密鍵を取得します.
9 a 9 a 6539856 be 209 b 8 a 2 adbd 155 c 046d 515 b 7 b 13 d 6 a 79 f 1 ab 5174
1.上記の秘密鍵の公開鍵を計算する(圧縮する).
0340 A 609475 AFA 9 A 784 CAD 0 DB 5 D 5 BA 7 DBAA 2 147 A 5 D 7 B 9 BBDE 4 D 334 A 0 E 40 A 5 E
2−公開鍵をSHA 256ハッシュ計算する(圧縮する).
2 b 0955 c 0703 c 96 d 694 f 03 a 8987 f 89 d 387495 fc 359694757 a 757 c 5 e 16
3−ステップ2のハッシュ値をRIPEMD−160のハッシュ計算する.
154 de7 cabb 5822075 e 92 c 57 a 27 ca 3 ef 3 e 8 be50 c
4−ステップ3のハッシュ値の前にアドレスバージョン番号を追加する(メインネットワークは0 x 00、テストネットワークは0 xef).
0054de 7 cabb 5822075 e 92 c 57 a 27 ca 3 ef 3 e 8 be50 c
5−ステップ4の拡張RIPEMD−160のハッシュ値に対してSHA 256のハッシュ計算を行う.
ab 7 d 579 d 497 d 75 ab 7 e 3372123455 a 4 c 071 c 249 c 6 e 8 c 07252 d 2 ea 4 d 82290 e 6
6−ステップ5のハッシュ値を再びSHA 256ハッシュ計算する.
fc 897 c 2001 ef 5 e 99 b 2 e 37853 e 84 dd 041 beb 831 f 462729 de 2 af 27 e 4 ab 9 ea 7 e
7-検証コードとして、ステップ6の結果値の最初の4バイトを取る
fc 897 c 20
8−チェックコードをステップ4の拡張RIPEMD−160のハッシュ値の末尾に追加する.
0054形7 cabb 5822075 e 92 c 57 a 27 ca 3 ef 3 e 8 be50 cfc 897 c 20
9-結果をビットBase 58符号化フォーマットに変換する
12 weWzbq 5 jT 7 c 3 MHbHD 2 WP 2 uLXEUtaGLXZ
Node(v 10.5.0)ソースコードの実現:
/** Create Bitcoin Address */
const crypto = require(`crypto`);
const ecdh = crypto.createECDH('secp256k1');
const bs58 = require(`bs58`);
// 0 - Having a private ECDSA key
var privateKey = crypto.randomBytes(32);
console.log(`Private key:[${privateKey.toString(`hex`)}]`);
// 1 - Take the corresponding public key generated with it (33 bytes, 1 byte 0x02 (y-coord is even), 
// and 32 bytes corresponding to X coordinate)
ecdh.setPrivateKey(privateKey);
var cpublicKey = Buffer.from(ecdh.getPublicKey('hex', 'compressed'), 'hex');
console.log(`Public key:[${cpublicKey.toString(`hex`).toUpperCase()}]`);
// 2 - Perform SHA-256 hashing on the public key
var sha1 = crypto.createHash(`sha256`).update(cpublicKey).digest();
console.log(`SHA-256:[${sha1.toString(`hex`)}]`);
// 3 - Perform RIPEMD-160 hashing on the result of SHA-256
var ripemd160 = crypto.createHash(`rmd160`).update(sha1).digest();
console.log(`RIPEMD-160:[${ripemd160.toString(`hex`)}]`);
// 4 - Add version byte in front of RIPEMD-160 hash (0x00 for Main Network, 0x6f for Testnet)
const version = Buffer.from([0x00]);
var extendedPriKey = Buffer.alloc(ripemd160.length + version.length);
extendedPriKey = Buffer.concat([version, ripemd160], extendedPriKey.length);
console.log(`Extended RIPEMD-160:[${extendedPriKey.toString(`hex`)}]`);
// 5 - Perform SHA-256 hash on the extended RIPEMD-160 result
var sha2 = crypto.createHash(`sha256`).update(extendedPriKey).digest();
console.log(`SHA-256:[${sha2.toString(`hex`)}]`);
// 6 - Perform SHA-256 hash on the result of the previous SHA-256 hash
var sha3 = crypto.createHash(`sha256`).update(sha2).digest();
console.log(`SHA-256:[${sha3.toString(`hex`)}]`);
// 7 - Take the first 4 bytes of the second SHA-256 hash. This is the address checksum
var checksum = Buffer.alloc(4);
sha3.copy(checksum, 0, 0, checksum.length);
console.log(`Checksum:[${checksum.toString(`hex`)}]`);
// 8 - Add the 4 checksum bytes from stage 7 at the end of extended RIPEMD-160 hash from stage 4. 
// This is the 25-byte binary Bitcoin Address.
var btcAddress = Buffer.alloc(extendedPriKey.length + checksum.length);
btcAddress = Buffer.concat([extendedPriKey, checksum], btcAddress.length);
console.log(`25-byte binary bitcoin address:[${btcAddress.toString(`hex`)}]`);
// 9 - Convert the result from a byte string into a base58 string using Base58Check encoding. 
// This is the most commonly used Bitcoin Address format
var address = bs58.encode(btcAddress);
console.log(`Address:[${address}]`);
パッケージをインストールする必要があります