mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-30 18:51:15 +02:00
Merge bitcoin/bitcoin#22079: zmq: Add support to listen on IPv6 addresses
e6998838e5
doc: Add IPv6 address to zmq example (nthumann)8abe5703a9
test: Add IPv6 test to zmq (nthumann)ded449b726
zmq: Enable IPv6 on listening socket (nthumann) Pull request description: This PR adds support for listening on IPv6 addresses with bitcoinds ZMQ interface, just like the RPC server. Currently, it is not possible to specify an IPv6 address, as the `ZMQ_IPV6` [socket option](http://api.zeromq.org/master:zmq-setsockopt#toc27) is not set and therefore the ZMQ initialization fails, if one does so. The absence of this option has also been noted [here](https://github.com/bitcoin/bitcoin/issues/15198#issuecomment-617378512). With this PR one can e.g. set `-zmqpubhashblock=tcp://[::1]:28333` to listen on the IPv6 loopback address. ACKs for top commit: laanwj: Code review ACKe6998838e5
theStack: Tested ACKe6998838e5
🌱 Tree-SHA512: 43c3043d8d5c79794d475926259c1be975b694db4fcc1f7750a9a28e242f0fa1b531735a63ea5777498003aa5834f6243f39742d0f3941f2f37593d0c7890700
This commit is contained in:
@ -24,6 +24,7 @@ from test_framework.util import (
|
||||
assert_equal,
|
||||
assert_raises_rpc_error,
|
||||
)
|
||||
from test_framework.netutil import test_ipv6_local
|
||||
from io import BytesIO
|
||||
from time import sleep
|
||||
|
||||
@ -119,6 +120,7 @@ class ZMQTest (BitcoinTestFramework):
|
||||
self.test_mempool_sync()
|
||||
self.test_reorg()
|
||||
self.test_multiple_interfaces()
|
||||
self.test_ipv6()
|
||||
finally:
|
||||
# Destroy the ZMQ context.
|
||||
self.log.debug("Destroying ZMQ context")
|
||||
@ -126,10 +128,12 @@ class ZMQTest (BitcoinTestFramework):
|
||||
|
||||
# Restart node with the specified zmq notifications enabled, subscribe to
|
||||
# all of them and return the corresponding ZMQSubscriber objects.
|
||||
def setup_zmq_test(self, services, *, recv_timeout=60, sync_blocks=True):
|
||||
def setup_zmq_test(self, services, *, recv_timeout=60, sync_blocks=True, ipv6=False):
|
||||
subscribers = []
|
||||
for topic, address in services:
|
||||
socket = self.ctx.socket(zmq.SUB)
|
||||
if ipv6:
|
||||
socket.setsockopt(zmq.IPV6, 1)
|
||||
subscribers.append(ZMQSubscriber(socket, topic.encode()))
|
||||
|
||||
self.restart_node(0, [f"-zmqpub{topic}={address}" for topic, address in services] +
|
||||
@ -568,5 +572,22 @@ class ZMQTest (BitcoinTestFramework):
|
||||
assert_equal(self.nodes[0].getbestblockhash(), subscribers[0].receive().hex())
|
||||
assert_equal(self.nodes[0].getbestblockhash(), subscribers[1].receive().hex())
|
||||
|
||||
def test_ipv6(self):
|
||||
if not test_ipv6_local():
|
||||
self.log.info("Skipping IPv6 test, because IPv6 is not supported.")
|
||||
return
|
||||
self.log.info("Testing IPv6")
|
||||
# Set up subscriber using IPv6 loopback address
|
||||
subscribers = self.setup_zmq_test([
|
||||
("hashblock", "tcp://[::1]:28332")
|
||||
], ipv6=True)
|
||||
|
||||
# Generate 1 block in nodes[0]
|
||||
self.nodes[0].generatetoaddress(1, ADDRESS_BCRT1_UNSPENDABLE)
|
||||
|
||||
# Should receive the same block hash
|
||||
assert_equal(self.nodes[0].getbestblockhash(), subscribers[0].receive().hex())
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
ZMQTest().main()
|
||||
|
Reference in New Issue
Block a user