Skip to content
dapplion edited this page Oct 26, 2018 · 6 revisions

DAppNode SDK tutorial

development flow

This tutorial will show you how to turn the Status-go server into a DAppNode package (DNP)

1. Installing the tools

1.1 Pre-requisites

If you don’t have it installed yet, you need to install Node.js in your laptop.

Last stable version of Node.js (or 8.12.0) works just fine.

You will also need docker and docker-compose.

1.2 Install DAppNode SDK

Repo: DAppNode SDK

npm install -g @dappnode/dappnodesdk

2. SDK introduction

  • Introduction to SDK

DAppNodeSDK is a tool to make as simple as possible the creation of new dappnode packages. It helps to initialize and publish an Aragon Package Manager Repo in the ethereum mainnet.

We have deployed a public APM (Aragon Package Manager) registry in which anyone can create their own APM repository: public.dappnode.eth

  • Manifest

DAppNode-packages-manifest

  • Command line
$ dappnodesdk --help

  Usage: dappnodesdk [options]

  Options:

    init            Initialize a new DAppNodePackage Repository
    build           build a new version (only generates the ipfs hash)
    publish <type>  Publish a new version of the package in an Aragon Package Manager Repository. Type: [ major | minor | patch ]
    gen_manifest    Generate a new manifest based on a existing docker-compose.yml
    gen_compose     Generate a new docker-compose.yml based on a existing dappnode_package.json
    -h, --help      output usage information

  • Workflow
    • init, create folder, manifest and docker-compose
    • develop + test locally
    • build and upload + test with IPFS
    • publish to APM

3. Creating the DNP

  • A DNP is a docker container. It needs a docker-compose and a Dockerfile.
  • Let's start from the status-go Dockerfile

3.1. Clone files

First, we need to have access to the project files. To do so, add a git clone command after the first run

RUN mkdir -p /go/src/github.com/status-im/status-go && \
    git clone -b $TAG https://github.com/status-im/status-go.git /go/src/github.com/status-im/status-go

3.2. Allow access to my.status.public.dappnode.eth

In order to be able to access the RPC we will grant access to any domain. The internal DAppNode bind will link my.status.dnp.dappnode.eth to the package.

RUN cd /go/src/github.com/status-im/status-go && \
    # Hack to allow terminal request to my.status.public.dappnode.eth
    sed -i 's/localhost/*/g' node/node.go && \
    make statusgo \
    BUILD_TAGS="$build_tags" \
    BUILD_FLAGS="$build_flags"

3.3. Add config files

Then, add specific config files. These configs will not be modifiable once the DNP is build and deployed. If a parameter has to be modified by the user, it should be an enviroment variable.

COPY config.json /data/config.json
COPY configMailServer.json /data/configMailServer.json
COPY entrypoint.sh entrypoint.sh

ENV STATUSD_MODE RELAY

3.4. Write entrypoint

The entrypoint is a switch between configs depending on the ENV STATUSD_MODE. If the user changes an env after installation, the package will restart and this script will be rerun

/entrypoint.sh

#!/bin/sh

# Default config file
CONFIG_FILE=/data/config.json;

# Check type
if [ "$STATUSD_MODE" = "MAILSERVER" ];then
    CONFIG_FILE=/data/configMailServer.json
fi

/usr/local/bin/statusd -register -log DEBUG -c $CONFIG_FILE -metrics

Dockerfile

ENTRYPOINT ["/entrypoint.sh"]

4. Build

Once you have tackled all the issues try building the package. This command only generates the IPFS Hash to be able to install it without needing to create the APM Repo. It will allow you to test the package in any DAppNode before publishing the package.

$ dappnodesdk build

5. Publish

Once you have successfully tested the package using its IPFS hash, it's time to publish it.

5.1 What does it mean to publish a DNP?

In DAppNode we favour the use of Aragon Package Manager (APM) smart contract. To publish a DNP means sending transaction to the a registry contract and link a semver version to the IPFS hash of the manifest of the package.

5.2 Let's publish our DNP

The publish command does the build of the image and shows a transaction data to be able to publish the package. The first time it will create the repository. Otherwise, it will update of it.

To be able to update a repository you must be the authorized dev.

The script increases the current version of the repository based on the specified type (patch, minor, major), unless a version hasn't yet been published

$ dappnodesdk publish < patch | minor | mayor >

for more information about versioning check semver

Clone this wiki locally