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

  • 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? – Andrew Chow Nov 25 '17 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 – Louis Grellet Nov 25 '17 at 21:55
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, privacy policy and cookie policy

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