Create a folder for fullnode.

Clone the latest master branch of and extract it to


Make sure you have the proper dependencies.

  • JDK 1.8 (JDK 1.9+ is not supported yet)
  • On Linux Ubuntu system (e.g. Ubuntu 16.04.4 LTS), ensure that the machine has Oracle JDK 8, instead of having Open JDK 8 in the system. If you are building the source code by using Open JDK 8, you will get "Build Failed" result.
  • Open UDP ports for connection to the network
  • MINIMUM 2 CPU Cores

Deployment Guide

1. Build the java-stabila project

cd /deploy/java-stabila
./gradlew build

2. Copy the FullNode.jar along with configuration files into the respective directories

download your needed configuration file from

main_net_config.conf is the configuration for MainNet.

please rename the configuration file to `config.conf` and use this config.conf to start FullNode.

cp build/libs/FullNode.jar ../fullnode

3. You can now run your FullNode using the following command

java -jar FullNode.jar -c config.conf // make sure that your config.conf is downloaded from

4. Running a Governor Node for mainnet

java -jar FullNode.jar -p your private key --executive -c your config.conf(Example:/data/java-stabila/config.conf)
java -jar FullNode.jar -p 650950B193DDDDB35B6E48912DD28F7AB0E7140C1BFDEFD493348F02295BD812 --executive -c /data/java-stabila/config.conf

5. Running a Governor Node

You should modify the config.conf:

  • Replace existing entry in genesis.block.executives with your address
  • Replace existing entry in seed.node ip.list with your ip list
  • The first Governor Node start, needSyncCheck should be set false
  • Set p2pversion to 61
cd build/libs
java -jar FullNode.jar -p your private key --executive -c your config.conf (Example:/data/java-stabila/config.conf)
java -jar FullNode.jar -p 650950B193DDDDB35B6E48912DD28F7AB0E7140C1BFDEFD493348F02295BD812 --executive -c /data/java-stabila/config.conf

Logging and Network Connection Verification

Logs for both nodes are located in /deploy/\*/logs/stabila.log. Use tail -f /logs/stabila.log/ to follow along with the block syncing.

You should see something similar to this in your logs for block synchronization:


