比特币消息
从 比特币消息以 npm 形式发布 @bitcoinerlab/btcmessage。 。 。 .
实例( 关于 Electrum 支持在底部的说明)
var tinysecp = require('tiny-secp256k1');
var MessageFactory = require('@bitcoinerlab/btcmessage').MessageFactory;
var toBase64 = require('uint8array-tools').toBase64;
var bitcoinMessage = MessageFactory(tinysecp);
使用时 tiny-secp256k1 或者说 @bitcoin-js/tiny-secp256k1-asmjs,使用2.2.5版本或以后使用. MessageFactory 使用应用程序提供的后端,因此仅更新此软件包不会更新后端.
V4 中突破更改: 此库为 Uint8Array- first, 不返回缓冲实例 .
符号(消息、 私密密钥、 压缩 [、 网络. message Prefix、 sig options])
- 如果您通过 sig options arg 而不是消息 Prefix, 它将会动态替换 .
- sig 选项包含两个属性
segwitType应该是一个'p2sh(p2wpkh)'或者说'p2wpkh'extraEntropy将使用 RFC6979 附加的 Entropy 参数创建非决定性签名。 R值再利用不是一个问题.
签名比特币消息
var keyPair = ECPair.fromWIF(
'L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1',
);
var privateKey = keyPair.privateKey;
var message = 'This is an example of a signed message.';
var signature = bitcoinMessage.sign(message, privateKey, keyPair.compressed);
console.log(toBase64(signature));
// => 'H9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='
要生成非决定性的签名, 您可以通过一个额外的签名选项( )
var { randomBytes } = require('crypto');
var keyPair = ECPair.fromWIF(
'L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1',
);
var privateKey = keyPair.privateKey;
var message = 'This is an example of a signed message.';
var signature = bitcoinMessage.sign(message, privateKey, keyPair.compressed, {
extraEntropy: randomBytes(32),
});
console.log(toBase64(signature));
// => different (but valid) signature each time
签名比特币消息( 有 segwit 地址)
// P2SH(P2WPKH) address 'p2sh(p2wpkh)'
var signature = bitcoinMessage.sign(message, privateKey, keyPair.compressed, {
segwitType: 'p2sh(p2wpkh)',
});
console.log(toBase64(signature));
// => 'I9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='
// P2WPKH address 'p2wpkh'
var signature = bitcoinMessage.sign(message, privateKey, keyPair.compressed, {
segwitType: 'p2wpkh',
});
console.log(toBase64(signature));
// => 'J9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='
使用 Signer 接口签名比特币消息 .
var keyPair = ECPair.fromWIF(
'L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1',
);
var privateKey = keyPair.privateKey;
var message = 'This is an example of a signed message.';
var secp256k1 = require('tiny-secp256k1');
// Notice we are using the privateKey var from the outer scope inside the sign function.
var signer = {
signRecoverable: (hash, extraData) =>
secp256k1.signRecoverable(hash, privateKey, extraData),
};
var signature = bitcoinMessage.sign(message, signer, keyPair.compressed);
console.log(toBase64(signature));
// => 'H9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='
符号 Async( 消息、 私密 Key、 压缩 [、 网络. message Prefix、 sig options]) 与符号相同, 除了返回一个承诺, 可以接受一个 SignerAsync 接口而不是私人 Key
同步签名比特币消息
var keyPair = ECPair.fromWIF(
'L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1',
);
var privateKey = keyPair.privateKey;
var message = 'This is an example of a signed message.';
bitcoinMessage
.signAsync(message, privateKey, keyPair.compressed)
.then(signature => {
console.log(toBase64(signature));
});
// => 'H9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='
使用 SignerAsync 接口同步签名比特币消息
var keyPair = ECPair.fromWIF(
'L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1',
);
var privateKey = keyPair.privateKey;
var message = 'This is an example of a signed message.';
var secp256k1 = require('tiny-secp256k1');
// Note that a Signer will also work
var signerAsync = {
signRecoverable: (hash, extraData) =>
Promise.resolve(secp256k1.signRecoverable(hash, privateKey, extraData)),
};
var signer = {
signRecoverable: (hash, extraData) =>
secp256k1.signRecoverable(hash, privateKey, extraData),
};
bitcoinMessage
.signAsync(message, signerAsync, keyPair.compressed)
.then(signature => {
console.log(toBase64(signature));
});
// => 'H9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='
bitcoinMessage
.signAsync(message, signer, keyPair.compressed)
.then(signature => {
console.log(toBase64(signature));
});
// => 'H9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='
校验( 消息、 地址、 签名 [, network. messagePrefix, checkSegwitAlways])
验证比特币消息
var address = '1F3sAm6ZtwLAUnj7d38pGFxtP3RVEvtsbV';
console.log(bitcoinMessage.verify(message, address, signature));
// => true
关于 Electrum segwit 签名支持
- 用于签名:对两种 segwit 类型(p2sh-p2wpkh和p2wpkh)使用非 segwit 压缩签名参数
- 用于校验: 通过检查SegwitAlways 参数为真 。 (消息前缀应设定为对 Bitcoin 消息的默认无效) Prefix