Skip to content
This repository was archived by the owner on Apr 3, 2019. It is now read-only.

Commit 9702105

Browse files
committed
Merge pull request #44 from braydonf/add-regtest
Networks: Added regtest to networks
2 parents 8bd4663 + 0c983c9 commit 9702105

File tree

3 files changed

+150
-17
lines changed

3 files changed

+150
-17
lines changed

docs/networks.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,23 @@ Bitcore provides support for the main bitcoin network as well as for `testnet3`,
33

44
The `Network` namespace has a function, `get(...)` that returns an instance of a `Network` or `undefined`. The only argument to this function is some kind of identifier of the network: either its name, a reference to a Network object, or a number used as a magic constant to identify the network (for example, the value `0` that gives bitcoin addresses the distinctive `'1'` at its beginning on livenet, is a `0x6F` for testnet).
55

6+
## Regtest
7+
8+
The regtest network is useful for development as it's possible to programmatically and instantly generate blocks for testing. It's currently supported as a variation of testnet. Here is an example of how to use regtest with the Bitcore Library:
9+
10+
```js
11+
// Standard testnet
12+
> bitcore.Networks.testnet.networkMagic;
13+
<Buffer 0b 11 09 07>
14+
```
15+
16+
```js
17+
// Enabling testnet to use the regtest port and magicNumber
18+
> bitcore.Networks.enableRegtest();
19+
> bitcore.Networks.testnet.networkMagic;
20+
<Buffer fa bf b5 da>
21+
```
22+
623
## Setting the Default Network
724
Most projects will only need to work with one of the networks. The value of `Networks.defaultNetwork` can be set to `Networks.testnet` if the project will need to only to work on testnet (the default is `Networks.livenet`).
825

lib/networks.js

Lines changed: 110 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,26 @@ function addNetwork(data) {
7575
privatekey: data.privatekey,
7676
scripthash: data.scripthash,
7777
xpubkey: data.xpubkey,
78-
xprivkey: data.xprivkey,
79-
networkMagic: BufferUtil.integerAsBuffer(data.networkMagic),
80-
port: data.port,
81-
dnsSeeds: data.dnsSeeds
78+
xprivkey: data.xprivkey
8279
});
8380

