Merge branch 'master' into releases

This commit is contained in:
Esteban Ordano 2015-01-21 17:07:33 -03:00
commit b1fb0a6812
9 changed files with 112 additions and 20 deletions

View File

@ -3,7 +3,7 @@ P2P Networking capabilities for bitcore
[![NPM Package](https://img.shields.io/npm/v/bitcore-p2p.svg?style=flat-square)](https://www.npmjs.org/package/bitcore-p2p)
[![Build Status](https://img.shields.io/travis/bitpay/bitcore-p2p.svg?branch=master&style=flat-square)](https://travis-ci.org/bitpay/bitcore-p2p)
[![Coverage Status](https://img.shields.io/coveralls/bitpay/bitcore-p2p.svg)](https://coveralls.io/r/bitpay/bitcore-p2p?branch=master)
[![Coverage Status](https://img.shields.io/coveralls/bitpay/bitcore-p2p.svg?style=flat-square)](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
View 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();
```

View File

@ -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);
});

View File

@ -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);

View File

@ -552,7 +552,7 @@ function Block(block) {
/**
* @type {Block}
* The
* @desc The block received
*/
this.block = block;
}

View File

@ -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

Binary file not shown.

View File

@ -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() {

View File

@ -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');