pkg: update deps.
This commit is contained in:
parent
319ec82997
commit
c388498ab0
@ -12,12 +12,12 @@ const path = require('path');
|
|||||||
const AsyncEmitter = require('bevent');
|
const AsyncEmitter = require('bevent');
|
||||||
const Logger = require('blgr');
|
const Logger = require('blgr');
|
||||||
const {Lock} = require('bmutex');
|
const {Lock} = require('bmutex');
|
||||||
|
const LRU = require('blru');
|
||||||
const Network = require('../protocol/network');
|
const Network = require('../protocol/network');
|
||||||
const ChainDB = require('./chaindb');
|
const ChainDB = require('./chaindb');
|
||||||
const common = require('./common');
|
const common = require('./common');
|
||||||
const consensus = require('../protocol/consensus');
|
const consensus = require('../protocol/consensus');
|
||||||
const util = require('../utils/util');
|
const util = require('../utils/util');
|
||||||
const LRU = require('../utils/lru');
|
|
||||||
const ChainEntry = require('./chainentry');
|
const ChainEntry = require('./chainentry');
|
||||||
const CoinView = require('../coins/coinview');
|
const CoinView = require('../coins/coinview');
|
||||||
const Script = require('../script/script');
|
const Script = require('../script/script');
|
||||||
|
|||||||
@ -10,12 +10,12 @@
|
|||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const bdb = require('bdb');
|
const bdb = require('bdb');
|
||||||
const bio = require('bufio');
|
const bio = require('bufio');
|
||||||
|
const LRU = require('blru');
|
||||||
const Amount = require('../btc/amount');
|
const Amount = require('../btc/amount');
|
||||||
const Network = require('../protocol/network');
|
const Network = require('../protocol/network');
|
||||||
const CoinView = require('../coins/coinview');
|
const CoinView = require('../coins/coinview');
|
||||||
const UndoCoins = require('../coins/undocoins');
|
const UndoCoins = require('../coins/undocoins');
|
||||||
const layout = require('./layout');
|
const layout = require('./layout');
|
||||||
const LRU = require('../utils/lru');
|
|
||||||
const util = require('../utils/util');
|
const util = require('../utils/util');
|
||||||
const consensus = require('../protocol/consensus');
|
const consensus = require('../protocol/consensus');
|
||||||
const Block = require('../primitives/block');
|
const Block = require('../primitives/block');
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const LRU = require('../utils/lru');
|
const LRU = require('blru');
|
||||||
const common = exports;
|
const common = exports;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -11,6 +11,7 @@ const path = require('path');
|
|||||||
const EventEmitter = require('events');
|
const EventEmitter = require('events');
|
||||||
const bdb = require('bdb');
|
const bdb = require('bdb');
|
||||||
const {RollingFilter} = require('bfilter');
|
const {RollingFilter} = require('bfilter');
|
||||||
|
const Heap = require('bheep');
|
||||||
const common = require('../blockchain/common');
|
const common = require('../blockchain/common');
|
||||||
const consensus = require('../protocol/consensus');
|
const consensus = require('../protocol/consensus');
|
||||||
const policy = require('../protocol/policy');
|
const policy = require('../protocol/policy');
|
||||||
@ -28,7 +29,6 @@ const Network = require('../protocol/network');
|
|||||||
const layout = require('./layout');
|
const layout = require('./layout');
|
||||||
const Fees = require('./fees');
|
const Fees = require('./fees');
|
||||||
const CoinView = require('../coins/coinview');
|
const CoinView = require('../coins/coinview');
|
||||||
const Heap = require('../utils/heap');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mempool
|
* Mempool
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const EventEmitter = require('events');
|
const EventEmitter = require('events');
|
||||||
const Heap = require('../utils/heap');
|
const Heap = require('bheep');
|
||||||
const Amount = require('../btc/amount');
|
const Amount = require('../btc/amount');
|
||||||
const Address = require('../primitives/address');
|
const Address = require('../primitives/address');
|
||||||
const BlockTemplate = require('./template');
|
const BlockTemplate = require('./template');
|
||||||
|
|||||||
@ -99,7 +99,7 @@ class BIP151Stream {
|
|||||||
|
|
||||||
this.publicKey = publicKey;
|
this.publicKey = publicKey;
|
||||||
|
|
||||||
const secret = secp256k1.ecdh(this.publicKey, this.privateKey);
|
const secret = secp256k1.ecdh(this.publicKey, this.privateKey).slice(1);
|
||||||
|
|
||||||
const bw = bio.pool(33);
|
const bw = bio.pool(33);
|
||||||
|
|
||||||
|
|||||||
@ -14,7 +14,7 @@ const assert = require('assert');
|
|||||||
const bio = require('bufio');
|
const bio = require('bufio');
|
||||||
const consensus = require('../protocol/consensus');
|
const consensus = require('../protocol/consensus');
|
||||||
const sha256 = require('bcrypto/lib/sha256');
|
const sha256 = require('bcrypto/lib/sha256');
|
||||||
const {siphash} = require('bcrypto/lib/siphash');
|
const {siphash} = require('bsip');
|
||||||
const AbstractBlock = require('../primitives/abstractblock');
|
const AbstractBlock = require('../primitives/abstractblock');
|
||||||
const TX = require('../primitives/tx');
|
const TX = require('../primitives/tx');
|
||||||
const Headers = require('../primitives/headers');
|
const Headers = require('../primitives/headers');
|
||||||
|
|||||||
@ -12,11 +12,11 @@ const fs = require('bfile');
|
|||||||
const IP = require('binet');
|
const IP = require('binet');
|
||||||
const dns = require('bdns');
|
const dns = require('bdns');
|
||||||
const Logger = require('blgr');
|
const Logger = require('blgr');
|
||||||
const {murmur3} = require('bfilter');
|
const murmur3 = require('mrmr');
|
||||||
|
const List = require('blst');
|
||||||
const util = require('../utils/util');
|
const util = require('../utils/util');
|
||||||
const Network = require('../protocol/network');
|
const Network = require('../protocol/network');
|
||||||
const NetAddress = require('./netaddress');
|
const NetAddress = require('./netaddress');
|
||||||
const List = require('../utils/list');
|
|
||||||
const common = require('./common');
|
const common = require('./common');
|
||||||
const seeds = require('./seeds');
|
const seeds = require('./seeds');
|
||||||
|
|
||||||
|
|||||||
@ -100,7 +100,7 @@ class NetAddress {
|
|||||||
* @returns {Boolean}
|
* @returns {Boolean}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static isIPv4() {
|
isIPv4() {
|
||||||
return IP.isIPv4(this.raw);
|
return IP.isIPv4(this.raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,7 +109,7 @@ class NetAddress {
|
|||||||
* @returns {Boolean}
|
* @returns {Boolean}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static isIPv6() {
|
isIPv6() {
|
||||||
return IP.isIPv6(this.raw);
|
return IP.isIPv6(this.raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -15,6 +15,7 @@ const dns = require('bdns');
|
|||||||
const tcp = require('btcp');
|
const tcp = require('btcp');
|
||||||
const UPNP = require('bupnp');
|
const UPNP = require('bupnp');
|
||||||
const socks = require('bsocks');
|
const socks = require('bsocks');
|
||||||
|
const List = require('blst');
|
||||||
const {BloomFilter, RollingFilter} = require('bfilter');
|
const {BloomFilter, RollingFilter} = require('bfilter');
|
||||||
const secp256k1 = require('bcrypto/lib/secp256k1');
|
const secp256k1 = require('bcrypto/lib/secp256k1');
|
||||||
const util = require('../utils/util');
|
const util = require('../utils/util');
|
||||||
@ -26,7 +27,6 @@ const BIP151 = require('./bip151');
|
|||||||
const BIP152 = require('./bip152');
|
const BIP152 = require('./bip152');
|
||||||
const Network = require('../protocol/network');
|
const Network = require('../protocol/network');
|
||||||
const Peer = require('./peer');
|
const Peer = require('./peer');
|
||||||
const List = require('../utils/list');
|
|
||||||
const HostList = require('./hostlist');
|
const HostList = require('./hostlist');
|
||||||
const InvItem = require('../primitives/invitem');
|
const InvItem = require('../primitives/invitem');
|
||||||
const packets = require('./packets');
|
const packets = require('./packets');
|
||||||
|
|||||||
@ -1,244 +0,0 @@
|
|||||||
/*!
|
|
||||||
* heap.js - heap object for bcoin
|
|
||||||
* Copyright (c) 2017, Christopher Jeffrey (MIT License).
|
|
||||||
* https://github.com/bcoin-org/bcoin
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const assert = require('assert');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Binary Heap
|
|
||||||
* @alias module:utils.Heap
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Heap {
|
|
||||||
/**
|
|
||||||
* Create a binary heap.
|
|
||||||
* @constructor
|
|
||||||
* @param {Function?} compare
|
|
||||||
*/
|
|
||||||
|
|
||||||
constructor(compare) {
|
|
||||||
this.compare = comparator;
|
|
||||||
this.items = [];
|
|
||||||
|
|
||||||
if (compare)
|
|
||||||
this.set(compare);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize and sort heap.
|
|
||||||
*/
|
|
||||||
|
|
||||||
init() {
|
|
||||||
const n = this.items.length;
|
|
||||||
|
|
||||||
if (n <= 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (let i = (n / 2 | 0) - 1; i >= 0; i--)
|
|
||||||
this.down(i, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get heap size.
|
|
||||||
* @returns {Number}
|
|
||||||
*/
|
|
||||||
|
|
||||||
size() {
|
|
||||||
return this.items.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set comparator.
|
|
||||||
* @param {Function} compare
|
|
||||||
*/
|
|
||||||
|
|
||||||
set(compare) {
|
|
||||||
assert(typeof compare === 'function',
|
|
||||||
'Comparator must be a function.');
|
|
||||||
this.compare = compare;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Push item onto heap.
|
|
||||||
* @param {Object} item
|
|
||||||
* @returns {Number}
|
|
||||||
*/
|
|
||||||
|
|
||||||
insert(item) {
|
|
||||||
this.items.push(item);
|
|
||||||
this.up(this.items.length - 1);
|
|
||||||
return this.items.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pop next item off of heap.
|
|
||||||
* @param {Object} item
|
|
||||||
* @returns {Object}
|
|
||||||
*/
|
|
||||||
|
|
||||||
shift() {
|
|
||||||
if (this.items.length === 0)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
const n = this.items.length - 1;
|
|
||||||
|
|
||||||
this.swap(0, n);
|
|
||||||
this.down(0, n);
|
|
||||||
|
|
||||||
return this.items.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove item from heap.
|
|
||||||
* @param {Number} i
|
|
||||||
* @returns {Object}
|
|
||||||
*/
|
|
||||||
|
|
||||||
remove(i) {
|
|
||||||
if (this.items.length === 0)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
const n = this.items.length - 1;
|
|
||||||
|
|
||||||
if (i < 0 || i > n)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
if (n !== i) {
|
|
||||||
this.swap(i, n);
|
|
||||||
this.down(i, n);
|
|
||||||
this.up(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.items.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Swap indicies.
|
|
||||||
* @private
|
|
||||||
* @param {Number} a
|
|
||||||
* @param {Number} b
|
|
||||||
*/
|
|
||||||
|
|
||||||
swap(a, b) {
|
|
||||||
const x = this.items[a];
|
|
||||||
const y = this.items[b];
|
|
||||||
this.items[a] = y;
|
|
||||||
this.items[b] = x;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compare indicies.
|
|
||||||
* @private
|
|
||||||
* @param {Number} i
|
|
||||||
* @param {Number} j
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
|
|
||||||
less(i, j) {
|
|
||||||
return this.compare(this.items[i], this.items[j]) < 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bubble item down.
|
|
||||||
* @private
|
|
||||||
* @param {Number} i
|
|
||||||
* @param {Number} n
|
|
||||||
*/
|
|
||||||
|
|
||||||
down(i, n) {
|
|
||||||
for (;;) {
|
|
||||||
const l = 2 * i + 1;
|
|
||||||
|
|
||||||
assert(l >= 0);
|
|
||||||
|
|
||||||
if (l < 0 || l >= n)
|
|
||||||
break;
|
|
||||||
|
|
||||||
let j = l;
|
|
||||||
const r = l + 1;
|
|
||||||
|
|
||||||
if (r < n && !this.less(l, r))
|
|
||||||
j = r;
|
|
||||||
|
|
||||||
if (!this.less(j, i))
|
|
||||||
break;
|
|
||||||
|
|
||||||
this.swap(i, j);
|
|
||||||
i = j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bubble item up.
|
|
||||||
* @private
|
|
||||||
* @param {Number} i
|
|
||||||
*/
|
|
||||||
|
|
||||||
up(i) {
|
|
||||||
for (;;) {
|
|
||||||
const j = (i - 1) / 2 | 0;
|
|
||||||
|
|
||||||
assert(j >= 0);
|
|
||||||
|
|
||||||
if (j < 0 || j === i)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (!this.less(i, j))
|
|
||||||
break;
|
|
||||||
|
|
||||||
this.swap(j, i);
|
|
||||||
i = j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert heap to sorted array.
|
|
||||||
* @returns {Object[]}
|
|
||||||
*/
|
|
||||||
|
|
||||||
toArray() {
|
|
||||||
const heap = new Heap();
|
|
||||||
const result = [];
|
|
||||||
|
|
||||||
heap.compare = this.compare;
|
|
||||||
heap.items = this.items.slice();
|
|
||||||
|
|
||||||
while (heap.size() > 0)
|
|
||||||
result.push(heap.shift());
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiate heap from array and comparator.
|
|
||||||
* @param {Function} compare
|
|
||||||
* @param {Object[]} items
|
|
||||||
* @returns {Heap}
|
|
||||||
*/
|
|
||||||
|
|
||||||
static fromArray(compare, items) {
|
|
||||||
const heap = new Heap();
|
|
||||||
heap.set(compare);
|
|
||||||
heap.items = items;
|
|
||||||
heap.init();
|
|
||||||
return heap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Helpers
|
|
||||||
*/
|
|
||||||
|
|
||||||
function comparator(a, b) {
|
|
||||||
throw new Error('No heap comparator set.');
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Expose
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = Heap;
|
|
||||||
@ -1,290 +0,0 @@
|
|||||||
/*!
|
|
||||||
* list.js - double linked list for bcoin
|
|
||||||
* Copyright (c) 2014-2017, Christopher Jeffrey (MIT License).
|
|
||||||
* https://github.com/bcoin-org/bcoin
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const assert = require('assert');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Double Linked List
|
|
||||||
* @alias module:utils.List
|
|
||||||
*/
|
|
||||||
|
|
||||||
class List {
|
|
||||||
/**
|
|
||||||
* Create a list.
|
|
||||||
* @constructor
|
|
||||||
* @property {ListItem|null} head
|
|
||||||
* @property {ListItem|null} tail
|
|
||||||
* @property {Number} size
|
|
||||||
*/
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
this.head = null;
|
|
||||||
this.tail = null;
|
|
||||||
this.size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset the cache. Clear all items.
|
|
||||||
*/
|
|
||||||
|
|
||||||
reset() {
|
|
||||||
let item, next;
|
|
||||||
|
|
||||||
for (item = this.head; item; item = next) {
|
|
||||||
next = item.next;
|
|
||||||
item.prev = null;
|
|
||||||
item.next = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(!item);
|
|
||||||
|
|
||||||
this.head = null;
|
|
||||||
this.tail = null;
|
|
||||||
this.size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove the first item in the list.
|
|
||||||
* @returns {ListItem}
|
|
||||||
*/
|
|
||||||
|
|
||||||
shift() {
|
|
||||||
const item = this.head;
|
|
||||||
|
|
||||||
if (!item)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
this.remove(item);
|
|
||||||
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepend an item to the linked list (sets new head).
|
|
||||||
* @param {ListItem}
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
|
|
||||||
unshift(item) {
|
|
||||||
return this.insert(null, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Append an item to the linked list (sets new tail).
|
|
||||||
* @param {ListItem}
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
|
|
||||||
push(item) {
|
|
||||||
return this.insert(this.tail, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove the last item in the list.
|
|
||||||
* @returns {ListItem}
|
|
||||||
*/
|
|
||||||
|
|
||||||
pop() {
|
|
||||||
const item = this.tail;
|
|
||||||
|
|
||||||
if (!item)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
this.remove(item);
|
|
||||||
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Insert item into the linked list.
|
|
||||||
* @private
|
|
||||||
* @param {ListItem|null} ref
|
|
||||||
* @param {ListItem} item
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
|
|
||||||
insert(ref, item) {
|
|
||||||
if (item.prev || item.next || item === this.head)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
assert(!item.prev);
|
|
||||||
assert(!item.next);
|
|
||||||
|
|
||||||
if (ref == null) {
|
|
||||||
if (!this.head) {
|
|
||||||
this.head = item;
|
|
||||||
this.tail = item;
|
|
||||||
} else {
|
|
||||||
this.head.prev = item;
|
|
||||||
item.next = this.head;
|
|
||||||
this.head = item;
|
|
||||||
}
|
|
||||||
this.size += 1;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
item.next = ref.next;
|
|
||||||
item.prev = ref;
|
|
||||||
ref.next = item;
|
|
||||||
|
|
||||||
if (ref === this.tail)
|
|
||||||
this.tail = item;
|
|
||||||
|
|
||||||
this.size += 1;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove item from the linked list.
|
|
||||||
* @private
|
|
||||||
* @param {ListItem}
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
|
|
||||||
remove(item) {
|
|
||||||
if (!item.prev && !item.next && item !== this.head)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (item.prev)
|
|
||||||
item.prev.next = item.next;
|
|
||||||
|
|
||||||
if (item.next)
|
|
||||||
item.next.prev = item.prev;
|
|
||||||
|
|
||||||
if (item === this.head)
|
|
||||||
this.head = item.next;
|
|
||||||
|
|
||||||
if (item === this.tail)
|
|
||||||
this.tail = item.prev || this.head;
|
|
||||||
|
|
||||||
if (!this.head)
|
|
||||||
assert(!this.tail);
|
|
||||||
|
|
||||||
if (!this.tail)
|
|
||||||
assert(!this.head);
|
|
||||||
|
|
||||||
item.prev = null;
|
|
||||||
item.next = null;
|
|
||||||
|
|
||||||
this.size -= 1;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace an item in-place.
|
|
||||||
* @param {ListItem} ref
|
|
||||||
* @param {ListItem} item
|
|
||||||
*/
|
|
||||||
|
|
||||||
replace(ref, item) {
|
|
||||||
if (ref.prev)
|
|
||||||
ref.prev.next = item;
|
|
||||||
|
|
||||||
if (ref.next)
|
|
||||||
ref.next.prev = item;
|
|
||||||
|
|
||||||
item.prev = ref.prev;
|
|
||||||
item.next = ref.next;
|
|
||||||
|
|
||||||
ref.next = null;
|
|
||||||
ref.prev = null;
|
|
||||||
|
|
||||||
if (this.head === ref)
|
|
||||||
this.head = item;
|
|
||||||
|
|
||||||
if (this.tail === ref)
|
|
||||||
this.tail = item;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Slice the list to an array of items.
|
|
||||||
* Will remove the items sliced.
|
|
||||||
* @param {Number?} total
|
|
||||||
* @returns {ListItem[]}
|
|
||||||
*/
|
|
||||||
|
|
||||||
slice(total) {
|
|
||||||
if (total == null)
|
|
||||||
total = -1;
|
|
||||||
|
|
||||||
const items = [];
|
|
||||||
|
|
||||||
let next = null;
|
|
||||||
|
|
||||||
for (let item = this.head; item; item = next) {
|
|
||||||
next = item.next;
|
|
||||||
item.prev = null;
|
|
||||||
item.next = null;
|
|
||||||
|
|
||||||
this.size -= 1;
|
|
||||||
|
|
||||||
items.push(item);
|
|
||||||
|
|
||||||
if (items.length === total)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (next) {
|
|
||||||
this.head = next;
|
|
||||||
next.prev = null;
|
|
||||||
} else {
|
|
||||||
this.head = null;
|
|
||||||
this.tail = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert the list to an array of items.
|
|
||||||
* @returns {ListItem[]}
|
|
||||||
*/
|
|
||||||
|
|
||||||
toArray() {
|
|
||||||
const items = [];
|
|
||||||
|
|
||||||
for (let item = this.head; item; item = item.next)
|
|
||||||
items.push(item);
|
|
||||||
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* List Item
|
|
||||||
* @alias module:utils.ListItem
|
|
||||||
*/
|
|
||||||
|
|
||||||
class ListItem {
|
|
||||||
/**
|
|
||||||
* Create a list item.
|
|
||||||
* @constructor
|
|
||||||
* @private
|
|
||||||
* @param {String} key
|
|
||||||
* @param {Object} value
|
|
||||||
*/
|
|
||||||
|
|
||||||
constructor(value) {
|
|
||||||
this.next = null;
|
|
||||||
this.prev = null;
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Expose
|
|
||||||
*/
|
|
||||||
|
|
||||||
exports = List;
|
|
||||||
exports.List = List;
|
|
||||||
exports.ListItem = ListItem;
|
|
||||||
exports.Item = ListItem;
|
|
||||||
|
|
||||||
module.exports = exports;
|
|
||||||
522
lib/utils/lru.js
522
lib/utils/lru.js
@ -1,522 +0,0 @@
|
|||||||
/*!
|
|
||||||
* lru.js - LRU cache for bcoin
|
|
||||||
* Copyright (c) 2014-2015, Fedor Indutny (MIT License)
|
|
||||||
* Copyright (c) 2014-2017, Christopher Jeffrey (MIT License).
|
|
||||||
* https://github.com/bcoin-org/bcoin
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const assert = require('assert');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LRU Cache
|
|
||||||
* @alias module:utils.LRU
|
|
||||||
*/
|
|
||||||
|
|
||||||
class LRU {
|
|
||||||
/**
|
|
||||||
* Create an LRU cache.
|
|
||||||
* @constructor
|
|
||||||
* @param {Number} capacity
|
|
||||||
* @param {Function?} getSize
|
|
||||||
*/
|
|
||||||
|
|
||||||
constructor(capacity, getSize) {
|
|
||||||
this.map = new Map();
|
|
||||||
this.size = 0;
|
|
||||||
this.items = 0;
|
|
||||||
this.head = null;
|
|
||||||
this.tail = null;
|
|
||||||
this.pending = null;
|
|
||||||
|
|
||||||
assert(typeof capacity === 'number', 'Capacity must be a number.');
|
|
||||||
assert(capacity >= 0, 'Capacity cannot be negative.');
|
|
||||||
assert(!getSize || typeof getSize === 'function', 'Bad size callback.');
|
|
||||||
|
|
||||||
this.capacity = capacity;
|
|
||||||
this.getSize = getSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculate size of an item.
|
|
||||||
* @private
|
|
||||||
* @param {LRUItem} item
|
|
||||||
* @returns {Number} Size.
|
|
||||||
*/
|
|
||||||
|
|
||||||
_getSize(item) {
|
|
||||||
if (this.getSize) {
|
|
||||||
const keySize = Math.floor(item.key.length * 1.375);
|
|
||||||
return 120 + keySize + this.getSize(item.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compact the LRU linked list.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
_compact() {
|
|
||||||
if (this.size <= this.capacity)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let item = null;
|
|
||||||
let next = null;
|
|
||||||
|
|
||||||
for (item = this.head; item; item = next) {
|
|
||||||
if (this.size <= this.capacity)
|
|
||||||
break;
|
|
||||||
|
|
||||||
this.size -= this._getSize(item);
|
|
||||||
this.items -= 1;
|
|
||||||
this.map.delete(item.key);
|
|
||||||
|
|
||||||
next = item.next;
|
|
||||||
|
|
||||||
item.prev = null;
|
|
||||||
item.next = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!item) {
|
|
||||||
this.head = null;
|
|
||||||
this.tail = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.head = item;
|
|
||||||
item.prev = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset the cache. Clear all items.
|
|
||||||
*/
|
|
||||||
|
|
||||||
reset() {
|
|
||||||
let item, next;
|
|
||||||
|
|
||||||
for (item = this.head; item; item = next) {
|
|
||||||
this.map.delete(item.key);
|
|
||||||
this.items -= 1;
|
|
||||||
next = item.next;
|
|
||||||
item.prev = null;
|
|
||||||
item.next = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(!item);
|
|
||||||
|
|
||||||
this.size = 0;
|
|
||||||
this.head = null;
|
|
||||||
this.tail = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add an item to the cache.
|
|
||||||
* @param {String|Number} key
|
|
||||||
* @param {Object} value
|
|
||||||
*/
|
|
||||||
|
|
||||||
set(key, value) {
|
|
||||||
if (this.capacity === 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let item = this.map.get(key);
|
|
||||||
|
|
||||||
if (item) {
|
|
||||||
this.size -= this._getSize(item);
|
|
||||||
item.value = value;
|
|
||||||
this.size += this._getSize(item);
|
|
||||||
this._removeList(item);
|
|
||||||
this._appendList(item);
|
|
||||||
this._compact();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
item = new LRUItem(key, value);
|
|
||||||
|
|
||||||
this.map.set(key, item);
|
|
||||||
|
|
||||||
this._appendList(item);
|
|
||||||
|
|
||||||
this.size += this._getSize(item);
|
|
||||||
this.items += 1;
|
|
||||||
|
|
||||||
this._compact();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve an item from the cache.
|
|
||||||
* @param {String|Number} key
|
|
||||||
* @returns {Object} Item.
|
|
||||||
*/
|
|
||||||
|
|
||||||
get(key) {
|
|
||||||
if (this.capacity === 0)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
const item = this.map.get(key);
|
|
||||||
|
|
||||||
if (!item)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
this._removeList(item);
|
|
||||||
this._appendList(item);
|
|
||||||
|
|
||||||
return item.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test whether the cache contains a key.
|
|
||||||
* @param {String|Number} key
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
|
|
||||||
has(key) {
|
|
||||||
if (this.capacity === 0)
|
|
||||||
return false;
|
|
||||||
return this.map.has(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove an item from the cache.
|
|
||||||
* @param {String|Number} key
|
|
||||||
* @returns {Boolean} Whether an item was removed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
remove(key) {
|
|
||||||
if (this.capacity === 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const item = this.map.get(key);
|
|
||||||
|
|
||||||
if (!item)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
this.size -= this._getSize(item);
|
|
||||||
this.items -= 1;
|
|
||||||
|
|
||||||
this.map.delete(key);
|
|
||||||
|
|
||||||
this._removeList(item);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepend an item to the linked list (sets new head).
|
|
||||||
* @private
|
|
||||||
* @param {LRUItem}
|
|
||||||
*/
|
|
||||||
|
|
||||||
_prependList(item) {
|
|
||||||
this._insertList(null, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Append an item to the linked list (sets new tail).
|
|
||||||
* @private
|
|
||||||
* @param {LRUItem}
|
|
||||||
*/
|
|
||||||
|
|
||||||
_appendList(item) {
|
|
||||||
this._insertList(this.tail, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Insert item into the linked list.
|
|
||||||
* @private
|
|
||||||
* @param {LRUItem|null} ref
|
|
||||||
* @param {LRUItem} item
|
|
||||||
*/
|
|
||||||
|
|
||||||
_insertList(ref, item) {
|
|
||||||
assert(!item.next);
|
|
||||||
assert(!item.prev);
|
|
||||||
|
|
||||||
if (ref == null) {
|
|
||||||
if (!this.head) {
|
|
||||||
this.head = item;
|
|
||||||
this.tail = item;
|
|
||||||
} else {
|
|
||||||
this.head.prev = item;
|
|
||||||
item.next = this.head;
|
|
||||||
this.head = item;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
item.next = ref.next;
|
|
||||||
item.prev = ref;
|
|
||||||
ref.next = item;
|
|
||||||
|
|
||||||
if (ref === this.tail)
|
|
||||||
this.tail = item;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove item from the linked list.
|
|
||||||
* @private
|
|
||||||
* @param {LRUItem}
|
|
||||||
*/
|
|
||||||
|
|
||||||
_removeList(item) {
|
|
||||||
if (item.prev)
|
|
||||||
item.prev.next = item.next;
|
|
||||||
|
|
||||||
if (item.next)
|
|
||||||
item.next.prev = item.prev;
|
|
||||||
|
|
||||||
if (item === this.head)
|
|
||||||
this.head = item.next;
|
|
||||||
|
|
||||||
if (item === this.tail)
|
|
||||||
this.tail = item.prev || this.head;
|
|
||||||
|
|
||||||
if (!this.head)
|
|
||||||
assert(!this.tail);
|
|
||||||
|
|
||||||
if (!this.tail)
|
|
||||||
assert(!this.head);
|
|
||||||
|
|
||||||
item.prev = null;
|
|
||||||
item.next = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Collect all keys in the cache, sorted by LRU.
|
|
||||||
* @returns {String[]}
|
|
||||||
*/
|
|
||||||
|
|
||||||
keys() {
|
|
||||||
const items = [];
|
|
||||||
|
|
||||||
for (let item = this.head; item; item = item.next) {
|
|
||||||
if (item === this.head)
|
|
||||||
assert(!item.prev);
|
|
||||||
if (!item.prev)
|
|
||||||
assert(item === this.head);
|
|
||||||
if (!item.next)
|
|
||||||
assert(item === this.tail);
|
|
||||||
items.push(item.key);
|
|
||||||
}
|
|
||||||
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Collect all values in the cache, sorted by LRU.
|
|
||||||
* @returns {String[]}
|
|
||||||
*/
|
|
||||||
|
|
||||||
values() {
|
|
||||||
const items = [];
|
|
||||||
|
|
||||||
for (let item = this.head; item; item = item.next)
|
|
||||||
items.push(item.value);
|
|
||||||
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert the LRU cache to an array of items.
|
|
||||||
* @returns {Object[]}
|
|
||||||
*/
|
|
||||||
|
|
||||||
toArray() {
|
|
||||||
const items = [];
|
|
||||||
|
|
||||||
for (let item = this.head; item; item = item.next)
|
|
||||||
items.push(item);
|
|
||||||
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create an atomic batch for the lru
|
|
||||||
* (used for caching database writes).
|
|
||||||
* @returns {LRUBatch}
|
|
||||||
*/
|
|
||||||
|
|
||||||
batch() {
|
|
||||||
return new LRUBatch(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Start the pending batch.
|
|
||||||
*/
|
|
||||||
|
|
||||||
start() {
|
|
||||||
assert(!this.pending);
|
|
||||||
this.pending = this.batch();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear the pending batch.
|
|
||||||
*/
|
|
||||||
|
|
||||||
clear() {
|
|
||||||
assert(this.pending);
|
|
||||||
this.pending.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Drop the pending batch.
|
|
||||||
*/
|
|
||||||
|
|
||||||
drop() {
|
|
||||||
assert(this.pending);
|
|
||||||
this.pending = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Commit the pending batch.
|
|
||||||
*/
|
|
||||||
|
|
||||||
commit() {
|
|
||||||
assert(this.pending);
|
|
||||||
this.pending.commit();
|
|
||||||
this.pending = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Push an item onto the pending batch.
|
|
||||||
* @param {String} key
|
|
||||||
* @param {Object} value
|
|
||||||
*/
|
|
||||||
|
|
||||||
push(key, value) {
|
|
||||||
assert(this.pending);
|
|
||||||
|
|
||||||
if (this.capacity === 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this.pending.set(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Push a removal onto the pending batch.
|
|
||||||
* @param {String} key
|
|
||||||
*/
|
|
||||||
|
|
||||||
unpush(key) {
|
|
||||||
assert(this.pending);
|
|
||||||
|
|
||||||
if (this.capacity === 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this.pending.remove(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LRU Item
|
|
||||||
* @alias module:utils.LRUItem
|
|
||||||
*/
|
|
||||||
|
|
||||||
class LRUItem {
|
|
||||||
/**
|
|
||||||
* Create an LRU item.
|
|
||||||
* @constructor
|
|
||||||
* @private
|
|
||||||
* @param {String} key
|
|
||||||
* @param {Object} value
|
|
||||||
*/
|
|
||||||
|
|
||||||
constructor(key, value) {
|
|
||||||
this.key = key;
|
|
||||||
this.value = value;
|
|
||||||
this.next = null;
|
|
||||||
this.prev = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LRU Batch
|
|
||||||
* @alias module:utils.LRUBatch
|
|
||||||
*/
|
|
||||||
|
|
||||||
class LRUBatch {
|
|
||||||
/**
|
|
||||||
* Create an LRU batch.
|
|
||||||
* @constructor
|
|
||||||
* @param {LRU} lru
|
|
||||||
*/
|
|
||||||
|
|
||||||
constructor(lru) {
|
|
||||||
this.lru = lru;
|
|
||||||
this.ops = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Push an item onto the batch.
|
|
||||||
* @param {String} key
|
|
||||||
* @param {Object} value
|
|
||||||
*/
|
|
||||||
|
|
||||||
set(key, value) {
|
|
||||||
this.ops.push(new LRUOp(false, key, value));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Push a removal onto the batch.
|
|
||||||
* @param {String} key
|
|
||||||
*/
|
|
||||||
|
|
||||||
remove(key) {
|
|
||||||
this.ops.push(new LRUOp(true, key, null));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear the batch.
|
|
||||||
*/
|
|
||||||
|
|
||||||
clear() {
|
|
||||||
this.ops.length = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Commit the batch.
|
|
||||||
*/
|
|
||||||
|
|
||||||
commit() {
|
|
||||||
for (const op of this.ops) {
|
|
||||||
if (op.remove) {
|
|
||||||
this.lru.remove(op.key);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
this.lru.set(op.key, op.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.ops.length = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LRU Op
|
|
||||||
* @alias module:utils.LRUOp
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
class LRUOp {
|
|
||||||
/**
|
|
||||||
* Create an LRU op.
|
|
||||||
* @constructor
|
|
||||||
* @param {Boolean} remove
|
|
||||||
* @param {String} key
|
|
||||||
* @param {Object} value
|
|
||||||
*/
|
|
||||||
|
|
||||||
constructor(remove, key, value) {
|
|
||||||
this.remove = remove;
|
|
||||||
this.key = key;
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Expose
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = LRU;
|
|
||||||
@ -20,13 +20,13 @@ const bdb = require('bdb');
|
|||||||
const hash256 = require('bcrypto/lib/hash256');
|
const hash256 = require('bcrypto/lib/hash256');
|
||||||
const BN = require('bn.js');
|
const BN = require('bn.js');
|
||||||
const bio = require('bufio');
|
const bio = require('bufio');
|
||||||
|
const LRU = require('blru');
|
||||||
const util = require('../lib/utils/util');
|
const util = require('../lib/utils/util');
|
||||||
const OldCoins = require('./coins/coins');
|
const OldCoins = require('./coins/coins');
|
||||||
const OldUndoCoins = require('./coins/undocoins');
|
const OldUndoCoins = require('./coins/undocoins');
|
||||||
const CoinEntry = require('../lib/coins/coinentry');
|
const CoinEntry = require('../lib/coins/coinentry');
|
||||||
const UndoCoins = require('../lib/coins/undocoins');
|
const UndoCoins = require('../lib/coins/undocoins');
|
||||||
const Block = require('../lib/primitives/block');
|
const Block = require('../lib/primitives/block');
|
||||||
const LRU = require('../lib/utils/lru');
|
|
||||||
const consensus = require('../lib/protocol/consensus');
|
const consensus = require('../lib/protocol/consensus');
|
||||||
|
|
||||||
const shouldPrune = process.argv.indexOf('--prune') !== -1;
|
const shouldPrune = process.argv.indexOf('--prune') !== -1;
|
||||||
|
|||||||
59
package.json
59
package.json
@ -23,41 +23,46 @@
|
|||||||
"node": ">=7.6.0"
|
"node": ">=7.6.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bcfg": "~0.0.1",
|
"bcfg": "~0.0.2",
|
||||||
"bclient": "~0.0.1",
|
"bclient": "~0.0.2",
|
||||||
"bcrypto": "~0.1.0",
|
"bcrypto": "~0.2.0",
|
||||||
"bdb": "~0.0.2",
|
"bdb": "~0.0.3",
|
||||||
"bdns": "~0.0.1",
|
"bdns": "~0.0.2",
|
||||||
"bevent": "~0.0.1",
|
"bevent": "~0.0.2",
|
||||||
"bfile": "~0.0.1",
|
"bfile": "~0.0.2",
|
||||||
"bfilter": "~0.0.1",
|
"bfilter": "~0.1.0",
|
||||||
"binet": "~0.0.1",
|
"bheep": "~0.0.1",
|
||||||
"blgr": "~0.0.1",
|
"binet": "~0.1.0",
|
||||||
"bmutex": "~0.0.1",
|
"blgr": "~0.0.2",
|
||||||
|
"blru": "~0.0.1",
|
||||||
|
"blst": "~0.0.1",
|
||||||
|
"bmutex": "~0.0.2",
|
||||||
"bn.js": "~4.11.8",
|
"bn.js": "~4.11.8",
|
||||||
"bsock": "~0.0.1",
|
"bsip": "~0.0.2",
|
||||||
"bsocks": "~0.0.1",
|
"bsock": "~0.0.2",
|
||||||
"bstring": "~0.0.1",
|
"bsocks": "~0.0.2",
|
||||||
"btcp": "~0.0.1",
|
"bstring": "~0.0.2",
|
||||||
"bufio": "~0.0.1",
|
"btcp": "~0.0.2",
|
||||||
"bupnp": "~0.0.1",
|
"bufio": "~0.0.3",
|
||||||
"bval": "~0.0.1",
|
"bupnp": "~0.0.2",
|
||||||
"bweb": "~0.0.1",
|
"bval": "~0.0.2",
|
||||||
"n64": "~0.1.0"
|
"bweb": "~0.0.2",
|
||||||
|
"mrmr": "~0.0.1",
|
||||||
|
"n64": "~0.1.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"babel-core": "^6.26.0",
|
"babel-core": "^6.26.0",
|
||||||
"babel-loader": "^7.1.2",
|
"babel-loader": "^7.1.4",
|
||||||
"babel-plugin-transform-runtime": "^6.23.0",
|
"babel-plugin-transform-runtime": "^6.23.0",
|
||||||
"babel-preset-env": "^1.6.1",
|
"babel-preset-env": "^1.6.1",
|
||||||
"babelify": "^8.0.0",
|
"babelify": "^8.0.0",
|
||||||
"browserify": "^14.5.0",
|
"browserify": "^16.1.1",
|
||||||
"eslint": "^4.14.0",
|
"eslint": "^4.18.2",
|
||||||
"jsdoc": "^3.5.5",
|
"jsdoc": "^3.5.5",
|
||||||
"mocha": "^4.0.1",
|
"mocha": "^5.0.4",
|
||||||
"uglify-es": "^3.1.3",
|
"uglify-es": "^3.3.9",
|
||||||
"uglifyjs-webpack-plugin": "^1.1.5",
|
"uglifyjs-webpack-plugin": "^1.2.3",
|
||||||
"webpack": "^3.10.0"
|
"webpack": "^4.1.1"
|
||||||
},
|
},
|
||||||
"main": "./lib/bcoin.js",
|
"main": "./lib/bcoin.js",
|
||||||
"bin": {
|
"bin": {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user