Allow Private nodes to be discoverable
/nomos/circuit/relay/0.2.0/hop
/nomos/circuit/relay/0.2.0/stop
If enabled via config, run a Circuit Relay v2 server and advertise, via Identify, support for the following protocols:
/nomos/circuit/relay/0.2.0/hop
/nomos/circuit/relay/0.2.0/stop
Add a Private node to its discovered nodes set, if the Private node has secured a Circuit Relay reservation at the Public node’s Circuit Relay server. The Private node should be added with the following relayed multiaddress:
/{public_relay_ip}/udp/{port}/quic-v1/p2p/public_relay_peer_id/p2p-circuit/p2p/{private_peer_id}
If the Private node loses its reservation at the Circuit Relay server, the above relayed address should be removed from the discovered nodes set.
Dialing Private peers
A Private peer can only be dialed by other peers if it has at least one valid reservation at a Circuit Relay server. Its addresses then have the following relayed multiaddress form:
/{public_relay_ip}/udp/{port}/quic-v1/p2p/{public_relay_peer_id}/p2p-circuit/p2p/{private_peer_id}
The peer discovery protocol must provide information about publicly reachable addresses of peers. When dialing a peer, the libp2p stack will automatically determine if the connection should be direct or relayed, depending on the address of the dialed peer. If the dialed peer is a Private peer and both peers advertise support for the DCUtR protocol via Identify (/nomos/dcutr
), NAT hole punching will be automatically attempted by the libp2p stack.
Dynamic Stake Threshold
Currently we have a static set of role stake threshold values. This is acceptable for an initial version of the protocol but we might need more dynamic mechanism for setting them in the future. Such mechanism would allow us to set thresholds values in a reactive way where way which tracks the network parameters (on-chain values). However, this requires us to define an equilibrium to which we want to optimize these values, and that requires more research.
More efficient ZK public key registration
In the current version, nodes participating in a service declare their reward address in the declaration message. This can be optimized because the nodes are locking NMO in their first declaration. We could reuse the Public Key of the locked note as the address of distribution of the rewards.
More efficient reward distribution
In the current version, rewards are distributed 4 by 4 across blocks. Each service do it independently in different transactions. If ZK generation is fast enough, we could batch distribution of the different services in the same transaction. Moreover, rewards are minted at only one moment so instead of minting rewards once, and distribute over time, we could directly mint for every validators without ZK.