nuts-network
#############
P2P network serving as a base layer for sharing data between Nuts nodes.
.. image:: https://circleci.com/gh/nuts-foundation/nuts-network.svg?style=svg
:target: https://circleci.com/gh/nuts-foundation/nuts-network
:alt: Build Status
.. image:: https://readthedocs.org/projects/nuts-network/badge/?version=latest
:target: https://nuts-documentation.readthedocs.io/projects/nuts-network/en/latest/?badge=latest
:alt: Documentation Status
.. image:: https://codecov.io/gh/nuts-foundation/nuts-network/branch/master/graph/badge.svg
:target: https://codecov.io/gh/nuts-foundation/nuts-network
:alt: Code coverage
.. image:: https://api.codeclimate.com/v1/badges/5475f4d4e696f43285b5/maintainability
:target: https://codeclimate.com/github/nuts-foundation/nuts-network/maintainability
:alt: Maintainability
The network is written in Go and should be part of nuts-go as an engine.
Dependencies
************
This projects is using go modules, so version > 1.12 is recommended. 1.10 would be a minimum.
Running tests
*************
Tests can be run by executing
.. code-block:: shell
go test ./...
Building
********
This project is part of https://github.com/nuts-foundation/nuts-go. If you do however would like a binary, just use ``go build``.
The (internal) server and client API is generated from the open-api spec:
.. code-block:: shell
oapi-codegen -generate types,server,client -package api docs/_static/nuts-network.yaml > api/generated.go
The peer-to-peer API uses gRPC. To generate Go code from the protobuf specs you need the `protoc-gen-go` package:
.. code-block:: shell
go get -u github.com/golang/protobuf/protoc-gen-go
To generate the Go server and client code, run the following command:
.. code-block:: shell
protoc -I network network/network.proto --go_out=plugins=grpc,paths=source_relative:network
To generate the mocks, run the following commands:
.. code-block:: shell
~/go/bin/mockgen -destination=pkg/mock.go -package=pkg -source=pkg/interface.go
~/go/bin/mockgen -destination=pkg/proto/mock.go -package=proto -source=pkg/proto/interface.go Protocol
~/go/bin/mockgen -destination=pkg/documentlog/mock.go -package=documentlog -source=pkg/documentlog/interface.go DocumentLog
~/go/bin/mockgen -destination=pkg/documentlog/store/mock.go -package=store -source=pkg/documentlog/store/interface.go DocumentStore
~/go/bin/mockgen -destination=pkg/nodelist/mock.go -package=nodelist -source=pkg/nodelist/interface.go NodeList
~/go/bin/mockgen -destination=pkg/p2p/mock.go -package=p2p -source=pkg/p2p/interface.go P2PNetwork
Binary format migrations
------------------------
The database migrations are packaged with the binary by using the ``go-bindata`` package.
.. code-block:: shell
NOT_IN_PROJECT $ go get -u github.com/go-bindata/go-bindata/...
nuts-network $ cd migrations && go-bindata -pkg migrations .
Running in Docker
*****************
Since nuts-network forms a p2p network it's useful to be able to quickly spawn a lot of nodes. The easiest way to do so it using the provided docker-compose file:
`docker-compose up`
It now should start a bootstrap node and a single (non-bootstrap) node.
To expand the network, add a few nodes:
`docker-compose up -d --scale node=5`
README
******
The readme is auto-generated from a template and uses the documentation to fill in the blanks.
.. code-block:: shell
./generate_readme.sh
This script uses ``rst_include`` which is installed as part of the dependencies for generating the documentation.
Documentation
*************
To generate the documentation, you'll need python3, sphinx and a bunch of other stuff. See :ref:`nuts-documentation-development-documentation`
The documentation can be build by running
.. code-block:: shell
/docs $ make html
The resulting html will be available from ``docs/_build/html/index.html``
Configuration
*************
Parameters
==========
The following configuration parameters are available:
======================= =============== =================================================================================================================================================================
Key Default Description
======================= =============== =================================================================================================================================================================
address Interface and port for http server to bind to, defaults to global Nuts address.
bootstrapNodes Space-separated list of bootstrap nodes (`<host>:<port>`) which the node initially connect to.
certFile PEM file containing the server certificate for the gRPC server. If not set the Nuts node won't start the gRPC server and other nodes will not be able to connect.
certKeyFile PEM file containing the private key of the server certificate. If not set the Nuts node won't start the gRPC server and other nodes will not be able to connect.
grpcAddr \:5555 Local address for gRPC to listen on.
mode server or client, when client it uses the HttpClient
nodeID Instance ID of this node under which the public address is registered on the nodelist. If not set, the Nuts node's identity will be used.
publicAddr Public address (of this node) other nodes can use to connect to it. If set, it is registered on the nodelist.
storageConnectionString file:network.db SQLite3 connection string to the database where the network should persist its documents.
======================= =============== =================================================================================================================================================================