Socket
Socket
Sign inDemoInstall

bitcoinjs-lib

Package Overview
Dependencies
45
Maintainers
4
Versions
87
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.4.2 to 1.4.3

test/integration/crypto.js

26

package.json
{
"name": "bitcoinjs-lib",
"version": "1.4.2",
"version": "1.4.3",
"description": "Client-side Bitcoin JavaScript library",

@@ -51,19 +51,21 @@ "main": "./src/index.js",

"dependencies": {
"bigi": "^1.1.0",
"bigi": "^1.4.0",
"bs58check": "1.0.3",
"crypto-browserify": "^3.2.6",
"ecurve": "1.0.0"
"crypto-browserify": "^3.9.0",
"ecurve": "1.0.0",
"typeforce": "0.1.0"
},
"devDependencies": {
"browserify": "^5.12.0",
"bs58": "^2.0.0",
"async": "^0.9.0",
"browserify": "^8.0.3",
"bs58": "^2.0.1",
"cb-helloblock": "^0.4.10",
"coveralls": "^2.11.2",
"helloblock-js": "^0.2.5",
"istanbul": "^0.3.2",
"jshint": "^2.5.6",
"mocha": "^1.21.4",
"istanbul": "^0.3.5",
"jshint": "^2.5.11",
"mocha": "^2.1.0",
"mocha-lcov-reporter": "0.0.1",
"sinon": "^1.10.3",
"uglify-js": "^2.4.15"
"sinon": "^1.12.2",
"uglify-js": "^2.4.16"
}
}

@@ -76,7 +76,9 @@ # BitcoinJS (bitcoinjs-lib)

