Corda’s new network map infrastructure
Exploring design decisions
- Why we don’t ship a network map server anymore.
- The new network bootstrapping tool and planned upgrades.
- Information about an upcoming refresh of the testnet.
- Background information on the design thinking that went into the change.
In Corda 3 we changed how the network map infrastructure works. This was the last step before we felt we could commit to the network protocol for the long term, as the prior design had always been temporary. The changes we made along with the reasons for them are described in this article by Joel Dudley.
The aspect of the re-design that has raised the most questions is the approach taken to creating a new compatibility zone (what people think of informally as a ‘Corda network’). In Corda 1 and 2 the zone concept was incomplete, so creating a new zone was straightforward — just start a network map node and connect the other nodes to it. In Corda 3 this changed significantly. In the new design the network map service is no longer a regular Corda node: it’s become a collection of signed files served over HTTP or loaded from the filesystem instead. A simple REST-like protocol is used to fetch network map entries from a network map service, and another HTTP based service is used to receive certificate signing requests (this is the doorman and is what makes a Corda zone a permissioned system). Also, this release introduces the notion of network parameters.
However, Corda 3 does not provide implementations of either server. As a consequence it may initially appear that you cannot create a new zone out of the box. This isn’t the case, as we do provide a ‘bootstrapper’ tool via a Gradle plugin that generates network map and certificate files that can be copied into each node directory. Future versions of Corda will improve this tool significantly and disconnect it from Gradle. By using it you can configure a new zone and distribute the resulting files via whatever means you have available.
But why is it done in this roundabout way? Why don’t we just provide implementations of the two servers? Given the description above it’s reasonable to assume that Corda would come with an implementation of the network map server and doorman, yet it doesn’t. Are we being deliberately awkward?
Well, no. The reasons for this design are somewhat subtle and may not be immediately apparent unless you’ve built peer to peer networks before. Time to explain.
We do it this way for two reasons:
- Different server implementations would have little shared code.
- It would cause people to do testing wrong.