bitcoinjs-lib
Advanced tools
Comparing version 1.4.2 to 1.4.3
{ | ||
"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
639353
9574
149
5
11
71
+ Addedtypeforce@0.1.0
+ Addedtypeforce@0.1.0(transitive)
Updatedbigi@^1.4.0
Updatedcrypto-browserify@^3.9.0