- [Verify a Bitcoin message](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/advanced.js#L17)
- [Generate a single-key stealth address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/advanced.js#L25)
- [Generate a dual-key stealth address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/advanced.js#L58)
- [Create an OP RETURN transaction](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/advanced.js#L60)
- [Create an OP RETURN transaction](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/advanced.js#L24)
- [Create a 2-of-3 multisig P2SH address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/multisig.js#L8)
- [Spend from a 2-of-2 multisig P2SH address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/multisig.js#L22)
- [Generate a single-key stealth address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/crypto.js#L7)
- [Generate a dual-key stealth address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/crypto.js#L40)
- [Recover a BIP32 parent private key from the parent public key and a derived non-hardened child private key](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/crypto.js#L42)
- [Recover a Private key from duplicate R values in a signature](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/crypto.js#L90)

@@ -83,0 +85,0 @@

var assert = require('assert')
var base58check = require('bs58check')
var enforceType = require('./types')
var typeForce = require('typeforce')
var networks = require('./networks')

@@ -17,3 +17,3 @@ var scripts = require('./scripts')

function Address(hash, version) {
enforceType('Buffer', hash)
typeForce('Buffer', hash)

@@ -20,0 +20,0 @@ assert.strictEqual(hash.length, 20, 'Invalid hash length')

var assert = require('assert')
var crypto = require('crypto')
var enforceType = require('./types')
var typeForce = require('typeforce')

@@ -12,6 +12,34 @@ var BigInteger = require('bigi')

// https://tools.ietf.org/html/rfc6979#section-3.2
function deterministicGenerateK(curve, hash, d) {
enforceType('Buffer', hash)
enforceType(BigInteger, d)
function deterministicGenerateK(curve, hash, d, checkSig) {
typeForce('Buffer', hash)
typeForce('BigInteger', d)
// FIXME: remove/uncomment for 2.0.0
// typeForce('Function', checkSig)
if (typeof checkSig !== 'function') {
console.warn('deterministicGenerateK requires a checkSig callback in 2.0.0, see #337 for more information')
checkSig = function(k) {
var G = curve.G
var n = curve.n
var e = BigInteger.fromBuffer(hash)
var Q = G.multiply(k)
if (curve.isInfinity(Q))
return false
var r = Q.affineX.mod(n)
if (r.signum() === 0)
return false
var s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n)
if (s.signum() === 0)
return false
return true
}
}
// sanity check

@@ -24,2 +52,3 @@ assert.equal(hash.length, 32, 'Hash must be 256 bit')

// Step A, ignored as hash already provided
// Step B

@@ -59,4 +88,4 @@ v.fill(1)

// Step H3, repeat until T is within the interval [1, n - 1]
while ((T.signum() <= 0) || (T.compareTo(curve.n) >= 0)) {
// Step H3, repeat until T is within the interval [1, n - 1] and is suitable for ECDSA
while ((T.signum() <= 0) || (T.compareTo(curve.n) >= 0) || !checkSig(T)) {
k = crypto.createHmac('sha256', k)

@@ -69,2 +98,5 @@ .update(v)

// Step H1/H2a, again, ignored as tlen === qlen (256 bit)
// Step H2b again
v = crypto.createHmac('sha256', k).update(v).digest()
T = BigInteger.fromBuffer(v)

@@ -77,15 +109,25 @@ }

function sign(curve, hash, d) {
var k = deterministicGenerateK(curve, hash, d)
var r, s
var e = BigInteger.fromBuffer(hash)
var n = curve.n
var G = curve.G
var Q = G.multiply(k)
var e = BigInteger.fromBuffer(hash)
var r = Q.affineX.mod(n)
assert.notEqual(r.signum(), 0, 'Invalid R value')
deterministicGenerateK(curve, hash, d, function(k) {
var Q = G.multiply(k)
var s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n)
assert.notEqual(s.signum(), 0, 'Invalid S value')
if (curve.isInfinity(Q))
return false
r = Q.affineX.mod(n)
if (r.signum() === 0)
return false
s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n)
if (s.signum() === 0)
return false
return true
})
var N_OVER_TWO = n.shiftRight(1)

@@ -92,0 +134,0 @@

@@ -5,3 +5,3 @@ var assert = require('assert')

var ecdsa = require('./ecdsa')
var enforceType = require('./types')
var typeForce = require('typeforce')
var networks = require('./networks')

@@ -54,3 +54,3 @@

var buffer = rng(32)
enforceType('Buffer', buffer)
typeForce('Buffer', buffer)
assert.equal(buffer.length, 32, 'Expected 256-bit Buffer from RNG')

@@ -57,0 +57,0 @@

var crypto = require('./crypto')
var ecdsa = require('./ecdsa')
var enforceType = require('./types')
var typeForce = require('typeforce')
var networks = require('./networks')

@@ -14,4 +14,4 @@

enforceType(ecurve.Point, Q)
enforceType('Boolean', compressed)
typeForce('Point', Q)
typeForce('Boolean', compressed)

@@ -18,0 +18,0 @@ this.compressed = compressed

var assert = require('assert')
var enforceType = require('./types')
var typeForce = require('typeforce')

@@ -7,4 +7,4 @@ var BigInteger = require('bigi')

function ECSignature(r, s) {
enforceType(BigInteger, r)
enforceType(BigInteger, s)
typeForce('BigInteger', r)
typeForce('BigInteger', s)

@@ -11,0 +11,0 @@ this.r = r

@@ -5,3 +5,3 @@ var assert = require('assert')

var crypto = require('crypto')
var enforceType = require('./types')
var typeForce = require('typeforce')
var networks = require('./networks')

@@ -33,3 +33,3 @@

enforceType('Buffer', chainCode)
typeForce('Buffer', chainCode)

@@ -42,2 +42,3 @@ assert.equal(chainCode.length, 32, 'Expected chainCode length of 32, got ' + chainCode.length)

this.index = 0
this.parentFingerprint = 0x00000000
this.network = network

@@ -58,3 +59,3 @@

HDNode.fromSeedBuffer = function(seed, network) {
enforceType('Buffer', seed)
typeForce('Buffer', seed)

@@ -203,4 +204,3 @@ assert(seed.length >= 16, 'Seed should be at least 128 bits')

// 4 bytes: the fingerprint of the parent's key (0x00000000 if master key)
var fingerprint = (this.depth === 0) ? 0x00000000 : this.parentFingerprint
buffer.writeUInt32BE(fingerprint, 5)
buffer.writeUInt32BE(this.parentFingerprint, 5)

@@ -207,0 +207,0 @@ // 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized.

var assert = require('assert')
var bufferutils = require('./bufferutils')
var crypto = require('./crypto')
var enforceType = require('./types')
var typeForce = require('typeforce')
var opcodes = require('./opcodes')
function Script(buffer, chunks) {
enforceType('Buffer', buffer)
enforceType('Array', chunks)
typeForce('Buffer', buffer)
typeForce('Array', chunks)

@@ -59,3 +59,3 @@ this.buffer = buffer

Script.fromChunks = function(chunks) {
enforceType('Array', chunks)
typeForce('Array', chunks)

@@ -62,0 +62,0 @@ var bufferSize = chunks.reduce(function(accum, chunk) {

var assert = require('assert')
var enforceType = require('./types')
var typeForce = require('typeforce')
var ops = require('./opcodes')

@@ -120,3 +120,3 @@

function classifyOutput(script) {
enforceType(Script, script)
typeForce('Script', script)

@@ -139,3 +139,3 @@ if (isPubKeyHashOutput(script)) {

function classifyInput(script) {
enforceType(Script, script)
typeForce('Script', script)

@@ -166,3 +166,3 @@ if (isPubKeyHashInput(script)) {

function pubKeyHashOutput(hash) {
enforceType('Buffer', hash)
typeForce('Buffer', hash)

@@ -180,3 +180,3 @@ return Script.fromChunks([

function scriptHashOutput(hash) {
enforceType('Buffer', hash)
typeForce('Buffer', hash)

@@ -192,3 +192,3 @@ return Script.fromChunks([

function multisigOutput(m, pubKeys) {
enforceType('Array', pubKeys)
typeForce(['ECPubKey'], pubKeys)

@@ -212,3 +212,3 @@ assert(pubKeys.length >= m, 'Not enough pubKeys provided')

function pubKeyInput(signature) {
enforceType('Buffer', signature)
typeForce('Buffer', signature)

@@ -220,3 +220,3 @@ return Script.fromChunks([signature])

function pubKeyHashInput(signature, pubKey) {
enforceType('Buffer', signature)
typeForce('Buffer', signature)

@@ -223,0 +223,0 @@ return Script.fromChunks([signature, pubKey.toBuffer()])

var assert = require('assert')
var bufferutils = require('./bufferutils')
var crypto = require('./crypto')
var enforceType = require('./types')
var typeForce = require('typeforce')
var opcodes = require('./opcodes')

@@ -96,3 +96,6 @@ var scripts = require('./scripts')

Transaction.prototype.addInput = function(hash, index, sequence, script) {
if (sequence === undefined) sequence = Transaction.DEFAULT_SEQUENCE
if (sequence === undefined || sequence === null) {
sequence = Transaction.DEFAULT_SEQUENCE
}
script = script || Script.EMPTY

@@ -109,6 +112,6 @@

enforceType('Buffer', hash)
enforceType('Number', index)
enforceType('Number', sequence)
enforceType(Script, script)
typeForce('Buffer', hash)
typeForce('Number', index)
typeForce('Number', sequence)
typeForce('Script', script)

@@ -146,4 +149,4 @@ assert.equal(hash.length, 32, 'Expected hash length of 32, got ' + hash.length)

enforceType(Script, scriptPubKey)
enforceType('Number', value)
typeForce('Script', scriptPubKey)
typeForce('Number', value)

@@ -200,5 +203,5 @@ // Add the output and return the output's index

enforceType('Number', inIndex)
enforceType(Script, prevOutScript)
enforceType('Number', hashType)
typeForce('Number', inIndex)
typeForce('Script', prevOutScript)
typeForce('Number', hashType)

@@ -205,0 +208,0 @@ assert(inIndex >= 0, 'Invalid vin index')

var assert = require('assert')
var bufferutils = require('./bufferutils')
var crypto = require('crypto')
var enforceType = require('./types')
var typeForce = require('typeforce')
var networks = require('./networks')

@@ -306,5 +306,5 @@

enforceType('String', txId)
enforceType('Number', index)
enforceType('Number', unspent.value)
typeForce('String', txId)
typeForce('Number', index)
typeForce('Number', unspent.value)

@@ -317,3 +317,3 @@ assert.equal(txId.length, 64, 'Expected valid txId, got ' + txId)

if (unspent.confirmations !== undefined) {
enforceType('Number', unspent.confirmations)
typeForce('Number', unspent.confirmations)
}

@@ -320,0 +320,0 @@

@@ -18,3 +18,5 @@ var assert = require('assert')

describe('deterministicGenerateK', function() {
fixtures.valid.forEach(function(f) {
function checkSig() { return true }
fixtures.valid.ecdsa.forEach(function(f) {
it('for \"' + f.message + '\"', function() {

@@ -24,3 +26,3 @@ var d = BigInteger.fromHex(f.d)

var k = ecdsa.deterministicGenerateK(curve, h1, d)
var k = ecdsa.deterministicGenerateK(curve, h1, d, checkSig)
assert.equal(k.toHex(), f.k)

@@ -30,20 +32,68 @@ })

// FIXME: remove in 2.0.0
fixtures.valid.ecdsa.forEach(function(f) {
it('(deprecated) for \"' + f.message + '\"', function() {
var d = BigInteger.fromHex(f.d)
var h1 = crypto.sha256(f.message)
var k = ecdsa.deterministicGenerateK(curve, h1, d) // default checkSig
assert.equal(k.toHex(), f.k)
})
})
it('loops until an appropriate k value is found', sinon.test(function() {
this.mock(BigInteger).expects('fromBuffer')
.exactly(3)
.onCall(0).returns(new BigInteger('0'))
.onCall(1).returns(curve.n)
.onCall(2).returns(new BigInteger('42'))
.onCall(0).returns(new BigInteger('0')) // < 1
.onCall(1).returns(curve.n) // > n-1
.onCall(2).returns(new BigInteger('42')) // valid
var d = new BigInteger('1')
var h1 = new Buffer(32)
var k = ecdsa.deterministicGenerateK(curve, h1, d, checkSig)
var k = ecdsa.deterministicGenerateK(curve, h1, d)
assert.equal(k.toString(), '42')
}))
it('loops until a suitable signature is found', sinon.test(function() {
this.mock(BigInteger).expects('fromBuffer')
.exactly(4)
.onCall(0).returns(new BigInteger('0')) // < 1
.onCall(1).returns(curve.n) // > n-1
.onCall(2).returns(new BigInteger('42')) // valid, but 'bad' signature
.onCall(3).returns(new BigInteger('53')) // valid, good signature
var checkSig = this.mock()
checkSig.exactly(2)
checkSig.onCall(0).returns(false) // bad signature
checkSig.onCall(1).returns(true) // good signature
var d = new BigInteger('1')
var h1 = new Buffer(32)
var k = ecdsa.deterministicGenerateK(curve, h1, d, checkSig)
assert.equal(k.toString(), '53')
}))
fixtures.valid.rfc6979.forEach(function(f) {
it('produces the expected k values for ' + f.message + ' if k wasn\'t suitable', function() {
var d = BigInteger.fromHex(f.d)
var h1 = crypto.sha256(f.message)
var results = []
ecdsa.deterministicGenerateK(curve, h1, d, function(k) {
results.push(k)
return results.length === 16
})
assert.equal(results[0].toHex(), f.k0)
assert.equal(results[1].toHex(), f.k1)
assert.equal(results[15].toHex(), f.k15)
})
})
})
describe('recoverPubKey', function() {
fixtures.valid.forEach(function(f) {
fixtures.valid.ecdsa.forEach(function(f) {
it('recovers the pubKey for ' + f.d, function() {

@@ -100,3 +150,3 @@ var d = BigInteger.fromHex(f.d)

describe('sign', function() {
fixtures.valid.forEach(function(f) {
fixtures.valid.ecdsa.forEach(function(f) {
it('produces a deterministic signature for \"' + f.message + '\"', function() {

@@ -123,3 +173,3 @@ var d = BigInteger.fromHex(f.d)

describe('verify/verifyRaw', function() {
fixtures.valid.forEach(function(f) {
fixtures.valid.ecdsa.forEach(function(f) {
it('verifies a valid signature for \"' + f.message + '\"', function() {

@@ -126,0 +176,0 @@ var d = BigInteger.fromHex(f.d)

{
"valid": [
{
"d": "01",
"k": "ec633bd56a5774a0940cb97e27a9e4e51dc94af737596a0c5cbb3d30332d92a5",
"message": "Everything should be made as simple as possible, but not simpler.",
"i": 0,
"signature": {
"r": "23362334225185207751494092901091441011938859014081160902781146257181456271561",
"s": "50433721247292933944369538617440297985091596895097604618403996029256432099938"
"valid": {
"ecdsa": [
{
"d": "01",
"k": "ec633bd56a5774a0940cb97e27a9e4e51dc94af737596a0c5cbb3d30332d92a5",
"message": "Everything should be made as simple as possible, but not simpler.",
"i": 0,
"signature": {
"r": "23362334225185207751494092901091441011938859014081160902781146257181456271561",
"s": "50433721247292933944369538617440297985091596895097604618403996029256432099938"
}
},
{
"d": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
"k": "9dc74cbfd383980fb4ae5d2680acddac9dac956dca65a28c80ac9c847c2374e4",
"message": "Equations are more important to me, because politics is for the present, but an equation is something for eternity.",
"i": 0,
"signature": {
"r": "38341707918488238920692284707283974715538935465589664377561695343399725051885",
"s": "3180566392414476763164587487324397066658063772201694230600609996154610926757"
}
},
{
"d": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
"k": "fd27071f01648ebbdd3e1cfbae48facc9fa97edc43bbbc9a7fdc28eae13296f5",
"message": "Not only is the Universe stranger than we think, it is stranger than we can think.",
"i": 0,
"signature": {
"r": "115464191557905790016094131873849783294273568009648050793030031933291767741904",
"s": "50562520307781850052192542766631199590053690478900449960232079510155113443971"
}
},
{
"d": "0000000000000000000000000000000000000000000000000000000000000001",
"k": "f0cd2ba5fc7c183de589f6416220a36775a146740798756d8d949f7166dcc87f",
"message": "How wonderful that we have met with a paradox. Now we have some hope of making progress.",
"i": 1,
"signature": {
"r": "87230998027579607140680851455601772643840468630989315269459846730712163783123",
"s": "53231320085894623106179381504478252331065330583563809963303318469380290929875"
}
},
{
"d": "69ec59eaa1f4f2e36b639716b7c30ca86d9a5375c7b38d8918bd9c0ebc80ba64",
"k": "6bb4a594ad57c1aa22dbe991a9d8501daf4688bf50a4892ef21bd7c711afda97",
"message": "Computer science is no more about computers than astronomy is about telescopes.",
"i": 0,
"signature": {
"r": "51348483531757779992459563033975330355971795607481991320287437101831125115997",
"s": "6277080015686056199074771961940657638578000617958603212944619747099038735862"
}
},
{
"d": "00000000000000000000000000007246174ab1e92e9149c6e446fe194d072637",
"k": "097b5c8ee22c3ea78a4d3635e0ff6fe85a1eb92ce317ded90b9e71aab2b861cb",
"message": "...if you aren't, at any given time, scandalized by code you wrote five or even three years ago, you're not learning anywhere near enough",
"i": 1,
"signature": {
"r": "113979859486826658566290715281614250298918272782414232881639314569529560769671",
"s": "6517071009538626957379450615706485096874328019806177698938278220732027419959"
}
},
{
"d": "000000000000000000000000000000000000000000056916d0f9b31dc9b637f3",
"k": "19355c36c8cbcdfb2382e23b194b79f8c97bf650040fc7728dfbf6b39a97c25b",
"message": "The question of whether computers can think is like the question of whether submarines can swim.",
"i": 1,
"signature": {
"r": "93122007060065279508564838030979550535085999589142852106617159184757394422777",
"s": "3078539468410661027472930027406594684630312677495124015420811882501887769839"
}
}
},
{
"d": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
"k": "9dc74cbfd383980fb4ae5d2680acddac9dac956dca65a28c80ac9c847c2374e4",
"message": "Equations are more important to me, because politics is for the present, but an equation is something for eternity.",
"i": 0,
"signature": {
"r": "38341707918488238920692284707283974715538935465589664377561695343399725051885",
"s": "3180566392414476763164587487324397066658063772201694230600609996154610926757"
],
"rfc6979": [
{
"message": "test data",
"d": "fee0a1f7afebf9d2a5a80c0c98a31c709681cce195cbcd06342b517970c0be1e",
"k0": "fcce1de7a9bcd6b2d3defade6afa1913fb9229e3b7ddf4749b55c4848b2a196e",
"k1": "727fbcb59eb48b1d7d46f95a04991fc512eb9dbf9105628e3aec87428df28fd8",
"k15": "398f0e2c9f79728f7b3d84d447ac3a86d8b2083c8f234a0ffa9c4043d68bd258"
},
{
"message": "Everything should be made as simple as possible, but not simpler.",
"d": "0000000000000000000000000000000000000000000000000000000000000001",
"k0": "ec633bd56a5774a0940cb97e27a9e4e51dc94af737596a0c5cbb3d30332d92a5",
"k1": "df55b6d1b5c48184622b0ead41a0e02bfa5ac3ebdb4c34701454e80aabf36f56",
"k15": "def007a9a3c2f7c769c75da9d47f2af84075af95cadd1407393dc1e26086ef87"
},
{
"message": "Satoshi Nakamoto",
"d": "0000000000000000000000000000000000000000000000000000000000000002",
"k0": "d3edc1b8224e953f6ee05c8bbf7ae228f461030e47caf97cde91430b4607405e",
"k1": "f86d8e43c09a6a83953f0ab6d0af59fb7446b4660119902e9967067596b58374",
"k15": "241d1f57d6cfd2f73b1ada7907b199951f95ef5ad362b13aed84009656e0254a"
},
{
"message": "Diffie Hellman",
"d": "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
"k0": "c378a41cb17dce12340788dd3503635f54f894c306d52f6e9bc4b8f18d27afcc",
"k1": "90756c96fef41152ac9abe08819c4e95f16da2af472880192c69a2b7bac29114",
"k15": "7b3f53300ab0ccd0f698f4d67db87c44cf3e9e513d9df61137256652b2e94e7c"
},
{
"message": "Japan",
"d": "8080808080808080808080808080808080808080808080808080808080808080",
"k0": "f471e61b51d2d8db78f3dae19d973616f57cdc54caaa81c269394b8c34edcf59",
"k1": "6819d85b9730acc876fdf59e162bf309e9f63dd35550edf20869d23c2f3e6d17",
"k15": "d8e8bae3ee330a198d1f5e00ad7c5f9ed7c24c357c0a004322abca5d9cd17847"
},
{
"message": "Bitcoin",
"d": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
"k0": "36c848ffb2cbecc5422c33a994955b807665317c1ce2a0f59c689321aaa631cc",
"k1": "4ed8de1ec952a4f5b3bd79d1ff96446bcd45cabb00fc6ca127183e14671bcb85",
"k15": "56b6f47babc1662c011d3b1f93aa51a6e9b5f6512e9f2e16821a238d450a31f8"
},
{
"message": "i2FLPP8WEus5WPjpoHwheXOMSobUJVaZM1JPMQZq",
"d": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
"k0": "6e9b434fcc6bbb081a0463c094356b47d62d7efae7da9c518ed7bac23f4e2ed6",
"k1": "ae5323ae338d6117ce8520a43b92eacd2ea1312ae514d53d8e34010154c593bb",
"k15": "3eaa1b61d1b8ab2f1ca71219c399f2b8b3defa624719f1e96fe3957628c2c4ea"
},
{
"message": "lEE55EJNP7aLrMtjkeJKKux4Yg0E8E1SAJnWTCEh",
"d": "3881e5286abc580bb6139fe8e83d7c8271c6fe5e5c2d640c1f0ed0e1ee37edc9",
"k0": "5b606665a16da29cc1c5411d744ab554640479dd8abd3c04ff23bd6b302e7034",
"k1": "f8b25263152c042807c992eacd2ac2cc5790d1e9957c394f77ea368e3d9923bd",
"k15": "ea624578f7e7964ac1d84adb5b5087dd14f0ee78b49072aa19051cc15dab6f33"
},
{
"message": "2SaVPvhxkAPrayIVKcsoQO5DKA8Uv5X/esZFlf+y",
"d": "7259dff07922de7f9c4c5720d68c9745e230b32508c497dd24cb95ef18856631",
"k0": "3ab6c19ab5d3aea6aa0c6da37516b1d6e28e3985019b3adb388714e8f536686b",
"k1": "19af21b05004b0ce9cdca82458a371a9d2cf0dc35a813108c557b551c08eb52e",
"k15": "117a32665fca1b7137a91c4739ac5719fec0cf2e146f40f8e7c21b45a07ebc6a"
},
{
"message": "00A0OwO2THi7j5Z/jp0FmN6nn7N/DQd6eBnCS+/b",
"d": "0d6ea45d62b334777d6995052965c795a4f8506044b4fd7dc59c15656a28f7aa",
"k0": "79487de0c8799158294d94c0eb92ee4b567e4dc7ca18addc86e49d31ce1d2db6",
"k1": "9561d2401164a48a8f600882753b3105ebdd35e2358f4f808c4f549c91490009",
"k15": "b0d273634129ff4dbdf0df317d4062a1dbc58818f88878ffdb4ec511c77976c0"
}
},
{
"d": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
"k": "fd27071f01648ebbdd3e1cfbae48facc9fa97edc43bbbc9a7fdc28eae13296f5",
"message": "Not only is the Universe stranger than we think, it is stranger than we can think.",
"i": 0,
"signature": {
"r": "115464191557905790016094131873849783294273568009648050793030031933291767741904",
"s": "50562520307781850052192542766631199590053690478900449960232079510155113443971"
}
},
{
"d": "0000000000000000000000000000000000000000000000000000000000000001",
"k": "f0cd2ba5fc7c183de589f6416220a36775a146740798756d8d949f7166dcc87f",
"message": "How wonderful that we have met with a paradox. Now we have some hope of making progress.",
"i": 1,
"signature": {
"r": "87230998027579607140680851455601772643840468630989315269459846730712163783123",
"s": "53231320085894623106179381504478252331065330583563809963303318469380290929875"
}
},
{
"d": "69ec59eaa1f4f2e36b639716b7c30ca86d9a5375c7b38d8918bd9c0ebc80ba64",
"k": "6bb4a594ad57c1aa22dbe991a9d8501daf4688bf50a4892ef21bd7c711afda97",
"message": "Computer science is no more about computers than astronomy is about telescopes.",
"i": 0,
"signature": {
"r": "51348483531757779992459563033975330355971795607481991320287437101831125115997",
"s": "6277080015686056199074771961940657638578000617958603212944619747099038735862"
}
},
{
"d": "00000000000000000000000000007246174ab1e92e9149c6e446fe194d072637",
"k": "097b5c8ee22c3ea78a4d3635e0ff6fe85a1eb92ce317ded90b9e71aab2b861cb",
"message": "...if you aren't, at any given time, scandalized by code you wrote five or even three years ago, you're not learning anywhere near enough",
"i": 1,
"signature": {
"r": "113979859486826658566290715281614250298918272782414232881639314569529560769671",
"s": "6517071009538626957379450615706485096874328019806177698938278220732027419959"
}
},
{
"d": "000000000000000000000000000000000000000000056916d0f9b31dc9b637f3",
"k": "19355c36c8cbcdfb2382e23b194b79f8c97bf650040fc7728dfbf6b39a97c25b",
"message": "The question of whether computers can think is like the question of whether submarines can swim.",
"i": 1,
"signature": {
"r": "93122007060065279508564838030979550535085999589142852106617159184757394422777",
"s": "3078539468410661027472930027406594684630312677495124015420811882501887769839"
}
}
],
]
},
"invalid": {

@@ -222,2 +296,2 @@ "recoverPubKey": [

}
}
}

@@ -5,3 +5,3 @@ {

"description": "Standard transaction (1:1)",
"txid": "a0ff943d3f644d8832b1fa74be4d0ad2577615dc28a7ef74ff8c271b603a082a",
"id": "a0ff943d3f644d8832b1fa74be4d0ad2577615dc28a7ef74ff8c271b603a082a",
"hash": "2a083a601b278cff74efa728dc157657d20a4dbe74fab132884d643f3d94ffa0",

@@ -14,4 +14,3 @@ "raw": {

"index": 0,
"script": "4830450221008732a460737d956fd94d49a31890b2908f7ed7025a9c1d0f25e43290f1841716022004fa7d608a291d44ebbbebbadaac18f943031e7de39ef3bf9920998c43e60c0401210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
"sequence": 4294967295
"script": "30450221008732a460737d956fd94d49a31890b2908f7ed7025a9c1d0f25e43290f1841716022004fa7d608a291d44ebbbebbadaac18f943031e7de39ef3bf9920998c43e60c0401 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"
}

@@ -21,3 +20,3 @@ ],

{
"script": "76a914c42e7ef92fdb603af844d064faad95db9bcdfd3d88ac",
"script": "OP_DUP OP_HASH160 c42e7ef92fdb603af844d064faad95db9bcdfd3d OP_EQUALVERIFY OP_CHECKSIG",
"value": 100000

@@ -32,4 +31,4 @@ }

"description": "Standard transaction (2:2)",
"txid": "eb1c3a8b1bd7d38a6bd8f3c48e8fc950cf3ddf9b34e91594d8c1b31e0bcf8240",
"hash": "4082cf0b1eb3c1d89415e9349bdf3dcf50c98f8ec4f3d86b8ad3d71b8b3a1ceb",
"id": "fcdd6d89c43e76dcff94285d9b6e31d5c60cb5e397a76ebc4920befad30907bc",
"hash": "bc0709d3fabe2049bc6ea797e3b50cc6d5316e9b5d2894ffdc763ec4896dddfc",
"raw": {

@@ -41,3 +40,3 @@ "version": 1,

"index": 0,
"script": "483045022100e661badd8d2cf1af27eb3b82e61b5d3f5d5512084591796ae31487f5b82df948022006df3c2a2cac79f68e4b179f4bbb8185a0bb3c4a2486d4405c59b2ba07a74c2101210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
"script": "3045022100e661badd8d2cf1af27eb3b82e61b5d3f5d5512084591796ae31487f5b82df948022006df3c2a2cac79f68e4b179f4bbb8185a0bb3c4a2486d4405c59b2ba07a74c2101 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
"sequence": 4294967295

@@ -48,4 +47,4 @@ },

"index": 1,
"script": "483045022100be54a46a44fb7e6bf4ebf348061d0dace7ddcbb92d4147ce181cf4789c7061f0022068ccab2a89a47fc29bb5074bca99ae846ab446eecf3c3aaeb238a13838783c78012102c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee517a9147ccb85f0ab2d599bc17246c98babd5a20b1cdc7687",
"sequence": 4294967295
"script": "3045022100be54a46a44fb7e6bf4ebf348061d0dace7ddcbb92d4147ce181cf4789c7061f0022068ccab2a89a47fc29bb5074bca99ae846ab446eecf3c3aaeb238a13838783c7801 02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5 a9147ccb85f0ab2d599bc17246c98babd5a20b1cdc7687",
"sequence": 2147483648
}

@@ -55,7 +54,7 @@ ],

{
"script": "76a914c42e7ef92fdb603af844d064faad95db9bcdfd3d88ac",
"script": "OP_DUP OP_HASH160 c42e7ef92fdb603af844d064faad95db9bcdfd3d OP_EQUALVERIFY OP_CHECKSIG",
"value": 50000
},
{
"script": "a9147ccb85f0ab2d599bc17246c98babd5a20b1cdc7687",
"script": "OP_HASH160 7ccb85f0ab2d599bc17246c98babd5a20b1cdc76 OP_EQUAL",
"value": 150000

@@ -66,7 +65,7 @@ }

},
"hex": "0100000002f1fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe000000006b483045022100e661badd8d2cf1af27eb3b82e61b5d3f5d5512084591796ae31487f5b82df948022006df3c2a2cac79f68e4b179f4bbb8185a0bb3c4a2486d4405c59b2ba07a74c2101210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798fffffffff2fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe0100000083483045022100be54a46a44fb7e6bf4ebf348061d0dace7ddcbb92d4147ce181cf4789c7061f0022068ccab2a89a47fc29bb5074bca99ae846ab446eecf3c3aaeb238a13838783c78012102c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee517a9147ccb85f0ab2d599bc17246c98babd5a20b1cdc7687ffffffff0250c30000000000001976a914c42e7ef92fdb603af844d064faad95db9bcdfd3d88acf04902000000000017a9147ccb85f0ab2d599bc17246c98babd5a20b1cdc768700000000"
"hex": "0100000002f1fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe000000006b483045022100e661badd8d2cf1af27eb3b82e61b5d3f5d5512084591796ae31487f5b82df948022006df3c2a2cac79f68e4b179f4bbb8185a0bb3c4a2486d4405c59b2ba07a74c2101210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798fffffffff2fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe0100000083483045022100be54a46a44fb7e6bf4ebf348061d0dace7ddcbb92d4147ce181cf4789c7061f0022068ccab2a89a47fc29bb5074bca99ae846ab446eecf3c3aaeb238a13838783c78012102c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee517a9147ccb85f0ab2d599bc17246c98babd5a20b1cdc7687000000800250c30000000000001976a914c42e7ef92fdb603af844d064faad95db9bcdfd3d88acf04902000000000017a9147ccb85f0ab2d599bc17246c98babd5a20b1cdc768700000000"
},
{
"description": "Standard transaction (14:2)",
"txid": "39d57bc27f72e904d81f6b5ef7b4e6e17fa33a06b11e5114a43435830d7b5563",
"id": "39d57bc27f72e904d81f6b5ef7b4e6e17fa33a06b11e5114a43435830d7b5563",
"hash": "63557b0d833534a414511eb1063aa37fe1e6b4f75e6b1fd804e9727fc27bd539",

@@ -80,4 +79,4 @@ "raw": {

"index": 0,
"script": "493046022100fd3d8fef44fb0962ba3f07bee1d4cafb84e60e38e6c7d9274504b3638a8d2f520221009fce009044e615b6883d4bf62e04c48f9fe236e19d644b082b2f0ae5c98e045c014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "3046022100fd3d8fef44fb0962ba3f07bee1d4cafb84e60e38e6c7d9274504b3638a8d2f520221009fce009044e615b6883d4bf62e04c48f9fe236e19d644b082b2f0ae5c98e045c01 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": null
},

@@ -87,4 +86,3 @@ {

"index": 1,
"script": "483045022100e2e61c40f26e2510b76dc72ea2f568ec514fce185c719e18bca9caaef2b20e9e02207f1100fc79eb0584e970c7f18fb226f178951d481767b4092d50d13c50ccba8b014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "3045022100e2e61c40f26e2510b76dc72ea2f568ec514fce185c719e18bca9caaef2b20e9e02207f1100fc79eb0584e970c7f18fb226f178951d481767b4092d50d13c50ccba8b01 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
},

@@ -94,4 +92,3 @@ {

"index": 1,
"script": "473044022048f1611e403710f248f7caf479965a6a5f63cdfbd9a714fef4ec1b68331ade1d022074919e79376c363d4575b2fc21513d5949471703efebd4c5ca2885e810eb1fa4014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "3044022048f1611e403710f248f7caf479965a6a5f63cdfbd9a714fef4ec1b68331ade1d022074919e79376c363d4575b2fc21513d5949471703efebd4c5ca2885e810eb1fa401 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
},

@@ -101,4 +98,3 @@ {

"index": 0,
"script": "483045022100886c07cad489dfcf4b364af561835d5cf985f07adf8bd1d5bd6ddea82b0ce6b2022045bdcbcc2b5fc55191bb997039cf59ff70e8515c56b62f293a9add770ba26738014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "3045022100886c07cad489dfcf4b364af561835d5cf985f07adf8bd1d5bd6ddea82b0ce6b2022045bdcbcc2b5fc55191bb997039cf59ff70e8515c56b62f293a9add770ba2673801 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
},

@@ -108,4 +104,3 @@ {

"index": 1,
"script": "4730440220535d49b819fdf294d27d82aff2865ed4e18580f0ca9796d793f611cb43a44f47022019584d5e300c415f642e37ba2a814a1e1106b4a9b91dc2a30fb57ceafe041181014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "30440220535d49b819fdf294d27d82aff2865ed4e18580f0ca9796d793f611cb43a44f47022019584d5e300c415f642e37ba2a814a1e1106b4a9b91dc2a30fb57ceafe04118101 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
},

@@ -115,4 +110,3 @@ {

"index": 1,
"script": "483045022100bf612b0fa46f49e70ab318ca3458d1ed5f59727aa782f7fac5503f54d9b43a590220358d7ed0e3cee63a5a7e972d9fad41f825d95de2fd0c5560382468610848d489014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "3045022100bf612b0fa46f49e70ab318ca3458d1ed5f59727aa782f7fac5503f54d9b43a590220358d7ed0e3cee63a5a7e972d9fad41f825d95de2fd0c5560382468610848d48901 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
},

@@ -122,4 +116,3 @@ {

"index": 1,
"script": "483045022006e263d5f73e05c48a603e3bd236e8314e5420721d5e9020114b93e8c9220e1102210099d3dead22f4a792123347a238c87e67b55b28a94a0bb7793144cc7ad94a0168014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "3045022006e263d5f73e05c48a603e3bd236e8314e5420721d5e9020114b93e8c9220e1102210099d3dead22f4a792123347a238c87e67b55b28a94a0bb7793144cc7ad94a016801 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
},

@@ -129,4 +122,3 @@ {

"index": 1,
"script": "47304402207d6e87588be47bf2d97eaf427bdd992e9d6b306255711328aee38533366a88b50220623099595ae442cb77eaddb3f91753a4fc9df56fde69cfec584c7f97e05533c8014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "304402207d6e87588be47bf2d97eaf427bdd992e9d6b306255711328aee38533366a88b50220623099595ae442cb77eaddb3f91753a4fc9df56fde69cfec584c7f97e05533c801 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
},

@@ -136,4 +128,3 @@ {

"index": 1,
"script": "473044022020f59498aee0cf82cb113768ef3cb721000346d381ff439adb4d405f791252510220448de723aa59412266fabbc689ec25dc94b1688c27a614982047513a80173514014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "3044022020f59498aee0cf82cb113768ef3cb721000346d381ff439adb4d405f791252510220448de723aa59412266fabbc689ec25dc94b1688c27a614982047513a8017351401 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
},

@@ -143,4 +134,3 @@ {

"index": 1,
"script": "48304502210088167867f87327f9c0db0444267ff0b6a026eedd629d8f16fe44a34c18e706bf0220675c8baebf89930e2d6e4463adefc50922653af99375242e38f5ee677418738a014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "304502210088167867f87327f9c0db0444267ff0b6a026eedd629d8f16fe44a34c18e706bf0220675c8baebf89930e2d6e4463adefc50922653af99375242e38f5ee677418738a01 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
},

@@ -150,4 +140,3 @@ {

"index": 0,
"script": "4830450220073d50ac5ec8388d5b3906921f9368c31ad078c8e1fb72f26d36b533f35ee327022100c398b23e6692e11dca8a1b64aae2ff70c6a781ed5ee99181b56a2f583a967cd4014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "30450220073d50ac5ec8388d5b3906921f9368c31ad078c8e1fb72f26d36b533f35ee327022100c398b23e6692e11dca8a1b64aae2ff70c6a781ed5ee99181b56a2f583a967cd401 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
},

@@ -157,4 +146,3 @@ {

"index": 1,
"script": "483045022100991d1bf60c41358f08b20e53718a24e05ac0608915df4f6305a5b47cb61e5da7022003f14fc1cc5b737e2c3279a4f9be1852b49dbb3d9d6cc4c8af6a666f600dced8014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "3045022100991d1bf60c41358f08b20e53718a24e05ac0608915df4f6305a5b47cb61e5da7022003f14fc1cc5b737e2c3279a4f9be1852b49dbb3d9d6cc4c8af6a666f600dced801 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
},

@@ -164,4 +152,3 @@ {

"index": 1,
"script": "493046022100f14e2b0ef8a8e206db350413d204bc0a5cd779e556b1191c2d30b5ec023cde6f022100b90b2d2bf256c98a88f7c3a653b93cec7d25bb6a517db9087d11dbd189e8851c014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "3046022100f14e2b0ef8a8e206db350413d204bc0a5cd779e556b1191c2d30b5ec023cde6f022100b90b2d2bf256c98a88f7c3a653b93cec7d25bb6a517db9087d11dbd189e8851c01 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
},

@@ -171,4 +158,3 @@ {

"index": 1,
"script": "483045022100a8cebb4f1c58f5ba1af91cb8bd4a2ed4e684e9605f5a9dc8b432ed00922d289d0220251145d2d56f06d936fd0c51fa884b4a6a5fafd0c3318f72fb05a5c9aa372195014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f",
"sequence": 4294967295
"script": "3045022100a8cebb4f1c58f5ba1af91cb8bd4a2ed4e684e9605f5a9dc8b432ed00922d289d0220251145d2d56f06d936fd0c51fa884b4a6a5fafd0c3318f72fb05a5c9aa37219501 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f"
}

@@ -179,7 +165,7 @@ ],

"value": 52680000,
"script": "76a914167c3e1f10cc3b691c73afbdb211e156e3e3f25c88ac"
"script": "OP_DUP OP_HASH160 167c3e1f10cc3b691c73afbdb211e156e3e3f25c OP_EQUALVERIFY OP_CHECKSIG"
},
{
"value": 3032597,
"script": "76a914290f7d617b75993e770e5606335fa0999a28d71388ac"
"script": "OP_DUP OP_HASH160 290f7d617b75993e770e5606335fa0999a28d713 OP_EQUALVERIFY OP_CHECKSIG"
}

@@ -186,0 +172,0 @@ ]

var assert = require('assert')
var bigi = require('bigi')
var bitcoin = require('../../')
var helloblock = require('helloblock-js')({
network: 'testnet'
})
var blockchain = new (require('cb-helloblock'))('testnet')

@@ -25,37 +22,2 @@ describe('bitcoinjs-lib (advanced)', function() {

it('can generate a single-key stealth address', function() {
var receiver = bitcoin.ECKey.fromWIF('5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss')
// XXX: ephemeral, must be random (and secret to sender) to preserve privacy
var sender = bitcoin.ECKey.fromWIF('Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct')
var G = bitcoin.ECKey.curve.G
var d = receiver.d // secret (receiver only)
var Q = receiver.pub.Q // shared
var e = sender.d // secret (sender only)
var P = sender.pub.Q // shared
// derived shared secret
var eQ = Q.multiply(e) // sender
var dP = P.multiply(d) // receiver
assert.deepEqual(eQ.getEncoded(), dP.getEncoded())
var c = bigi.fromBuffer(bitcoin.crypto.sha256(eQ.getEncoded()))
var cG = G.multiply(c)
// derived public key
var QprimeS = Q.add(cG)
var QprimeR = G.multiply(d.add(c))
assert.deepEqual(QprimeR.getEncoded(), QprimeS.getEncoded())
// derived shared-secret address
var address = new bitcoin.ECPubKey(QprimeS).getAddress().toString()
assert.equal(address, '1EwCNJNZM5q58YPPTnjR1H5BvYRNeyZi47')
})
// TODO
it.skip('can generate a dual-key stealth address', function() {})
it('can create an OP_RETURN transaction', function(done) {

@@ -67,6 +29,6 @@ this.timeout(20000)

helloblock.faucet.withdraw(address, 2e4, function(err) {
blockchain.addresses.__faucetWithdraw(address, 2e4, function(err) {
if (err) return done(err)
helloblock.addresses.getUnspents(address, function(err, _, unspents) {
blockchain.addresses.unspents(address, function(err, unspents) {
if (err) return done(err)

@@ -85,16 +47,15 @@

tx.addInput(unspent.txHash, unspent.index)
tx.addInput(unspent.txId, unspent.vout)
tx.addOutput(dataScript, 1000)
tx.sign(0, key)
helloblock.transactions.propagate(tx.build().toHex(), function(err) {
blockchain.transactions.propagate(tx.build().toHex(), function(err) {
if (err) return done(err)
// check that the message was propagated
helloblock.addresses.getTransactions(address, function(err, res, transactions) {
blockchain.addresses.transactions(address, function(err, transactions) {
if (err) return done(err)
var transaction = transactions[0]
var output = transaction.outputs[0]
var dataScript2 = bitcoin.Script.fromHex(output.scriptPubKey)
var transaction = bitcoin.Transaction.fromHex(transactions[0].txHex)
var dataScript2 = transaction.outs[0].script
var data2 = dataScript2.chunks[1]

@@ -101,0 +62,0 @@

var assert = require('assert')
var bitcoin = require('../../')
var helloblock = require('helloblock-js')({
network: 'testnet'
})
var blockchain = new (require('cb-helloblock'))('testnet')

@@ -36,7 +34,7 @@ describe('bitcoinjs-lib (multisig)', function() {

// Attempt to send funds to the source address
helloblock.faucet.withdraw(address, 2e4, function(err) {
blockchain.addresses.__faucetWithdraw(address, 2e4, function(err) {
if (err) return done(err)
// get latest unspents from the address
helloblock.addresses.getUnspents(address, function(err, _, unspents) {
blockchain.addresses.unspents(address, function(err, unspents) {
if (err) return done(err)

@@ -54,3 +52,3 @@

var txb = new bitcoin.TransactionBuilder()
txb.addInput(unspent.txHash, unspent.index)
txb.addInput(unspent.txId, unspent.vout)
txb.addOutput(targetAddress, 1e4)

@@ -64,10 +62,10 @@

// broadcast our transaction
helloblock.transactions.propagate(txb.build().toHex(), function(err) {
blockchain.transactions.propagate(txb.build().toHex(), function(err) {
if (err) return done(err)
// check that the funds (1e4 Satoshis) indeed arrived at the intended address
helloblock.addresses.get(targetAddress, function(err, res, addrInfo) {
blockchain.addresses.summary(targetAddress, function(err, result) {
if (err) return done(err)
assert.equal(addrInfo.balance, 1e4)
assert.equal(result.balance, 1e4)
done()

@@ -74,0 +72,0 @@ })

@@ -36,3 +36,2 @@ var assert = require('assert')

var signature = f.signature
assert(Message.verify(f.address, f.signature, f.message, network))

@@ -39,0 +38,0 @@

@@ -171,3 +171,3 @@ var assert = require('assert')

fixtures.invalid.multisigOutput.forEach(function(f) {
var pubKeys = f.pubKeys.map(function(p) { return new Buffer(p, 'hex') })
var pubKeys = f.pubKeys.map(ECPubKey.fromHex)

@@ -174,0 +174,0 @@ it('throws on ' + f.exception, function() {

var assert = require('assert')
var ecdsa = require('../src/ecdsa')
var scripts = require('../src/scripts')
var Address = require('../src/address')
var BigInteger = require('bigi')

@@ -27,3 +25,2 @@ var ECKey = require('../src/eckey')

prevTxHash = prevTx.getHash()
prevTxId = prevTx.getId()

@@ -33,3 +30,2 @@ privKey = new ECKey(BigInteger.ONE, false)

privScript = privAddress.toOutputScript()
value = 10000
})

@@ -95,3 +91,3 @@

txb.addInput(prevTxHash, 0)
txb.addOutput(privScript, value)
txb.addOutput(privScript, 2000)
txb.sign(0, privKey)

@@ -262,3 +258,3 @@

fixtures.invalid.fromTransaction.forEach(function(f,i) {
fixtures.invalid.fromTransaction.forEach(function(f) {
it('throws on ' + f.exception, function() {

@@ -277,3 +273,3 @@ var tx = Transaction.fromHex(f.hex)

"91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT"
].map(function(wif) { return ECKey.fromWIF(wif) })
].map(ECKey.fromWIF)
var redeemScript = Script.fromASM("OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a OP_2 OP_CHECKMULTISIG")

@@ -280,0 +276,0 @@

@@ -11,23 +11,28 @@ var assert = require('assert')

// FIXME: what is a better way to do this, seems a bit odd
fixtures.valid.forEach(function(f) {
var Script = require('../src/script')
describe('Transaction', function() {
function fromRaw(raw) {
var tx = new Transaction()
tx.version = raw.version
tx.locktime = raw.locktime
f.raw.ins.forEach(function(fin) {
fin.hash = new Buffer(fin.hash, 'hex')
fin.script = Script.fromHex(fin.script)
})
raw.ins.forEach(function(txIn) {
var txHash = new Buffer(txIn.hash, 'hex')
var script = txIn.script ? Script.fromASM(txIn.script) : undefined
f.raw.outs.forEach(function(fout) {
fout.script = Script.fromHex(fout.script)
})
})
tx.addInput(txHash, txIn.index, txIn.sequence, script)
})
describe('Transaction', function() {
raw.outs.forEach(function(txOut) {
tx.addOutput(Script.fromASM(txOut.script), txOut.value)
})
return tx
}
describe('fromBuffer/fromHex', function() {
fixtures.valid.forEach(function(f) {
it('imports ' + f.txid + ' correctly', function() {
it('imports ' + f.id + ' correctly', function() {
var actual = Transaction.fromHex(f.hex)
assert.deepEqual(actual, f.raw)
assert.deepEqual(actual.toHex(), f.hex)
})

@@ -47,6 +52,6 @@ })

fixtures.valid.forEach(function(f) {
it('exports ' + f.txid + ' correctly', function() {
var actual = Transaction.prototype.toBuffer.call(f.raw)
it('exports ' + f.id + ' correctly', function() {
var actual = fromRaw(f.raw)
assert.equal(actual.toString('hex'), f.hex)
assert.deepEqual(actual.toHex(), f.hex)
})

@@ -109,18 +114,19 @@ })

fixtures.valid.forEach(function(f) {
it('should add the inputs for ' + f.txid + ' correctly', function() {
it('should add the inputs for ' + f.id + ' correctly', function() {
var tx = new Transaction()
f.raw.ins.forEach(function(txIn, i) {
var script = txIn.script ? Script.fromHex(txIn.script) : undefined
var j = tx.addInput(txIn.hash, txIn.index, txIn.sequence, script)
var txHash = new Buffer(txIn.hash, 'hex')
var script = txIn.script ? Script.fromASM(txIn.script) : undefined
var j = tx.addInput(txHash, txIn.index, txIn.sequence, script)
var sequence = txIn.sequence
if (sequence === undefined || sequence === null ) {
sequence = Transaction.DEFAULT_SEQUENCE
}
assert.equal(i, j)
assert.deepEqual(tx.ins[i].hash, txIn.hash)
assert.equal(tx.ins[i].hash.toString('hex'), txIn.hash)
assert.equal(tx.ins[i].index, txIn.index)
var sequence = txIn.sequence
if (sequence === undefined) sequence = Transaction.DEFAULT_SEQUENCE
assert.equal(tx.ins[i].sequence, sequence)
assert.equal(tx.ins[i].script, script || Script.EMPTY)
assert.deepEqual(tx.ins[i].script, script || Script.EMPTY)
})

@@ -183,12 +189,13 @@ })

fixtures.valid.forEach(function(f) {
it('should add the outputs for ' + f.txid + ' correctly', function() {
it('should add the outputs for ' + f.id + ' correctly', function() {
var tx = new Transaction()
f.raw.outs.forEach(function(txOut, i) {
var j = tx.addOutput(txOut.script, txOut.value)
var scriptPubKey = Script.fromASM(txOut.script)
var j = tx.addOutput(scriptPubKey, txOut.value)
assert.equal(i, j)
assert.equal(tx.outs[i].script, scriptPubKey)
assert.equal(tx.outs[i].value, txOut.value)
})
assert.deepEqual(tx.outs, f.raw.outs)
})

@@ -215,7 +222,7 @@ })

fixtures.valid.forEach(function(f) {
it('should return the txid for ' + f.txid, function() {
it('should return the id for ' + f.id, function() {
var tx = Transaction.fromHex(f.hex)
var actual = tx.getId()
assert.equal(actual, f.txid)
assert.equal(actual, f.id)
})

@@ -227,3 +234,3 @@ })

fixtures.valid.forEach(function(f) {
it('should return the hash for ' + f.txid, function() {
it('should return the hash for ' + f.id, function() {
var tx = Transaction.fromHex(f.hex)

@@ -230,0 +237,0 @@ var actual = tx.getHash().toString('hex')

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc