Merge branch 'master' into releases
This commit is contained in:
commit
b1fb0a6812
@ -3,7 +3,7 @@ P2P Networking capabilities for bitcore
|
||||
|
||||
[](https://www.npmjs.org/package/bitcore-p2p)
|
||||
[](https://travis-ci.org/bitpay/bitcore-p2p)
|
||||
[](https://coveralls.io/r/bitpay/bitcore-p2p?branch=master)
|
||||
[](https://coveralls.io/r/bitpay/bitcore-p2p?branch=master)
|
||||
|
||||
bitcore-p2p adds support for connecting to the bitcoin p2p network on node.
|
||||
|
||||
@ -12,10 +12,10 @@ See [the main bitcore repo](https://github.com/bitpay/bitcore) for more informat
|
||||
## Getting Started
|
||||
|
||||
```sh
|
||||
npm install bitcore-rpc
|
||||
npm install bitcore-p2p
|
||||
```
|
||||
```sh
|
||||
bower install bitcore-rpc
|
||||
bower install bitcore-p2p
|
||||
```
|
||||
In order to connect to the bitcore network, you'll need to know the IP address of at least one node of the network. You can do that by using the known DNS servers. Then, you can connect to it:
|
||||
|
||||
|
||||
38
docs/index.md
Normal file
38
docs/index.md
Normal file
@ -0,0 +1,38 @@
|
||||
---
|
||||
title: Peer-to-Peer Networking
|
||||
description: Peer-to-Peer Networking Capabilities for Bitcore
|
||||
---
|
||||
# Peer-to-Peer
|
||||
|
||||
## Description
|
||||
|
||||
The `bitcore-p2p` module provides peer-to-peer networking capabilites for [Bitcore](https://github.com/bitpay/bitcore), and includes [Peer](peer.md) and [Pool](pool.md) classes. A [Message](messages.md) class is also exposed, in addition to [several types of messages](messages.md). Pool will maintain connection to several peers, Peers represents a node in the bitcoin network, and Message represents data sent to and from a Peer. For detailed technical information about the bitcoin protocol, please visit the [Protocol Specification](https://en.bitcoin.it/wiki/Protocol_specification) on the Bitcoin Wiki.
|
||||
|
||||
## Installation
|
||||
|
||||
Peer-to-peer is implemented as a seperate module.
|
||||
|
||||
For node projects:
|
||||
```bash
|
||||
npm install bitcore-p2p --save
|
||||
```
|
||||
|
||||
For client-side projects:
|
||||
```bash
|
||||
bower install bitcore-p2p --save
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
```javascript
|
||||
var Peer = require('bitcore-p2p').Peer;
|
||||
var peer = new Peer('5.9.85.34');
|
||||
|
||||
// handle events
|
||||
peer.on('inv', function(message) {
|
||||
// message.inventory[]
|
||||
});
|
||||
|
||||
peer.connect();
|
||||
|
||||
```
|
||||
20
docs/peer.md
20
docs/peer.md
@ -12,8 +12,7 @@ Represents a node from the p2p bitcoin network. The Peer class supports connecti
|
||||
The code to create a new peer looks like this:
|
||||
|
||||
```javascript
|
||||
var bitcore = require('bitcore');
|
||||
var Peer = bitcore.transport.Peer;
|
||||
var Peer = require('bitcore-p2p').Peer;
|
||||
|
||||
// default port
|
||||
var livenetPeer = new Peer('5.9.85.34');
|
||||
@ -39,8 +38,7 @@ A peer instance is always in one of the following states:
|
||||
You can subscribe to the change of those states as follows:
|
||||
|
||||
```javascript
|
||||
var bitcore = require('bitcore');
|
||||
var Peer = bitcore.transport.Peer;
|
||||
var Peer = require('bitcore-p2p').Peer;
|
||||
|
||||
var peer = new Peer('5.9.85.34');
|
||||
|
||||
@ -61,8 +59,8 @@ peer.connect();
|
||||
Once connected, a peer instance can send and receive messages. Every time a message arrives it's emitted as a new event. Let's see an example of this:
|
||||
|
||||
```javascript
|
||||
var bitcore = require('bitcore');
|
||||
var peer = new bitcore.transport.Peer('5.9.85.34');
|
||||
var Peer = require('bitcore-p2p').Peer;
|
||||
var peer = new Peer('5.9.85.34');
|
||||
|
||||
// handle events
|
||||
peer.on('inv', function(message) {
|
||||
@ -82,16 +80,18 @@ peer.connect();
|
||||
|
||||
## Sending messages
|
||||
|
||||
In order to send messages the Peer class offers the `sendMessage(message)` method, which receives an instance of a message. All supported messages can be found on the `bitcore.transport.Messages` module. For more information about messages refer to the [protocol specification](https://en.bitcoin.it/wiki/Protocol_specification).
|
||||
In order to send messages the Peer class offers the `sendMessage(message)` method, which receives an instance of a message. All supported messages can be found in the `Messages` module. For more information about messages refer to the [protocol specification](https://en.bitcoin.it/wiki/Protocol_specification).
|
||||
|
||||
An example for requesting other connected nodes to a peers looks like this:
|
||||
|
||||
```javascript
|
||||
var bitcore = require('bitcore');
|
||||
var peer = new bitcore.transport.Peer('5.9.85.34');
|
||||
var p2p = require('bitcore-p2p')
|
||||
var Peer = p2p.Peer;
|
||||
var Messages = p2p.Messages;
|
||||
var peer = new Peer('5.9.85.34');
|
||||
|
||||
peer.on('ready', function() {
|
||||
var message = new bitcore.transport.Messages.GetAddresses();
|
||||
var message = new Messages.GetAddresses();
|
||||
peer.sendMessage(message);
|
||||
});
|
||||
|
||||
|
||||
@ -9,9 +9,8 @@ The quickest way to get connected is to run the following:
|
||||
|
||||
```javascript
|
||||
|
||||
var bitcore = require('bitcore');
|
||||
var Pool = bitcore.transport.Pool;
|
||||
var Networks = bitcore.Networks;
|
||||
var Pool = require('bitcore-p2p').Pool;
|
||||
var Networks = require('bitcore').Networks;
|
||||
|
||||
var pool = new Pool(Networks.livenet);
|
||||
|
||||
|
||||
@ -552,7 +552,7 @@ function Block(block) {
|
||||
|
||||
/**
|
||||
* @type {Block}
|
||||
* The
|
||||
* @desc The block received
|
||||
*/
|
||||
this.block = block;
|
||||
}
|
||||
|
||||
@ -52,14 +52,14 @@
|
||||
"url": "https://github.com/bitpay/bitcore-p2p.git"
|
||||
},
|
||||
"dependencies": {
|
||||
"bitcore": "^0.8.6",
|
||||
"bitcore": "^0.9.0",
|
||||
"bufferput": "^0.1.2",
|
||||
"buffers": "^0.1.1",
|
||||
"karma-detect-browsers": "^0.1.3",
|
||||
"socks5-client": "^0.3.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"bitcore-build": "^0.4.2",
|
||||
"bitcore-build": "^0.5.0",
|
||||
"brfs": "^1.2.0",
|
||||
"chai": "~1.10.0",
|
||||
"gulp": "^3.8.10",
|
||||
|
||||
BIN
test/connection.log
Normal file
BIN
test/connection.log
Normal file
Binary file not shown.
@ -199,7 +199,7 @@ describe('Messages', function() {
|
||||
});
|
||||
|
||||
describe('Block', function() {
|
||||
var blockHex = 'f9beb4d91d0100000100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000';
|
||||
var blockHex = '0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000';
|
||||
var block = new bitcore.Block(new Buffer(blockHex, 'hex'));
|
||||
|
||||
it('should be able to create instance', function() {
|
||||
|
||||
55
test/peer.js
55
test/peer.js
@ -1,5 +1,6 @@
|
||||
'use strict';
|
||||
|
||||
var _ = require('lodash');
|
||||
var chai = require('chai');
|
||||
var Net = require('net');
|
||||
var Socks5Client = require('socks5-client');
|
||||
@ -7,6 +8,8 @@ var Socks5Client = require('socks5-client');
|
||||
/* jshint unused: false */
|
||||
var should = chai.should();
|
||||
var expect = chai.expect;
|
||||
var sinon = require('sinon');
|
||||
var fs = require('fs');
|
||||
|
||||
var bitcore = require('bitcore');
|
||||
var P2P = require('../');
|
||||
@ -15,6 +18,58 @@ var Networks = bitcore.Networks;
|
||||
|
||||
describe('Peer', function() {
|
||||
|
||||
describe('Integration test', function() {
|
||||
it('parses this stream of data from a connection', function(callback) {
|
||||
var peer = new P2P.Peer('');
|
||||
var stub = sinon.stub();
|
||||
var dataCallback;
|
||||
var connectCallback;
|
||||
var expected = {
|
||||
version: 1,
|
||||
verack: 1,
|
||||
inv: 18,
|
||||
addr: 4
|
||||
};
|
||||
var received = {
|
||||
version: 0,
|
||||
verack: 0,
|
||||
inv: 0,
|
||||
addr: 0
|
||||
};
|
||||
stub.on = function() {
|
||||
if (arguments[0] === 'data') {
|
||||
dataCallback = arguments[1];
|
||||
}
|
||||
if (arguments[0] === 'connect') {
|
||||
connectCallback = arguments[1];
|
||||
}
|
||||
};
|
||||
stub.write = function() {
|
||||
};
|
||||
stub.connect = function() {
|
||||
connectCallback();
|
||||
};
|
||||
peer._getSocket = function() {
|
||||
return stub;
|
||||
};
|
||||
peer.on('connect', function() {
|
||||
dataCallback(fs.readFileSync('./test/connection.log'));
|
||||
});
|
||||
var check = function(message) {
|
||||
received[message.command]++;
|
||||
if (_.isEqual(received, expected)) {
|
||||
callback();
|
||||
}
|
||||
};
|
||||
peer.on('version', check);
|
||||
peer.on('verack', check);
|
||||
peer.on('addr', check);
|
||||
peer.on('inv', check);
|
||||
peer.connect();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
it('should be able to create instance', function() {
|
||||
var peer = new Peer('localhost');
|
||||
peer.host.should.equal('localhost');
|
||||
|
||||
Loading…
Reference in New Issue
Block a user