-
-
Save jprichardson/6729629a73b77551a6758e1aa681bf34 to your computer and use it in GitHub Desktop.
BIP-0037 example on JavaScript (bitcore-lib, bitcore-p2p, webcoin merkleTree)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ 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