Package Exports
- groestlcoinjs-message
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (groestlcoinjs-message) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
groestlcoinjs-message
Examples (Note about Electrum-GRS support at the bottom)
var bitcoin = require('groestlcoinjs-lib') // v4.x.x
var bitcoinMessage = require('groestlcoinjs-message')sign(message, privateKey, compressed[, network.messagePrefix, sigOptions])
- If you pass the sigOptions arg instead of messagePrefix it will dynamically replace.
- sigOptions contains two attributes
segwitTypeshould be one of'p2sh(p2wpkh)'or'p2wpkh'extraEntropywill be used to create non-deterministic signatures using the RFC6979 extra entropy parameter. R value reuse is not an issue.
Sign a Groestlcoin message
var keyPair = bitcoin.ECPair.fromWIF('L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrnZQVUG')
var privateKey = keyPair.privateKey
var message = 'This is an example of a signed message.'
var signature = bitcoinMessage.sign(message, privateKey, keyPair.compressed)
console.log(signature.toString('base64'))
// => 'IOES8hMhdoZFP0QaMJXTExZPmrTneGfbDmJib7Jt3gTaN0CfsYjBLWRvnDtd9aKlTt8BXxV95PYFOYhdiM1x90w='To produce non-deterministic signatures you can pass an extra option to sign()
var { randomBytes } = require('crypto')
var keyPair = bitcoin.ECPair.fromWIF('L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrnZQVUG')
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(signature.toString('base64'))
// => different (but valid) signature each timeSign a Groestlcoin message (with segwit addresses)
// P2SH(P2WPKH) address 'p2sh(p2wpkh)'
var signature = bitcoinMessage.sign(message, privateKey, keyPair.compressed, { segwitType: 'p2sh(p2wpkh)' })
console.log(signature.toString('base64'))
// => 'JOES8hMhdoZFP0QaMJXTExZPmrTneGfbDmJib7Jt3gTaN0CfsYjBLWRvnDtd9aKlTt8BXxV95PYFOYhdiM1x90w='
// P2WPKH address 'p2wpkh'
var signature = bitcoinMessage.sign(message, privateKey, keyPair.compressed, { segwitType: 'p2wpkh' })
console.log(signature.toString('base64'))
// => 'KOES8hMhdoZFP0QaMJXTExZPmrTneGfbDmJib7Jt3gTaN0CfsYjBLWRvnDtd9aKlTt8BXxV95PYFOYhdiM1x90w='Sign a Groestlcoin message using a Signer interface.
var keyPair = bitcoin.ECPair.fromWIF('L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrnZQVUG')
var privateKey = keyPair.privateKey
var message = 'This is an example of a signed message.'
var secp256k1 = require('secp256k1')
// Notice we are using the privateKey var from the outer scope inside the sign function.
var signer = { sign: (hash, extraData) => secp256k1.sign(hash, privateKey, { data: extraData }) }
var signature = bitcoinMessage.sign(message, signer, keyPair.compressed)
console.log(signature.toString('base64'))
// => 'IOES8hMhdoZFP0QaMJXTExZPmrTneGfbDmJib7Jt3gTaN0CfsYjBLWRvnDtd9aKlTt8BXxV95PYFOYhdiM1x90w='signAsync(message, privateKey, compressed[, network.messagePrefix, sigOptions]) Same as sign, except returns a promise, and can accept a SignerAsync interface instead of privateKey
Sign a Groestlcoin message asynchronously
var keyPair = bitcoin.ECPair.fromWIF('L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrnZQVUG')
var privateKey = keyPair.privateKey
var message = 'This is an example of a signed message.'
bitcoinMessage.signAsync(message, privateKey, keyPair.compressed).then(signature => {
console.log(signature.toString('base64'))
})
// => 'IOES8hMhdoZFP0QaMJXTExZPmrTneGfbDmJib7Jt3gTaN0CfsYjBLWRvnDtd9aKlTt8BXxV95PYFOYhdiM1x90w='Sign a Groestlcoin message asynchronously using SignerAsync interface
var keyPair = bitcoin.ECPair.fromWIF('L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrnZQVUG')
var privateKey = keyPair.privateKey
var message = 'This is an example of a signed message.'
var secp256k1 = require('secp256k1')
// Note that a Signer will also work
var signerAsync = { sign: (hash, extraData) => Promise.resolve(secp256k1.sign(hash, privateKey, { data: extraData })) }
var signer = { sign: (hash, extraData) => secp256k1.sign(hash, privateKey, { data: extraData }) }
bitcoinMessage.signAsync(message, signerAsync, keyPair.compressed).then(signature => {
console.log(signature.toString('base64'))
})
// => 'IOES8hMhdoZFP0QaMJXTExZPmrTneGfbDmJib7Jt3gTaN0CfsYjBLWRvnDtd9aKlTt8BXxV95PYFOYhdiM1x90w='
bitcoinMessage.signAsync(message, signer, keyPair.compressed).then(signature => {
console.log(signature.toString('base64'))
})
// => 'IOES8hMhdoZFP0QaMJXTExZPmrTneGfbDmJib7Jt3gTaN0CfsYjBLWRvnDtd9aKlTt8BXxV95PYFOYhdiM1x90w='verify(message, address, signature[, network.messagePrefix, checkSegwitAlways])
Verify a Groestlcoin message
var address = 'FjDacfpwTS1hvPkEW98HimmD3ChSpZQuss'
console.log(bitcoinMessage.verify(message, address, signature))
// => trueAbout Electrum-GRS segwit signature support
- For Signing: Use the non-segwit compressed signing parameters for both segwit types (p2sh-p2wpkh and p2wpkh)
- For Verifying: Pass the checkSegwitAlways argument as true. (messagePrefix should be set to null to default to Groestlcoin messagePrefix)