2

I need your opinion, do you mind ? :)

I'm bulding a javascript layer on top of bitcoind. I have bitcoind running on my server with rpc & zmq enabled.

daemon=1
rpcallowip=0.0.0.0/0
rpcuser=xxxxxxxx
rpcpassword=xxxxxxxxx
server=1
rest=1
zmqpubhashblock=tcp://*:28332
zmqpubhashtx=tcp://*:28332
zmqpubrawblock=tcp://*:28332
zmqpubrawtx=tcp://*:28332
rpcworkqueue=100

My program goal is to listen for rawblock and rawtx ZMQ channels. This is my zmq client:

const socket = ZMQ.socket('sub')
socket.connect('tcp://myserverip:28332')

socket.on('message', (channel, data) => { 
  console.log(channel.toString())
})

So here is what happens :

subscribing to rawtx alone works, I receive the tx flow (approx 2.5tx per second)

socket.subscribe('rawtx')

subscribing to rawblock alone also works, I receive blocks (approx 1block per 10minutes)

socket.subscribe('rawblock')

But here is my problem, when subscribing to both, i do receive rawtx but no rawblock !

socket.subscribe('rawblock')
socket.subscribe('rawtx')

I'm assuming the ZMQ socket is flooded with rawtx, which result in missing rawblock event.

My question is: how would you debug this ? Have you guys faced this situation already ?

I know I could use the blocknotify option in bitcoind to forward the blockhash back to my client, and then load the rawblock via an rpc call back to bitcoind, but then I would use 2 different mechanisms (one for rawtx and blocknotify for rawblock) for something that was supposed to work in the first place :)

Thanks for your feedback !!

2
  • Are you sure that socket.subscribe allows you to subscript to multiple things in the way that you have done it? It seems like it could only be subscribing to the latest thing that subscribe was called on, and that would be rawtx. What happens if you reverse the order?
    – Ava Chow
    Nov 25, 2017 at 17:08
  • order does not matter I've checked. and if I sub to rawtx & hashtx i receive both. I just don't receive rawblock when used with rawtx at the same time Nov 25, 2017 at 21:55

1 Answer 1

1

Try to subscribe by using prefix raw as topic . After this you will get both message on the one listener.

socket.subscribe('raw');

socket.on('message', (topicRaw: Buffer, bodyRaw: Buffer, ...tailRaw: Buffer[]) => {

    const sequenceRaw = tailRaw[tailRaw.length - 1];
    const sequence = sequenceRaw.readInt32LE(0);
    const topic = topicRaw.toString();


    if (topic == 'rawtx') {
        const rawTX = bodyRaw.toString('hex');
        console.log(topic, sequence, rawTX);

    } else if (topic == 'rawblock') {

        const rawBlock = bodyRaw.toString('hex', 0, 80);
        console.log(topic, sequence, rawBlock);
    }
});

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.