Skip to content

Instantly share code, notes, and snippets.

@jprichardson
Forked from fanatid/bip0037.js
Created April 14, 2016 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jprichardson/6729629a73b77551a6758e1aa681bf34 to your computer and use it in GitHub Desktop.
Save jprichardson/6729629a73b77551a6758e1aa681bf34 to your computer and use it in GitHub Desktop.
BIP-0037 example on JavaScript (bitcore-lib, bitcore-p2p, webcoin merkleTree)
var bitcore = require('bitcore-lib') // 0.13.14
var p2p = require('bitcore-p2p') // 1.1.0
var MerkleTree = require('webcoin/lib/merkleTree') // 1.0.2
var address = '1JSbd6CXJHzhGgadpio3HPXTZcSWzBHy3L'
var blockHash = '000000000000000006f9b9d985624bb621221cde9682a038a9a21403376c36f6' // 397690
// expect:
// tx: 0f15750e8a662ff7d02123677461477eb3b3222d6ca785b98f64c17d7d458699
// in block: 397697:0000000000000000021b3bd248ee38a47e0a9904d6a4bfbd7fcfe200bb533e97
// tx: ffe2822fd404e829ef4758617b01d2c4b9b26ab9a1a146e23be468aa0d881fa5
// in block: 397706:0000000000000000040e04147d502a27736d404a7a1dcddda8e490006be28157
var pool = new p2p.Pool({ relay: false, maxSize: 1 })
var messages = new p2p.Messages()
var _emit = pool.emit
pool.emit = function (type) {
console.log(`New event: ${type}`)
return _emit.apply(this, arguments)
}
var _sendMessage = pool.sendMessage
pool.sendMessage = function (message) {
console.log('Send message:', message.command)
return _sendMessage.apply(this, arguments)
}
pool.on('peerinv', (peer, msg) => {
console.log('peerinv:')
msg.inventory.forEach((item) => console.log(`${item.type} ${item.hash.reverse().toString('hex')}`))
})
pool.on('peerready', () => {
setTimeout(() => {
var filter = p2p.BloomFilter.create(100, 0.0001, 0, p2p.BloomFilter.BLOOM_UPDATE_ALL)
filter.insert(new Buffer(bitcore.Address(address).toObject().hash, 'hex'))
var message = messages.FilterLoad(filter)
pool.sendMessage(message)
}, 1000)
setTimeout(() => {
var message = messages.GetHeaders({
starts: [ new Buffer(blockHash, 'hex').reverse() ]
})
pool.sendMessage(message)
}, 2000)
})
pool.on('peerheaders', (peer, msg) => {
var items = msg.headers.slice(0, 20).map((item) => ({
type: 3,
hash: new Buffer(item.hash, 'hex').reverse()
}))
var message = messages.GetData(items)
pool.sendMessage(message)
})
pool.on('peermerkleblock', (peer, msg) => {
var tree = MerkleTree.fromMerkleBlock(msg.merkleBlock)
if (tree.txids.length === 0) return
console.log(`Block: ${msg.merkleBlock.header.hash}, txids: ${tree.txids.map(x => x.reverse().toString('hex')).join(' ,')}`)
})
pool.on('peertx', (peer, msg) => {
console.log('peertx:', msg.transaction.hash)
})
pool.connect()
$ node -v
v5.10.0
$ node bip0037.js
New event: seed
New event: seed
New event: seed
New event: seed
New event: seed
New event: seed
New event: peerconnect
(node) Buffer.get is deprecated. Use array indexes instead.
New event: peerversion
New event: peerready
New event: peerverack
New event: peerping
New event: peeraddr
New event: peergetheaders
Send message: filterload
Send message: getheaders
New event: peerheaders
Send message: getdata
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
Block: 0000000000000000021b3bd248ee38a47e0a9904d6a4bfbd7fcfe200bb533e97, txids: 0f15750e8a662ff7d02123677461477eb3b3222d6ca785b98f64c17d7d458699
New event: peertx
peertx: 0f15750e8a662ff7d02123677461477eb3b3222d6ca785b98f64c17d7d458699
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
Block: 0000000000000000040e04147d502a27736d404a7a1dcddda8e490006be28157, txids: ffe2822fd404e829ef4758617b01d2c4b9b26ab9a1a146e23be468aa0d881fa5
New event: peertx
peertx: ffe2822fd404e829ef4758617b01d2c4b9b26ab9a1a146e23be468aa0d881fa5
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
New event: peermerkleblock
^C
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment