bitpay / bitcore-p2p

Interface to the bitcoin P2P network for bitcore
MIT License
80 stars 276 forks source link

Docs for using bloom filter and BIP37 support #44

Open braydonf opened 9 years ago

braydonf commented 9 years ago

With the filter messages now included, we need docs on how to create a bloom filter, and send a filterload message and receive messages (such as an initial relay boolean).

braydonf commented 9 years ago

Here is start for connecting with the relay disabled option, loading a filter and requesting filtered blocks, and handling txs:


'use strict';

var p2p = require('../');
var Pool = p2p.Pool;
var BloomFilter = p2p.BloomFilter;
var qrcode = require('qrcode-terminal');
var Messages = p2p.Messages;
var bitcore = require('bitcore');
var Networks = bitcore.Networks;

var pool = new Pool(Networks.testnet, {
  relay: false,
  dnsSeed: false,
  listenAddr: false,
  addrs: [{ip: {v4: 'localhost'}}]
});

pool.connect();
var privateKey = bitcore.PrivateKey.fromWIF('...');
var publicKey = privateKey.toPublicKey();

console.log('publickey buffer', publicKey.toBuffer());
console.log('address', publicKey.toAddress());

qrcode.generate('bitcoin:' + publicKey.toAddress() + '?amount=0.01');

var filter = BloomFilter.create(10, 0.01);
filter.insert(publicKey.toBuffer());
filter.insert(bitcore.crypto.Hash.sha256ripemd160(publicKey.toBuffer()));

pool.on('peerready', function(peer) {
  var message = new Messages.FilterLoad(filter);
  peer.sendMessage(message);
});

pool.on('peerinv', function(peer, message) {
  var inventory = message.inventory;
  var filteredInventory = [];
  inventory.forEach(function(inv) {
    // request a filtered block                                                                                                                                                                                       
    if (inv.type === Messages.Inventory.TYPE.BLOCK) {
      var filteredInv = new Messages.Inventory.forItem(Messages.Inventory.TYPE.FILTERED_BLOCK, inv.hash);
      filteredInventory.push(filteredInv);
    }
    if (inv.type === Messages.Inventory.TYPE.TX) {
      filteredInventory.push(inv);
    }
  });

  var getdata = new Messages.GetData(filteredInventory);
  peer.sendMessage(getdata);

});

pool.on('peermerkleblock', function(peer, message) {
  console.log('merkleblock', message);
});

pool.on('peertx', function(peer, message) {
  console.log('tx', message);
});
braydonf commented 9 years ago

I thinking it may be good to have a bloomfilter.insertPublicKey(key) to handle Bitcore objects appropriately. Thoughts?