test: cleanup tests.
This commit is contained in:
parent
5e3b05ff11
commit
d2e61d1fa2
@ -2044,7 +2044,7 @@ TX.prototype.format = function format(view) {
|
|||||||
flag: this.flag,
|
flag: this.flag,
|
||||||
inputs: this.inputs.map(function(input) {
|
inputs: this.inputs.map(function(input) {
|
||||||
var coin = view ? view.getOutput(input) : null;
|
var coin = view ? view.getOutput(input) : null;
|
||||||
return input.inspect(coin);
|
return input.format(coin);
|
||||||
}),
|
}),
|
||||||
outputs: this.outputs,
|
outputs: this.outputs,
|
||||||
locktime: this.locktime
|
locktime: this.locktime
|
||||||
|
|||||||
@ -1,9 +1,8 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var BN = require('bn.js');
|
var assert = require('assert');
|
||||||
var util = require('../lib/utils/util');
|
var util = require('../lib/utils/util');
|
||||||
var crypto = require('../lib/crypto/crypto');
|
var crypto = require('../lib/crypto/crypto');
|
||||||
var assert = require('assert');
|
|
||||||
var aes = require('../lib/crypto/aes');
|
var aes = require('../lib/crypto/aes');
|
||||||
var nativeCrypto = require('crypto');
|
var nativeCrypto = require('crypto');
|
||||||
|
|
||||||
|
|||||||
@ -1,26 +1,25 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var BN = require('bn.js');
|
|
||||||
var bcoin = require('../').set('main');
|
|
||||||
var util = bcoin.util;
|
|
||||||
var crypto = require('../lib/crypto/crypto');
|
|
||||||
var constants = bcoin.constants;
|
|
||||||
var network = bcoin.networks;
|
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
|
var util = require('../lib/utils/util');
|
||||||
|
var crypto = require('../lib/crypto/crypto');
|
||||||
|
var ec = require('../lib/crypto/ec');
|
||||||
|
var BIP150 = require('../lib/net/bip150');
|
||||||
|
var BIP151 = require('../lib/net/bip151');
|
||||||
|
|
||||||
describe('BIP150', function() {
|
describe('BIP150', function() {
|
||||||
var db = new bcoin.bip150.AuthDB();
|
var db = new BIP150.AuthDB();
|
||||||
var ck = bcoin.ec.generatePrivateKey();
|
var ck = ec.generatePrivateKey();
|
||||||
var sk = bcoin.ec.generatePrivateKey();
|
var sk = ec.generatePrivateKey();
|
||||||
|
|
||||||
db.addAuthorized(bcoin.ec.publicKeyCreate(ck, true));
|
db.addAuthorized(ec.publicKeyCreate(ck, true));
|
||||||
db.addKnown('server', bcoin.ec.publicKeyCreate(sk, true));
|
db.addKnown('server', ec.publicKeyCreate(sk, true));
|
||||||
|
|
||||||
var client = new bcoin.bip151();
|
var client = new BIP151();
|
||||||
var server = new bcoin.bip151();
|
var server = new BIP151();
|
||||||
|
|
||||||
client.bip150 = new bcoin.bip150(client, 'server', true, db, ck);
|
client.bip150 = new BIP150(client, 'server', true, db, ck);
|
||||||
server.bip150 = new bcoin.bip150(server, 'client', false, db, sk);
|
server.bip150 = new BIP150(server, 'client', false, db, sk);
|
||||||
|
|
||||||
function payload() {
|
function payload() {
|
||||||
return new Buffer('deadbeef', 'hex');
|
return new Buffer('deadbeef', 'hex');
|
||||||
|
|||||||
@ -1,16 +1,11 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var BN = require('bn.js');
|
|
||||||
var bcoin = require('../').set('main');
|
|
||||||
var util = bcoin.util;
|
|
||||||
var crypto = require('../lib/crypto/crypto');
|
|
||||||
var constants = bcoin.constants;
|
|
||||||
var network = bcoin.networks;
|
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
|
var BIP151 = require('../lib/net/bip151');
|
||||||
|
|
||||||
describe('BIP151', function() {
|
describe('BIP151', function() {
|
||||||
var client = new bcoin.bip151();
|
var client = new BIP151();
|
||||||
var server = new bcoin.bip151();
|
var server = new BIP151();
|
||||||
|
|
||||||
function payload() {
|
function payload() {
|
||||||
return new Buffer('deadbeef', 'hex');
|
return new Buffer('deadbeef', 'hex');
|
||||||
|
|||||||
@ -1,16 +1,14 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var BN = require('bn.js');
|
|
||||||
var bcoin = require('../').set('main');
|
|
||||||
var util = bcoin.util;
|
|
||||||
var crypto = require('../lib/crypto/crypto');
|
|
||||||
var constants = bcoin.constants;
|
|
||||||
var network = bcoin.networks;
|
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
var tests = require('./data/bip70.json');
|
var util = require('../lib/utils/util');
|
||||||
|
var crypto = require('../lib/crypto/crypto');
|
||||||
var bip70 = require('../lib/bip70');
|
var bip70 = require('../lib/bip70');
|
||||||
|
var Address = require('../lib/primitives/address');
|
||||||
var x509 = bip70.x509;
|
var x509 = bip70.x509;
|
||||||
|
|
||||||
|
var tests = require('./data/bip70.json');
|
||||||
|
|
||||||
tests.valid = new Buffer(tests.valid, 'hex');
|
tests.valid = new Buffer(tests.valid, 'hex');
|
||||||
tests.invalid = new Buffer(tests.invalid, 'hex');
|
tests.invalid = new Buffer(tests.invalid, 'hex');
|
||||||
tests.untrusted = new Buffer(tests.untrusted, 'hex');
|
tests.untrusted = new Buffer(tests.untrusted, 'hex');
|
||||||
@ -27,13 +25,16 @@ x509.trusted = {};
|
|||||||
describe('BIP70', function() {
|
describe('BIP70', function() {
|
||||||
function testRequest(data) {
|
function testRequest(data) {
|
||||||
var request = bip70.PaymentRequest.fromRaw(data);
|
var request = bip70.PaymentRequest.fromRaw(data);
|
||||||
|
var ser;
|
||||||
|
|
||||||
assert.equal(request.pkiType, 'x509+sha256');
|
assert.equal(request.pkiType, 'x509+sha256');
|
||||||
assert(request.pkiData);
|
assert(request.pkiData);
|
||||||
assert(request.getChain());
|
assert(request.getChain());
|
||||||
assert(request.paymentDetails);
|
assert(request.paymentDetails);
|
||||||
assert(request.paymentDetails.memo.length !== 0);
|
assert(request.paymentDetails.memo.length !== 0);
|
||||||
assert(request.paymentDetails.paymentUrl.length !== 0);
|
assert(request.paymentDetails.paymentUrl.length !== 0);
|
||||||
var ser = request.toRaw();
|
|
||||||
|
ser = request.toRaw();
|
||||||
assert.equal(ser.toString('hex'), data.toString('hex'));
|
assert.equal(ser.toString('hex'), data.toString('hex'));
|
||||||
assert(request.verify());
|
assert(request.verify());
|
||||||
}
|
}
|
||||||
@ -62,7 +63,7 @@ describe('BIP70', function() {
|
|||||||
|
|
||||||
assert(request.verifyChain());
|
assert(request.verifyChain());
|
||||||
|
|
||||||
var request = bip70.PaymentRequest.fromRaw(tests.invalid);
|
request = bip70.PaymentRequest.fromRaw(tests.invalid);
|
||||||
|
|
||||||
assert.equal(request.version, 1);
|
assert.equal(request.version, 1);
|
||||||
assert.equal(request.getChain().length, 3);
|
assert.equal(request.getChain().length, 3);
|
||||||
@ -83,7 +84,7 @@ describe('BIP70', function() {
|
|||||||
assert.deepStrictEqual(request.paymentDetails.getData('json'), {foo:1});
|
assert.deepStrictEqual(request.paymentDetails.getData('json'), {foo:1});
|
||||||
assert(!request.verify());
|
assert(!request.verify());
|
||||||
|
|
||||||
var request = bip70.PaymentRequest.fromRaw(tests.untrusted);
|
request = bip70.PaymentRequest.fromRaw(tests.untrusted);
|
||||||
|
|
||||||
assert.equal(request.version, -1);
|
assert.equal(request.version, -1);
|
||||||
assert.equal(request.getChain().length, 2);
|
assert.equal(request.getChain().length, 2);
|
||||||
@ -102,12 +103,17 @@ describe('BIP70', function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should fail to verify cert signatures when enforcing trust', function() {
|
it('should fail to verify cert signatures when enforcing trust', function() {
|
||||||
|
var request;
|
||||||
|
|
||||||
x509.allowUntrusted = false;
|
x509.allowUntrusted = false;
|
||||||
var request = bip70.PaymentRequest.fromRaw(tests.valid);
|
|
||||||
|
request = bip70.PaymentRequest.fromRaw(tests.valid);
|
||||||
assert(!request.verifyChain());
|
assert(!request.verifyChain());
|
||||||
var request = bip70.PaymentRequest.fromRaw(tests.invalid);
|
|
||||||
|
request = bip70.PaymentRequest.fromRaw(tests.invalid);
|
||||||
assert(!request.verifyChain());
|
assert(!request.verifyChain());
|
||||||
var request = bip70.PaymentRequest.fromRaw(tests.untrusted);
|
|
||||||
|
request = bip70.PaymentRequest.fromRaw(tests.untrusted);
|
||||||
assert(!request.verifyChain());
|
assert(!request.verifyChain());
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -115,7 +121,8 @@ describe('BIP70', function() {
|
|||||||
var request = bip70.PaymentRequest.fromRaw(tests.valid);
|
var request = bip70.PaymentRequest.fromRaw(tests.valid);
|
||||||
x509.setTrust([request.getChain().pop()]);
|
x509.setTrust([request.getChain().pop()]);
|
||||||
assert(request.verifyChain());
|
assert(request.verifyChain());
|
||||||
var request = bip70.PaymentRequest.fromRaw(tests.untrusted);
|
|
||||||
|
request = bip70.PaymentRequest.fromRaw(tests.untrusted);
|
||||||
assert(!request.verifyChain());
|
assert(!request.verifyChain());
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -134,7 +141,8 @@ describe('BIP70', function() {
|
|||||||
it('should validate untrusted once again', function() {
|
it('should validate untrusted once again', function() {
|
||||||
var request = bip70.PaymentRequest.fromRaw(tests.untrusted);
|
var request = bip70.PaymentRequest.fromRaw(tests.untrusted);
|
||||||
x509.setTrust([request.getChain().pop()]);
|
x509.setTrust([request.getChain().pop()]);
|
||||||
var request = bip70.PaymentRequest.fromRaw(tests.untrusted);
|
|
||||||
|
request = bip70.PaymentRequest.fromRaw(tests.untrusted);
|
||||||
assert(request.verifyChain());
|
assert(request.verifyChain());
|
||||||
assert.equal(request.getCA().name,
|
assert.equal(request.getCA().name,
|
||||||
'DigiCert SHA2 Extended Validation Server CA');
|
'DigiCert SHA2 Extended Validation Server CA');
|
||||||
@ -158,8 +166,8 @@ describe('BIP70', function() {
|
|||||||
time: util.now(),
|
time: util.now(),
|
||||||
expires: util.now() + 3600,
|
expires: util.now() + 3600,
|
||||||
outputs: [
|
outputs: [
|
||||||
{ value: 10000, address: bcoin.address() },
|
{ value: 10000, address: new Address() },
|
||||||
{ value: 50000, address: bcoin.address() }
|
{ value: 50000, address: new Address() }
|
||||||
],
|
],
|
||||||
merchantData: { foo: 'bar' }
|
merchantData: { foo: 'bar' }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var assert = require('assert');
|
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
|
var assert = require('assert');
|
||||||
var util = require('../lib/utils/util');
|
var util = require('../lib/utils/util');
|
||||||
var btcutils = require('../lib/btc/utils');
|
var btcutils = require('../lib/btc/utils');
|
||||||
var crypto = require('../lib/crypto/crypto');
|
var crypto = require('../lib/crypto/crypto');
|
||||||
@ -16,10 +16,13 @@ var constants = require('../lib/protocol/constants');
|
|||||||
var bip152 = require('../lib/net/bip152');
|
var bip152 = require('../lib/net/bip152');
|
||||||
|
|
||||||
var block300025 = require('./data/block300025.json');
|
var block300025 = require('./data/block300025.json');
|
||||||
var cmpct = fs.readFileSync(__dirname + '/data/compactblock.hex', 'utf8').trim().split('\n');
|
var cmpct1 = fs.readFileSync(__dirname + '/data/compactblock.hex', 'utf8');
|
||||||
var cmpct2 = fs.readFileSync(__dirname + '/data/cmpct2', 'utf8').trim();
|
var cmpct2 = fs.readFileSync(__dirname + '/data/cmpct2', 'utf8');
|
||||||
var cmpct2block = fs.readFileSync(__dirname + '/data/cmpct2.bin');
|
var cmpct2block = fs.readFileSync(__dirname + '/data/cmpct2.bin');
|
||||||
|
|
||||||
|
cmpct1 = cmpct1.trim().split('\n');
|
||||||
|
cmpct2 = cmpct2.trim();
|
||||||
|
|
||||||
describe('Block', function() {
|
describe('Block', function() {
|
||||||
var mblock, raw, block, raw2;
|
var mblock, raw, block, raw2;
|
||||||
|
|
||||||
@ -245,14 +248,14 @@ describe('Block', function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should handle compact block', function(cb) {
|
it('should handle compact block', function(cb) {
|
||||||
var cblock = bip152.CompactBlock.fromRaw(cmpct[0], 'hex');
|
var block = Block.fromRaw(cmpct1[1], 'hex');
|
||||||
var block = Block.fromRaw(cmpct[1], 'hex');
|
var cblock1 = bip152.CompactBlock.fromRaw(cmpct1[0], 'hex');
|
||||||
var cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock.keyNonce);
|
var cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock1.keyNonce);
|
||||||
var map = {};
|
var map = {};
|
||||||
var i, tx, mempool, result;
|
var i, tx, mempool, result;
|
||||||
|
|
||||||
assert.equal(cblock.toRaw().toString('hex'), cmpct[0]);
|
assert.equal(cblock1.toRaw().toString('hex'), cmpct1[0]);
|
||||||
assert.equal(cblock2.toRaw().toString('hex'), cmpct[0]);
|
assert.equal(cblock2.toRaw().toString('hex'), cmpct1[0]);
|
||||||
|
|
||||||
for (i = 0; i < block.txs.length; i++) {
|
for (i = 0; i < block.txs.length; i++) {
|
||||||
tx = block.txs[i];
|
tx = block.txs[i];
|
||||||
@ -268,30 +271,30 @@ describe('Block', function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
assert.equal(cblock.sid(block.txs[1].hash()), 125673511480291);
|
assert.equal(cblock1.sid(block.txs[1].hash()), 125673511480291);
|
||||||
|
|
||||||
result = cblock.fillMempool(false, mempool);
|
result = cblock1.fillMempool(false, mempool);
|
||||||
assert(result);
|
assert(result);
|
||||||
|
|
||||||
for (i = 0; i < cblock.available.length; i++)
|
for (i = 0; i < cblock1.available.length; i++)
|
||||||
assert(cblock.available[i]);
|
assert(cblock1.available[i]);
|
||||||
|
|
||||||
assert.equal(
|
assert.equal(
|
||||||
cblock.toBlock().toRaw().toString('hex'),
|
cblock1.toBlock().toRaw().toString('hex'),
|
||||||
block.toRaw().toString('hex'));
|
block.toRaw().toString('hex'));
|
||||||
|
|
||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should handle half-full compact block', function(cb) {
|
it('should handle half-full compact block', function(cb) {
|
||||||
var cblock = bip152.CompactBlock.fromRaw(cmpct[0], 'hex');
|
var block = Block.fromRaw(cmpct1[1], 'hex');
|
||||||
var block = Block.fromRaw(cmpct[1], 'hex');
|
var cblock1 = bip152.CompactBlock.fromRaw(cmpct1[0], 'hex');
|
||||||
var cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock.keyNonce);
|
var cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock1.keyNonce);
|
||||||
var map = {};
|
var map = {};
|
||||||
var i, tx, mid, keys, mempool, result, req, res;
|
var i, tx, mid, keys, mempool, result, req, res;
|
||||||
|
|
||||||
assert.equal(cblock.toRaw().toString('hex'), cmpct[0]);
|
assert.equal(cblock1.toRaw().toString('hex'), cmpct1[0]);
|
||||||
assert.equal(cblock2.toRaw().toString('hex'), cmpct[0]);
|
assert.equal(cblock2.toRaw().toString('hex'), cmpct1[0]);
|
||||||
|
|
||||||
for (i = 0; i < block.txs.length; i++) {
|
for (i = 0; i < block.txs.length; i++) {
|
||||||
tx = block.txs[i];
|
tx = block.txs[i];
|
||||||
@ -310,43 +313,43 @@ describe('Block', function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
assert.equal(cblock.sid(block.txs[1].hash()), 125673511480291);
|
assert.equal(cblock1.sid(block.txs[1].hash()), 125673511480291);
|
||||||
|
|
||||||
result = cblock.fillMempool(false, mempool);
|
result = cblock1.fillMempool(false, mempool);
|
||||||
assert(!result);
|
assert(!result);
|
||||||
|
|
||||||
req = cblock.toRequest();
|
req = cblock1.toRequest();
|
||||||
assert.equal(req.hash, cblock.hash('hex'));
|
assert.equal(req.hash, cblock1.hash('hex'));
|
||||||
assert.deepEqual(req.indexes, [5, 6, 7, 8, 9]);
|
assert.deepEqual(req.indexes, [5, 6, 7, 8, 9]);
|
||||||
|
|
||||||
req = bip152.TXRequest.fromRaw(req.toRaw());
|
req = bip152.TXRequest.fromRaw(req.toRaw());
|
||||||
assert.equal(req.hash, cblock.hash('hex'));
|
assert.equal(req.hash, cblock1.hash('hex'));
|
||||||
assert.deepEqual(req.indexes, [5, 6, 7, 8, 9]);
|
assert.deepEqual(req.indexes, [5, 6, 7, 8, 9]);
|
||||||
|
|
||||||
res = bip152.TXResponse.fromBlock(block, req);
|
res = bip152.TXResponse.fromBlock(block, req);
|
||||||
res = bip152.TXResponse.fromRaw(res.toRaw());
|
res = bip152.TXResponse.fromRaw(res.toRaw());
|
||||||
|
|
||||||
result = cblock.fillMissing(res);
|
result = cblock1.fillMissing(res);
|
||||||
assert(result);
|
assert(result);
|
||||||
|
|
||||||
for (i = 0; i < cblock.available.length; i++)
|
for (i = 0; i < cblock1.available.length; i++)
|
||||||
assert(cblock.available[i]);
|
assert(cblock1.available[i]);
|
||||||
|
|
||||||
assert.equal(
|
assert.equal(
|
||||||
cblock.toBlock().toRaw().toString('hex'),
|
cblock1.toBlock().toRaw().toString('hex'),
|
||||||
block.toRaw().toString('hex'));
|
block.toRaw().toString('hex'));
|
||||||
|
|
||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should handle compact block', function(cb) {
|
it('should handle compact block', function(cb) {
|
||||||
var cblock = bip152.CompactBlock.fromRaw(cmpct2, 'hex');
|
|
||||||
var block = Block.fromRaw(cmpct2block);
|
var block = Block.fromRaw(cmpct2block);
|
||||||
var cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock.keyNonce);
|
var cblock1 = bip152.CompactBlock.fromRaw(cmpct2, 'hex');
|
||||||
|
var cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock1.keyNonce);
|
||||||
var map = {};
|
var map = {};
|
||||||
var i, tx, result, mempool;
|
var i, tx, result, mempool;
|
||||||
|
|
||||||
assert.equal(cblock.toRaw().toString('hex'), cmpct2);
|
assert.equal(cblock1.toRaw().toString('hex'), cmpct2);
|
||||||
assert.equal(cblock2.toRaw().toString('hex'), cmpct2);
|
assert.equal(cblock2.toRaw().toString('hex'), cmpct2);
|
||||||
|
|
||||||
for (i = 0; i < block.txs.length; i++) {
|
for (i = 0; i < block.txs.length; i++) {
|
||||||
@ -363,27 +366,27 @@ describe('Block', function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
result = cblock.fillMempool(false, mempool);
|
result = cblock1.fillMempool(false, mempool);
|
||||||
assert(result);
|
assert(result);
|
||||||
|
|
||||||
for (i = 0; i < cblock.available.length; i++)
|
for (i = 0; i < cblock1.available.length; i++)
|
||||||
assert(cblock.available[i]);
|
assert(cblock1.available[i]);
|
||||||
|
|
||||||
assert.equal(
|
assert.equal(
|
||||||
cblock.toBlock().toRaw().toString('hex'),
|
cblock1.toBlock().toRaw().toString('hex'),
|
||||||
block.toRaw().toString('hex'));
|
block.toRaw().toString('hex'));
|
||||||
|
|
||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should handle half-full compact block', function(cb) {
|
it('should handle half-full compact block', function(cb) {
|
||||||
var cblock = bip152.CompactBlock.fromRaw(cmpct2, 'hex');
|
|
||||||
var block = Block.fromRaw(cmpct2block);
|
var block = Block.fromRaw(cmpct2block);
|
||||||
var cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock.keyNonce);
|
var cblock1 = bip152.CompactBlock.fromRaw(cmpct2, 'hex');
|
||||||
|
var cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock1.keyNonce);
|
||||||
var map = {};
|
var map = {};
|
||||||
var i, tx, mid, keys, mempool, result, req, res;
|
var i, tx, mid, keys, mempool, result, req, res;
|
||||||
|
|
||||||
assert.equal(cblock.toRaw().toString('hex'), cmpct2);
|
assert.equal(cblock1.toRaw().toString('hex'), cmpct2);
|
||||||
assert.equal(cblock2.toRaw().toString('hex'), cmpct2);
|
assert.equal(cblock2.toRaw().toString('hex'), cmpct2);
|
||||||
|
|
||||||
for (i = 0; i < block.txs.length; i++) {
|
for (i = 0; i < block.txs.length; i++) {
|
||||||
@ -403,26 +406,26 @@ describe('Block', function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
result = cblock.fillMempool(false, mempool);
|
result = cblock1.fillMempool(false, mempool);
|
||||||
assert(!result);
|
assert(!result);
|
||||||
|
|
||||||
req = cblock.toRequest();
|
req = cblock1.toRequest();
|
||||||
assert.equal(req.hash, cblock.hash('hex'));
|
assert.equal(req.hash, cblock1.hash('hex'));
|
||||||
|
|
||||||
req = bip152.TXRequest.fromRaw(req.toRaw());
|
req = bip152.TXRequest.fromRaw(req.toRaw());
|
||||||
assert.equal(req.hash, cblock.hash('hex'));
|
assert.equal(req.hash, cblock1.hash('hex'));
|
||||||
|
|
||||||
res = bip152.TXResponse.fromBlock(block, req);
|
res = bip152.TXResponse.fromBlock(block, req);
|
||||||
res = bip152.TXResponse.fromRaw(res.toRaw());
|
res = bip152.TXResponse.fromRaw(res.toRaw());
|
||||||
|
|
||||||
result = cblock.fillMissing(res);
|
result = cblock1.fillMissing(res);
|
||||||
assert(result);
|
assert(result);
|
||||||
|
|
||||||
for (i = 0; i < cblock.available.length; i++)
|
for (i = 0; i < cblock1.available.length; i++)
|
||||||
assert(cblock.available[i]);
|
assert(cblock1.available[i]);
|
||||||
|
|
||||||
assert.equal(
|
assert.equal(
|
||||||
cblock.toBlock().toRaw().toString('hex'),
|
cblock1.toBlock().toRaw().toString('hex'),
|
||||||
block.toRaw().toString('hex'));
|
block.toRaw().toString('hex'));
|
||||||
|
|
||||||
cb();
|
cb();
|
||||||
|
|||||||
@ -1,27 +1,26 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var bcoin = require('../').set('main');
|
var assert = require('assert');
|
||||||
var util = bcoin.util;
|
var util = require('../lib/utils/util');
|
||||||
|
var constants = require('../lib/protocol/constants');
|
||||||
var crypto = require('../lib/crypto/crypto');
|
var crypto = require('../lib/crypto/crypto');
|
||||||
var Bloom = require('../lib/utils/bloom');
|
var Bloom = require('../lib/utils/bloom');
|
||||||
var murmur3 = require('../lib/utils/murmur3');
|
var murmur3 = require('../lib/utils/murmur3');
|
||||||
var constants = bcoin.constants;
|
|
||||||
var assert = require('assert');
|
|
||||||
|
|
||||||
describe('Bloom', function() {
|
describe('Bloom', function() {
|
||||||
this.timeout(20000);
|
|
||||||
|
|
||||||
var filterHex = ''
|
var filterHex = ''
|
||||||
+ '000000000000000000000000000000000000000000000000088004000000000000000'
|
+ '000000000000000000000000000000000000000000000000088004000000000000000'
|
||||||
+ '000000000200000000000000000000000000000000800000000000000000002000000'
|
+ '000000000200000000000000000000000000000000800000000000000000002000000'
|
||||||
+ '000000000000002000000000000000000000000000000000000000000040000200000'
|
+ '000000000000002000000000000000000000000000000000000000000040000200000'
|
||||||
+ '0000000001000000800000080000000';
|
+ '0000000001000000800000080000000';
|
||||||
|
|
||||||
it('should do proper murmur3', function() {
|
function mm(str, seed, expect, enc) {
|
||||||
function mm(str, seed, expect, enc) {
|
assert.equal(murmur3(new Buffer(str, enc || 'ascii'), seed), expect);
|
||||||
assert.equal(murmur3(new Buffer(str, enc || 'ascii'), seed), expect);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
this.timeout(20000);
|
||||||
|
|
||||||
|
it('should do proper murmur3', function() {
|
||||||
mm('', 0, 0);
|
mm('', 0, 0);
|
||||||
mm('', 0xfba4c795, 0x6a396f08);
|
mm('', 0xfba4c795, 0x6a396f08);
|
||||||
mm('00', 0xfba4c795, 0x2a101837);
|
mm('00', 0xfba4c795, 0x2a101837);
|
||||||
@ -74,14 +73,17 @@ describe('Bloom', function() {
|
|||||||
|
|
||||||
it('should handle 1m ops with regular filter', function() {
|
it('should handle 1m ops with regular filter', function() {
|
||||||
var filter = Bloom.fromRate(210000, 0.00001, -1);
|
var filter = Bloom.fromRate(210000, 0.00001, -1);
|
||||||
|
var i, j, str;
|
||||||
|
|
||||||
filter.tweak = 0xdeadbeef;
|
filter.tweak = 0xdeadbeef;
|
||||||
|
|
||||||
// ~1m operations
|
// ~1m operations
|
||||||
for (var i = 0; i < 1000; i++) {
|
for (i = 0; i < 1000; i++) {
|
||||||
var str = 'foobar' + i;
|
str = 'foobar' + i;
|
||||||
filter.add(str, 'ascii');
|
filter.add(str, 'ascii');
|
||||||
var j = i;
|
j = i;
|
||||||
do {
|
do {
|
||||||
var str = 'foobar' + j;
|
str = 'foobar' + j;
|
||||||
assert(filter.test(str, 'ascii') === true);
|
assert(filter.test(str, 'ascii') === true);
|
||||||
assert(filter.test(str + '-', 'ascii') === false);
|
assert(filter.test(str + '-', 'ascii') === false);
|
||||||
} while (j--);
|
} while (j--);
|
||||||
@ -90,14 +92,17 @@ describe('Bloom', function() {
|
|||||||
|
|
||||||
it('should handle 1m ops with rolling filter', function() {
|
it('should handle 1m ops with rolling filter', function() {
|
||||||
var filter = new Bloom.Rolling(210000, 0.00001);
|
var filter = new Bloom.Rolling(210000, 0.00001);
|
||||||
|
var i, j, str;
|
||||||
|
|
||||||
filter.tweak = 0xdeadbeef;
|
filter.tweak = 0xdeadbeef;
|
||||||
|
|
||||||
// ~1m operations
|
// ~1m operations
|
||||||
for (var i = 0; i < 1000; i++) {
|
for (i = 0; i < 1000; i++) {
|
||||||
var str = 'foobar' + i;
|
str = 'foobar' + i;
|
||||||
filter.add(str, 'ascii');
|
filter.add(str, 'ascii');
|
||||||
var j = i;
|
j = i;
|
||||||
do {
|
do {
|
||||||
var str = 'foobar' + j;
|
str = 'foobar' + j;
|
||||||
assert(filter.test(str, 'ascii') === true);
|
assert(filter.test(str, 'ascii') === true);
|
||||||
assert(filter.test(str + '-', 'ascii') === false);
|
assert(filter.test(str + '-', 'ascii') === false);
|
||||||
} while (j--);
|
} while (j--);
|
||||||
@ -106,58 +111,66 @@ describe('Bloom', function() {
|
|||||||
|
|
||||||
it('should handle rolling generations', function() {
|
it('should handle rolling generations', function() {
|
||||||
var filter = new Bloom.Rolling(50, 0.00001);
|
var filter = new Bloom.Rolling(50, 0.00001);
|
||||||
|
var i, j, str;
|
||||||
|
|
||||||
filter.tweak = 0xdeadbeee;
|
filter.tweak = 0xdeadbeee;
|
||||||
for (var i = 0; i < 25; i++) {
|
|
||||||
var str = 'foobar' + i;
|
for (i = 0; i < 25; i++) {
|
||||||
|
str = 'foobar' + i;
|
||||||
filter.add(str, 'ascii');
|
filter.add(str, 'ascii');
|
||||||
var j = i;
|
j = i;
|
||||||
do {
|
do {
|
||||||
var str = 'foobar' + j;
|
str = 'foobar' + j;
|
||||||
assert(filter.test(str, 'ascii') === true);
|
assert(filter.test(str, 'ascii') === true);
|
||||||
assert(filter.test(str + '-', 'ascii') === false);
|
assert(filter.test(str + '-', 'ascii') === false);
|
||||||
} while (j--);
|
} while (j--);
|
||||||
}
|
}
|
||||||
for (var i = 25; i < 50; i++) {
|
|
||||||
var str = 'foobar' + i;
|
for (i = 25; i < 50; i++) {
|
||||||
|
str = 'foobar' + i;
|
||||||
filter.add(str, 'ascii');
|
filter.add(str, 'ascii');
|
||||||
var j = i;
|
j = i;
|
||||||
do {
|
do {
|
||||||
var str = 'foobar' + j;
|
str = 'foobar' + j;
|
||||||
assert(filter.test(str, 'ascii') === true, str);
|
assert(filter.test(str, 'ascii') === true, str);
|
||||||
assert(filter.test(str + '-', 'ascii') === false, str);
|
assert(filter.test(str + '-', 'ascii') === false, str);
|
||||||
} while (j--);
|
} while (j--);
|
||||||
}
|
}
|
||||||
for (var i = 50; i < 75; i++) {
|
|
||||||
var str = 'foobar' + i;
|
for (i = 50; i < 75; i++) {
|
||||||
|
str = 'foobar' + i;
|
||||||
filter.add(str, 'ascii');
|
filter.add(str, 'ascii');
|
||||||
var j = i;
|
j = i;
|
||||||
do {
|
do {
|
||||||
var str = 'foobar' + j;
|
str = 'foobar' + j;
|
||||||
assert(filter.test(str, 'ascii') === true, str);
|
assert(filter.test(str, 'ascii') === true, str);
|
||||||
assert(filter.test(str + '-', 'ascii') === false, str);
|
assert(filter.test(str + '-', 'ascii') === false, str);
|
||||||
} while (j--);
|
} while (j--);
|
||||||
}
|
}
|
||||||
for (var i = 75; i < 100; i++) {
|
|
||||||
var str = 'foobar' + i;
|
for (i = 75; i < 100; i++) {
|
||||||
|
str = 'foobar' + i;
|
||||||
filter.add(str, 'ascii');
|
filter.add(str, 'ascii');
|
||||||
var j = i;
|
j = i;
|
||||||
do {
|
do {
|
||||||
var str = 'foobar' + j;
|
str = 'foobar' + j;
|
||||||
assert(filter.test(str, 'ascii') === true, str);
|
assert(filter.test(str, 'ascii') === true, str);
|
||||||
assert(filter.test(str + '-', 'ascii') === false, str);
|
assert(filter.test(str + '-', 'ascii') === false, str);
|
||||||
} while (j-- > 25);
|
} while (j-- > 25);
|
||||||
assert(filter.test('foobar 24', 'ascii') === false);
|
assert(filter.test('foobar 24', 'ascii') === false);
|
||||||
}
|
}
|
||||||
for (var i = 100; i < 125; i++) {
|
|
||||||
var str = 'foobar' + i;
|
for (i = 100; i < 125; i++) {
|
||||||
|
str = 'foobar' + i;
|
||||||
filter.add(str, 'ascii');
|
filter.add(str, 'ascii');
|
||||||
var j = i;
|
j = i;
|
||||||
do {
|
do {
|
||||||
var str = 'foobar' + j;
|
str = 'foobar' + j;
|
||||||
assert(filter.test(str, 'ascii') === true, str);
|
assert(filter.test(str, 'ascii') === true, str);
|
||||||
assert(filter.test(str + '-', 'ascii') === false, str);
|
assert(filter.test(str + '-', 'ascii') === false, str);
|
||||||
} while (j-- > 50);
|
} while (j-- > 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(filter.test('foobar 49', 'ascii') === false);
|
assert(filter.test('foobar 49', 'ascii') === false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -13,19 +13,20 @@ describe('ChaCha20 / Poly1305 / AEAD', function() {
|
|||||||
var plain = options.plain;
|
var plain = options.plain;
|
||||||
var ciphertext = options.ciphertext;
|
var ciphertext = options.ciphertext;
|
||||||
var counter = options.counter;
|
var counter = options.counter;
|
||||||
|
var chacha, plainenc;
|
||||||
|
|
||||||
key = new Buffer(key, 'hex');
|
key = new Buffer(key, 'hex');
|
||||||
nonce = new Buffer(nonce, 'hex');
|
nonce = new Buffer(nonce, 'hex');
|
||||||
plain = new Buffer(plain, 'hex');
|
plain = new Buffer(plain, 'hex');
|
||||||
ciphertext = new Buffer(ciphertext, 'hex');
|
ciphertext = new Buffer(ciphertext, 'hex');
|
||||||
|
|
||||||
var chacha = new ChaCha20();
|
chacha = new ChaCha20();
|
||||||
chacha.init(key, nonce, counter);
|
chacha.init(key, nonce, counter);
|
||||||
var plainenc = new Buffer(plain);
|
plainenc = new Buffer(plain);
|
||||||
chacha.encrypt(plainenc);
|
chacha.encrypt(plainenc);
|
||||||
assert.deepEqual(plainenc, ciphertext);
|
assert.deepEqual(plainenc, ciphertext);
|
||||||
|
|
||||||
var chacha = new ChaCha20();
|
chacha = new ChaCha20();
|
||||||
chacha.init(key, nonce, counter);
|
chacha.init(key, nonce, counter);
|
||||||
chacha.encrypt(ciphertext);
|
chacha.encrypt(ciphertext);
|
||||||
assert.deepEqual(plain, ciphertext);
|
assert.deepEqual(plain, ciphertext);
|
||||||
@ -39,6 +40,7 @@ describe('ChaCha20 / Poly1305 / AEAD', function() {
|
|||||||
var pk = options.pk;
|
var pk = options.pk;
|
||||||
var ciphertext = options.ciphertext;
|
var ciphertext = options.ciphertext;
|
||||||
var tag = options.tag;
|
var tag = options.tag;
|
||||||
|
var aead, plainenc;
|
||||||
|
|
||||||
plain = new Buffer(plain, 'hex');
|
plain = new Buffer(plain, 'hex');
|
||||||
aad = new Buffer(aad, 'hex');
|
aad = new Buffer(aad, 'hex');
|
||||||
@ -48,17 +50,17 @@ describe('ChaCha20 / Poly1305 / AEAD', function() {
|
|||||||
ciphertext = new Buffer(ciphertext, 'hex');
|
ciphertext = new Buffer(ciphertext, 'hex');
|
||||||
tag = new Buffer(tag, 'hex');
|
tag = new Buffer(tag, 'hex');
|
||||||
|
|
||||||
var aead = new AEAD();
|
aead = new AEAD();
|
||||||
aead.init(key, nonce);
|
aead.init(key, nonce);
|
||||||
assert.equal(aead.chacha20.getCounter(), 1);
|
assert.equal(aead.chacha20.getCounter(), 1);
|
||||||
assert.deepEqual(aead.polyKey, pk);
|
assert.deepEqual(aead.polyKey, pk);
|
||||||
aead.aad(aad);
|
aead.aad(aad);
|
||||||
var plainenc = new Buffer(plain);
|
plainenc = new Buffer(plain);
|
||||||
aead.encrypt(plainenc);
|
aead.encrypt(plainenc);
|
||||||
assert.deepEqual(plainenc, ciphertext);
|
assert.deepEqual(plainenc, ciphertext);
|
||||||
assert.deepEqual(aead.finish(), tag);
|
assert.deepEqual(aead.finish(), tag);
|
||||||
|
|
||||||
var aead = new AEAD();
|
aead = new AEAD();
|
||||||
aead.init(key, nonce);
|
aead.init(key, nonce);
|
||||||
assert.equal(aead.chacha20.getCounter(), 1);
|
assert.equal(aead.chacha20.getCounter(), 1);
|
||||||
assert.deepEqual(aead.polyKey, pk);
|
assert.deepEqual(aead.polyKey, pk);
|
||||||
@ -191,8 +193,6 @@ describe('ChaCha20 / Poly1305 / AEAD', function() {
|
|||||||
|
|
||||||
it('should create an AEAD and encrypt', function() {
|
it('should create an AEAD and encrypt', function() {
|
||||||
testAEAD({
|
testAEAD({
|
||||||
// 'Ladies and Gentlemen of the class of \'99: If I could'
|
|
||||||
// + ' offer you only one tip for the future, sunscreen would be it.';
|
|
||||||
plain: ''
|
plain: ''
|
||||||
+ '4c616469657320616e642047656e746c656d656e206f662074686520636c6'
|
+ '4c616469657320616e642047656e746c656d656e206f662074686520636c6'
|
||||||
+ '17373206f66202739393a204966204920636f756c64206f666665722'
|
+ '17373206f66202739393a204966204920636f756c64206f666665722'
|
||||||
|
|||||||
@ -1,32 +1,36 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var BN = require('bn.js');
|
|
||||||
var bcoin = require('../').set('regtest');
|
|
||||||
var constants = bcoin.constants;
|
|
||||||
var util = bcoin.util;
|
|
||||||
var crypto = require('../lib/crypto/crypto');
|
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
var opcodes = constants.opcodes;
|
var BN = require('bn.js');
|
||||||
|
var constants = require('../lib/protocol/constants');
|
||||||
|
var util = require('../lib/utils/util');
|
||||||
var co = require('../lib/utils/co');
|
var co = require('../lib/utils/co');
|
||||||
var cob = co.cob;
|
var crypto = require('../lib/crypto/crypto');
|
||||||
var CoinView = require('../lib/blockchain/coinview');
|
var CoinView = require('../lib/blockchain/coinview');
|
||||||
|
var Coin = require('../lib/primitives/coin');
|
||||||
|
var Script = require('../lib/script/script');
|
||||||
|
var FullNode = require('../lib/node/fullnode');
|
||||||
|
var TX = require('../lib/primitives/tx');
|
||||||
|
var MTX = require('../lib/primitives/mtx');
|
||||||
// var Client = require('../lib/wallet/client');
|
// var Client = require('../lib/wallet/client');
|
||||||
|
var opcodes = constants.opcodes;
|
||||||
|
var cob = co.cob;
|
||||||
|
|
||||||
describe('Chain', function() {
|
describe('Chain', function() {
|
||||||
var chain, wallet, node, miner, walletdb, mempool;
|
var node = new FullNode({ db: 'memory', apiKey: 'foo', network: 'regtest' });
|
||||||
var tip1, tip2, cb1, cb2, mineBlock;
|
var chain = node.chain;
|
||||||
|
var mempool = node.mempool;
|
||||||
|
var walletdb = node.walletdb;
|
||||||
|
var miner = node.miner;
|
||||||
|
var wallet, tip1, tip2, cb1, cb2, mineBlock;
|
||||||
|
|
||||||
|
// walletdb.client = new Client({ apiKey: 'foo', network: 'regtest' });
|
||||||
|
walletdb.options.resolution = false;
|
||||||
|
|
||||||
|
node.on('error', function() {});
|
||||||
|
|
||||||
this.timeout(5000);
|
this.timeout(5000);
|
||||||
|
|
||||||
node = new bcoin.fullnode({ db: 'memory', apiKey: 'foo' });
|
|
||||||
// node.walletdb.client = new Client({ apiKey: 'foo', network: 'regtest' });
|
|
||||||
chain = node.chain;
|
|
||||||
mempool = node.mempool;
|
|
||||||
walletdb = node.walletdb;
|
|
||||||
walletdb.options.resolution = false;
|
|
||||||
miner = node.miner;
|
|
||||||
node.on('error', function() {});
|
|
||||||
|
|
||||||
mineBlock = co(function* mineBlock(tip, tx) {
|
mineBlock = co(function* mineBlock(tip, tx) {
|
||||||
var attempt = yield miner.createBlock(tip);
|
var attempt = yield miner.createBlock(tip);
|
||||||
var redeemer;
|
var redeemer;
|
||||||
@ -34,7 +38,7 @@ describe('Chain', function() {
|
|||||||
if (!tx)
|
if (!tx)
|
||||||
return yield attempt.mineAsync();
|
return yield attempt.mineAsync();
|
||||||
|
|
||||||
redeemer = bcoin.mtx();
|
redeemer = new MTX();
|
||||||
|
|
||||||
redeemer.addOutput({
|
redeemer.addOutput({
|
||||||
address: wallet.getReceive(),
|
address: wallet.getReceive(),
|
||||||
@ -225,7 +229,7 @@ describe('Chain', function() {
|
|||||||
yield chain.add(block);
|
yield chain.add(block);
|
||||||
|
|
||||||
tx = block.txs[1];
|
tx = block.txs[1];
|
||||||
output = bcoin.coin.fromTX(tx, 1, chain.height);
|
output = Coin.fromTX(tx, 1, chain.height);
|
||||||
|
|
||||||
coin = yield chain.db.getCoin(tx.hash('hex'), 1);
|
coin = yield chain.db.getCoin(tx.hash('hex'), 1);
|
||||||
|
|
||||||
@ -318,11 +322,11 @@ describe('Chain', function() {
|
|||||||
var attempt = yield miner.createBlock();
|
var attempt = yield miner.createBlock();
|
||||||
var redeemer;
|
var redeemer;
|
||||||
|
|
||||||
redeemer = bcoin.mtx();
|
redeemer = new MTX();
|
||||||
|
|
||||||
redeemer.addOutput({
|
redeemer.addOutput({
|
||||||
script: [
|
script: [
|
||||||
bcoin.script.array(new BN(1)),
|
Script.array(new BN(1)),
|
||||||
constants.opcodes.OP_CHECKSEQUENCEVERIFY
|
constants.opcodes.OP_CHECKSEQUENCEVERIFY
|
||||||
],
|
],
|
||||||
value: 10 * 1e8
|
value: 10 * 1e8
|
||||||
@ -348,11 +352,11 @@ describe('Chain', function() {
|
|||||||
|
|
||||||
csv = block.txs[1];
|
csv = block.txs[1];
|
||||||
|
|
||||||
redeemer = bcoin.mtx();
|
redeemer = new MTX();
|
||||||
|
|
||||||
redeemer.addOutput({
|
redeemer.addOutput({
|
||||||
script: [
|
script: [
|
||||||
bcoin.script.array(new BN(2)),
|
Script.array(new BN(2)),
|
||||||
constants.opcodes.OP_CHECKSEQUENCEVERIFY
|
constants.opcodes.OP_CHECKSEQUENCEVERIFY
|
||||||
],
|
],
|
||||||
value: 10 * 1e8
|
value: 10 * 1e8
|
||||||
@ -374,11 +378,11 @@ describe('Chain', function() {
|
|||||||
var csv = (yield chain.db.getBlock(chain.height)).txs[1];
|
var csv = (yield chain.db.getBlock(chain.height)).txs[1];
|
||||||
var block, attempt, redeemer, err;
|
var block, attempt, redeemer, err;
|
||||||
|
|
||||||
redeemer = bcoin.mtx();
|
redeemer = new MTX();
|
||||||
|
|
||||||
redeemer.addOutput({
|
redeemer.addOutput({
|
||||||
script: [
|
script: [
|
||||||
bcoin.script.array(new BN(1)),
|
Script.array(new BN(1)),
|
||||||
constants.opcodes.OP_CHECKSEQUENCEVERIFY
|
constants.opcodes.OP_CHECKSEQUENCEVERIFY
|
||||||
],
|
],
|
||||||
value: 10 * 1e8
|
value: 10 * 1e8
|
||||||
@ -418,11 +422,11 @@ describe('Chain', function() {
|
|||||||
|
|
||||||
csv = block.txs[1];
|
csv = block.txs[1];
|
||||||
|
|
||||||
redeemer = bcoin.mtx();
|
redeemer = new MTX();
|
||||||
|
|
||||||
redeemer.addOutput({
|
redeemer.addOutput({
|
||||||
script: [
|
script: [
|
||||||
bcoin.script.array(new BN(2)),
|
Script.array(new BN(2)),
|
||||||
constants.opcodes.OP_CHECKSEQUENCEVERIFY
|
constants.opcodes.OP_CHECKSEQUENCEVERIFY
|
||||||
],
|
],
|
||||||
value: 10 * 1e8
|
value: 10 * 1e8
|
||||||
|
|||||||
@ -1,11 +1,10 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var BN = require('bn.js');
|
var assert = require('assert');
|
||||||
var bcoin = require('../').set('main');
|
var util = require('../lib/utils/util');
|
||||||
var util = bcoin.util;
|
var HD = require('../lib/hd');
|
||||||
var base58 = require('../lib/utils/base58');
|
var base58 = require('../lib/utils/base58');
|
||||||
var crypto = require('../lib/crypto/crypto');
|
var crypto = require('../lib/crypto/crypto');
|
||||||
var assert = require('assert');
|
|
||||||
|
|
||||||
// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
|
// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
|
||||||
var vector1 = {
|
var vector1 = {
|
||||||
@ -98,7 +97,7 @@ describe('HD', function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should create master private key', function() {
|
it('should create master private key', function() {
|
||||||
master = bcoin.hd.PrivateKey.fromSeed(new Buffer(seed, 'hex'));
|
master = HD.PrivateKey.fromSeed(new Buffer(seed, 'hex'));
|
||||||
assert.equal(master.toBase58(), master_priv);
|
assert.equal(master.toBase58(), master_priv);
|
||||||
assert.equal(master.toPublic().toBase58(), master_pub);
|
assert.equal(master.toPublic().toBase58(), master_pub);
|
||||||
});
|
});
|
||||||
@ -140,23 +139,23 @@ describe('HD', function() {
|
|||||||
|
|
||||||
it('should derive correctly when private key has leading zeros', function() {
|
it('should derive correctly when private key has leading zeros', function() {
|
||||||
var key = 'xprv9s21ZrQH143K3ckY9DgU79uMTJkQRLdbCCVDh81SnxTgPzLLGax6uHeBULTtaEtcAvKjXfT7ZWtHzKjTpujMkUd9dDb8msDeAfnJxrgAYhr';
|
var key = 'xprv9s21ZrQH143K3ckY9DgU79uMTJkQRLdbCCVDh81SnxTgPzLLGax6uHeBULTtaEtcAvKjXfT7ZWtHzKjTpujMkUd9dDb8msDeAfnJxrgAYhr';
|
||||||
var hdkey = bcoin.hd.PrivateKey.fromBase58(key);
|
var hdkey = HD.PrivateKey.fromBase58(key);
|
||||||
assert.equal(hdkey.privateKey.toString('hex'), '00000055378cf5fafb56c711c674143f9b0ee82ab0ba2924f19b64f5ae7cdbfd');
|
assert.equal(hdkey.privateKey.toString('hex'), '00000055378cf5fafb56c711c674143f9b0ee82ab0ba2924f19b64f5ae7cdbfd');
|
||||||
var child = hdkey.derivePath('m/44\'/0\'/0\'/0/0\'');
|
var child = hdkey.derivePath('m/44\'/0\'/0\'/0/0\'');
|
||||||
assert.equal(child.privateKey.toString('hex'), '3348069561d2a0fb925e74bf198762acc47dce7db27372257d2d959a9e6f8aeb');
|
assert.equal(child.privateKey.toString('hex'), '3348069561d2a0fb925e74bf198762acc47dce7db27372257d2d959a9e6f8aeb');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should deserialize master private key', function() {
|
it('should deserialize master private key', function() {
|
||||||
bcoin.hd.PrivateKey.fromBase58(master.toBase58());
|
HD.PrivateKey.fromBase58(master.toBase58());
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should deserialize master public key', function() {
|
it('should deserialize master public key', function() {
|
||||||
bcoin.hd.PublicKey.fromBase58(master.toPublic().toBase58());
|
HD.PublicKey.fromBase58(master.toPublic().toBase58());
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should deserialize and reserialize', function() {
|
it('should deserialize and reserialize', function() {
|
||||||
var key = bcoin.hd.fromMnemonic();
|
var key = HD.fromMnemonic();
|
||||||
assert.equal(bcoin.hd.fromJSON(key.toJSON()).toBase58(), key.toBase58());
|
assert.equal(HD.fromJSON(key.toJSON()).toBase58(), key.toBase58());
|
||||||
});
|
});
|
||||||
|
|
||||||
function ub58(data) {
|
function ub58(data) {
|
||||||
@ -175,7 +174,7 @@ describe('HD', function() {
|
|||||||
delete vector.seed;
|
delete vector.seed;
|
||||||
delete vector.m;
|
delete vector.m;
|
||||||
it('should create from a seed', function() {
|
it('should create from a seed', function() {
|
||||||
master = bcoin.hd.PrivateKey.fromSeed(new Buffer(seed, 'hex'));
|
master = HD.PrivateKey.fromSeed(new Buffer(seed, 'hex'));
|
||||||
equal(master.toBase58(), m.prv);
|
equal(master.toBase58(), m.prv);
|
||||||
equal(master.toPublic().toBase58(), m.pub);
|
equal(master.toPublic().toBase58(), m.pub);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,15 +1,16 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var BN = require('bn.js');
|
|
||||||
var bcoin = require('../').set('regtest');
|
|
||||||
var constants = bcoin.constants;
|
|
||||||
var network = bcoin.networks;
|
|
||||||
var util = bcoin.util;
|
|
||||||
var crypto = require('../lib/crypto/crypto');
|
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
var scriptTypes = constants.scriptTypes;
|
var constants = require('../lib/protocol/constants');
|
||||||
|
var network = require('../lib/protocol/networks');
|
||||||
|
var util = require('../lib/utils/util');
|
||||||
|
var crypto = require('../lib/crypto/crypto');
|
||||||
var co = require('../lib/utils/co');
|
var co = require('../lib/utils/co');
|
||||||
var Amount = require('../lib/btc/amount');
|
var Amount = require('../lib/btc/amount');
|
||||||
|
var MTX = require('../lib/primitives/mtx');
|
||||||
|
var HTTP = require('../lib/http');
|
||||||
|
var FullNode = require('../lib/node/fullnode');
|
||||||
|
var scriptTypes = constants.scriptTypes;
|
||||||
var cob = co.cob;
|
var cob = co.cob;
|
||||||
|
|
||||||
var dummyInput = {
|
var dummyInput = {
|
||||||
@ -20,25 +21,25 @@ var dummyInput = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
describe('HTTP', function() {
|
describe('HTTP', function() {
|
||||||
var request = bcoin.http.request;
|
var request = HTTP.request;
|
||||||
var w, addr, hash;
|
var node, wallet, w, addr, hash;
|
||||||
|
|
||||||
this.timeout(15000);
|
node = new FullNode({
|
||||||
|
|
||||||
var node = new bcoin.fullnode({
|
|
||||||
network: 'regtest',
|
network: 'regtest',
|
||||||
apiKey: 'foo',
|
apiKey: 'foo',
|
||||||
walletAuth: true,
|
walletAuth: true,
|
||||||
db: 'memory'
|
db: 'memory'
|
||||||
});
|
});
|
||||||
|
|
||||||
var wallet = new bcoin.http.Wallet({
|
wallet = new HTTP.Wallet({
|
||||||
network: 'regtest',
|
network: 'regtest',
|
||||||
apiKey: 'foo'
|
apiKey: 'foo'
|
||||||
});
|
});
|
||||||
|
|
||||||
node.on('error', function() {});
|
node.on('error', function() {});
|
||||||
|
|
||||||
|
this.timeout(15000);
|
||||||
|
|
||||||
it('should open node', cob(function* () {
|
it('should open node', cob(function* () {
|
||||||
constants.tx.COINBASE_MATURITY = 0;
|
constants.tx.COINBASE_MATURITY = 0;
|
||||||
yield node.open();
|
yield node.open();
|
||||||
@ -65,17 +66,17 @@ describe('HTTP', function() {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
it('should fill with funds', cob(function* () {
|
it('should fill with funds', cob(function* () {
|
||||||
var balance, receive, details;
|
var tx, balance, receive, details;
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
var t1 = bcoin.mtx()
|
tx = MTX()
|
||||||
.addOutput(addr, 50460)
|
.addOutput(addr, 50460)
|
||||||
.addOutput(addr, 50460)
|
.addOutput(addr, 50460)
|
||||||
.addOutput(addr, 50460)
|
.addOutput(addr, 50460)
|
||||||
.addOutput(addr, 50460);
|
.addOutput(addr, 50460);
|
||||||
|
|
||||||
t1.addInput(dummyInput);
|
tx.addInput(dummyInput);
|
||||||
t1 = t1.toTX();
|
tx = tx.toTX();
|
||||||
|
|
||||||
wallet.once('balance', function(b) {
|
wallet.once('balance', function(b) {
|
||||||
balance = b;
|
balance = b;
|
||||||
@ -89,7 +90,7 @@ describe('HTTP', function() {
|
|||||||
details = d;
|
details = d;
|
||||||
});
|
});
|
||||||
|
|
||||||
yield node.walletdb.addTX(t1);
|
yield node.walletdb.addTX(tx);
|
||||||
yield co.timeout(300);
|
yield co.timeout(300);
|
||||||
|
|
||||||
assert(receive);
|
assert(receive);
|
||||||
@ -100,7 +101,7 @@ describe('HTTP', function() {
|
|||||||
assert.equal(Amount.value(balance.confirmed), 0);
|
assert.equal(Amount.value(balance.confirmed), 0);
|
||||||
assert.equal(Amount.value(balance.unconfirmed), 201840);
|
assert.equal(Amount.value(balance.unconfirmed), 201840);
|
||||||
assert(details);
|
assert(details);
|
||||||
assert.equal(details.hash, t1.rhash());
|
assert.equal(details.hash, tx.rhash());
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it('should get balance', cob(function* () {
|
it('should get balance', cob(function* () {
|
||||||
|
|||||||
@ -1,46 +1,54 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var BN = require('bn.js');
|
|
||||||
var bcoin = require('../').set('main');
|
|
||||||
var constants = bcoin.constants;
|
|
||||||
var util = bcoin.util;
|
|
||||||
var crypto = require('../lib/crypto/crypto');
|
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
var opcodes = constants.opcodes;
|
var constants = require('../lib/protocol/constants');
|
||||||
var cob = require('../lib/utils/co').cob;
|
var util = require('../lib/utils/util');
|
||||||
|
var crypto = require('../lib/crypto/crypto');
|
||||||
|
var co = require('../lib/utils/co');
|
||||||
var MempoolEntry = require('../lib/mempool/mempoolentry');
|
var MempoolEntry = require('../lib/mempool/mempoolentry');
|
||||||
|
var Mempool = require('../lib/mempool/mempool');
|
||||||
|
var Chain = require('../lib/blockchain/chain');
|
||||||
|
var WalletDB = require('../lib/wallet/walletdb');
|
||||||
|
var MTX = require('../lib/primitives/mtx');
|
||||||
|
var Coin = require('../lib/primitives/coin');
|
||||||
|
var KeyRing = require('../lib/primitives/keyring');
|
||||||
|
var Address = require('../lib/primitives/address');
|
||||||
|
var Script = require('../lib/script/script');
|
||||||
|
var Witness = require('../lib/script/witness');
|
||||||
|
var Block = require('../lib/primitives/block');
|
||||||
|
var opcodes = constants.opcodes;
|
||||||
|
var cob = co.cob;
|
||||||
|
|
||||||
describe('Mempool', function() {
|
describe('Mempool', function() {
|
||||||
var chain, mempool, walletdb;
|
var chain, mempool, walletdb, wallet, cached;
|
||||||
var wallet, cached;
|
|
||||||
|
|
||||||
this.timeout(5000);
|
this.timeout(5000);
|
||||||
|
|
||||||
chain = new bcoin.chain({
|
chain = new Chain({
|
||||||
name: 'mp-chain',
|
name: 'mp-chain',
|
||||||
db: 'memory'
|
db: 'memory'
|
||||||
});
|
});
|
||||||
|
|
||||||
mempool = new bcoin.mempool({
|
mempool = new Mempool({
|
||||||
chain: chain,
|
chain: chain,
|
||||||
name: 'mempool-test',
|
name: 'mempool-test',
|
||||||
db: 'memory'
|
db: 'memory'
|
||||||
});
|
});
|
||||||
|
|
||||||
walletdb = new bcoin.walletdb({
|
walletdb = new WalletDB({
|
||||||
name: 'mempool-wallet-test',
|
name: 'mempool-wallet-test',
|
||||||
db: 'memory',
|
db: 'memory',
|
||||||
verify: true
|
verify: true
|
||||||
});
|
});
|
||||||
|
|
||||||
function dummy(prev, prevHash) {
|
function dummy(prev, prevHash) {
|
||||||
var funding = bcoin.mtx();
|
var funding = new MTX();
|
||||||
var coin, entry;
|
var coin, entry;
|
||||||
|
|
||||||
if (!prevHash)
|
if (!prevHash)
|
||||||
prevHash = constants.ONE_HASH.toString('hex');
|
prevHash = constants.ONE_HASH.toString('hex');
|
||||||
|
|
||||||
coin = new bcoin.coin({
|
coin = new Coin({
|
||||||
version: 1,
|
version: 1,
|
||||||
height: 0,
|
height: 0,
|
||||||
value: 0,
|
value: 0,
|
||||||
@ -58,7 +66,7 @@ describe('Mempool', function() {
|
|||||||
|
|
||||||
mempool.trackEntry(entry, funding.view);
|
mempool.trackEntry(entry, funding.view);
|
||||||
|
|
||||||
return bcoin.coin.fromTX(funding, 0, -1);
|
return Coin.fromTX(funding, 0, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
it('should open mempool', cob(function* () {
|
it('should open mempool', cob(function* () {
|
||||||
@ -75,24 +83,24 @@ describe('Mempool', function() {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
it('should handle incoming orphans and TXs', cob(function* () {
|
it('should handle incoming orphans and TXs', cob(function* () {
|
||||||
var kp = bcoin.keyring.generate();
|
var kp = KeyRing.generate();
|
||||||
var w = wallet;
|
var w = wallet;
|
||||||
var t1, t2, t3, t4, f1, fake, prev, sig, balance, txs;
|
var t1, t2, t3, t4, f1, fake, prev, sig, balance, txs;
|
||||||
|
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(w.getAddress(), 50000)
|
.addOutput(w.getAddress(), 50000)
|
||||||
.addOutput(w.getAddress(), 10000);
|
.addOutput(w.getAddress(), 10000);
|
||||||
|
|
||||||
prev = new bcoin.script([kp.publicKey, opcodes.OP_CHECKSIG]);
|
prev = new Script([kp.publicKey, opcodes.OP_CHECKSIG]);
|
||||||
t1.addInput(dummy(prev));
|
t1.addInput(dummy(prev));
|
||||||
sig = t1.signature(0, prev, 70000, kp.privateKey, 'all', 0);
|
sig = t1.signature(0, prev, 70000, kp.privateKey, 'all', 0);
|
||||||
t1.inputs[0].script = new bcoin.script([sig]);
|
t1.inputs[0].script = new Script([sig]);
|
||||||
|
|
||||||
// balance: 51000
|
// balance: 51000
|
||||||
yield w.sign(t1);
|
yield w.sign(t1);
|
||||||
t1 = t1.toTX();
|
t1 = t1.toTX();
|
||||||
|
|
||||||
t2 = bcoin.mtx()
|
t2 = MTX()
|
||||||
.addInput(t1, 0) // 50000
|
.addInput(t1, 0) // 50000
|
||||||
.addOutput(w.getAddress(), 20000)
|
.addOutput(w.getAddress(), 20000)
|
||||||
.addOutput(w.getAddress(), 20000);
|
.addOutput(w.getAddress(), 20000);
|
||||||
@ -101,7 +109,7 @@ describe('Mempool', function() {
|
|||||||
yield w.sign(t2);
|
yield w.sign(t2);
|
||||||
t2 = t2.toTX();
|
t2 = t2.toTX();
|
||||||
|
|
||||||
t3 = bcoin.mtx()
|
t3 = MTX()
|
||||||
.addInput(t1, 1) // 10000
|
.addInput(t1, 1) // 10000
|
||||||
.addInput(t2, 0) // 20000
|
.addInput(t2, 0) // 20000
|
||||||
.addOutput(w.getAddress(), 23000);
|
.addOutput(w.getAddress(), 23000);
|
||||||
@ -110,7 +118,7 @@ describe('Mempool', function() {
|
|||||||
yield w.sign(t3);
|
yield w.sign(t3);
|
||||||
t3 = t3.toTX();
|
t3 = t3.toTX();
|
||||||
|
|
||||||
t4 = bcoin.mtx()
|
t4 = MTX()
|
||||||
.addInput(t2, 1) // 24000
|
.addInput(t2, 1) // 24000
|
||||||
.addInput(t3, 0) // 23000
|
.addInput(t3, 0) // 23000
|
||||||
.addOutput(w.getAddress(), 11000)
|
.addOutput(w.getAddress(), 11000)
|
||||||
@ -120,15 +128,15 @@ describe('Mempool', function() {
|
|||||||
yield w.sign(t4);
|
yield w.sign(t4);
|
||||||
t4 = t4.toTX();
|
t4 = t4.toTX();
|
||||||
|
|
||||||
f1 = bcoin.mtx()
|
f1 = MTX()
|
||||||
.addInput(t4, 1) // 11000
|
.addInput(t4, 1) // 11000
|
||||||
.addOutput(new bcoin.address(), 9000);
|
.addOutput(new Address(), 9000);
|
||||||
|
|
||||||
// balance: 11000
|
// balance: 11000
|
||||||
yield w.sign(f1);
|
yield w.sign(f1);
|
||||||
f1 = f1.toTX();
|
f1 = f1.toTX();
|
||||||
|
|
||||||
fake = bcoin.mtx()
|
fake = MTX()
|
||||||
.addInput(t1, 1) // 1000 (already redeemed)
|
.addInput(t1, 1) // 1000 (already redeemed)
|
||||||
.addOutput(w.getAddress(), 6000); // 6000 instead of 500
|
.addOutput(w.getAddress(), 6000); // 6000 instead of 500
|
||||||
|
|
||||||
@ -175,14 +183,14 @@ describe('Mempool', function() {
|
|||||||
|
|
||||||
it('should handle locktime', cob(function* () {
|
it('should handle locktime', cob(function* () {
|
||||||
var w = wallet;
|
var w = wallet;
|
||||||
var kp = bcoin.keyring.generate();
|
var kp = KeyRing.generate();
|
||||||
var tx, prev, prevHash, sig;
|
var tx, prev, prevHash, sig;
|
||||||
|
|
||||||
tx = bcoin.mtx()
|
tx = MTX()
|
||||||
.addOutput(w.getAddress(), 50000)
|
.addOutput(w.getAddress(), 50000)
|
||||||
.addOutput(w.getAddress(), 10000);
|
.addOutput(w.getAddress(), 10000);
|
||||||
|
|
||||||
prev = new bcoin.script([kp.publicKey, opcodes.OP_CHECKSIG]);
|
prev = new Script([kp.publicKey, opcodes.OP_CHECKSIG]);
|
||||||
prevHash = crypto.randomBytes(32).toString('hex');
|
prevHash = crypto.randomBytes(32).toString('hex');
|
||||||
|
|
||||||
tx.addInput(dummy(prev, prevHash));
|
tx.addInput(dummy(prev, prevHash));
|
||||||
@ -191,7 +199,7 @@ describe('Mempool', function() {
|
|||||||
chain.tip.height = 200;
|
chain.tip.height = 200;
|
||||||
|
|
||||||
sig = tx.signature(0, prev, 70000, kp.privateKey, 'all', 0);
|
sig = tx.signature(0, prev, 70000, kp.privateKey, 'all', 0);
|
||||||
tx.inputs[0].script = new bcoin.script([sig]),
|
tx.inputs[0].script = new Script([sig]),
|
||||||
|
|
||||||
tx = tx.toTX();
|
tx = tx.toTX();
|
||||||
|
|
||||||
@ -201,14 +209,14 @@ describe('Mempool', function() {
|
|||||||
|
|
||||||
it('should handle invalid locktime', cob(function* () {
|
it('should handle invalid locktime', cob(function* () {
|
||||||
var w = wallet;
|
var w = wallet;
|
||||||
var kp = bcoin.keyring.generate();
|
var kp = KeyRing.generate();
|
||||||
var tx, prev, prevHash, sig, err;
|
var tx, prev, prevHash, sig, err;
|
||||||
|
|
||||||
tx = bcoin.mtx()
|
tx = MTX()
|
||||||
.addOutput(w.getAddress(), 50000)
|
.addOutput(w.getAddress(), 50000)
|
||||||
.addOutput(w.getAddress(), 10000);
|
.addOutput(w.getAddress(), 10000);
|
||||||
|
|
||||||
prev = new bcoin.script([kp.publicKey, opcodes.OP_CHECKSIG]);
|
prev = new Script([kp.publicKey, opcodes.OP_CHECKSIG]);
|
||||||
prevHash = crypto.randomBytes(32).toString('hex');
|
prevHash = crypto.randomBytes(32).toString('hex');
|
||||||
|
|
||||||
tx.addInput(dummy(prev, prevHash));
|
tx.addInput(dummy(prev, prevHash));
|
||||||
@ -216,7 +224,7 @@ describe('Mempool', function() {
|
|||||||
chain.tip.height = 200 - 1;
|
chain.tip.height = 200 - 1;
|
||||||
|
|
||||||
sig = tx.signature(0, prev, 70000, kp.privateKey, 'all', 0);
|
sig = tx.signature(0, prev, 70000, kp.privateKey, 'all', 0);
|
||||||
tx.inputs[0].script = new bcoin.script([sig]),
|
tx.inputs[0].script = new Script([sig]),
|
||||||
tx = tx.toTX();
|
tx = tx.toTX();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -232,25 +240,25 @@ describe('Mempool', function() {
|
|||||||
|
|
||||||
it('should not cache a malleated wtx with mutated sig', cob(function* () {
|
it('should not cache a malleated wtx with mutated sig', cob(function* () {
|
||||||
var w = wallet;
|
var w = wallet;
|
||||||
var kp = bcoin.keyring.generate();
|
var kp = KeyRing.generate();
|
||||||
var tx, prev, prevHash, prevs, sig, tx, err;
|
var tx, prev, prevHash, prevs, sig, tx, err;
|
||||||
|
|
||||||
kp.witness = true;
|
kp.witness = true;
|
||||||
|
|
||||||
tx = bcoin.mtx()
|
tx = MTX()
|
||||||
.addOutput(w.getAddress(), 50000)
|
.addOutput(w.getAddress(), 50000)
|
||||||
.addOutput(w.getAddress(), 10000);
|
.addOutput(w.getAddress(), 10000);
|
||||||
|
|
||||||
prev = new bcoin.script([0, kp.getKeyHash()]);
|
prev = new Script([0, kp.getKeyHash()]);
|
||||||
prevHash = crypto.randomBytes(32).toString('hex');
|
prevHash = crypto.randomBytes(32).toString('hex');
|
||||||
|
|
||||||
tx.addInput(dummy(prev, prevHash));
|
tx.addInput(dummy(prev, prevHash));
|
||||||
|
|
||||||
prevs = bcoin.script.fromPubkeyhash(kp.getKeyHash());
|
prevs = Script.fromPubkeyhash(kp.getKeyHash());
|
||||||
|
|
||||||
sig = tx.signature(0, prevs, 70000, kp.privateKey, 'all', 1);
|
sig = tx.signature(0, prevs, 70000, kp.privateKey, 'all', 1);
|
||||||
sig[sig.length - 1] = 0;
|
sig[sig.length - 1] = 0;
|
||||||
tx.inputs[0].witness = new bcoin.witness([sig, kp.publicKey]);
|
tx.inputs[0].witness = new Witness([sig, kp.publicKey]);
|
||||||
tx = tx.toTX();
|
tx = tx.toTX();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -265,20 +273,20 @@ describe('Mempool', function() {
|
|||||||
|
|
||||||
it('should not cache a malleated tx with unnecessary witness', cob(function* () {
|
it('should not cache a malleated tx with unnecessary witness', cob(function* () {
|
||||||
var w = wallet;
|
var w = wallet;
|
||||||
var kp = bcoin.keyring.generate();
|
var kp = KeyRing.generate();
|
||||||
var tx, prev, prevHash, sig, tx, err;
|
var tx, prev, prevHash, sig, tx, err;
|
||||||
|
|
||||||
tx = bcoin.mtx()
|
tx = MTX()
|
||||||
.addOutput(w.getAddress(), 50000)
|
.addOutput(w.getAddress(), 50000)
|
||||||
.addOutput(w.getAddress(), 10000);
|
.addOutput(w.getAddress(), 10000);
|
||||||
|
|
||||||
prev = new bcoin.script([kp.publicKey, opcodes.OP_CHECKSIG]);
|
prev = new Script([kp.publicKey, opcodes.OP_CHECKSIG]);
|
||||||
prevHash = crypto.randomBytes(32).toString('hex');
|
prevHash = crypto.randomBytes(32).toString('hex');
|
||||||
|
|
||||||
tx.addInput(dummy(prev, prevHash));
|
tx.addInput(dummy(prev, prevHash));
|
||||||
|
|
||||||
sig = tx.signature(0, prev, 70000, kp.privateKey, 'all', 0);
|
sig = tx.signature(0, prev, 70000, kp.privateKey, 'all', 0);
|
||||||
tx.inputs[0].script = new bcoin.script([sig]);
|
tx.inputs[0].script = new Script([sig]);
|
||||||
tx.inputs[0].witness.push(new Buffer(0));
|
tx.inputs[0].witness.push(new Buffer(0));
|
||||||
tx = tx.toTX();
|
tx = tx.toTX();
|
||||||
|
|
||||||
@ -294,16 +302,16 @@ describe('Mempool', function() {
|
|||||||
|
|
||||||
it('should not cache a malleated wtx with wit removed', cob(function* () {
|
it('should not cache a malleated wtx with wit removed', cob(function* () {
|
||||||
var w = wallet;
|
var w = wallet;
|
||||||
var kp = bcoin.keyring.generate();
|
var kp = KeyRing.generate();
|
||||||
var tx, prev, prevHash, tx, err;
|
var tx, prev, prevHash, tx, err;
|
||||||
|
|
||||||
kp.witness = true;
|
kp.witness = true;
|
||||||
|
|
||||||
tx = bcoin.mtx()
|
tx = MTX()
|
||||||
.addOutput(w.getAddress(), 50000)
|
.addOutput(w.getAddress(), 50000)
|
||||||
.addOutput(w.getAddress(), 10000);
|
.addOutput(w.getAddress(), 10000);
|
||||||
|
|
||||||
prev = new bcoin.script([0, kp.getKeyHash()]);
|
prev = new Script([0, kp.getKeyHash()]);
|
||||||
prevHash = crypto.randomBytes(32).toString('hex');
|
prevHash = crypto.randomBytes(32).toString('hex');
|
||||||
|
|
||||||
tx.addInput(dummy(prev, prevHash));
|
tx.addInput(dummy(prev, prevHash));
|
||||||
@ -323,14 +331,14 @@ describe('Mempool', function() {
|
|||||||
|
|
||||||
it('should cache non-malleated tx without sig', cob(function* () {
|
it('should cache non-malleated tx without sig', cob(function* () {
|
||||||
var w = wallet;
|
var w = wallet;
|
||||||
var kp = bcoin.keyring.generate();
|
var kp = KeyRing.generate();
|
||||||
var tx, prev, prevHash, tx, err;
|
var tx, prev, prevHash, tx, err;
|
||||||
|
|
||||||
tx = bcoin.mtx()
|
tx = MTX()
|
||||||
.addOutput(w.getAddress(), 50000)
|
.addOutput(w.getAddress(), 50000)
|
||||||
.addOutput(w.getAddress(), 10000);
|
.addOutput(w.getAddress(), 10000);
|
||||||
|
|
||||||
prev = new bcoin.script([kp.publicKey, opcodes.OP_CHECKSIG]);
|
prev = new Script([kp.publicKey, opcodes.OP_CHECKSIG]);
|
||||||
prevHash = crypto.randomBytes(32).toString('hex');
|
prevHash = crypto.randomBytes(32).toString('hex');
|
||||||
|
|
||||||
tx.addInput(dummy(prev, prevHash));
|
tx.addInput(dummy(prev, prevHash));
|
||||||
@ -353,7 +361,7 @@ describe('Mempool', function() {
|
|||||||
var w = wallet;
|
var w = wallet;
|
||||||
var tx, input, tx, block;
|
var tx, input, tx, block;
|
||||||
|
|
||||||
tx = bcoin.mtx()
|
tx = MTX()
|
||||||
.addOutput(w.getAddress(), 50000);
|
.addOutput(w.getAddress(), 50000);
|
||||||
|
|
||||||
input = {
|
input = {
|
||||||
@ -367,7 +375,7 @@ describe('Mempool', function() {
|
|||||||
|
|
||||||
tx = tx.toTX();
|
tx = tx.toTX();
|
||||||
|
|
||||||
block = new bcoin.block();
|
block = new Block();
|
||||||
block.txs.push(tx);
|
block.txs.push(tx);
|
||||||
|
|
||||||
assert(mempool.hasReject(cached.hash()));
|
assert(mempool.hasReject(cached.hash()));
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var BN = require('bn.js');
|
|
||||||
var bcoin = require('../').set('main');
|
|
||||||
var util = bcoin.util;
|
|
||||||
var crypto = require('../lib/crypto/crypto');
|
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
|
var util = require('../lib/utils/util');
|
||||||
|
var crypto = require('../lib/crypto/crypto');
|
||||||
|
var HD = require('../lib/hd');
|
||||||
|
|
||||||
var mnemonic1 = require('./data/mnemonic1').english;
|
var mnemonic1 = require('./data/mnemonic1').english;
|
||||||
var mnemonic2 = require('./data/mnemonic2');
|
var mnemonic2 = require('./data/mnemonic2');
|
||||||
|
|
||||||
@ -15,14 +15,18 @@ describe('Mnemonic', function() {
|
|||||||
var seed = new Buffer(data[2], 'hex');
|
var seed = new Buffer(data[2], 'hex');
|
||||||
var xpriv = data[3];
|
var xpriv = data[3];
|
||||||
it('should create an english mnemonic (' + i + ')', function() {
|
it('should create an english mnemonic (' + i + ')', function() {
|
||||||
var mnemonic = new bcoin.hd.Mnemonic({
|
var mnemonic, key;
|
||||||
|
|
||||||
|
mnemonic = new HD.Mnemonic({
|
||||||
language: 'english',
|
language: 'english',
|
||||||
entropy: entropy,
|
entropy: entropy,
|
||||||
passphrase: 'TREZOR'
|
passphrase: 'TREZOR'
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.equal(mnemonic.getPhrase(), phrase);
|
assert.equal(mnemonic.getPhrase(), phrase);
|
||||||
assert.equal(mnemonic.toSeed().toString('hex'), seed.toString('hex'));
|
assert.equal(mnemonic.toSeed().toString('hex'), seed.toString('hex'));
|
||||||
var key = bcoin.hd.fromMnemonic(mnemonic);
|
|
||||||
|
key = HD.fromMnemonic(mnemonic);
|
||||||
assert.equal(key.toBase58(), xpriv);
|
assert.equal(key.toBase58(), xpriv);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -34,21 +38,25 @@ describe('Mnemonic', function() {
|
|||||||
var passphrase = data.passphrase;
|
var passphrase = data.passphrase;
|
||||||
var xpriv = data.bip32_xprv;
|
var xpriv = data.bip32_xprv;
|
||||||
it('should create a japanese mnemonic (' + i + ')', function() {
|
it('should create a japanese mnemonic (' + i + ')', function() {
|
||||||
var mnemonic = new bcoin.hd.Mnemonic({
|
var mnemonic, key;
|
||||||
|
|
||||||
|
mnemonic = new HD.Mnemonic({
|
||||||
language: 'japanese',
|
language: 'japanese',
|
||||||
entropy: entropy,
|
entropy: entropy,
|
||||||
passphrase: passphrase
|
passphrase: passphrase
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.equal(mnemonic.getPhrase(), phrase);
|
assert.equal(mnemonic.getPhrase(), phrase);
|
||||||
assert.equal(mnemonic.toSeed().toString('hex'), seed.toString('hex'));
|
assert.equal(mnemonic.toSeed().toString('hex'), seed.toString('hex'));
|
||||||
var key = bcoin.hd.fromMnemonic(mnemonic);
|
|
||||||
|
key = HD.fromMnemonic(mnemonic);
|
||||||
assert.equal(key.toBase58(), xpriv);
|
assert.equal(key.toBase58(), xpriv);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should verify phrase', function() {
|
it('should verify phrase', function() {
|
||||||
var m1 = new bcoin.hd.Mnemonic();
|
var m1 = new HD.Mnemonic();
|
||||||
var m2 = bcoin.hd.Mnemonic.fromPhrase(m1.getPhrase());
|
var m2 = HD.Mnemonic.fromPhrase(m1.getPhrase());
|
||||||
assert.deepEqual(m2.getEntropy(), m1.getEntropy());
|
assert.deepEqual(m2.getEntropy(), m1.getEntropy());
|
||||||
assert.equal(m2.bits, m1.bits);
|
assert.equal(m2.bits, m1.bits);
|
||||||
assert.equal(m2.language, m1.language);
|
assert.equal(m2.language, m1.language);
|
||||||
|
|||||||
@ -1,24 +1,26 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var bcoin = require('../').set('main');
|
|
||||||
var assert = require('assert');
|
|
||||||
var constants = bcoin.constants;
|
|
||||||
var network = bcoin.network.get();
|
|
||||||
var util = bcoin.util;
|
|
||||||
var crypto = require('../lib/crypto/crypto');
|
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var alertData = fs.readFileSync(__dirname + '/data/alertTests.raw');
|
var assert = require('assert');
|
||||||
|
var constants = require('../lib/protocol/constants');
|
||||||
|
var Network = require('../lib/protocol/network');
|
||||||
|
var util = require('../lib/utils/util');
|
||||||
|
var BufferReader = require('../lib/utils/reader');
|
||||||
|
var crypto = require('../lib/crypto/crypto');
|
||||||
var NetworkAddress = require('../lib/primitives/netaddress');
|
var NetworkAddress = require('../lib/primitives/netaddress');
|
||||||
|
var TX = require('../lib/primitives/tx');
|
||||||
var Framer = require('../lib/net/framer');
|
var Framer = require('../lib/net/framer');
|
||||||
var Parser = require('../lib/net/parser');
|
var Parser = require('../lib/net/parser');
|
||||||
var packets = require('../lib/net/packets');
|
var packets = require('../lib/net/packets');
|
||||||
|
var network = Network.get('main');
|
||||||
|
|
||||||
|
var alertData = fs.readFileSync(__dirname + '/data/alertTests.raw');
|
||||||
|
|
||||||
describe('Protocol', function() {
|
describe('Protocol', function() {
|
||||||
var version = require('../package.json').version;
|
var version = require('../package.json').version;
|
||||||
var agent = '/bcoin:' + version + '/';
|
var agent = '/bcoin:' + version + '/';
|
||||||
|
var parser, framer, v1, v2, hosts;
|
||||||
|
|
||||||
var parser;
|
|
||||||
var framer;
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
parser = new Parser();
|
parser = new Parser();
|
||||||
framer = new Framer();
|
framer = new Framer();
|
||||||
@ -36,10 +38,10 @@ describe('Protocol', function() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var v1 = packets.VersionPacket.fromOptions({
|
v1 = packets.VersionPacket.fromOptions({
|
||||||
version: constants.VERSION,
|
version: constants.VERSION,
|
||||||
services: constants.LOCAL_SERVICES,
|
services: constants.LOCAL_SERVICES,
|
||||||
ts: bcoin.now(),
|
ts: network.now(),
|
||||||
remote: new NetworkAddress(),
|
remote: new NetworkAddress(),
|
||||||
local: new NetworkAddress(),
|
local: new NetworkAddress(),
|
||||||
nonce: util.nonce(),
|
nonce: util.nonce(),
|
||||||
@ -55,10 +57,10 @@ describe('Protocol', function() {
|
|||||||
assert.equal(payload.relay, false);
|
assert.equal(payload.relay, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
var v2 = packets.VersionPacket.fromOptions({
|
v2 = packets.VersionPacket.fromOptions({
|
||||||
version: constants.VERSION,
|
version: constants.VERSION,
|
||||||
services: constants.LOCAL_SERVICES,
|
services: constants.LOCAL_SERVICES,
|
||||||
ts: bcoin.now(),
|
ts: network.now(),
|
||||||
remote: new NetworkAddress(),
|
remote: new NetworkAddress(),
|
||||||
local: new NetworkAddress(),
|
local: new NetworkAddress(),
|
||||||
nonce: util.nonce(),
|
nonce: util.nonce(),
|
||||||
@ -77,7 +79,7 @@ describe('Protocol', function() {
|
|||||||
packetTest('verack', new packets.VerackPacket(), function(payload) {
|
packetTest('verack', new packets.VerackPacket(), function(payload) {
|
||||||
});
|
});
|
||||||
|
|
||||||
var hosts = [
|
hosts = [
|
||||||
new NetworkAddress({
|
new NetworkAddress({
|
||||||
services: constants.LOCAL_SERVICES,
|
services: constants.LOCAL_SERVICES,
|
||||||
host: '127.0.0.1',
|
host: '127.0.0.1',
|
||||||
@ -109,7 +111,9 @@ describe('Protocol', function() {
|
|||||||
|
|
||||||
it('should include the raw data of only one transaction in a ' +
|
it('should include the raw data of only one transaction in a ' +
|
||||||
'parsed transaction', function() {
|
'parsed transaction', function() {
|
||||||
var rawTwoTxs = new Buffer(
|
var tx, rawTwoTxs, rawFirstTx;
|
||||||
|
|
||||||
|
rawTwoTxs = new Buffer(
|
||||||
'0100000004b124cca7e9686375380c845d0fd002ed704aef4472f4cc193' +
|
'0100000004b124cca7e9686375380c845d0fd002ed704aef4472f4cc193' +
|
||||||
'fca4aa1b3404da400000000b400493046022100d3c9ba786488323c975f' +
|
'fca4aa1b3404da400000000b400493046022100d3c9ba786488323c975f' +
|
||||||
'e61593df6a8041c5442736f361887abfe5c97175c72b022100ca61688f4' +
|
'e61593df6a8041c5442736f361887abfe5c97175c72b022100ca61688f4' +
|
||||||
@ -160,7 +164,8 @@ describe('Protocol', function() {
|
|||||||
'0001976a9146167aeaeec59836b22447b8af2c5e61fb4f1b7b088ac00a3' +
|
'0001976a9146167aeaeec59836b22447b8af2c5e61fb4f1b7b088ac00a3' +
|
||||||
'dc5c0500000017a9149eb21980dc9d413d8eac27314938b9da920ee53e8' +
|
'dc5c0500000017a9149eb21980dc9d413d8eac27314938b9da920ee53e8' +
|
||||||
'700000000', 'hex');
|
'700000000', 'hex');
|
||||||
var rawFirstTx = new Buffer(
|
|
||||||
|
rawFirstTx = new Buffer(
|
||||||
'0100000004b124cca7e9686375380c845d0fd002ed704aef4472f4cc193' +
|
'0100000004b124cca7e9686375380c845d0fd002ed704aef4472f4cc193' +
|
||||||
'fca4aa1b3404da400000000b400493046022100d3c9ba786488323c975f' +
|
'fca4aa1b3404da400000000b400493046022100d3c9ba786488323c975f' +
|
||||||
'e61593df6a8041c5442736f361887abfe5c97175c72b022100ca61688f4' +
|
'e61593df6a8041c5442736f361887abfe5c97175c72b022100ca61688f4' +
|
||||||
@ -201,19 +206,24 @@ describe('Protocol', function() {
|
|||||||
'c9954c44b0ce168bc78efd5f1e1c7db9d6c21b3016599ffffffff01a029' +
|
'c9954c44b0ce168bc78efd5f1e1c7db9d6c21b3016599ffffffff01a029' +
|
||||||
'de5c0500000017a9141d9ca71efa36d814424ea6ca1437e67287aebe348' +
|
'de5c0500000017a9141d9ca71efa36d814424ea6ca1437e67287aebe348' +
|
||||||
'700000000', 'hex');
|
'700000000', 'hex');
|
||||||
var tx = bcoin.tx.fromRaw(rawTwoTxs);
|
|
||||||
|
tx = TX.fromRaw(rawTwoTxs);
|
||||||
tx._raw = null;
|
tx._raw = null;
|
||||||
|
|
||||||
assert.deepEqual(tx.toRaw(), rawFirstTx);
|
assert.deepEqual(tx.toRaw(), rawFirstTx);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should parse, reserialize, and verify alert packets', function() {
|
it('should parse, reserialize, and verify alert packets', function() {
|
||||||
var br = new bcoin.reader(alertData);
|
var br = new BufferReader(alertData);
|
||||||
|
var alert, data;
|
||||||
|
|
||||||
while (br.left()) {
|
while (br.left()) {
|
||||||
var alert = packets.AlertPacket.fromReader(br);
|
alert = packets.AlertPacket.fromReader(br);
|
||||||
assert(alert.verify(network.alertKey));
|
assert(alert.verify(network.alertKey));
|
||||||
alert._payload = null;
|
alert._payload = null;
|
||||||
alert._hash = null;
|
alert._hash = null;
|
||||||
var data = alert.toRaw();
|
|
||||||
|
data = alert.toRaw();
|
||||||
alert = packets.AlertPacket.fromRaw(data);
|
alert = packets.AlertPacket.fromRaw(data);
|
||||||
assert(alert.verify(network.alertKey));
|
assert(alert.verify(network.alertKey));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -164,57 +164,57 @@ describe('Script', function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should handle CScriptNums correctly', function() {
|
it('should handle CScriptNums correctly', function() {
|
||||||
var s1, s2, stack;
|
var input, output, stack;
|
||||||
|
|
||||||
s1 = new Script([
|
input = new Script([
|
||||||
new Buffer([0xff, 0xff, 0xff, 0x7f]),
|
new Buffer('ffffff7f', 'hex'),
|
||||||
opcodes.OP_NEGATE,
|
opcodes.OP_NEGATE,
|
||||||
opcodes.OP_DUP,
|
opcodes.OP_DUP,
|
||||||
opcodes.OP_ADD
|
opcodes.OP_ADD
|
||||||
]);
|
]);
|
||||||
|
|
||||||
s2 = new Script([
|
output = new Script([
|
||||||
new Buffer([0xfe, 0xff, 0xff, 0xff, 0x80]),
|
new Buffer('feffffff80', 'hex'),
|
||||||
opcodes.OP_EQUAL
|
opcodes.OP_EQUAL
|
||||||
]);
|
]);
|
||||||
|
|
||||||
stack = new Stack();
|
stack = new Stack();
|
||||||
|
|
||||||
assert(s1.execute(stack));
|
assert(input.execute(stack));
|
||||||
assert(success(s2.execute(stack), stack));
|
assert(success(output.execute(stack), stack));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should handle CScriptNums correctly', function() {
|
it('should handle CScriptNums correctly', function() {
|
||||||
var s1, s2, stack;
|
var input, output, stack;
|
||||||
|
|
||||||
s1 = new Script([
|
input = new Script([
|
||||||
opcodes.OP_11,
|
opcodes.OP_11,
|
||||||
opcodes.OP_10,
|
opcodes.OP_10,
|
||||||
opcodes.OP_1,
|
opcodes.OP_1,
|
||||||
opcodes.OP_ADD
|
opcodes.OP_ADD
|
||||||
]);
|
]);
|
||||||
|
|
||||||
s2 = new Script([
|
output = new Script([
|
||||||
opcodes.OP_NUMNOTEQUAL,
|
opcodes.OP_NUMNOTEQUAL,
|
||||||
opcodes.OP_NOT
|
opcodes.OP_NOT
|
||||||
]);
|
]);
|
||||||
|
|
||||||
stack = new Stack();
|
stack = new Stack();
|
||||||
|
|
||||||
assert(s1.execute(stack));
|
assert(input.execute(stack));
|
||||||
assert(success(s2.execute(stack), stack));
|
assert(success(output.execute(stack), stack));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should handle OP_ROLL correctly', function() {
|
it('should handle OP_ROLL correctly', function() {
|
||||||
var s1, s2, stack;
|
var input, output, stack;
|
||||||
|
|
||||||
s1 = new Script([
|
input = new Script([
|
||||||
new Buffer([0x16]),
|
new Buffer([0x16]),
|
||||||
new Buffer([0x15]),
|
new Buffer([0x15]),
|
||||||
new Buffer([0x14])
|
new Buffer([0x14])
|
||||||
]);
|
]);
|
||||||
|
|
||||||
s2 = new Script([
|
output = new Script([
|
||||||
opcodes.OP_0,
|
opcodes.OP_0,
|
||||||
opcodes.OP_ROLL,
|
opcodes.OP_ROLL,
|
||||||
new Buffer([0x14]),
|
new Buffer([0x14]),
|
||||||
@ -226,8 +226,8 @@ describe('Script', function() {
|
|||||||
|
|
||||||
stack = new Stack();
|
stack = new Stack();
|
||||||
|
|
||||||
assert(s1.execute(stack));
|
assert(input.execute(stack));
|
||||||
assert(success(s2.execute(stack), stack));
|
assert(success(output.execute(stack), stack));
|
||||||
});
|
});
|
||||||
|
|
||||||
scripts.forEach(function(data) {
|
scripts.forEach(function(data) {
|
||||||
@ -264,8 +264,8 @@ describe('Script', function() {
|
|||||||
|
|
||||||
flags = flag;
|
flags = flag;
|
||||||
|
|
||||||
[false, true].forEach(function(nocache) {
|
[false, true].forEach(function(noCache) {
|
||||||
var suffix = nocache ? ' without cache' : ' with cache';
|
var suffix = noCache ? ' without cache' : ' with cache';
|
||||||
it('should handle script test' + suffix + ': ' + comments, function() {
|
it('should handle script test' + suffix + ': ' + comments, function() {
|
||||||
var prev, tx, err, res;
|
var prev, tx, err, res;
|
||||||
|
|
||||||
@ -278,7 +278,7 @@ describe('Script', function() {
|
|||||||
hash: constants.NULL_HASH,
|
hash: constants.NULL_HASH,
|
||||||
index: 0xffffffff
|
index: 0xffffffff
|
||||||
},
|
},
|
||||||
script: [Script.array(0), Script.array(0)],
|
script: new Script([opcodes.OP_0, opcodes.OP_0]),
|
||||||
witness: new Witness(),
|
witness: new Witness(),
|
||||||
sequence: 0xffffffff
|
sequence: 0xffffffff
|
||||||
}],
|
}],
|
||||||
@ -309,7 +309,7 @@ describe('Script', function() {
|
|||||||
locktime: 0
|
locktime: 0
|
||||||
});
|
});
|
||||||
|
|
||||||
if (nocache) {
|
if (noCache) {
|
||||||
tx._raw = null;
|
tx._raw = null;
|
||||||
tx._size = -1;
|
tx._size = -1;
|
||||||
tx._witnessSize = -1;
|
tx._witnessSize = -1;
|
||||||
|
|||||||
@ -41,8 +41,8 @@ function parseTX(file) {
|
|||||||
return { tx: tx, view: view };
|
return { tx: tx, view: view };
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearCache(tx, nocache) {
|
function clearCache(tx, noCache) {
|
||||||
if (!nocache) {
|
if (!noCache) {
|
||||||
assert.equal(tx.hash('hex'), tx.clone().hash('hex'));
|
assert.equal(tx.hash('hex'), tx.clone().hash('hex'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -77,24 +77,27 @@ function parseTest(data) {
|
|||||||
flags = flag;
|
flags = flag;
|
||||||
|
|
||||||
coins.forEach(function(data) {
|
coins.forEach(function(data) {
|
||||||
var hash = data[0];
|
var hash = util.revHex(data[0]);
|
||||||
var index = data[1];
|
var index = data[1];
|
||||||
var script = Script.fromString(data[2]);
|
var script = Script.fromString(data[2]);
|
||||||
var value = data[3];
|
var amount = data[3] != null ? data[3] : '0';
|
||||||
|
var value = parseInt(amount, 10);
|
||||||
var coin;
|
var coin;
|
||||||
|
|
||||||
|
if (index === -1)
|
||||||
|
return;
|
||||||
|
|
||||||
coin = new Coin({
|
coin = new Coin({
|
||||||
version: 1,
|
version: 1,
|
||||||
height: -1,
|
height: -1,
|
||||||
coinbase: false,
|
coinbase: false,
|
||||||
hash: util.revHex(hash),
|
hash: hash,
|
||||||
index: index,
|
index: index,
|
||||||
script: script,
|
script: script,
|
||||||
value: value != null ? parseInt(value, 10) : 0
|
value: value
|
||||||
});
|
});
|
||||||
|
|
||||||
if (index !== -1)
|
view.addCoin(coin);
|
||||||
view.addCoin(coin);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
coin = view.getOutput(tx.inputs[0]);
|
coin = view.getOutput(tx.inputs[0]);
|
||||||
@ -148,12 +151,12 @@ describe('TX', function() {
|
|||||||
'0f7c00000000001976a91495ad422bb5911c2c9fe6ce4f82a13c85f03d9b' +
|
'0f7c00000000001976a91495ad422bb5911c2c9fe6ce4f82a13c85f03d9b' +
|
||||||
'2e88ac00000000';
|
'2e88ac00000000';
|
||||||
|
|
||||||
[false, true].forEach(function(nocache) {
|
[false, true].forEach(function(noCache) {
|
||||||
var suffix = nocache ? ' without cache' : ' with cache';
|
var suffix = noCache ? ' without cache' : ' with cache';
|
||||||
|
|
||||||
it('should decode/encode with parser/framer' + suffix, function() {
|
it('should decode/encode with parser/framer' + suffix, function() {
|
||||||
var tx = TX.fromRaw(raw, 'hex');
|
var tx = TX.fromRaw(raw, 'hex');
|
||||||
clearCache(tx, nocache);
|
clearCache(tx, noCache);
|
||||||
assert.equal(tx.toRaw().toString('hex'), raw);
|
assert.equal(tx.toRaw().toString('hex'), raw);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -163,43 +166,44 @@ describe('TX', function() {
|
|||||||
var view = new CoinView();
|
var view = new CoinView();
|
||||||
view.addTX(p, -1);
|
view.addTX(p, -1);
|
||||||
|
|
||||||
clearCache(tx, nocache);
|
clearCache(tx, noCache);
|
||||||
clearCache(p, nocache);
|
clearCache(p, noCache);
|
||||||
|
|
||||||
assert(tx.verify(view));
|
assert(tx.verify(view));
|
||||||
|
util.log(tx.format(view));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should verify non-minimal output' + suffix, function() {
|
it('should verify non-minimal output' + suffix, function() {
|
||||||
clearCache(tx1.tx, nocache);
|
clearCache(tx1.tx, noCache);
|
||||||
assert(tx1.tx.verify(tx1.view, constants.flags.VERIFY_P2SH));
|
assert(tx1.tx.verify(tx1.view, constants.flags.VERIFY_P2SH));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should verify tx.version == 0' + suffix, function() {
|
it('should verify tx.version == 0' + suffix, function() {
|
||||||
clearCache(tx2.tx, nocache);
|
clearCache(tx2.tx, noCache);
|
||||||
assert(tx2.tx.verify(tx2.view, constants.flags.VERIFY_P2SH));
|
assert(tx2.tx.verify(tx2.view, constants.flags.VERIFY_P2SH));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should verify sighash_single bug w/ findanddelete' + suffix, function() {
|
it('should verify sighash_single bug w/ findanddelete' + suffix, function() {
|
||||||
clearCache(tx3.tx, nocache);
|
clearCache(tx3.tx, noCache);
|
||||||
assert(tx3.tx.verify(tx3.view, constants.flags.VERIFY_P2SH));
|
assert(tx3.tx.verify(tx3.view, constants.flags.VERIFY_P2SH));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should verify high S value with only DERSIG enabled' + suffix, function() {
|
it('should verify high S value with only DERSIG enabled' + suffix, function() {
|
||||||
var coin = tx4.view.getOutput(tx4.tx.inputs[0]);
|
var coin = tx4.view.getOutput(tx4.tx.inputs[0]);
|
||||||
var flags = constants.flags.VERIFY_P2SH | constants.flags.VERIFY_DERSIG;
|
var flags = constants.flags.VERIFY_P2SH | constants.flags.VERIFY_DERSIG;
|
||||||
clearCache(tx4.tx, nocache);
|
clearCache(tx4.tx, noCache);
|
||||||
assert(tx4.tx.verifyInput(0, coin, flags));
|
assert(tx4.tx.verifyInput(0, coin, flags));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should verify the coolest tx ever sent' + suffix, function() {
|
it('should verify the coolest tx ever sent' + suffix, function() {
|
||||||
clearCache(coolest.tx, nocache);
|
clearCache(coolest.tx, noCache);
|
||||||
assert(coolest.tx.verify(coolest.view, constants.flags.VERIFY_NONE));
|
assert(coolest.tx.verify(coolest.view, constants.flags.VERIFY_NONE));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should parse witness tx properly' + suffix, function() {
|
it('should parse witness tx properly' + suffix, function() {
|
||||||
var raw1, raw2, wtx2;
|
var raw1, raw2, wtx2;
|
||||||
|
|
||||||
clearCache(wtx.tx, nocache);
|
clearCache(wtx.tx, noCache);
|
||||||
|
|
||||||
assert.equal(wtx.tx.inputs.length, 5);
|
assert.equal(wtx.tx.inputs.length, 5);
|
||||||
assert.equal(wtx.tx.outputs.length, 1980);
|
assert.equal(wtx.tx.outputs.length, 1980);
|
||||||
@ -218,7 +222,7 @@ describe('TX', function() {
|
|||||||
assert.deepEqual(raw1, raw2);
|
assert.deepEqual(raw1, raw2);
|
||||||
|
|
||||||
wtx2 = TX.fromRaw(raw2);
|
wtx2 = TX.fromRaw(raw2);
|
||||||
clearCache(wtx2, nocache);
|
clearCache(wtx2, noCache);
|
||||||
|
|
||||||
assert.equal(wtx.tx.hash('hex'), wtx2.hash('hex'));
|
assert.equal(wtx.tx.hash('hex'), wtx2.hash('hex'));
|
||||||
assert.equal(wtx.tx.witnessHash('hex'), wtx2.witnessHash('hex'));
|
assert.equal(wtx.tx.witnessHash('hex'), wtx2.witnessHash('hex'));
|
||||||
@ -257,19 +261,19 @@ describe('TX', function() {
|
|||||||
if (valid) {
|
if (valid) {
|
||||||
if (comments.indexOf('Coinbase') === 0) {
|
if (comments.indexOf('Coinbase') === 0) {
|
||||||
it('should handle valid coinbase' + suffix + ': ' + comments, function() {
|
it('should handle valid coinbase' + suffix + ': ' + comments, function() {
|
||||||
clearCache(tx, nocache);
|
clearCache(tx, noCache);
|
||||||
assert.ok(tx.isSane());
|
assert.ok(tx.isSane());
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
it('should handle valid tx test' + suffix + ': ' + comments, function() {
|
it('should handle valid tx test' + suffix + ': ' + comments, function() {
|
||||||
clearCache(tx, nocache);
|
clearCache(tx, noCache);
|
||||||
assert.ok(tx.verify(view, flags));
|
assert.ok(tx.verify(view, flags));
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
if (comments === 'Duplicate inputs') {
|
if (comments === 'Duplicate inputs') {
|
||||||
it('should handle duplicate input test' + suffix + ': ' + comments, function() {
|
it('should handle duplicate input test' + suffix + ': ' + comments, function() {
|
||||||
clearCache(tx, nocache);
|
clearCache(tx, noCache);
|
||||||
assert.ok(tx.verify(view, flags));
|
assert.ok(tx.verify(view, flags));
|
||||||
assert.ok(!tx.isSane());
|
assert.ok(!tx.isSane());
|
||||||
});
|
});
|
||||||
@ -277,7 +281,7 @@ describe('TX', function() {
|
|||||||
}
|
}
|
||||||
if (comments === 'Negative output') {
|
if (comments === 'Negative output') {
|
||||||
it('should handle invalid tx (negative)' + suffix + ': ' + comments, function() {
|
it('should handle invalid tx (negative)' + suffix + ': ' + comments, function() {
|
||||||
clearCache(tx, nocache);
|
clearCache(tx, noCache);
|
||||||
assert.ok(tx.verify(view, flags));
|
assert.ok(tx.verify(view, flags));
|
||||||
assert.ok(!tx.isSane());
|
assert.ok(!tx.isSane());
|
||||||
});
|
});
|
||||||
@ -285,13 +289,13 @@ describe('TX', function() {
|
|||||||
}
|
}
|
||||||
if (comments.indexOf('Coinbase') === 0) {
|
if (comments.indexOf('Coinbase') === 0) {
|
||||||
it('should handle invalid coinbase' + suffix + ': ' + comments, function() {
|
it('should handle invalid coinbase' + suffix + ': ' + comments, function() {
|
||||||
clearCache(tx, nocache);
|
clearCache(tx, noCache);
|
||||||
assert.ok(!tx.isSane());
|
assert.ok(!tx.isSane());
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
it('should handle invalid tx test' + suffix + ': ' + comments, function() {
|
it('should handle invalid tx test' + suffix + ': ' + comments, function() {
|
||||||
clearCache(tx, nocache);
|
clearCache(tx, noCache);
|
||||||
assert.ok(!tx.verify(view, flags));
|
assert.ok(!tx.verify(view, flags));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -299,13 +303,14 @@ describe('TX', function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
sighash.forEach(function(data) {
|
sighash.forEach(function(data) {
|
||||||
var tx, script, index, type, expected, hexType;
|
var name, tx, script, index;
|
||||||
|
var type, expected, hexType;
|
||||||
|
|
||||||
if (data.length === 1)
|
if (data.length === 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
tx = TX.fromRaw(data[0], 'hex');
|
tx = TX.fromRaw(data[0], 'hex');
|
||||||
clearCache(tx, nocache);
|
clearCache(tx, noCache);
|
||||||
|
|
||||||
script = Script.fromRaw(data[1], 'hex');
|
script = Script.fromRaw(data[1], 'hex');
|
||||||
|
|
||||||
@ -322,10 +327,13 @@ describe('TX', function() {
|
|||||||
if (hexType.length % 2 !== 0)
|
if (hexType.length % 2 !== 0)
|
||||||
hexType = '0' + hexType;
|
hexType = '0' + hexType;
|
||||||
|
|
||||||
it('should get signature hash of ' + data[4] + ' (' + hexType + ')' + suffix, function() {
|
name = 'should get signature hash of '
|
||||||
|
+ data[4] + ' (' + hexType + ')' + suffix;
|
||||||
|
|
||||||
|
it(name, function() {
|
||||||
var subscript = script.getSubscript(0).removeSeparators();
|
var subscript = script.getSubscript(0).removeSeparators();
|
||||||
var hash = tx.signatureHash(index, subscript, 0, type, 0).toString('hex');
|
var hash = tx.signatureHash(index, subscript, 0, type, 0);
|
||||||
assert.equal(hash, expected);
|
assert.equal(hash.toString('hex'), expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -12,7 +12,9 @@ var schnorr = require('../lib/crypto/schnorr');
|
|||||||
var Amount = require('../lib/btc/amount');
|
var Amount = require('../lib/btc/amount');
|
||||||
|
|
||||||
describe('Utils', function() {
|
describe('Utils', function() {
|
||||||
var vectors = [
|
var vectors, signed, unsigned;
|
||||||
|
|
||||||
|
vectors = [
|
||||||
['', ''],
|
['', ''],
|
||||||
['61', '2g'],
|
['61', '2g'],
|
||||||
['626262', 'a3gV'],
|
['626262', 'a3gV'],
|
||||||
@ -30,22 +32,28 @@ describe('Utils', function() {
|
|||||||
it('should encode/decode base58', function() {
|
it('should encode/decode base58', function() {
|
||||||
var arr = new Buffer([ 0, 0, 0, 0xde, 0xad, 0xbe, 0xef ]);
|
var arr = new Buffer([ 0, 0, 0, 0xde, 0xad, 0xbe, 0xef ]);
|
||||||
var b = base58.encode(arr);
|
var b = base58.encode(arr);
|
||||||
|
var i, r, b;
|
||||||
|
|
||||||
assert.equal(b, '1116h8cQN');
|
assert.equal(b, '1116h8cQN');
|
||||||
assert.deepEqual(base58.decode(b), arr);
|
assert.deepEqual(base58.decode(b), arr);
|
||||||
for (var i = 0; i < vectors.length; i++) {
|
|
||||||
var r = new Buffer(vectors[i][0], 'hex');
|
for (i = 0; i < vectors.length; i++) {
|
||||||
var b = vectors[i][1];
|
r = new Buffer(vectors[i][0], 'hex');
|
||||||
|
b = vectors[i][1];
|
||||||
assert.equal(base58.encode(r), b);
|
assert.equal(base58.encode(r), b);
|
||||||
assert.deepEqual(base58.decode(b), r);
|
assert.deepEqual(base58.decode(b), r);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should verify proof-of-work', function() {
|
it('should verify proof-of-work', function() {
|
||||||
var hash = new Buffer(
|
var bits = 0x1900896c;
|
||||||
|
var hash;
|
||||||
|
|
||||||
|
hash = new Buffer(
|
||||||
'672b3f1bb11a994267ea4171069ba0aa4448a840f38e8f340000000000000000',
|
'672b3f1bb11a994267ea4171069ba0aa4448a840f38e8f340000000000000000',
|
||||||
'hex'
|
'hex'
|
||||||
);
|
);
|
||||||
var bits = 0x1900896c;
|
|
||||||
assert(btcutils.verifyPOW(hash, bits));
|
assert(btcutils.verifyPOW(hash, bits));
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -90,6 +98,8 @@ describe('Utils', function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should write/read new varints', function() {
|
it('should write/read new varints', function() {
|
||||||
|
var n, b;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 0: [0x00] 256: [0x81 0x00]
|
* 0: [0x00] 256: [0x81 0x00]
|
||||||
* 1: [0x01] 16383: [0xFE 0x7F]
|
* 1: [0x01] 16383: [0xFE 0x7F]
|
||||||
@ -99,71 +109,71 @@ describe('Utils', function() {
|
|||||||
* 2^32: [0x8E 0xFE 0xFE 0xFF 0x00]
|
* 2^32: [0x8E 0xFE 0xFE 0xFF 0x00]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var n = 0;
|
n = 0;
|
||||||
var b = new Buffer(1);
|
b = new Buffer(1);
|
||||||
b.fill(0x00);
|
b.fill(0x00);
|
||||||
encoding.writeVarint2(b, 0, 0);
|
encoding.writeVarint2(b, 0, 0);
|
||||||
assert.equal(encoding.readVarint2(b, 0).value, 0);
|
assert.equal(encoding.readVarint2(b, 0).value, 0);
|
||||||
assert.deepEqual(b, [0]);
|
assert.deepEqual(b, [0]);
|
||||||
|
|
||||||
var b = new Buffer(1);
|
b = new Buffer(1);
|
||||||
b.fill(0x00);
|
b.fill(0x00);
|
||||||
encoding.writeVarint2(b, 1, 0);
|
encoding.writeVarint2(b, 1, 0);
|
||||||
assert.equal(encoding.readVarint2(b, 0).value, 1);
|
assert.equal(encoding.readVarint2(b, 0).value, 1);
|
||||||
assert.deepEqual(b, [1]);
|
assert.deepEqual(b, [1]);
|
||||||
|
|
||||||
var b = new Buffer(1);
|
b = new Buffer(1);
|
||||||
b.fill(0x00);
|
b.fill(0x00);
|
||||||
encoding.writeVarint2(b, 127, 0);
|
encoding.writeVarint2(b, 127, 0);
|
||||||
assert.equal(encoding.readVarint2(b, 0).value, 127);
|
assert.equal(encoding.readVarint2(b, 0).value, 127);
|
||||||
assert.deepEqual(b, [0x7f]);
|
assert.deepEqual(b, [0x7f]);
|
||||||
|
|
||||||
var b = new Buffer(2);
|
b = new Buffer(2);
|
||||||
b.fill(0x00);
|
b.fill(0x00);
|
||||||
encoding.writeVarint2(b, 128, 0);
|
encoding.writeVarint2(b, 128, 0);
|
||||||
assert.equal(encoding.readVarint2(b, 0).value, 128);
|
assert.equal(encoding.readVarint2(b, 0).value, 128);
|
||||||
assert.deepEqual(b, [0x80, 0x00]);
|
assert.deepEqual(b, [0x80, 0x00]);
|
||||||
|
|
||||||
var b = new Buffer(2);
|
b = new Buffer(2);
|
||||||
b.fill(0x00);
|
b.fill(0x00);
|
||||||
encoding.writeVarint2(b, 255, 0);
|
encoding.writeVarint2(b, 255, 0);
|
||||||
assert.equal(encoding.readVarint2(b, 0).value, 255);
|
assert.equal(encoding.readVarint2(b, 0).value, 255);
|
||||||
assert.deepEqual(b, [0x80, 0x7f]);
|
assert.deepEqual(b, [0x80, 0x7f]);
|
||||||
|
|
||||||
var b = new Buffer(2);
|
b = new Buffer(2);
|
||||||
b.fill(0x00);
|
b.fill(0x00);
|
||||||
encoding.writeVarint2(b, 16383, 0);
|
encoding.writeVarint2(b, 16383, 0);
|
||||||
assert.equal(encoding.readVarint2(b, 0).value, 16383);
|
assert.equal(encoding.readVarint2(b, 0).value, 16383);
|
||||||
assert.deepEqual(b, [0xfe, 0x7f]);
|
assert.deepEqual(b, [0xfe, 0x7f]);
|
||||||
|
|
||||||
var b = new Buffer(2);
|
b = new Buffer(2);
|
||||||
b.fill(0x00);
|
b.fill(0x00);
|
||||||
encoding.writeVarint2(b, 16384, 0);
|
encoding.writeVarint2(b, 16384, 0);
|
||||||
assert.equal(encoding.readVarint2(b, 0).value, 16384);
|
assert.equal(encoding.readVarint2(b, 0).value, 16384);
|
||||||
assert.deepEqual(b, [0xff, 0x00]);
|
assert.deepEqual(b, [0xff, 0x00]);
|
||||||
|
|
||||||
var b = new Buffer(3);
|
b = new Buffer(3);
|
||||||
b.fill(0x00);
|
b.fill(0x00);
|
||||||
encoding.writeVarint2(b, 16511, 0);
|
encoding.writeVarint2(b, 16511, 0);
|
||||||
assert.equal(encoding.readVarint2(b, 0).value, 16511);
|
assert.equal(encoding.readVarint2(b, 0).value, 16511);
|
||||||
// assert.deepEqual(b, [0x80, 0xff, 0x7f]);
|
// assert.deepEqual(b, [0x80, 0xff, 0x7f]);
|
||||||
assert.deepEqual(b, [0xff, 0x7f, 0x00]);
|
assert.deepEqual(b, [0xff, 0x7f, 0x00]);
|
||||||
|
|
||||||
var b = new Buffer(3);
|
b = new Buffer(3);
|
||||||
b.fill(0x00);
|
b.fill(0x00);
|
||||||
encoding.writeVarint2(b, 65535, 0);
|
encoding.writeVarint2(b, 65535, 0);
|
||||||
assert.equal(encoding.readVarint2(b, 0).value, 65535);
|
assert.equal(encoding.readVarint2(b, 0).value, 65535);
|
||||||
// assert.deepEqual(b, [0x82, 0xfd, 0x7f]);
|
// assert.deepEqual(b, [0x82, 0xfd, 0x7f]);
|
||||||
assert.deepEqual(b, [0x82, 0xfe, 0x7f]);
|
assert.deepEqual(b, [0x82, 0xfe, 0x7f]);
|
||||||
|
|
||||||
var b = new Buffer(5);
|
b = new Buffer(5);
|
||||||
b.fill(0x00);
|
b.fill(0x00);
|
||||||
encoding.writeVarint2(b, Math.pow(2, 32), 0);
|
encoding.writeVarint2(b, Math.pow(2, 32), 0);
|
||||||
assert.equal(encoding.readVarint2(b, 0).value, Math.pow(2, 32));
|
assert.equal(encoding.readVarint2(b, 0).value, Math.pow(2, 32));
|
||||||
assert.deepEqual(b, [0x8e, 0xfe, 0xfe, 0xff, 0x00]);
|
assert.deepEqual(b, [0x8e, 0xfe, 0xfe, 0xff, 0x00]);
|
||||||
});
|
});
|
||||||
|
|
||||||
var unsigned = [
|
unsigned = [
|
||||||
new BN('ffeeffee'),
|
new BN('ffeeffee'),
|
||||||
new BN('001fffeeffeeffee'),
|
new BN('001fffeeffeeffee'),
|
||||||
new BN('eeffeeff'),
|
new BN('eeffeeff'),
|
||||||
@ -172,7 +182,7 @@ describe('Utils', function() {
|
|||||||
new BN(1)
|
new BN(1)
|
||||||
];
|
];
|
||||||
|
|
||||||
var signed = [
|
signed = [
|
||||||
new BN('ffeeffee'),
|
new BN('ffeeffee'),
|
||||||
new BN('001fffeeffeeffee'),
|
new BN('001fffeeffeeffee'),
|
||||||
new BN('eeffeeff'),
|
new BN('eeffeeff'),
|
||||||
@ -191,12 +201,16 @@ describe('Utils', function() {
|
|||||||
var buf1 = new Buffer(8);
|
var buf1 = new Buffer(8);
|
||||||
var buf2 = new Buffer(8);
|
var buf2 = new Buffer(8);
|
||||||
var msg = 'should write+read a ' + num.bitLength() + ' bit unsigned int';
|
var msg = 'should write+read a ' + num.bitLength() + ' bit unsigned int';
|
||||||
|
|
||||||
it(msg, function() {
|
it(msg, function() {
|
||||||
|
var n1, n2;
|
||||||
|
|
||||||
encoding.writeU64BN(buf1, num, 0);
|
encoding.writeU64BN(buf1, num, 0);
|
||||||
encoding.writeU64(buf2, num.toNumber(), 0);
|
encoding.writeU64(buf2, num.toNumber(), 0);
|
||||||
assert.deepEqual(buf1, buf2);
|
assert.deepEqual(buf1, buf2);
|
||||||
var n1 = encoding.readU64BN(buf1, 0);
|
|
||||||
var n2 = encoding.readU64(buf2, 0);
|
n1 = encoding.readU64BN(buf1, 0);
|
||||||
|
n2 = encoding.readU64(buf2, 0);
|
||||||
assert.equal(n1.toNumber(), n2);
|
assert.equal(n1.toNumber(), n2);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -206,27 +220,36 @@ describe('Utils', function() {
|
|||||||
var buf2 = new Buffer(8);
|
var buf2 = new Buffer(8);
|
||||||
var msg = 'should write+read a ' + num.bitLength()
|
var msg = 'should write+read a ' + num.bitLength()
|
||||||
+ ' bit ' + (num.isNeg() ? 'negative' : 'positive') + ' int';
|
+ ' bit ' + (num.isNeg() ? 'negative' : 'positive') + ' int';
|
||||||
|
|
||||||
it(msg, function() {
|
it(msg, function() {
|
||||||
|
var n1, n2;
|
||||||
|
|
||||||
encoding.write64BN(buf1, num, 0);
|
encoding.write64BN(buf1, num, 0);
|
||||||
encoding.write64(buf2, num.toNumber(), 0);
|
encoding.write64(buf2, num.toNumber(), 0);
|
||||||
assert.deepEqual(buf1, buf2);
|
assert.deepEqual(buf1, buf2);
|
||||||
var n1 = encoding.read64BN(buf1, 0);
|
|
||||||
var n2 = encoding.read64(buf2, 0);
|
n1 = encoding.read64BN(buf1, 0);
|
||||||
|
n2 = encoding.read64(buf2, 0);
|
||||||
assert.equal(n1.toNumber(), n2);
|
assert.equal(n1.toNumber(), n2);
|
||||||
});
|
});
|
||||||
var msg = 'should write+read a ' + num.bitLength()
|
|
||||||
|
msg = 'should write+read a ' + num.bitLength()
|
||||||
+ ' bit ' + (num.isNeg() ? 'negative' : 'positive') + ' int as unsigned';
|
+ ' bit ' + (num.isNeg() ? 'negative' : 'positive') + ' int as unsigned';
|
||||||
|
|
||||||
it(msg, function() {
|
it(msg, function() {
|
||||||
|
var n1, n2;
|
||||||
|
|
||||||
encoding.writeU64BN(buf1, num, 0);
|
encoding.writeU64BN(buf1, num, 0);
|
||||||
encoding.writeU64(buf2, num.toNumber(), 0);
|
encoding.writeU64(buf2, num.toNumber(), 0);
|
||||||
assert.deepEqual(buf1, buf2);
|
assert.deepEqual(buf1, buf2);
|
||||||
var n1 = encoding.readU64BN(buf1, 0);
|
|
||||||
|
n1 = encoding.readU64BN(buf1, 0);
|
||||||
if (num.isNeg()) {
|
if (num.isNeg()) {
|
||||||
assert.throws(function() {
|
assert.throws(function() {
|
||||||
encoding.readU64(buf2, 0);
|
encoding.readU64(buf2, 0);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
var n2 = encoding.readU64(buf2, 0);
|
n2 = encoding.readU64(buf2, 0);
|
||||||
assert.equal(n1.toNumber(), n2);
|
assert.equal(n1.toNumber(), n2);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -239,46 +262,48 @@ describe('Utils', function() {
|
|||||||
var salt = '000102030405060708090a0b0c';
|
var salt = '000102030405060708090a0b0c';
|
||||||
var info = 'f0f1f2f3f4f5f6f7f8f9';
|
var info = 'f0f1f2f3f4f5f6f7f8f9';
|
||||||
var len = 42;
|
var len = 42;
|
||||||
|
var prkE, okmE, prk, okm, hash;
|
||||||
|
|
||||||
var prkE = '077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5';
|
prkE = '077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5';
|
||||||
var okmE = '3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865';
|
okmE = '3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1'
|
||||||
|
+ 'a5a4c5db02d56ecc4c5bf34007208d5b887185865';
|
||||||
|
|
||||||
ikm = new Buffer(ikm, 'hex');
|
ikm = new Buffer(ikm, 'hex');
|
||||||
salt = new Buffer(salt, 'hex');
|
salt = new Buffer(salt, 'hex');
|
||||||
info = new Buffer(info, 'hex');
|
info = new Buffer(info, 'hex');
|
||||||
|
|
||||||
var prk = crypto.hkdfExtract(ikm, salt, 'sha256');
|
prk = crypto.hkdfExtract(ikm, salt, 'sha256');
|
||||||
var okm = crypto.hkdfExpand(prk, info, len, 'sha256');
|
okm = crypto.hkdfExpand(prk, info, len, 'sha256');
|
||||||
|
|
||||||
assert.equal(prk.toString('hex'), prkE);
|
assert.equal(prk.toString('hex'), prkE);
|
||||||
assert.equal(okm.toString('hex'), okmE);
|
assert.equal(okm.toString('hex'), okmE);
|
||||||
|
|
||||||
var hash = 'sha256';
|
hash = 'sha256';
|
||||||
|
|
||||||
var ikm = '000102030405060708090a0b0c0d0e0f'
|
ikm = '000102030405060708090a0b0c0d0e0f'
|
||||||
+ '101112131415161718191a1b1c1d1e1f'
|
+ '101112131415161718191a1b1c1d1e1f'
|
||||||
+ '202122232425262728292a2b2c2d2e2f'
|
+ '202122232425262728292a2b2c2d2e2f'
|
||||||
+ '303132333435363738393a3b3c3d3e3f'
|
+ '303132333435363738393a3b3c3d3e3f'
|
||||||
+ '404142434445464748494a4b4c4d4e4f';
|
+ '404142434445464748494a4b4c4d4e4f';
|
||||||
|
|
||||||
var salt = '606162636465666768696a6b6c6d6e6f'
|
salt = '606162636465666768696a6b6c6d6e6f'
|
||||||
+ '707172737475767778797a7b7c7d7e7f'
|
+ '707172737475767778797a7b7c7d7e7f'
|
||||||
+ '808182838485868788898a8b8c8d8e8f'
|
+ '808182838485868788898a8b8c8d8e8f'
|
||||||
+ '909192939495969798999a9b9c9d9e9f'
|
+ '909192939495969798999a9b9c9d9e9f'
|
||||||
+ 'a0a1a2a3a4a5a6a7a8a9aaabacadaeaf';
|
+ 'a0a1a2a3a4a5a6a7a8a9aaabacadaeaf';
|
||||||
|
|
||||||
var info = 'b0b1b2b3b4b5b6b7b8b9babbbcbdbebf'
|
info = 'b0b1b2b3b4b5b6b7b8b9babbbcbdbebf'
|
||||||
+ 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf'
|
+ 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf'
|
||||||
+ 'd0d1d2d3d4d5d6d7d8d9dadbdcdddedf'
|
+ 'd0d1d2d3d4d5d6d7d8d9dadbdcdddedf'
|
||||||
+ 'e0e1e2e3e4e5e6e7e8e9eaebecedeeef'
|
+ 'e0e1e2e3e4e5e6e7e8e9eaebecedeeef'
|
||||||
+ 'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff';
|
+ 'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff';
|
||||||
|
|
||||||
var len = 82;
|
len = 82;
|
||||||
|
|
||||||
var prkE = '06a6b88c5853361a06104c9ceb35b45c'
|
prkE = '06a6b88c5853361a06104c9ceb35b45c'
|
||||||
+ 'ef760014904671014a193f40c15fc244';
|
+ 'ef760014904671014a193f40c15fc244';
|
||||||
|
|
||||||
var okmE = 'b11e398dc80327a1c8e7f78c596a4934'
|
okmE = 'b11e398dc80327a1c8e7f78c596a4934'
|
||||||
+ '4f012eda2d4efad8a050cc4c19afa97c'
|
+ '4f012eda2d4efad8a050cc4c19afa97c'
|
||||||
+ '59045a99cac7827271cb41c65e590e09'
|
+ '59045a99cac7827271cb41c65e590e09'
|
||||||
+ 'da3275600c2f09b8367793a9aca3db71'
|
+ 'da3275600c2f09b8367793a9aca3db71'
|
||||||
@ -289,8 +314,8 @@ describe('Utils', function() {
|
|||||||
salt = new Buffer(salt, 'hex');
|
salt = new Buffer(salt, 'hex');
|
||||||
info = new Buffer(info, 'hex');
|
info = new Buffer(info, 'hex');
|
||||||
|
|
||||||
var prk = crypto.hkdfExtract(ikm, salt, 'sha256');
|
prk = crypto.hkdfExtract(ikm, salt, 'sha256');
|
||||||
var okm = crypto.hkdfExpand(prk, info, len, 'sha256');
|
okm = crypto.hkdfExpand(prk, info, len, 'sha256');
|
||||||
|
|
||||||
assert.equal(prk.toString('hex'), prkE);
|
assert.equal(prk.toString('hex'), prkE);
|
||||||
assert.equal(okm.toString('hex'), okmE);
|
assert.equal(okm.toString('hex'), okmE);
|
||||||
|
|||||||
@ -1,15 +1,20 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var BN = require('bn.js');
|
var assert = require('assert');
|
||||||
var bcoin = require('../').set('main');
|
var constants = require('../lib/protocol/constants');
|
||||||
var constants = bcoin.constants;
|
var util = require('../lib/utils/util');
|
||||||
var network = bcoin.networks;
|
|
||||||
var util = bcoin.util;
|
|
||||||
var encoding = require('../lib/utils/encoding');
|
var encoding = require('../lib/utils/encoding');
|
||||||
var crypto = require('../lib/crypto/crypto');
|
var crypto = require('../lib/crypto/crypto');
|
||||||
var assert = require('assert');
|
|
||||||
var scriptTypes = constants.scriptTypes;
|
|
||||||
var co = require('../lib/utils/co');
|
var co = require('../lib/utils/co');
|
||||||
|
var WalletDB = require('../lib/wallet/walletdb');
|
||||||
|
var Address = require('../lib/primitives/address');
|
||||||
|
var MTX = require('../lib/primitives/mtx');
|
||||||
|
var Coin = require('../lib/primitives/coin');
|
||||||
|
var KeyRing = require('../lib/primitives/keyring');
|
||||||
|
var Address = require('../lib/primitives/address');
|
||||||
|
var Script = require('../lib/script/script');
|
||||||
|
var HD = require('../lib/hd');
|
||||||
|
var scriptTypes = constants.scriptTypes;
|
||||||
var cob = co.cob;
|
var cob = co.cob;
|
||||||
|
|
||||||
var KEY1 = 'xprv9s21ZrQH143K3Aj6xQBymM31Zb4BVc7wxqfUhMZrzewdDVCt'
|
var KEY1 = 'xprv9s21ZrQH143K3Aj6xQBymM31Zb4BVc7wxqfUhMZrzewdDVCt'
|
||||||
@ -54,9 +59,11 @@ function dummy(hash) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe('Wallet', function() {
|
describe('Wallet', function() {
|
||||||
var walletdb, wallet, ewallet, ekey, doubleSpendWallet, doubleSpend;
|
var walletdb, wallet, ewallet, ekey;
|
||||||
|
var doubleSpendWallet, doubleSpend;
|
||||||
|
var p2pkh, multisig;
|
||||||
|
|
||||||
walletdb = new bcoin.walletdb({
|
walletdb = new WalletDB({
|
||||||
name: 'wallet-test',
|
name: 'wallet-test',
|
||||||
db: 'memory',
|
db: 'memory',
|
||||||
resolution: true,
|
resolution: true,
|
||||||
@ -74,15 +81,15 @@ describe('Wallet', function() {
|
|||||||
var w = yield walletdb.create();
|
var w = yield walletdb.create();
|
||||||
var addr = w.getAddress('base58');
|
var addr = w.getAddress('base58');
|
||||||
assert(addr);
|
assert(addr);
|
||||||
assert(bcoin.address.validate(addr));
|
assert(Address.validate(addr));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it('should validate existing address', function() {
|
it('should validate existing address', function() {
|
||||||
assert(bcoin.address.validate('1KQ1wMNwXHUYj1nV2xzsRcKUH8gVFpTFUc'));
|
assert(Address.validate('1KQ1wMNwXHUYj1nV2xzsRcKUH8gVFpTFUc'));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should fail to validate invalid address', function() {
|
it('should fail to validate invalid address', function() {
|
||||||
assert(!bcoin.address.validate('1KQ1wMNwXHUYj1nv2xzsRcKUH8gVFpTFUc'));
|
assert(!Address.validate('1KQ1wMNwXHUYj1nv2xzsRcKUH8gVFpTFUc'));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create and get wallet', cob(function* () {
|
it('should create and get wallet', cob(function* () {
|
||||||
@ -96,26 +103,28 @@ describe('Wallet', function() {
|
|||||||
assert(w1 !== w2);
|
assert(w1 !== w2);
|
||||||
assert(w1.master !== w2.master);
|
assert(w1.master !== w2.master);
|
||||||
assert.equal(w1.master.key.toBase58(), w2.master.key.toBase58());
|
assert.equal(w1.master.key.toBase58(), w2.master.key.toBase58());
|
||||||
assert.equal(w1.account.accountKey.toBase58(), w2.account.accountKey.toBase58());
|
assert.equal(
|
||||||
|
w1.account.accountKey.toBase58(),
|
||||||
|
w2.account.accountKey.toBase58());
|
||||||
}));
|
}));
|
||||||
|
|
||||||
var p2pkh = co(function* p2pkh(witness, bullshitNesting) {
|
p2pkh = co(function* p2pkh(witness, bullshitNesting) {
|
||||||
var flags = bcoin.constants.flags.STANDARD_VERIFY_FLAGS;
|
var flags = constants.flags.STANDARD_VERIFY_FLAGS;
|
||||||
var w, addr, src, tx;
|
var w, addr, src, tx;
|
||||||
|
|
||||||
if (witness)
|
if (witness)
|
||||||
flags |= bcoin.constants.flags.VERIFY_WITNESS;
|
flags |= constants.flags.VERIFY_WITNESS;
|
||||||
|
|
||||||
w = yield walletdb.create({ witness: witness });
|
w = yield walletdb.create({ witness: witness });
|
||||||
|
|
||||||
addr = bcoin.address.fromBase58(w.getAddress('base58'));
|
addr = Address.fromBase58(w.getAddress('base58'));
|
||||||
|
|
||||||
if (witness)
|
if (witness)
|
||||||
assert.equal(addr.type, scriptTypes.WITNESSPUBKEYHASH);
|
assert.equal(addr.type, scriptTypes.WITNESSPUBKEYHASH);
|
||||||
else
|
else
|
||||||
assert.equal(addr.type, scriptTypes.PUBKEYHASH);
|
assert.equal(addr.type, scriptTypes.PUBKEYHASH);
|
||||||
|
|
||||||
src = bcoin.mtx({
|
src = MTX({
|
||||||
outputs: [{
|
outputs: [{
|
||||||
value: 5460 * 2,
|
value: 5460 * 2,
|
||||||
address: bullshitNesting
|
address: bullshitNesting
|
||||||
@ -123,13 +132,13 @@ describe('Wallet', function() {
|
|||||||
: w.getAddress()
|
: w.getAddress()
|
||||||
}, {
|
}, {
|
||||||
value: 5460 * 2,
|
value: 5460 * 2,
|
||||||
address: new bcoin.address()
|
address: new Address()
|
||||||
}]
|
}]
|
||||||
});
|
});
|
||||||
|
|
||||||
src.addInput(dummy());
|
src.addInput(dummy());
|
||||||
|
|
||||||
tx = bcoin.mtx()
|
tx = MTX()
|
||||||
.addInput(src, 0)
|
.addInput(src, 0)
|
||||||
.addOutput(w.getAddress(), 5460);
|
.addOutput(w.getAddress(), 5460);
|
||||||
|
|
||||||
@ -159,7 +168,7 @@ describe('Wallet', function() {
|
|||||||
n: 2
|
n: 2
|
||||||
});
|
});
|
||||||
|
|
||||||
k = bcoin.hd.fromMnemonic().deriveAccount44(0).toPublic();
|
k = HD.fromMnemonic().deriveAccount44(0).toPublic();
|
||||||
|
|
||||||
yield w.addSharedKey(k);
|
yield w.addSharedKey(k);
|
||||||
|
|
||||||
@ -169,19 +178,19 @@ describe('Wallet', function() {
|
|||||||
];
|
];
|
||||||
|
|
||||||
// Input transaction (bare 1-of-2 multisig)
|
// Input transaction (bare 1-of-2 multisig)
|
||||||
src = bcoin.mtx({
|
src = MTX({
|
||||||
outputs: [{
|
outputs: [{
|
||||||
value: 5460 * 2,
|
value: 5460 * 2,
|
||||||
script: bcoin.script.fromMultisig(1, 2, keys)
|
script: Script.fromMultisig(1, 2, keys)
|
||||||
}, {
|
}, {
|
||||||
value: 5460 * 2,
|
value: 5460 * 2,
|
||||||
address: new bcoin.address()
|
address: new Address()
|
||||||
}]
|
}]
|
||||||
});
|
});
|
||||||
|
|
||||||
src.addInput(dummy());
|
src.addInput(dummy());
|
||||||
|
|
||||||
tx = bcoin.mtx()
|
tx = MTX()
|
||||||
.addInput(src, 0)
|
.addInput(src, 0)
|
||||||
.addOutput(w.getAddress(), 5460);
|
.addOutput(w.getAddress(), 5460);
|
||||||
|
|
||||||
@ -201,7 +210,7 @@ describe('Wallet', function() {
|
|||||||
doubleSpendWallet = w;
|
doubleSpendWallet = w;
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(w.getAddress(), 50000)
|
.addOutput(w.getAddress(), 50000)
|
||||||
.addOutput(w.getAddress(), 1000);
|
.addOutput(w.getAddress(), 1000);
|
||||||
t1.addInput(dummy());
|
t1.addInput(dummy());
|
||||||
@ -211,17 +220,17 @@ describe('Wallet', function() {
|
|||||||
// yield w.sign(t1);
|
// yield w.sign(t1);
|
||||||
t1 = t1.toTX();
|
t1 = t1.toTX();
|
||||||
|
|
||||||
t2 = bcoin.mtx()
|
t2 = MTX()
|
||||||
.addInput(t1, 0) // 50000
|
.addInput(t1, 0) // 50000
|
||||||
.addOutput(w.getAddress(), 24000)
|
.addOutput(w.getAddress(), 24000)
|
||||||
.addOutput(w.getAddress(), 24000);
|
.addOutput(w.getAddress(), 24000);
|
||||||
|
|
||||||
doubleSpend = bcoin.coin.fromTX(t1, 0, -1);
|
doubleSpend = Coin.fromTX(t1, 0, -1);
|
||||||
|
|
||||||
// balance: 49000
|
// balance: 49000
|
||||||
yield w.sign(t2);
|
yield w.sign(t2);
|
||||||
t2 = t2.toTX();
|
t2 = t2.toTX();
|
||||||
t3 = bcoin.mtx()
|
t3 = MTX()
|
||||||
.addInput(t1, 1) // 1000
|
.addInput(t1, 1) // 1000
|
||||||
.addInput(t2, 0) // 24000
|
.addInput(t2, 0) // 24000
|
||||||
.addOutput(w.getAddress(), 23000);
|
.addOutput(w.getAddress(), 23000);
|
||||||
@ -229,7 +238,7 @@ describe('Wallet', function() {
|
|||||||
// balance: 47000
|
// balance: 47000
|
||||||
yield w.sign(t3);
|
yield w.sign(t3);
|
||||||
t3 = t3.toTX();
|
t3 = t3.toTX();
|
||||||
t4 = bcoin.mtx()
|
t4 = MTX()
|
||||||
.addInput(t2, 1) // 24000
|
.addInput(t2, 1) // 24000
|
||||||
.addInput(t3, 0) // 23000
|
.addInput(t3, 0) // 23000
|
||||||
.addOutput(w.getAddress(), 11000)
|
.addOutput(w.getAddress(), 11000)
|
||||||
@ -238,7 +247,7 @@ describe('Wallet', function() {
|
|||||||
// balance: 22000
|
// balance: 22000
|
||||||
yield w.sign(t4);
|
yield w.sign(t4);
|
||||||
t4 = t4.toTX();
|
t4 = t4.toTX();
|
||||||
f1 = bcoin.mtx()
|
f1 = MTX()
|
||||||
.addInput(t4, 1) // 11000
|
.addInput(t4, 1) // 11000
|
||||||
.addOutput(f.getAddress(), 10000);
|
.addOutput(f.getAddress(), 10000);
|
||||||
|
|
||||||
@ -246,7 +255,7 @@ describe('Wallet', function() {
|
|||||||
yield w.sign(f1);
|
yield w.sign(f1);
|
||||||
f1 = f1.toTX();
|
f1 = f1.toTX();
|
||||||
|
|
||||||
fake = bcoin.mtx()
|
fake = MTX()
|
||||||
.addInput(t1, 1) // 1000 (already redeemed)
|
.addInput(t1, 1) // 1000 (already redeemed)
|
||||||
.addOutput(w.getAddress(), 500);
|
.addOutput(w.getAddress(), 500);
|
||||||
|
|
||||||
@ -307,7 +316,7 @@ describe('Wallet', function() {
|
|||||||
var w = doubleSpendWallet;
|
var w = doubleSpendWallet;
|
||||||
var tx, txs, total, balance;
|
var tx, txs, total, balance;
|
||||||
|
|
||||||
tx = bcoin.mtx().addOutput(w.getAddress(), 5000);
|
tx = MTX().addOutput(w.getAddress(), 5000);
|
||||||
tx.addInput(doubleSpend);
|
tx.addInput(doubleSpend);
|
||||||
|
|
||||||
txs = yield w.getHistory();
|
txs = yield w.getHistory();
|
||||||
@ -341,7 +350,7 @@ describe('Wallet', function() {
|
|||||||
it('should handle missed txs without resolution', cob(function* () {
|
it('should handle missed txs without resolution', cob(function* () {
|
||||||
var walletdb, w, f, t1, t2, t3, t4, f1, fake, balance, txs;
|
var walletdb, w, f, t1, t2, t3, t4, f1, fake, balance, txs;
|
||||||
|
|
||||||
walletdb = new bcoin.walletdb({
|
walletdb = new WalletDB({
|
||||||
name: 'wallet-test',
|
name: 'wallet-test',
|
||||||
db: 'memory',
|
db: 'memory',
|
||||||
resolution: false,
|
resolution: false,
|
||||||
@ -354,7 +363,7 @@ describe('Wallet', function() {
|
|||||||
f = yield walletdb.create();
|
f = yield walletdb.create();
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(w.getAddress(), 50000)
|
.addOutput(w.getAddress(), 50000)
|
||||||
.addOutput(w.getAddress(), 1000);
|
.addOutput(w.getAddress(), 1000);
|
||||||
t1.addInput(dummy());
|
t1.addInput(dummy());
|
||||||
@ -363,7 +372,7 @@ describe('Wallet', function() {
|
|||||||
// yield w.sign(t1);
|
// yield w.sign(t1);
|
||||||
t1 = t1.toTX();
|
t1 = t1.toTX();
|
||||||
|
|
||||||
t2 = bcoin.mtx()
|
t2 = MTX()
|
||||||
.addInput(t1, 0) // 50000
|
.addInput(t1, 0) // 50000
|
||||||
.addOutput(w.getAddress(), 24000)
|
.addOutput(w.getAddress(), 24000)
|
||||||
.addOutput(w.getAddress(), 24000);
|
.addOutput(w.getAddress(), 24000);
|
||||||
@ -371,7 +380,7 @@ describe('Wallet', function() {
|
|||||||
// balance: 49000
|
// balance: 49000
|
||||||
yield w.sign(t2);
|
yield w.sign(t2);
|
||||||
t2 = t2.toTX();
|
t2 = t2.toTX();
|
||||||
t3 = bcoin.mtx()
|
t3 = MTX()
|
||||||
.addInput(t1, 1) // 1000
|
.addInput(t1, 1) // 1000
|
||||||
.addInput(t2, 0) // 24000
|
.addInput(t2, 0) // 24000
|
||||||
.addOutput(w.getAddress(), 23000);
|
.addOutput(w.getAddress(), 23000);
|
||||||
@ -379,7 +388,7 @@ describe('Wallet', function() {
|
|||||||
// balance: 47000
|
// balance: 47000
|
||||||
yield w.sign(t3);
|
yield w.sign(t3);
|
||||||
t3 = t3.toTX();
|
t3 = t3.toTX();
|
||||||
t4 = bcoin.mtx()
|
t4 = MTX()
|
||||||
.addInput(t2, 1) // 24000
|
.addInput(t2, 1) // 24000
|
||||||
.addInput(t3, 0) // 23000
|
.addInput(t3, 0) // 23000
|
||||||
.addOutput(w.getAddress(), 11000)
|
.addOutput(w.getAddress(), 11000)
|
||||||
@ -388,7 +397,7 @@ describe('Wallet', function() {
|
|||||||
// balance: 22000
|
// balance: 22000
|
||||||
yield w.sign(t4);
|
yield w.sign(t4);
|
||||||
t4 = t4.toTX();
|
t4 = t4.toTX();
|
||||||
f1 = bcoin.mtx()
|
f1 = MTX()
|
||||||
.addInput(t4, 1) // 11000
|
.addInput(t4, 1) // 11000
|
||||||
.addOutput(f.getAddress(), 10000);
|
.addOutput(f.getAddress(), 10000);
|
||||||
|
|
||||||
@ -396,7 +405,7 @@ describe('Wallet', function() {
|
|||||||
yield w.sign(f1);
|
yield w.sign(f1);
|
||||||
f1 = f1.toTX();
|
f1 = f1.toTX();
|
||||||
|
|
||||||
// fake = bcoin.mtx()
|
// fake = MTX()
|
||||||
// .addInput(t1, 1) // 1000 (already redeemed)
|
// .addInput(t1, 1) // 1000 (already redeemed)
|
||||||
// .addOutput(w.getAddress(), 500);
|
// .addOutput(w.getAddress(), 500);
|
||||||
|
|
||||||
@ -473,7 +482,7 @@ describe('Wallet', function() {
|
|||||||
var view, t1, t2, t3, err;
|
var view, t1, t2, t3, err;
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
@ -485,7 +494,7 @@ describe('Wallet', function() {
|
|||||||
yield walletdb.addTX(t1);
|
yield walletdb.addTX(t1);
|
||||||
|
|
||||||
// Create new transaction
|
// Create new transaction
|
||||||
t2 = bcoin.mtx().addOutput(w2.getAddress(), 5460);
|
t2 = MTX().addOutput(w2.getAddress(), 5460);
|
||||||
yield w1.fund(t2, { rate: 10000, round: true });
|
yield w1.fund(t2, { rate: 10000, round: true });
|
||||||
yield w1.sign(t2);
|
yield w1.sign(t2);
|
||||||
view = t2.view;
|
view = t2.view;
|
||||||
@ -502,7 +511,7 @@ describe('Wallet', function() {
|
|||||||
assert.equal(t2.getFee(view), 10000); // minrelay=1000
|
assert.equal(t2.getFee(view), 10000); // minrelay=1000
|
||||||
|
|
||||||
// Create new transaction
|
// Create new transaction
|
||||||
t3 = bcoin.mtx().addOutput(w2.getAddress(), 15000);
|
t3 = MTX().addOutput(w2.getAddress(), 15000);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
yield w1.fund(t3, { rate: 10000, round: true });
|
yield w1.fund(t3, { rate: 10000, round: true });
|
||||||
@ -520,7 +529,7 @@ describe('Wallet', function() {
|
|||||||
var view, t1, t2, t3, balance, err;
|
var view, t1, t2, t3, balance, err;
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
@ -532,7 +541,7 @@ describe('Wallet', function() {
|
|||||||
yield walletdb.addTX(t1);
|
yield walletdb.addTX(t1);
|
||||||
|
|
||||||
// Create new transaction
|
// Create new transaction
|
||||||
t2 = bcoin.mtx().addOutput(w2.getAddress(), 5460);
|
t2 = MTX().addOutput(w2.getAddress(), 5460);
|
||||||
yield w1.fund(t2, { rate: 10000 });
|
yield w1.fund(t2, { rate: 10000 });
|
||||||
|
|
||||||
yield w1.sign(t2);
|
yield w1.sign(t2);
|
||||||
@ -559,7 +568,7 @@ describe('Wallet', function() {
|
|||||||
yield walletdb.addTX(t2);
|
yield walletdb.addTX(t2);
|
||||||
|
|
||||||
// Create new transaction
|
// Create new transaction
|
||||||
t3 = bcoin.mtx().addOutput(w2.getAddress(), 15000);
|
t3 = MTX().addOutput(w2.getAddress(), 15000);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
yield w1.fund(t3, { rate: 10000 });
|
yield w1.fund(t3, { rate: 10000 });
|
||||||
@ -579,7 +588,7 @@ describe('Wallet', function() {
|
|||||||
var t1, t2, tx, cost, total, coins1, coins2, left;
|
var t1, t2, tx, cost, total, coins1, coins2, left;
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
@ -589,7 +598,7 @@ describe('Wallet', function() {
|
|||||||
t1 = t1.toTX();
|
t1 = t1.toTX();
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t2 = bcoin.mtx()
|
t2 = MTX()
|
||||||
.addOutput(w2.getAddress(), 5460)
|
.addOutput(w2.getAddress(), 5460)
|
||||||
.addOutput(w2.getAddress(), 5460)
|
.addOutput(w2.getAddress(), 5460)
|
||||||
.addOutput(w2.getAddress(), 5460)
|
.addOutput(w2.getAddress(), 5460)
|
||||||
@ -602,7 +611,7 @@ describe('Wallet', function() {
|
|||||||
yield walletdb.addTX(t2);
|
yield walletdb.addTX(t2);
|
||||||
|
|
||||||
// Create our tx with an output
|
// Create our tx with an output
|
||||||
tx = bcoin.mtx();
|
tx = MTX();
|
||||||
tx.addOutput(to.getAddress(), 5460);
|
tx.addOutput(to.getAddress(), 5460);
|
||||||
|
|
||||||
cost = tx.getOutputValue();
|
cost = tx.getOutputValue();
|
||||||
@ -655,8 +664,8 @@ describe('Wallet', function() {
|
|||||||
assert.equal(tx.verify(), true);
|
assert.equal(tx.verify(), true);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
var multisig = co(function* multisig(witness, bullshitNesting, cb) {
|
multisig = co(function* multisig(witness, bullshitNesting, cb) {
|
||||||
var flags = bcoin.constants.flags.STANDARD_VERIFY_FLAGS;
|
var flags = constants.flags.STANDARD_VERIFY_FLAGS;
|
||||||
var options, w1, w2, w3, receive, b58, addr, paddr, utx, send, change;
|
var options, w1, w2, w3, receive, b58, addr, paddr, utx, send, change;
|
||||||
var view;
|
var view;
|
||||||
|
|
||||||
@ -664,7 +673,7 @@ describe('Wallet', function() {
|
|||||||
var depth = bullshitNesting ? 'nestedDepth' : 'receiveDepth';
|
var depth = bullshitNesting ? 'nestedDepth' : 'receiveDepth';
|
||||||
|
|
||||||
if (witness)
|
if (witness)
|
||||||
flags |= bcoin.constants.flags.VERIFY_WITNESS;
|
flags |= constants.flags.VERIFY_WITNESS;
|
||||||
|
|
||||||
// Create 3 2-of-3 wallets with our pubkeys as "shared keys"
|
// Create 3 2-of-3 wallets with our pubkeys as "shared keys"
|
||||||
options = {
|
options = {
|
||||||
@ -688,7 +697,7 @@ describe('Wallet', function() {
|
|||||||
|
|
||||||
// Our p2sh address
|
// Our p2sh address
|
||||||
b58 = w1.account[rec].getAddress('base58');
|
b58 = w1.account[rec].getAddress('base58');
|
||||||
addr = bcoin.address.fromBase58(b58);
|
addr = Address.fromBase58(b58);
|
||||||
|
|
||||||
if (witness) {
|
if (witness) {
|
||||||
if (bullshitNesting)
|
if (bullshitNesting)
|
||||||
@ -709,7 +718,7 @@ describe('Wallet', function() {
|
|||||||
assert.equal(w3.getNested('base58'), paddr);
|
assert.equal(w3.getNested('base58'), paddr);
|
||||||
|
|
||||||
// Add a shared unspent transaction to our wallets
|
// Add a shared unspent transaction to our wallets
|
||||||
utx = bcoin.mtx();
|
utx = MTX();
|
||||||
if (bullshitNesting)
|
if (bullshitNesting)
|
||||||
utx.addOutput({ address: paddr, value: 5460 * 10 });
|
utx.addOutput({ address: paddr, value: 5460 * 10 });
|
||||||
else
|
else
|
||||||
@ -740,7 +749,7 @@ describe('Wallet', function() {
|
|||||||
assert.equal(w3.account[rec].getAddress('base58'), b58);
|
assert.equal(w3.account[rec].getAddress('base58'), b58);
|
||||||
|
|
||||||
// Create a tx requiring 2 signatures
|
// Create a tx requiring 2 signatures
|
||||||
send = bcoin.mtx();
|
send = MTX();
|
||||||
send.addOutput({ address: receive.getAddress(), value: 5460 });
|
send.addOutput({ address: receive.getAddress(), value: 5460 });
|
||||||
assert(!send.verify(flags));
|
assert(!send.verify(flags));
|
||||||
yield w1.fund(send, { rate: 10000, round: true });
|
yield w1.fund(send, { rate: 10000, round: true });
|
||||||
@ -819,7 +828,7 @@ describe('Wallet', function() {
|
|||||||
rec = account.receive;
|
rec = account.receive;
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(rec.getAddress(), 5460)
|
.addOutput(rec.getAddress(), 5460)
|
||||||
.addOutput(rec.getAddress(), 5460)
|
.addOutput(rec.getAddress(), 5460)
|
||||||
.addOutput(rec.getAddress(), 5460)
|
.addOutput(rec.getAddress(), 5460)
|
||||||
@ -831,7 +840,7 @@ describe('Wallet', function() {
|
|||||||
yield walletdb.addTX(t1);
|
yield walletdb.addTX(t1);
|
||||||
|
|
||||||
// Create new transaction
|
// Create new transaction
|
||||||
t2 = bcoin.mtx().addOutput(w2.getAddress(), 5460);
|
t2 = MTX().addOutput(w2.getAddress(), 5460);
|
||||||
yield w1.fund(t2, { rate: 10000, round: true });
|
yield w1.fund(t2, { rate: 10000, round: true });
|
||||||
yield w1.sign(t2);
|
yield w1.sign(t2);
|
||||||
|
|
||||||
@ -846,7 +855,7 @@ describe('Wallet', function() {
|
|||||||
assert.equal(t2.getFee(), 10000); // minrelay=1000
|
assert.equal(t2.getFee(), 10000); // minrelay=1000
|
||||||
|
|
||||||
// Create new transaction
|
// Create new transaction
|
||||||
t3 = bcoin.mtx().addOutput(w2.getAddress(), 15000);
|
t3 = MTX().addOutput(w2.getAddress(), 15000);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
yield w1.fund(t3, { rate: 10000, round: true });
|
yield w1.fund(t3, { rate: 10000, round: true });
|
||||||
@ -885,7 +894,7 @@ describe('Wallet', function() {
|
|||||||
w.account.receive.getAddress('base58'));
|
w.account.receive.getAddress('base58'));
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(w.getAddress(), 5460)
|
.addOutput(w.getAddress(), 5460)
|
||||||
.addOutput(w.getAddress(), 5460)
|
.addOutput(w.getAddress(), 5460)
|
||||||
.addOutput(w.getAddress(), 5460)
|
.addOutput(w.getAddress(), 5460)
|
||||||
@ -897,7 +906,7 @@ describe('Wallet', function() {
|
|||||||
yield walletdb.addTX(t1);
|
yield walletdb.addTX(t1);
|
||||||
|
|
||||||
// Should fill from `foo` and fail
|
// Should fill from `foo` and fail
|
||||||
t2 = bcoin.mtx().addOutput(w.getAddress(), 5460);
|
t2 = MTX().addOutput(w.getAddress(), 5460);
|
||||||
try {
|
try {
|
||||||
yield w.fund(t2, { rate: 10000, round: true, account: 'foo' });
|
yield w.fund(t2, { rate: 10000, round: true, account: 'foo' });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -906,11 +915,11 @@ describe('Wallet', function() {
|
|||||||
assert(err);
|
assert(err);
|
||||||
|
|
||||||
// Should fill from whole wallet and succeed
|
// Should fill from whole wallet and succeed
|
||||||
t2 = bcoin.mtx().addOutput(w.getAddress(), 5460);
|
t2 = MTX().addOutput(w.getAddress(), 5460);
|
||||||
yield w.fund(t2, { rate: 10000, round: true });
|
yield w.fund(t2, { rate: 10000, round: true });
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(account.receive.getAddress(), 5460)
|
.addOutput(account.receive.getAddress(), 5460)
|
||||||
.addOutput(account.receive.getAddress(), 5460)
|
.addOutput(account.receive.getAddress(), 5460)
|
||||||
.addOutput(account.receive.getAddress(), 5460);
|
.addOutput(account.receive.getAddress(), 5460);
|
||||||
@ -921,7 +930,7 @@ describe('Wallet', function() {
|
|||||||
|
|
||||||
yield walletdb.addTX(t1);
|
yield walletdb.addTX(t1);
|
||||||
|
|
||||||
t2 = bcoin.mtx().addOutput(w.getAddress(), 5460);
|
t2 = MTX().addOutput(w.getAddress(), 5460);
|
||||||
// Should fill from `foo` and succeed
|
// Should fill from `foo` and succeed
|
||||||
yield w.fund(t2, { rate: 10000, round: true, account: 'foo' });
|
yield w.fund(t2, { rate: 10000, round: true, account: 'foo' });
|
||||||
}));
|
}));
|
||||||
@ -943,7 +952,7 @@ describe('Wallet', function() {
|
|||||||
w.master.key = null;
|
w.master.key = null;
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(w.getAddress(), 5460)
|
.addOutput(w.getAddress(), 5460)
|
||||||
.addOutput(w.getAddress(), 5460)
|
.addOutput(w.getAddress(), 5460)
|
||||||
.addOutput(w.getAddress(), 5460)
|
.addOutput(w.getAddress(), 5460)
|
||||||
@ -955,7 +964,7 @@ describe('Wallet', function() {
|
|||||||
yield walletdb.addTX(t1);
|
yield walletdb.addTX(t1);
|
||||||
|
|
||||||
// Create new transaction
|
// Create new transaction
|
||||||
t2 = bcoin.mtx().addOutput(w.getAddress(), 5460);
|
t2 = MTX().addOutput(w.getAddress(), 5460);
|
||||||
yield w.fund(t2, { rate: 10000, round: true });
|
yield w.fund(t2, { rate: 10000, round: true });
|
||||||
|
|
||||||
// Should fail
|
// Should fail
|
||||||
@ -979,7 +988,7 @@ describe('Wallet', function() {
|
|||||||
var t1, t2;
|
var t1, t2;
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
@ -991,7 +1000,7 @@ describe('Wallet', function() {
|
|||||||
yield walletdb.addTX(t1);
|
yield walletdb.addTX(t1);
|
||||||
|
|
||||||
// Create new transaction
|
// Create new transaction
|
||||||
t2 = bcoin.mtx().addOutput(w2.getAddress(), 21840);
|
t2 = MTX().addOutput(w2.getAddress(), 21840);
|
||||||
yield w1.fund(t2, { rate: 10000, round: true, subtractFee: true });
|
yield w1.fund(t2, { rate: 10000, round: true, subtractFee: true });
|
||||||
yield w1.sign(t2);
|
yield w1.sign(t2);
|
||||||
|
|
||||||
@ -1002,13 +1011,13 @@ describe('Wallet', function() {
|
|||||||
assert.equal(t2.getFee(), 10000);
|
assert.equal(t2.getFee(), 10000);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it('should fill tx with inputs with subtract fee with create tx', cob(function* () {
|
it('should fill tx with inputs with subtract fee', cob(function* () {
|
||||||
var w1 = yield walletdb.create();
|
var w1 = yield walletdb.create();
|
||||||
var w2 = yield walletdb.create();
|
var w2 = yield walletdb.create();
|
||||||
var options, t1, t2;
|
var options, t1, t2;
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
.addOutput(w1.getAddress(), 5460)
|
.addOutput(w1.getAddress(), 5460)
|
||||||
@ -1070,7 +1079,7 @@ describe('Wallet', function() {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
it('should import privkey', cob(function* () {
|
it('should import privkey', cob(function* () {
|
||||||
var key = bcoin.keyring.generate();
|
var key = KeyRing.generate();
|
||||||
var w = yield walletdb.create({ passphrase: 'test' });
|
var w = yield walletdb.create({ passphrase: 'test' });
|
||||||
var options, k, t1, t2, tx;
|
var options, k, t1, t2, tx;
|
||||||
|
|
||||||
@ -1081,7 +1090,7 @@ describe('Wallet', function() {
|
|||||||
assert.equal(k.getHash('hex'), key.getHash('hex'));
|
assert.equal(k.getHash('hex'), key.getHash('hex'));
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(key.getAddress(), 5460)
|
.addOutput(key.getAddress(), 5460)
|
||||||
.addOutput(key.getAddress(), 5460)
|
.addOutput(key.getAddress(), 5460)
|
||||||
.addOutput(key.getAddress(), 5460)
|
.addOutput(key.getAddress(), 5460)
|
||||||
@ -1113,8 +1122,8 @@ describe('Wallet', function() {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
it('should import pubkey', cob(function* () {
|
it('should import pubkey', cob(function* () {
|
||||||
var priv = bcoin.keyring.generate();
|
var priv = KeyRing.generate();
|
||||||
var key = new bcoin.keyring(priv.publicKey);
|
var key = new KeyRing(priv.publicKey);
|
||||||
var w = yield walletdb.create({ watchOnly: true });
|
var w = yield walletdb.create({ watchOnly: true });
|
||||||
var options, k, t1, t2, tx;
|
var options, k, t1, t2, tx;
|
||||||
|
|
||||||
@ -1129,7 +1138,7 @@ describe('Wallet', function() {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
it('should import address', cob(function* () {
|
it('should import address', cob(function* () {
|
||||||
var key = bcoin.keyring.generate();
|
var key = KeyRing.generate();
|
||||||
var w = yield walletdb.create({ watchOnly: true });
|
var w = yield walletdb.create({ watchOnly: true });
|
||||||
var options, k, t1, t2, tx;
|
var options, k, t1, t2, tx;
|
||||||
|
|
||||||
@ -1158,7 +1167,7 @@ describe('Wallet', function() {
|
|||||||
assert.equal(details[0].toJSON().id, 'test');
|
assert.equal(details[0].toJSON().id, 'test');
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it('should handle changed passphrase with encrypted imports', cob(function* () {
|
it('should change passphrase with encrypted imports', cob(function* () {
|
||||||
var w = ewallet;
|
var w = ewallet;
|
||||||
var addr = ekey.getAddress();
|
var addr = ekey.getAddress();
|
||||||
var path, d1, d2, k;
|
var path, d1, d2, k;
|
||||||
@ -1200,7 +1209,7 @@ describe('Wallet', function() {
|
|||||||
it('should recover from a missed tx', cob(function* () {
|
it('should recover from a missed tx', cob(function* () {
|
||||||
var walletdb, alice, addr, bob, t1, t2, t3;
|
var walletdb, alice, addr, bob, t1, t2, t3;
|
||||||
|
|
||||||
walletdb = new bcoin.walletdb({
|
walletdb = new WalletDB({
|
||||||
name: 'wallet-test',
|
name: 'wallet-test',
|
||||||
db: 'memory',
|
db: 'memory',
|
||||||
resolution: false,
|
resolution: false,
|
||||||
@ -1214,7 +1223,7 @@ describe('Wallet', function() {
|
|||||||
addr = alice.getAddress();
|
addr = alice.getAddress();
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(addr, 50000);
|
.addOutput(addr, 50000);
|
||||||
t1.addInput(dummy());
|
t1.addInput(dummy());
|
||||||
|
|
||||||
@ -1225,7 +1234,7 @@ describe('Wallet', function() {
|
|||||||
yield bob.add(t1);
|
yield bob.add(t1);
|
||||||
|
|
||||||
// Bob misses this tx!
|
// Bob misses this tx!
|
||||||
t2 = bcoin.mtx()
|
t2 = MTX()
|
||||||
.addInput(t1, 0)
|
.addInput(t1, 0)
|
||||||
.addOutput(addr, 24000)
|
.addOutput(addr, 24000)
|
||||||
.addOutput(addr, 24000);
|
.addOutput(addr, 24000);
|
||||||
@ -1240,7 +1249,7 @@ describe('Wallet', function() {
|
|||||||
(yield bob.getBalance()).unconfirmed);
|
(yield bob.getBalance()).unconfirmed);
|
||||||
|
|
||||||
// Bob sees this one.
|
// Bob sees this one.
|
||||||
t3 = bcoin.mtx()
|
t3 = MTX()
|
||||||
.addInput(t2, 0)
|
.addInput(t2, 0)
|
||||||
.addInput(t2, 1)
|
.addInput(t2, 1)
|
||||||
.addOutput(addr, 30000);
|
.addOutput(addr, 30000);
|
||||||
@ -1267,7 +1276,7 @@ describe('Wallet', function() {
|
|||||||
it('should recover from a missed tx and double spend', cob(function* () {
|
it('should recover from a missed tx and double spend', cob(function* () {
|
||||||
var walletdb, alice, addr, bob, t1, t2, t3, t2a;
|
var walletdb, alice, addr, bob, t1, t2, t3, t2a;
|
||||||
|
|
||||||
walletdb = new bcoin.walletdb({
|
walletdb = new WalletDB({
|
||||||
name: 'wallet-test',
|
name: 'wallet-test',
|
||||||
db: 'memory',
|
db: 'memory',
|
||||||
resolution: false,
|
resolution: false,
|
||||||
@ -1281,7 +1290,7 @@ describe('Wallet', function() {
|
|||||||
addr = alice.getAddress();
|
addr = alice.getAddress();
|
||||||
|
|
||||||
// Coinbase
|
// Coinbase
|
||||||
t1 = bcoin.mtx()
|
t1 = MTX()
|
||||||
.addOutput(addr, 50000);
|
.addOutput(addr, 50000);
|
||||||
t1.addInput(dummy());
|
t1.addInput(dummy());
|
||||||
|
|
||||||
@ -1292,7 +1301,7 @@ describe('Wallet', function() {
|
|||||||
yield bob.add(t1);
|
yield bob.add(t1);
|
||||||
|
|
||||||
// Bob misses this tx!
|
// Bob misses this tx!
|
||||||
t2 = bcoin.mtx()
|
t2 = MTX()
|
||||||
.addInput(t1, 0)
|
.addInput(t1, 0)
|
||||||
.addOutput(addr, 24000)
|
.addOutput(addr, 24000)
|
||||||
.addOutput(addr, 24000);
|
.addOutput(addr, 24000);
|
||||||
@ -1307,7 +1316,7 @@ describe('Wallet', function() {
|
|||||||
(yield bob.getBalance()).unconfirmed);
|
(yield bob.getBalance()).unconfirmed);
|
||||||
|
|
||||||
// Bob doublespends.
|
// Bob doublespends.
|
||||||
t2a = bcoin.mtx()
|
t2a = MTX()
|
||||||
.addInput(t1, 0)
|
.addInput(t1, 0)
|
||||||
.addOutput(addr, 10000)
|
.addOutput(addr, 10000)
|
||||||
.addOutput(addr, 10000);
|
.addOutput(addr, 10000);
|
||||||
@ -1318,7 +1327,7 @@ describe('Wallet', function() {
|
|||||||
yield bob.add(t2a);
|
yield bob.add(t2a);
|
||||||
|
|
||||||
// Bob sees this one.
|
// Bob sees this one.
|
||||||
t3 = bcoin.mtx()
|
t3 = MTX()
|
||||||
.addInput(t2, 0)
|
.addInput(t2, 0)
|
||||||
.addInput(t2, 1)
|
.addInput(t2, 1)
|
||||||
.addOutput(addr, 30000);
|
.addOutput(addr, 30000);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user