message: zmq: Enable IPv6 on listening socket
diff: #include <chain.h>
  #include <chainparams.h>
  +#include <netbase.h>
  #include <node/blockstorage.h>
  #include <rpc/server.h>
  #include <streams.h>
  @@ -73,6 +74,20 @@ static int zmq_send_multipart(void *sock, const void* data, size_t size, ...)
  return 0;
  }
  +static bool IsZMQAddressIPV6(const std::string &zmq_address)
  +{
  + const std::string tcp_prefix = "tcp://";
  + const size_t tcp_index = zmq_address.rfind(tcp_prefix);
  + const size_t colon_index = zmq_address.rfind(":");
  + if (tcp_index == 0 && colon_index != std::string::npos) {
  + const std::string ip = zmq_address.substr(tcp_prefix.length(), colon_index - tcp_prefix.length());
  + CNetAddr addr;
  + LookupHost(ip, addr, false);
  + if (addr.IsIPv6()) return true;
  + }
  + return false;
  +}
  +
  bool CZMQAbstractPublishNotifier::Initialize(void *pcontext)
  {
  assert(!psocket);
  @@ -107,6 +122,15 @@ bool CZMQAbstractPublishNotifier::Initialize(void *pcontext)
  return false;
  }
  + // On some systems (e.g. OpenBSD) the ZMQ_IPV6 must not be enabled, if the address to bind isn't IPv6
  + const int enable_ipv6 { IsZMQAddressIPV6(address) ? 1 : 0};
  + rc = zmq_setsockopt(psocket, ZMQ_IPV6, &enable_ipv6, sizeof(enable_ipv6));
  + if (rc != 0) {
  + zmqError("Failed to set ZMQ_IPV6");
  + zmq_close(psocket);
  + return false;
  + }
  +
  rc = zmq_bind(psocket, address.c_str());
  if (rc != 0)
  {
  