81+
if (data.networkMagic) {
82+
JSUtil.defineImmutable(network, {
83+
networkMagic: BufferUtil.integerAsBuffer(data.networkMagic)
84+
});
85+
}
86+
87+
if (data.port) {
88+
JSUtil.defineImmutable(network, {
89+
port: data.port
90+
});
91+
}
92+
93+
if (data.dnsSeeds) {
94+
JSUtil.defineImmutable(network, {
95+
dnsSeeds: data.dnsSeeds
96+
});
97+
}
8498
_.each(network, function(value) {
8599
if (!_.isUndefined(value) && !_.isObject(value)) {
86100
networkMaps[value] = network;
@@ -132,35 +146,112 @@ addNetwork({
132146
]
133147
});
134148

149+
/**
150+
* @instance
151+
* @member Networks#livenet
152+
*/
153+
var livenet = get('livenet');
154+
135155
addNetwork({
136156
name: 'testnet',
137-
alias: 'testnet',
157+
alias: 'regtest',
138158
pubkeyhash: 0x6f,
139159
privatekey: 0xef,
140160
scripthash: 0xc4,
141161
xpubkey: 0x043587cf,
142-
xprivkey: 0x04358394,
143-
networkMagic: 0x0b110907,
144-
port: 18333,
145-
dnsSeeds: [
162+
xprivkey: 0x04358394
163+
});
164+
165+
/**
166+
* @instance
167+
* @member Networks#testnet
168+
*/
169+
var testnet = get('testnet');
170+
171+
// Add configurable values for testnet/regtest
172+
173+
var TESTNET = {
174+
PORT: 18333,
175+
NETWORK_MAGIC: BufferUtil.integerAsBuffer(0x0b110907),
176+
DNS_SEEDS: [
146177
'testnet-seed.bitcoin.petertodd.org',
147178
'testnet-seed.bluematt.me',
148179
'testnet-seed.alexykot.me',
149180
'testnet-seed.bitcoin.schildbach.de'
150-
],
181+
]
182+
};
183+
184+
for (var key in TESTNET) {
185+
if (!_.isObject(TESTNET[key])) {
186+
networkMaps[TESTNET[key]] = testnet;
187+
}
188+
}
189+
190+
var REGTEST = {
191+
PORT: 18444,
192+
NETWORK_MAGIC: BufferUtil.integerAsBuffer(0xfabfb5da),
193+
DNS_SEEDS: []
194+
};
195+
196+
for (var key in REGTEST) {
197+
if (!_.isObject(REGTEST[key])) {
198+
networkMaps[REGTEST[key]] = testnet;
199+
}
200+
}
201+
202+
Object.defineProperty(testnet, 'port', {
203+
enumerable: true,
204+
configurable: false,
205+
get: function() {
206+
if (this.regtestEnabled) {
207+
return REGTEST.PORT;
208+
} else {
209+
return TESTNET.PORT;
210+
}
211+
}
212+
});
213+
214+
Object.defineProperty(testnet, 'networkMagic', {
215+
enumerable: true,
216+
configurable: false,
217+
get: function() {
218+
if (this.regtestEnabled) {
219+
return REGTEST.NETWORK_MAGIC;
220+
} else {
221+
return TESTNET.NETWORK_MAGIC;
222+
}
223+
}
224+
});
225+
226+
Object.defineProperty(testnet, 'dnsSeeds', {
227+
enumerable: true,
228+
configurable: false,
229+
get: function() {
230+
if (this.regtestEnabled) {
231+
return REGTEST.DNS_SEEDS;
232+
} else {
233+
return TESTNET.DNS_SEEDS;
234+
}
235+
}
151236
});
152237

153238
/**
154-
* @instance
155-
* @member Networks#livenet
239+
* @function
240+
* @member Networks#enableRegtest
241+
* Will enable regtest features for testnet
156242
*/
157-
var livenet = get('livenet');
243+
function enableRegtest() {
244+
testnet.regtestEnabled = true;
245+
}
158246

159247
/**
160-
* @instance
161-
* @member Networks#testnet
248+
* @function
249+
* @member Networks#disableRegtest
250+
* Will disable regtest features for testnet
162251
*/
163-
var testnet = get('testnet');
252+
function disableRegtest() {
253+
testnet.regtestEnabled = false;
254+
}
164255

165256
/**
166257
* @namespace Networks
@@ -172,5 +263,7 @@ module.exports = {
172263
livenet: livenet,
173264
mainnet: livenet,
174265
testnet: testnet,
175-
get: get
266+
get: get,
267+
enableRegtest: enableRegtest,
268+
disableRegtest: disableRegtest
176269
};

test/networks.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,29 @@ describe('Networks', function() {
1515
should.exist(networks.defaultNetwork);
1616
});
1717

18+
it('will enable/disable regtest Network', function() {
19+
networks.enableRegtest();
20+
networks.testnet.networkMagic.should.deep.equal(new Buffer('fabfb5da', 'hex'));
21+
networks.testnet.port.should.equal(18444);
22+
networks.testnet.dnsSeeds.should.deep.equal([]);
23+
networks.testnet.regtestEnabled.should.equal(true);
24+
25+
networks.disableRegtest();
26+
networks.testnet.networkMagic.should.deep.equal(new Buffer('0b110907', 'hex'));
27+
networks.testnet.port.should.equal(18333);
28+
networks.testnet.dnsSeeds.should.deep.equal([
29+
'testnet-seed.bitcoin.petertodd.org',
30+
'testnet-seed.bluematt.me',
31+
'testnet-seed.alexykot.me',
32+
'testnet-seed.bitcoin.schildbach.de'
33+
]);
34+
});
35+
36+
it('will get network based on string "regtest" value', function() {
37+
var network = networks.get('regtest');
38+
network.should.equal(networks.testnet);
39+
});
40+
1841
it('should be able to define a custom Network', function() {
1942
var custom = {
2043
name: 'customnet',

0 commit comments

Comments
 (0)