12:00:57.658 INFO  [pool-7-thread-1] [o.t.c.n.n.NodeImpl]( Success handle block Num:236610,ID:0000000000039c427569efa27cc2493c1fff243cc1515aa6665c617c45d2e1bf

Stop Node Gracefully

Create file,use kill -15 to close FullNode.jar. You need to modify pid=ps -ef |grep FullNode.jar |grep -v grep |awk '{print $2}' to find the correct pid.

while true; do
  pid=`ps -ef |grep FullNode.jar |grep -v grep |awk '{print $2}'`
  if [ -n "$pid" ]; then
    kill -15 $pid
    echo "The java-stabila process is exiting, it may take some time, forcing the exit may cause damage to the database, please wait patiently..."
    sleep 1
    echo "java-stabila killed successfully!"

FullNode Fast Deployment

Download fast deployment script, run the script according to different types of node.

Scope of use

This script could be used on Linux/MacOS, but not on Windows. Supported just by FullNode.

Download and run script

wget -O

Parameter Illustration

bash --app [FullNode] --net [mainnet] --db [keep|remove|backup] --heap-size <heapsize>

--app Optional, Running application. The default node is Fullnode.
--net Optional, Connecting network. The default network is mainnet and it could be mainnet, testnet.
--db  Optional, The way of data processing could be keep, remove and backup. Default is keep. If you launch two different networks, like from mainnet to testnet or from testnet to mainnet, you need to delete database.
--rpc-port  Optional, Port of grpc. Default is 50051.
--commit  Optional, commitid of project.
--branch  Optional, branch of project.  Mainnet default is latest release and Testnet default is master.
--heap-size  Optional, jvm option: Xmx. The default heap-size is 0.8 * memory size.
--work_space  Optional, default is current directory.

Deployment of FullNode on the one host

wget -O

Grpc Gateway Deployment


This script helps you download the code from and deploy the code on your environment.


Please follow the guide on Install Golang, Protoc, and set $GOPATH environment variable according to your requirement.

Download and run script

wget -O

Parameter Illustration

bash --rpchost [rpc host ip] --rpcport [rpc port number] --httpport [http port number]

--rpchost The fullnode IP where the grpc service is provided. Default value is "localhost".
--rpcport The fullnode port number grpc service is consuming. Default value is 50051.
--httpport The port intends to provide http service provided by grpc gateway. Default value is 18890.


Use default configuration:


Use customized configuration:

bash --rpchost --rpcport 50052 --httpport 18891

Event Subscribe plugin Deployment

This is an implementation of Stabila eventsubscribe model.

  • api module defines IPluginEventListener, a protocol between Java-stabila and event plugin.
  • app module is an example for loading plugin, developers could use it for debugging.
  • kafkaplugin module is the implementation for kafka, it implements IPluginEventListener, it receives events subscribed from Java-stabila and relay events to kafka server.
  • mongodbplugin mongodbplugin module is the implementation for mongodb.


  1. Clone the repo git clone
  2. Go to eventplugin cd event-plugin
  3. run ./gradlew build

  4. This will produce one plugin zip, named, located in the event-plugin/build/plugins/ directory.

Edit **config.conf** of Java-stabila, add the following fileds:

event.subscribe = {
    path = "" // absolute path of plugin
    server = "" // target server address to receive event triggers
    dbconfig="" // dbname|username|password
    topics = [
          triggerName = "block" // block trigger, the value can't be modified
          enable = false
          topic = "block" // plugin topic, the value could be modified
          triggerName = "transaction"
          enable = false
          topic = "transaction"
          triggerName = "contractevent"
          enable = true
          topic = "contractevent"
          triggerName = "contractlog"
          enable = true
          topic = "contractlog"

    filter = {
       fromblock = "" // the value could be "", "earliest" or a specified block number as the beginning of the queried range
       toblock = "" // the value could be "", "latest" or a specified block number as end of the queried range
       contractAddress = [
           "" // contract address you want to subscribe, if it's set to "", you will receive contract logs/events with any contract address.

       contractTopic = [
           "" // contract topic you want to subscribe, if it's set to "", you will receive contract logs/events with any contract topic.
  • path: is the absolute path of ""
  • server: Kafka server address
  • topics: each event type maps to one Kafka topic, we support four event types subscribing, block, transaction, contractlog and contractevent.
  • dbconfig: db configuration information for mongodb, if using kafka, delete this one; if using Mongodb, add like that dbname|username|password
  • triggerName: the trigger type, the value can't be modified.
  • enable: plugin can receive nothing if the value is false.
  • topic: the value is the kafka topic to receive events. Make sure it has been created and Kafka process is running
  • filter: filter condition for process trigger. note: if the server is not, pls set some properties in config/ file remove comment and set listeners=PLAINTEXT://:9092 remove comment and set advertised.listeners to PLAINTEXT://host_ip:9092

Install Kafka

On Mac:

brew install kafka

On Linux:

cd /usr/local
tar -xzvf kafka_2.10-
mv kafka_2.10- kafka

add "export PATH=$PATH:/usr/local/kafka/bin" to end of /etc/profile
source /etc/profile /usr/local/kafka/config/ &

Note: make sure the version of Kafka is the same as the version set in build.gradle of eventplugin project.(kafka_2.10- kafka)

Run Kafka

On Mac:

zookeeper-server-start /usr/local/etc/kafka/ & kafka-server-start /usr/local/etc/kafka/

On Linux: /usr/local/kafka/config/ &
Sleep about 3 seconds /usr/local/kafka/config/ &

Create topics to receive events, the topic is defined in config.conf

On Mac:

kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic block
kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic transaction
kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic contractlog
kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic contractevent

On Linux:  --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic block --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic transaction --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic contractlog --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic contractevent

Kafka consumer

On Mac:

kafka-console-consumer --bootstrap-server localhost:9092  --topic block
kafka-console-consumer --bootstrap-server localhost:9092  --topic transaction
kafka-console-consumer --bootstrap-server localhost:9092  --topic contractlog
kafka-console-consumer --bootstrap-server localhost:9092  --topic contractevent

On Linux: --zookeeper localhost:2181 --topic block --zookeeper localhost:2181 --topic transaction --zookeeper localhost:2181 --topic contractlog --zookeeper localhost:2181 --topic contractevent

Load plugin in Java-stabila

  • add --es to command line, for example:
 java -jar FullNode.jar -p privatekey -c config.conf --es

Event filter

which is defined in config.conf, path: event.subscribe

filter = {
       fromblock = "" // the value could be "", "earliest" or a specified block number as the beginning of the queried range
       toblock = "" // the value could be "", "latest" or a specified block number as end of the queried range
       contractAddress = [
           "SVkNuE1BYxECWq85d8UR9zsv6WppBns9iH" // contract address you want to subscribe, if it's set to "", you will receive contract logs/events with any contract address.

       contractTopic = [
           "f0f1e23ddce8a520eaa7502e02fa767cb24152e9a86a4bf02529637c4e57504b" // contract topic you want to subscribe, if it's set to "", you will receive contract logs/events with any contract topic.

Download and install MongoDB

Suggested Configuration

  • CPU/ RAM: 16Core / 32G
  • DISK: 500G
  • System: CentOS 64

The version of MongoDB is 4.0.4, below is the command:

  • cd /home/java-stabila
  • curl -O
  • tar zxvf mongodb-linux-x86_64-4.0.4.tgz
  • mv mongodb-linux-x86_64-4.0.4 mongodb

Set environment - export MONGOPATH=/home/java-stabila/mongodb/ - export PATH=$PATH:$MONGOPATH/bin

Create mongodb config The path is : /etc/mongodb/mgdb.conf

  • cd /etc/mongodb
  • touch mgdb.conf

Create data&log folder for mongodb Create data, log subfolder in mongodb directory, and add their absolute path to mgdb.conf


  • dbpath=/home/java-stabila/mongodb/data
  • logpath=/home/java-stabila/mongodb/log/mongodb.log
  • port=27017
  • logappend=true
  • fork=true
  • bind_ip=
  • auth=true
  • wiredTigerCacheSizeGB=2

Note: - bind_ip must be configured to,otherwise remote connection will be refused. - wiredTigerCacheSizeGB, must be configured to prevent OOM

Launch MongoDB - mongod --config /etc/mongodb/mgdb.conf

Create admin account: - mongo - use admin - db.createUser({user:"root",pwd:"admin",roles:[{role:"root",db:"admin"}]})

Create eventlog and its owner account

  • db.auth("root", "admin")
  • use eventlog
  • db.createUser({user:"stabila",pwd:"123456",roles:[{role:"dbOwner",db:"eventlog"}]})

database: eventlog, username: stabila, password: 123456

Firewall rule: - iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 27017 -j ACCEPT

Remote connection via mongo:

  • mongo
  • use eventlog
  • db.auth("stabila", "123456")
  • show collections
  • db.block.find()

Query block trigger data:

  • db.block.find({blockNumber: {$lt: 1000}}); // return records whose blockNumber less than1000

Set database index to speedup query:

cd /{projectPath} sh

Advanced Configurations

Read the Advanced Configuration