add network.js and testnet support. see #40.
This commit is contained in:
parent
26035c3b41
commit
57491aaadc
@ -14,3 +14,5 @@ bcoin.wallet = require('./bcoin/wallet');
|
|||||||
bcoin.peer = require('./bcoin/peer');
|
bcoin.peer = require('./bcoin/peer');
|
||||||
bcoin.pool = require('./bcoin/pool');
|
bcoin.pool = require('./bcoin/pool');
|
||||||
bcoin.hd = require('./bcoin/hd');
|
bcoin.hd = require('./bcoin/hd');
|
||||||
|
|
||||||
|
bcoin.protocol.network.set(process.env.BCOIN_NETWORK || 'main');
|
||||||
|
|||||||
@ -3,7 +3,7 @@ var EventEmitter = require('events').EventEmitter;
|
|||||||
|
|
||||||
var bcoin = require('../bcoin');
|
var bcoin = require('../bcoin');
|
||||||
var constants = bcoin.protocol.constants;
|
var constants = bcoin.protocol.constants;
|
||||||
var preload = bcoin.protocol.preload;
|
var network = bcoin.protocol.network;
|
||||||
var utils = bcoin.utils;
|
var utils = bcoin.utils;
|
||||||
var assert = utils.assert;
|
var assert = utils.assert;
|
||||||
|
|
||||||
@ -38,6 +38,8 @@ function Chain(options) {
|
|||||||
};
|
};
|
||||||
this.request = new utils.RequestCache();
|
this.request = new utils.RequestCache();
|
||||||
|
|
||||||
|
var preload = network.preload;
|
||||||
|
|
||||||
// Start from the genesis block
|
// Start from the genesis block
|
||||||
// if we're a full node.
|
// if we're a full node.
|
||||||
if (this.options.fullNode) {
|
if (this.options.fullNode) {
|
||||||
@ -516,6 +518,7 @@ Chain.prototype.toJSON = function toJSON() {
|
|||||||
return {
|
return {
|
||||||
v: 1,
|
v: 1,
|
||||||
type: 'chain',
|
type: 'chain',
|
||||||
|
network: network.type,
|
||||||
hashes: first.hashes.concat(last.hashes),
|
hashes: first.hashes.concat(last.hashes),
|
||||||
ts: first.ts.concat(last.ts),
|
ts: first.ts.concat(last.ts),
|
||||||
heights: first.heights.concat(last.heights)
|
heights: first.heights.concat(last.heights)
|
||||||
@ -525,6 +528,7 @@ Chain.prototype.toJSON = function toJSON() {
|
|||||||
Chain.prototype.fromJSON = function fromJSON(json) {
|
Chain.prototype.fromJSON = function fromJSON(json) {
|
||||||
assert.equal(json.v, 1);
|
assert.equal(json.v, 1);
|
||||||
assert.equal(json.type, 'chain');
|
assert.equal(json.type, 'chain');
|
||||||
|
assert.equal(json.network, network.type);
|
||||||
this.index.hashes = json.hashes.slice();
|
this.index.hashes = json.hashes.slice();
|
||||||
this.index.ts = json.ts.slice();
|
this.index.ts = json.ts.slice();
|
||||||
this.index.heights = json.heights.slice();
|
this.index.heights = json.heights.slice();
|
||||||
@ -534,7 +538,7 @@ Chain.prototype.fromJSON = function fromJSON(json) {
|
|||||||
this.index.bloom = new bcoin.bloom(28 * 1024 * 1024, 16, 0xdeadbeef);
|
this.index.bloom = new bcoin.bloom(28 * 1024 * 1024, 16, 0xdeadbeef);
|
||||||
|
|
||||||
if (this.index.hashes.length === 0)
|
if (this.index.hashes.length === 0)
|
||||||
this.add(new bcoin.block(constants.genesis, 'block'));
|
this.add(new bcoin.block(network.genesis, 'block'));
|
||||||
|
|
||||||
for (var i = 0; i < this.index.hashes.length; i++) {
|
for (var i = 0; i < this.index.hashes.length; i++) {
|
||||||
this.index.bloom.add(this.index.hashes[i], 'hex');
|
this.index.bloom.add(this.index.hashes[i], 'hex');
|
||||||
|
|||||||
@ -56,6 +56,7 @@ var bn = require('bn.js');
|
|||||||
var elliptic = require('elliptic');
|
var elliptic = require('elliptic');
|
||||||
var utils = bcoin.utils;
|
var utils = bcoin.utils;
|
||||||
var assert = utils.assert;
|
var assert = utils.assert;
|
||||||
|
var network = bcoin.protocol.network;
|
||||||
|
|
||||||
var EventEmitter = require('events').EventEmitter;
|
var EventEmitter = require('events').EventEmitter;
|
||||||
|
|
||||||
@ -112,11 +113,6 @@ HDSeed._mnemonic = function(entropy) {
|
|||||||
* HD Keys
|
* HD Keys
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var VERSION = {
|
|
||||||
xpubkey: 0x0488b21e,
|
|
||||||
xprivkey: 0x0488ade4
|
|
||||||
};
|
|
||||||
|
|
||||||
var HARDENED = 0x80000000;
|
var HARDENED = 0x80000000;
|
||||||
var MAX_INDEX = 2 * HARDENED;
|
var MAX_INDEX = 2 * HARDENED;
|
||||||
var MIN_ENTROPY = 128 / 8;
|
var MIN_ENTROPY = 128 / 8;
|
||||||
@ -155,7 +151,7 @@ function HDPriv(options) {
|
|||||||
data = options;
|
data = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
data = this._normalize(data, VERSION.xprivkey);
|
data = this._normalize(data, network.prefixes.xprivkey);
|
||||||
|
|
||||||
this.data = data;
|
this.data = data;
|
||||||
|
|
||||||
@ -165,7 +161,7 @@ function HDPriv(options) {
|
|||||||
HDPriv.prototype._normalize = function(data, version) {
|
HDPriv.prototype._normalize = function(data, version) {
|
||||||
var b;
|
var b;
|
||||||
|
|
||||||
data.version = version || VERSION.xprivkey;
|
data.version = version || network.prefixes.xprivkey;
|
||||||
data.version = +data.version;
|
data.version = +data.version;
|
||||||
|
|
||||||
data.depth = +data.depth;
|
data.depth = +data.depth;
|
||||||
@ -219,7 +215,7 @@ HDPriv.prototype._seed = function(seed) {
|
|||||||
var hash = sha512hmac(seed, 'Bitcoin seed');
|
var hash = sha512hmac(seed, 'Bitcoin seed');
|
||||||
|
|
||||||
return {
|
return {
|
||||||
// version: VERSION.xprivkey,
|
// version: network.prefixes.xprivkey,
|
||||||
depth: 0,
|
depth: 0,
|
||||||
parentFingerPrint: 0,
|
parentFingerPrint: 0,
|
||||||
childIndex: 0,
|
childIndex: 0,
|
||||||
@ -413,7 +409,7 @@ function HDPub(options) {
|
|||||||
else
|
else
|
||||||
data = options;
|
data = options;
|
||||||
|
|
||||||
data = this._normalize(data, VERSION.xpubkey);
|
data = this._normalize(data, network.prefixes.xpubkey);
|
||||||
|
|
||||||
this.data = data;
|
this.data = data;
|
||||||
|
|
||||||
@ -518,7 +514,7 @@ HDPub.prototype.derive = function(index, hard) {
|
|||||||
var publicKey = bcoin.ecdsa.keyFromPublic(pubkeyPoint).getPublic(true, 'array');
|
var publicKey = bcoin.ecdsa.keyFromPublic(pubkeyPoint).getPublic(true, 'array');
|
||||||
|
|
||||||
return new HDPub({
|
return new HDPub({
|
||||||
// version: VERSION.xpubkey,
|
// version: network.prefixes.xpubkey,
|
||||||
depth: this.depth + 1,
|
depth: this.depth + 1,
|
||||||
parentFingerPrint: this.fingerPrint,
|
parentFingerPrint: this.fingerPrint,
|
||||||
childIndex: index,
|
childIndex: index,
|
||||||
|
|||||||
@ -3,29 +3,6 @@ var utils = bcoin.utils;
|
|||||||
|
|
||||||
exports.minVersion = 70001;
|
exports.minVersion = 70001;
|
||||||
exports.version = 70002;
|
exports.version = 70002;
|
||||||
exports.magic = 0xd9b4bef9;
|
|
||||||
exports.genesis = {
|
|
||||||
version: 1,
|
|
||||||
prevBlock: [ 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
||||||
merkleRoot: utils.toArray(
|
|
||||||
'4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b',
|
|
||||||
'hex'
|
|
||||||
).reverse(),
|
|
||||||
ts: 1231006505,
|
|
||||||
bits: 0x1d00ffff,
|
|
||||||
nonce: 2083236893
|
|
||||||
};
|
|
||||||
|
|
||||||
// address versions
|
|
||||||
exports.addr = {
|
|
||||||
normal: 0,
|
|
||||||
p2pkh: 0,
|
|
||||||
multisig: 0,
|
|
||||||
p2sh: 5
|
|
||||||
};
|
|
||||||
|
|
||||||
// version - services field
|
// version - services field
|
||||||
exports.services = {
|
exports.services = {
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
var bcoin = require('../../bcoin');
|
var bcoin = require('../../bcoin');
|
||||||
|
var network = require('./network');
|
||||||
var constants = require('./constants');
|
var constants = require('./constants');
|
||||||
var utils = bcoin.utils;
|
var utils = bcoin.utils;
|
||||||
var assert = utils.assert;
|
var assert = utils.assert;
|
||||||
@ -27,7 +28,7 @@ Framer.prototype.header = function header(cmd, payload) {
|
|||||||
var h = new Array(24);
|
var h = new Array(24);
|
||||||
|
|
||||||
// Magic value
|
// Magic value
|
||||||
writeU32(h, constants.magic, 0);
|
writeU32(h, network.magic, 0);
|
||||||
|
|
||||||
// Command
|
// Command
|
||||||
var len = writeAscii(h, cmd, 4);
|
var len = writeAscii(h, cmd, 4);
|
||||||
|
|||||||
@ -3,4 +3,4 @@ var protocol = exports;
|
|||||||
protocol.constants = require('./constants');
|
protocol.constants = require('./constants');
|
||||||
protocol.framer = require('./framer');
|
protocol.framer = require('./framer');
|
||||||
protocol.parser = require('./parser');
|
protocol.parser = require('./parser');
|
||||||
protocol.preload = require('./preload');
|
protocol.network = require('./network');
|
||||||
|
|||||||
178
lib/bcoin/protocol/network.js
Normal file
178
lib/bcoin/protocol/network.js
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
var bcoin = require('../../bcoin');
|
||||||
|
var utils = bcoin.utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Network
|
||||||
|
*/
|
||||||
|
|
||||||
|
var network = exports;
|
||||||
|
|
||||||
|
network.set = function(type) {
|
||||||
|
var net = network[type];
|
||||||
|
utils.merge(network, net);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main
|
||||||
|
*/
|
||||||
|
|
||||||
|
var main = network.main = {};
|
||||||
|
|
||||||
|
main.prefixes = {
|
||||||
|
pubkey: 0,
|
||||||
|
script: 5,
|
||||||
|
privkey: 128,
|
||||||
|
xpubkey: 0x0488b21e,
|
||||||
|
xprivkey: 0x0488ade4
|
||||||
|
};
|
||||||
|
|
||||||
|
utils.merge(main.prefixes, {
|
||||||
|
normal: main.prefixes.pubkey,
|
||||||
|
p2pkh: main.prefixes.pubkey,
|
||||||
|
multisig: main.prefixes.pubkey,
|
||||||
|
p2sh: main.prefixes.script
|
||||||
|
});
|
||||||
|
|
||||||
|
main.type = 'main';
|
||||||
|
|
||||||
|
main.seeds = [
|
||||||
|
'seed.bitcoin.sipa.be', // Pieter Wuille
|
||||||
|
'dnsseed.bluematt.me', // Matt Corallo
|
||||||
|
'dnsseed.bitcoin.dashjr.org', // Luke Dashjr
|
||||||
|
'seed.bitcoinstats.com', // Christian Decker
|
||||||
|
'bitseed.xf2.org', // Jeff Garzik
|
||||||
|
'seed.bitcoin.jonasschnelli.ch' // Jonas Schnelli
|
||||||
|
];
|
||||||
|
|
||||||
|
main.port = 8333;
|
||||||
|
|
||||||
|
main.alertKey = utils.toArray(''
|
||||||
|
+ '04fc9702847840aaf195de8442ebecedf5b095c'
|
||||||
|
+ 'dbb9bc716bda9110971b28a49e0ead8564ff0db'
|
||||||
|
+ '22209e0374782c093bb899692d524e9d6a6956e'
|
||||||
|
+ '7c5ecbcd68284',
|
||||||
|
'hex');
|
||||||
|
|
||||||
|
main.checkpoints = [
|
||||||
|
{ height: 11111, hash: '0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d' },
|
||||||
|
{ height: 33333, hash: '000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6' },
|
||||||
|
{ height: 74000, hash: '0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20' },
|
||||||
|
{ height: 105000, hash: '00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97' },
|
||||||
|
{ height: 134444, hash: '00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe' },
|
||||||
|
{ height: 168000, hash: '000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763' },
|
||||||
|
{ height: 193000, hash: '000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317' },
|
||||||
|
{ height: 210000, hash: '000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e' },
|
||||||
|
{ height: 216116, hash: '00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e' },
|
||||||
|
{ height: 225430, hash: '00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932' },
|
||||||
|
{ height: 250000, hash: '000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214' },
|
||||||
|
{ height: 279000, hash: '0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40' },
|
||||||
|
{ height: 295000, hash: '00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983' }
|
||||||
|
];
|
||||||
|
|
||||||
|
main.checkpoints.tsLastCheckpoint = 1397080064;
|
||||||
|
main.checkpoints.txsLastCheckpoint = 36544669;
|
||||||
|
main.checkpoints.txsPerDay = 60000.0;
|
||||||
|
|
||||||
|
// http://blockexplorer.com/b/0
|
||||||
|
// http://blockexplorer.com/rawblock/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
|
||||||
|
main.genesis = {
|
||||||
|
version: 1,
|
||||||
|
_hash: utils.toArray(
|
||||||
|
'000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f',
|
||||||
|
'hex'
|
||||||
|
).reverse(),
|
||||||
|
prevBlock: [ 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0 ],
|
||||||
|
merkleRoot: utils.toArray(
|
||||||
|
'4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b',
|
||||||
|
'hex'
|
||||||
|
).reverse(),
|
||||||
|
ts: 1231006505,
|
||||||
|
bits: 0x1d00ffff,
|
||||||
|
nonce: 2083236893
|
||||||
|
};
|
||||||
|
|
||||||
|
main.magic = 0xd9b4bef9;
|
||||||
|
|
||||||
|
main.preload = require('./preload');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Testnet (v3)
|
||||||
|
* https://en.bitcoin.it/wiki/Testnet
|
||||||
|
*/
|
||||||
|
|
||||||
|
var testnet = network.testnet = {};
|
||||||
|
|
||||||
|
testnet.type = 'testnet';
|
||||||
|
|
||||||
|
testnet.prefixes = {
|
||||||
|
pubkey: 111,
|
||||||
|
script: 196,
|
||||||
|
privkey: 239,
|
||||||
|
xpubkey: 0x043587cf,
|
||||||
|
xprivkey: 0x04358394
|
||||||
|
};
|
||||||
|
|
||||||
|
utils.merge(testnet.prefixes, {
|
||||||
|
normal: testnet.prefixes.pubkey,
|
||||||
|
p2pkh: testnet.prefixes.pubkey,
|
||||||
|
multisig: testnet.prefixes.pubkey,
|
||||||
|
p2sh: testnet.prefixes.script
|
||||||
|
});
|
||||||
|
|
||||||
|
testnet.seeds = [
|
||||||
|
'testnet-seed.alexykot.me',
|
||||||
|
'testnet-seed.bitcoin.petertodd.org',
|
||||||
|
'testnet-seed.bluematt.me',
|
||||||
|
'testnet-seed.bitcoin.schildbach.de'
|
||||||
|
];
|
||||||
|
|
||||||
|
testnet.port = 18333;
|
||||||
|
|
||||||
|
testnet.alertKey = utils.toArray(''
|
||||||
|
+ '04302390343f91cc401d56d68b123028bf52e5f'
|
||||||
|
+ 'ca1939df127f63c6467cdf9c8e2c14b61104cf8'
|
||||||
|
+ '17d0b780da337893ecc4aaff1309e536162dabb'
|
||||||
|
+ 'db45200ca2b0a',
|
||||||
|
'hex');
|
||||||
|
|
||||||
|
testnet.checkpoints = [
|
||||||
|
{ height: 546, hash: '000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70' }
|
||||||
|
];
|
||||||
|
|
||||||
|
testnet.checkpoints.tsLastCheckpoint = 1338180505;
|
||||||
|
testnet.checkpoints.txsLastCheckpoint = 16341;
|
||||||
|
testnet.checkpoints.txsPerDay = 300;
|
||||||
|
|
||||||
|
// http://blockexplorer.com/testnet/b/0
|
||||||
|
// http://blockexplorer.com/testnet/rawblock/000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
|
||||||
|
testnet.genesis = {
|
||||||
|
version: 1,
|
||||||
|
_hash: utils.toArray(
|
||||||
|
'000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943',
|
||||||
|
'hex'
|
||||||
|
).reverse(),
|
||||||
|
prevBlock: [ 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0 ],
|
||||||
|
merkleRoot: utils.toArray(
|
||||||
|
'4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b',
|
||||||
|
'hex'
|
||||||
|
).reverse(),
|
||||||
|
ts: 1296688602,
|
||||||
|
bits: 0x1d00ffff,
|
||||||
|
nonce: 414098458
|
||||||
|
};
|
||||||
|
|
||||||
|
testnet.magic = 0x0709110b;
|
||||||
|
|
||||||
|
testnet.preload = {
|
||||||
|
'v': 1,
|
||||||
|
'type': 'chain',
|
||||||
|
'hashes': [utils.toHex(testnet.genesis._hash)],
|
||||||
|
'ts': [testnet.genesis.ts],
|
||||||
|
'heights': [0]
|
||||||
|
};
|
||||||
@ -6,6 +6,7 @@ var bcoin = require('../../bcoin');
|
|||||||
var utils = bcoin.utils;
|
var utils = bcoin.utils;
|
||||||
var assert = utils.assert;
|
var assert = utils.assert;
|
||||||
var constants = require('./constants');
|
var constants = require('./constants');
|
||||||
|
var network = require('./network');
|
||||||
|
|
||||||
var readU32 = utils.readU32;
|
var readU32 = utils.readU32;
|
||||||
var readU64 = utils.readU64;
|
var readU64 = utils.readU64;
|
||||||
@ -71,7 +72,7 @@ Parser.prototype.parse = function parse(chunk) {
|
|||||||
|
|
||||||
Parser.prototype.parseHeader = function parseHeader(h) {
|
Parser.prototype.parseHeader = function parseHeader(h) {
|
||||||
var magic = readU32(h, 0);
|
var magic = readU32(h, 0);
|
||||||
if (magic !== constants.magic) {
|
if (magic !== network.magic) {
|
||||||
return this._error('Invalid magic value: ' + magic.toString(16));
|
return this._error('Invalid magic value: ' + magic.toString(16));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,7 @@ var utils = exports;
|
|||||||
|
|
||||||
var bn = require('bn.js');
|
var bn = require('bn.js');
|
||||||
var hash = require('hash.js');
|
var hash = require('hash.js');
|
||||||
|
var util = require('util');
|
||||||
|
|
||||||
function toArray(msg, enc) {
|
function toArray(msg, enc) {
|
||||||
if (Array.isArray(msg))
|
if (Array.isArray(msg))
|
||||||
@ -491,6 +492,41 @@ utils.toKeyArray = function(msg) {
|
|||||||
return utils.fromBase58(msg);
|
return utils.fromBase58(msg);
|
||||||
};
|
};
|
||||||
|
|
||||||
utils.debug = function(msg) {
|
utils.inspect = function(obj) {
|
||||||
console.log('\x1b[31m' + msg + '\x1b[m');
|
return typeof obj !== 'string'
|
||||||
|
? util.inspect(obj, null, 20, true)
|
||||||
|
: obj;
|
||||||
|
};
|
||||||
|
|
||||||
|
utils.print = function(msg) {
|
||||||
|
return typeof msg === 'object'
|
||||||
|
? process.stdout.write(utils.inspect(msg) + '\n')
|
||||||
|
: console.log.apply(console, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
utils.debug = function() {
|
||||||
|
var args = Array.prototype.slice.call(arguments);
|
||||||
|
args[0] = '\x1b[31m' + args[0] + '\x1b[m';
|
||||||
|
return utils.print.apply(null, args);
|
||||||
|
};
|
||||||
|
|
||||||
|
utils.merge = function(target) {
|
||||||
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
|
args.forEach(function(obj) {
|
||||||
|
Object.keys(obj).forEach(function(key) {
|
||||||
|
target[key] = obj[key];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return target;
|
||||||
|
};
|
||||||
|
|
||||||
|
utils.fromBTC = function(btc) {
|
||||||
|
var satoshi = new bn(+btc || 0);
|
||||||
|
satoshi.imuln(100000000);
|
||||||
|
return satoshi;
|
||||||
|
};
|
||||||
|
|
||||||
|
utils.ntoBTC = function(satoshi) {
|
||||||
|
satoshi = new bn(Math.floor(+satoshi || 0).toString(16), 16);
|
||||||
|
return bcoin.utils.toBTC(satoshi);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -6,6 +6,7 @@ var EventEmitter = require('events').EventEmitter;
|
|||||||
var utils = bcoin.utils;
|
var utils = bcoin.utils;
|
||||||
var assert = utils.assert;
|
var assert = utils.assert;
|
||||||
var constants = bcoin.protocol.constants;
|
var constants = bcoin.protocol.constants;
|
||||||
|
var network = bcoin.protocol.network;
|
||||||
|
|
||||||
function Wallet(options, passphrase) {
|
function Wallet(options, passphrase) {
|
||||||
if (!(this instanceof Wallet))
|
if (!(this instanceof Wallet))
|
||||||
@ -166,7 +167,7 @@ Wallet.prototype.getPrivateKey = function getPrivateKey(enc) {
|
|||||||
|
|
||||||
if (enc === 'base58') {
|
if (enc === 'base58') {
|
||||||
// We'll be using ncompressed public key as an address
|
// We'll be using ncompressed public key as an address
|
||||||
var arr = [ 128 ];
|
var arr = [ network.prefixes.privkey ];
|
||||||
|
|
||||||
// 0-pad key
|
// 0-pad key
|
||||||
while (arr.length + priv.length < 33)
|
while (arr.length + priv.length < 33)
|
||||||
@ -258,7 +259,7 @@ Wallet.prototype.getAddress = function getAddress() {
|
|||||||
Wallet.hash2addr = function hash2addr(hash, version) {
|
Wallet.hash2addr = function hash2addr(hash, version) {
|
||||||
hash = utils.toArray(hash, 'hex');
|
hash = utils.toArray(hash, 'hex');
|
||||||
|
|
||||||
version = constants.addr[version || 'normal'];
|
version = network.prefixes[version || 'normal'];
|
||||||
hash = [ version ].concat(hash);
|
hash = [ version ].concat(hash);
|
||||||
|
|
||||||
var addr = hash.concat(utils.checksum(hash));
|
var addr = hash.concat(utils.checksum(hash));
|
||||||
@ -269,7 +270,7 @@ Wallet.addr2hash = function addr2hash(addr, version) {
|
|||||||
if (!Array.isArray(addr))
|
if (!Array.isArray(addr))
|
||||||
addr = utils.fromBase58(addr);
|
addr = utils.fromBase58(addr);
|
||||||
|
|
||||||
version = constants.addr[version || 'normal'];
|
version = network.prefixes[version || 'normal'];
|
||||||
|
|
||||||
if (addr.length !== 25)
|
if (addr.length !== 25)
|
||||||
return [];
|
return [];
|
||||||
@ -417,6 +418,7 @@ Wallet.prototype.toJSON = function toJSON() {
|
|||||||
return {
|
return {
|
||||||
v: 1,
|
v: 1,
|
||||||
type: 'wallet',
|
type: 'wallet',
|
||||||
|
network: network.type,
|
||||||
pub: this.getOwnPublicKey('base58'),
|
pub: this.getOwnPublicKey('base58'),
|
||||||
priv: this.getPrivateKey('base58'),
|
priv: this.getPrivateKey('base58'),
|
||||||
tx: this.tx.toJSON(),
|
tx: this.tx.toJSON(),
|
||||||
@ -432,6 +434,7 @@ Wallet.prototype.toJSON = function toJSON() {
|
|||||||
Wallet.fromJSON = function fromJSON(json) {
|
Wallet.fromJSON = function fromJSON(json) {
|
||||||
assert.equal(json.v, 1);
|
assert.equal(json.v, 1);
|
||||||
assert.equal(json.type, 'wallet');
|
assert.equal(json.type, 'wallet');
|
||||||
|
assert.equal(json.network, network.type);
|
||||||
|
|
||||||
var priv;
|
var priv;
|
||||||
var pub;
|
var pub;
|
||||||
@ -440,7 +443,7 @@ Wallet.fromJSON = function fromJSON(json) {
|
|||||||
if (json.priv) {
|
if (json.priv) {
|
||||||
var key = bcoin.utils.fromBase58(json.priv);
|
var key = bcoin.utils.fromBase58(json.priv);
|
||||||
assert(utils.isEqual(key.slice(-4), utils.checksum(key.slice(0, -4))));
|
assert(utils.isEqual(key.slice(-4), utils.checksum(key.slice(0, -4))));
|
||||||
assert.equal(key[0], 128);
|
assert.equal(key[0], network.prefixes.privkey);
|
||||||
|
|
||||||
key = key.slice(0, -4);
|
key = key.slice(0, -4);
|
||||||
if (key.length === 34) {
|
if (key.length === 34) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user