Repository: citahub/cita (language: rust)

Issue:
block.coinbase can't be used in autoExec()
## Description

block.coinbase can't be used in autoExec()

## Steps to Reproduce

1. Add `SysConfig.autoExec=true` when create chain;
2. use `address(block.coinbase).transfer(1)` in function `autoExec()`;
3. create contract and registe it to AutoExec contract;
4. Transfer token to contract.

**Expected behavior**: contract balance sub 1  per block

**Actual behavior**: contract balance remain unchanged

**Reproduce how often**: every time.

## Versions

v0.22.0

## Additional Information

`address(0x5444B13eFe73A7de4d56f2c043424115C8e26eF1).transfer(1)` works but `address(block.coinbase).transfer(1)` not.



Discussion / hints:
What's the `Solidity` version?
> What's the `Solidity` version?

^0.4.24

Fix patch:
diff --git a/.all-contributorsrc b/.all-contributorsrc
index 03e009799..01327b5c2 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -305,7 +305,7 @@
       "avatar_url": "https://avatars1.githubusercontent.com/u/24754263?v=4",
       "profile": "https://github.com/jiangxianliang007",
       "contributions": [
-        "code"
+        "bug"
       ]
     },
     {
@@ -433,6 +433,69 @@
       "contributions": [
         "code"
       ]
+    },
+    {
+      "login": "QingYanL",
+      "name": "liyanzi",
+      "avatar_url": "https://avatars3.githubusercontent.com/u/48231505?v=4",
+      "profile": "https://github.com/QingYanL",
+      "contributions": [
+        "bug"
+      ]
+    },
+    {
+      "login": "YUJIAYIYIYI",
+      "name": "JiaYi",
+      "avatar_url": "https://avatars0.githubusercontent.com/u/40654430?v=4",
+      "profile": "https://github.com/YUJIAYIYIYI",
+      "contributions": [
+        "doc"
+      ]
+    },
+    {
+      "login": "timmyz",
+      "name": "Timmy Zhang",
+      "avatar_url": "https://avatars0.githubusercontent.com/u/795528?v=4",
+      "profile": "https://github.com/timmyz",
+      "contributions": [
+        "ideas"
+      ]
+    },
+    {
+      "login": "wuyuyue",
+      "name": "Wu Yuyue",
+      "avatar_url": "https://avatars3.githubusercontent.com/u/40381396?v=4",
+      "profile": "https://github.com/wuyuyue",
+      "contributions": [
+        "doc"
+      ]
+    },
+    {
+      "login": "xiangmeiLu",
+      "name": "xiangmeiLu",
+      "avatar_url": "https://avatars2.githubusercontent.com/u/30581938?v=4",
+      "profile": "https://github.com/xiangmeiLu",
+      "contributions": [
+        "doc"
+      ]
+    },
+    {
+      "login": "mingxiaowu",
+      "name": "mingxiaowu",
+      "avatar_url": "https://avatars0.githubusercontent.com/u/42978282?v=4",
+      "profile": "https://github.com/mingxiaowu",
+      "contributions": [
+        "bug"
+      ]
+    },
+    {
+      "login": "wangfh666",
+      "name": "wangfh666",
+      "avatar_url": "https://avatars0.githubusercontent.com/u/41322861?s=400&v=4",
+      "profile": "https://github.com/wangfh666",
+      "contributions": [
+        "bug"
+      ]
     }
   ],
   "contributorsPerLine": 7
diff --git a/.circleci/config.yml b/.circleci/config.yml
index f41ab001e..4d509c73c 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -107,7 +107,7 @@ alias:
 
   - &job-default
     docker:
-      - image: cita/cita-build:ubuntu-18.04-20190413
+      - image: cita/cita-build:ubuntu-18.04-20190429
     working_directory: ~/cita-build
     resource_class: xlarge
 
@@ -145,7 +145,9 @@ jobs:
       - restore_cache: *restore-security-audit-cache
       - run:
           name: Check Security Audit
-          command: make security_audit
+          command: |
+            echo "Add it back when bump protobuf to `v2.6.0`."
+            # make security_audit
       - save_cache: *save-security-audit-cache
 
   "Check Contracts":
diff --git a/.gitmodules b/.gitmodules
index 4ce30b456..36679fd36 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -18,7 +18,7 @@
 [submodule "scripts/config_tool/genesis"]
 	path = scripts/config_tool/genesis
 	url = https://github.com/cryptape/genesis.git
-	branch = v0.22.0
+	tag = v0.24.0
 [submodule "tests/jsondata"]
 	path = tests/jsondata
 	url = https://github.com/cryptape/cita-testdata.git
diff --git a/.travis.yml b/.travis.yml
index c804ade99..f8495607f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -14,7 +14,7 @@ stages:
   - Release
   - IntegrateTest
 before_install:
-  - docker pull cita/cita-build:ubuntu-18.04-20190413
+  - docker pull cita/cita-build:ubuntu-18.04-20190429
 jobs:
   include:
 
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1248f10dc..4309072ef 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,73 @@ All notable changes to this project will be documented in this file. And this pr
 
 ## [Unreleased]
 
+### Framework
+
+- [Optimization] Support new protocol version 2. [@ouwenkg]
+- [Optimization] Bump cita-sdk-js to `0.23.1` to fix the problem of version 2. [@kaikai1024]
+- [Optimization] Bump Rust toolchain to `1.34.1`. [@kaikai1024]
+- [Optimization] Use fixed Solidity version for system contracts. [@kaikai1024]
+- [Optimization] Upgrade the node packages to avoid the security alert. [@kaikai1024]
+- [Optimization] Use new log pattern. [@kaikai1024]
+- [Optimization] Update genesis submodule: use tag. [@kaikai1024]
+
+### Executor
+
+- [Fix] Fix coinbase in auto exec. [@ouwenkg]
+- [Fix] Fix potential panic issue in evm trace. [@ouwenkg]
+- [Fix] Refund token when suicide. [@ouwenkg]
+- [Optimization] Update zktx to use stable verison of Rust. [@kaikai1024]
+
+### Network
+
+- [Feature] Use new P2P library. [@jerry-yu]
+- [Feature] Let network be configuration. [@jerry-yu]
+
+### Chain
+
+- [Fix] Fix the bug that getLogs would break down the chain when `toBlock` is very large. [@leeyr338]
+- [Optimization] Update log in `forward` of `cita-chain`. [@ouwenkg]
+- [Fix] Move `chain_version` into `BlockSysConfig`. [@ouwenkg]
+
+### Consensus
+
+- [Fix] Fix Bft panic when new ordinary node syncs the blocks. [@leeyr338]
+- [Fix] Fix the bug that chain can't product block after restart docker. [@leeyr338]
+
+### Forever
+
+- [Fix] Fix service start error when `.*.pid` files exist. [@leeyr338]
+
+### Tools
+
+- [Fix] Fix panic in snapshot path. [@ouwenkg]
+
+### Test
+
+- [Optimization] Set more time for checking P2P network. [@leeyr338]
+- [Optimization] Use testdata submodule to test rpc interface. [@kaikai1024]
+- [Fix] Fix bug of `blockNumber.sh` script. [@rev-chaos]
+
+### Scripts
+
+- [Optimization] Modify script for new network config. [@leeyr338]
+- [Fix] Set logrotate output log as a relative path. [@leeyr338]
+- [Fix] Generate privkey file when use authorities option. [@leeyr338]
+- [Feature] Let native token be configurable. [@leeyr338]
+- [Fix] Fix docker multi-ports expose error. [@leeyr338]
+- [Optimization] Remove the useless scripts. [@kaikai1024]
+- [Optimization] Remove warnings of yaml. [@ouwenkg]
+
+### Doc
+
+- [Doc] Refactor `getting-started` doc. [@zhouyun-zoe]
+- [Doc] Add `economics model` docs.[@zhouyun-zoe]
+- [Doc] Add `zktx` docs. [@kaikai1024]
+- [Doc] Add `depository` sample. [@leeyr338]
+- [Doc] Add `operation guide` section. [@zhouyun-zoe]
+- [Doc] Add English version of release guide. [@YUJIAYIYIYI]
+- [Doc] Add logging rule doc. [@leeyr338]
+
 ## [v0.23.1] - 2019-05-05
 
 Fix the issue about showing the wrong version.
@@ -764,6 +831,7 @@ Release the first version of CITA.
 [@Kayryu]: https://github.com/Kayryu
 [@Keith-CY]: https://github.com/Keith-CY
 [@QingYanL]: https://github.com/QingYanL
+[@YUJIAYIYIYI]: https://github.com/YUJIAYIYIYI
 [@classicalliu]: https://github.com/classicalliu
 [@clearloop]: https://github.com/clearloop
 [@driftluo]: https://github.com/driftluo
@@ -773,6 +841,7 @@ Release the first version of CITA.
 [@leeyr338]: https://github.com/leeyr338
 [@luqz]: https://github.com/luqz
 [@ouwenkg]: https://github.com/ouwenkg
+[@rev-chaos]: https://github.com/rev-chaos
 [@rink1969]: https://github.com/rink1969
 [@u2]: https://github.com/u2
 [@wangfh666]: https://github.com/wangfh666
diff --git a/Cargo.lock b/Cargo.lock
index 32617c9fd..9db567f23 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -125,7 +125,7 @@ dependencies = [
 [[package]]
 name = "authority_manage"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -236,6 +236,11 @@ name = "bit-vec"
 version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "bitflags"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "bitflags"
 version = "1.0.4"
@@ -255,7 +260,7 @@ dependencies = [
 [[package]]
 name = "blake2b"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -357,7 +362,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "bytes"
-version = "0.4.11"
+version = "0.4.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -518,7 +523,7 @@ dependencies = [
 [[package]]
 name = "cita-crypto"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "cita-crypto-trait 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
  "cita-ed25519 0.6.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -529,7 +534,7 @@ dependencies = [
 [[package]]
 name = "cita-crypto-trait"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
 ]
@@ -537,7 +542,7 @@ dependencies = [
 [[package]]
 name = "cita-directories"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -545,7 +550,7 @@ dependencies = [
 [[package]]
 name = "cita-ed25519"
 version = "0.6.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cita-crypto-trait 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -604,7 +609,7 @@ dependencies = [
 name = "cita-jsonrpc"
 version = "0.1.0"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cpuprofiler 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "dotenv 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -640,7 +645,7 @@ dependencies = [
 [[package]]
 name = "cita-merklehash"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
  "hashable 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -654,7 +659,7 @@ name = "cita-network"
 version = "0.6.0"
 dependencies = [
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
  "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "dotenv 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -663,14 +668,15 @@ dependencies = [
  "jsonrpc-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
  "libproto 0.6.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
  "logger 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
+ "notify 4.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
  "pubsub 0.6.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
  "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
  "tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
- "tentacle 0.2.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "tentacle-discovery 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tentacle 0.2.0-alpha.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tentacle-discovery 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
  "util 0.6.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
 ]
@@ -699,7 +705,7 @@ dependencies = [
 [[package]]
 name = "cita-secp256k1"
 version = "0.6.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cita-crypto-trait 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -716,7 +722,7 @@ dependencies = [
 [[package]]
 name = "cita-sm2"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "cita-crypto-trait 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -730,7 +736,7 @@ dependencies = [
 [[package]]
 name = "cita-types"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1108,30 +1114,10 @@ name = "data-encoding"
 version = "2.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
-[[package]]
-name = "data-encoding-macro"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "data-encoding-macro-internal 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "data-encoding-macro-internal"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
 [[package]]
 name = "db"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
  "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1198,15 +1184,10 @@ dependencies = [
  "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
-[[package]]
-name = "endian-type"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
 [[package]]
 name = "engine"
 version = "0.6.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "cita-crypto 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -1269,7 +1250,7 @@ dependencies = [
 [[package]]
 name = "error"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 
 [[package]]
 name = "error-chain"
@@ -1330,7 +1311,7 @@ dependencies = [
 [[package]]
 name = "ethcore-bloom-journal"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "siphasher 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -1411,6 +1392,16 @@ name = "fake-simd"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "filetime"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.46 (registry+https://github.com/rust-lang/crates.io-index)",
+ "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "fixed-hash"
 version = "0.2.2"
@@ -1424,7 +1415,7 @@ dependencies = [
 
 [[package]]
 name = "flatbuffers"
-version = "0.5.0"
+version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1432,10 +1423,10 @@ dependencies = [
 
 [[package]]
 name = "flatbuffers-verifier"
-version = "0.1.9"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "flatbuffers 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flatbuffers 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1462,6 +1453,24 @@ dependencies = [
  "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "fsevent"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fsevent-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.46 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "fsevent-sys"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.46 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "fuchsia-cprng"
 version = "0.1.1"
@@ -1550,7 +1559,7 @@ version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "httpbis 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1569,7 +1578,7 @@ version = "0.1.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1583,7 +1592,7 @@ dependencies = [
 [[package]]
 name = "hashable"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "blake2b 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -1638,7 +1647,7 @@ name = "http"
 version = "0.1.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -1653,7 +1662,7 @@ name = "httpbis"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1683,7 +1692,7 @@ version = "0.11.22"
 source = "git+https://github.com/cryptape/hyper.git?branch=reuse_port#6c3eb6679ad9d3ddeca5702df371ccd9e9535f5d"
 dependencies = [
  "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1706,7 +1715,7 @@ name = "hyper"
 version = "0.12.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "h2 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1742,6 +1751,24 @@ name = "indexmap"
 version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "inotify"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "inotify-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.46 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "inotify-sys"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.46 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "iovec"
 version = "0.1.2"
@@ -1767,7 +1794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 [[package]]
 name = "jsonrpc-proto"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -1784,7 +1811,7 @@ dependencies = [
 [[package]]
 name = "jsonrpc-types"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -1798,7 +1825,7 @@ dependencies = [
 [[package]]
 name = "jsonrpc-types-internals"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1808,7 +1835,7 @@ dependencies = [
 [[package]]
 name = "jubjub"
 version = "0.0.1"
-source = "git+https://github.com/cryptape/jubjub-prototype.git?branch=modified#91e46fbb689e158a03cb11146f8a124ac27c764d"
+source = "git+https://github.com/cryptape/jubjub-prototype.git?branch=modified#198cb4080f45decc652aa393f2605cb5d9ddbd8b"
 dependencies = [
  "bellman 0.0.4 (git+https://github.com/cryptape/bellman.git?branch=0.0.4_modified)",
  "pairing 0.11.0 (git+https://github.com/cryptape/pairing.git?branch=0.11-release)",
@@ -1880,7 +1907,7 @@ dependencies = [
 [[package]]
 name = "libproto"
 version = "0.6.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "cita-crypto 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
  "cita-merklehash 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -2036,7 +2063,7 @@ dependencies = [
 [[package]]
 name = "logger"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "crossbeam-channel 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2215,11 +2242,6 @@ dependencies = [
  "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
-[[package]]
-name = "nibble_vec"
-version = "0.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
 [[package]]
 name = "nodrop"
 version = "0.1.12"
@@ -2233,6 +2255,24 @@ dependencies = [
  "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "notify"
+version = "4.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "filetime 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fsevent 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fsevent-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "inotify 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.46 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "ntp"
 version = "0.4.0"
@@ -2377,7 +2417,7 @@ dependencies = [
 [[package]]
 name = "pairing"
 version = "0.11.0"
-source = "git+https://github.com/cryptape/pairing.git?branch=0.11-release#aa65ce4cdd5abde9a4f534da11a102a97cb802eb"
+source = "git+https://github.com/cryptape/pairing.git?branch=0.11-release#6e36ec6bd968072c7f499f5f286a8c89f1b51a3b"
 dependencies = [
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2386,7 +2426,7 @@ dependencies = [
 [[package]]
 name = "panic_hook"
 version = "0.0.1"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "logger 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -2394,12 +2434,13 @@ dependencies = [
 
 [[package]]
 name = "parity-multiaddr"
-version = "0.3.0"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2493,19 +2534,6 @@ dependencies = [
  "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
-[[package]]
-name = "proc-macro-hack"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "proc-macro-hack-impl"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
 [[package]]
 name = "proc-macro2"
 version = "0.3.5"
@@ -2525,7 +2553,7 @@ dependencies = [
 [[package]]
 name = "proof"
 version = "0.6.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cita-crypto 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -2537,23 +2565,18 @@ dependencies = [
  "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
-[[package]]
-name = "protobuf"
-version = "1.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
 [[package]]
 name = "protobuf"
 version = "2.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "pubsub"
 version = "0.6.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "dotenv 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "pubsub_kafka 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -2564,7 +2587,7 @@ dependencies = [
 [[package]]
 name = "pubsub_kafka"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2576,7 +2599,7 @@ dependencies = [
 [[package]]
 name = "pubsub_rabbitmq"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "amqp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2585,7 +2608,7 @@ dependencies = [
 [[package]]
 name = "pubsub_zeromq"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "logger 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -2637,15 +2660,6 @@ dependencies = [
  "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
-[[package]]
-name = "radix_trie"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "endian-type 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "nibble_vec 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
 [[package]]
 name = "rand"
 version = "0.3.22"
@@ -2920,7 +2934,7 @@ dependencies = [
 [[package]]
 name = "rlp"
 version = "0.2.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -2932,7 +2946,7 @@ dependencies = [
 [[package]]
 name = "rlp_derive"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2988,6 +3002,14 @@ name = "safemem"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "same-file"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "scoped-tls"
 version = "0.1.2"
@@ -3137,7 +3159,7 @@ dependencies = [
 [[package]]
 name = "snappy"
 version = "0.1.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "libc 0.2.46 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -3156,17 +3178,6 @@ dependencies = [
  "util 0.6.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
 ]
 
-[[package]]
-name = "socket2"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.46 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
 [[package]]
 name = "sodiumoxide"
 version = "0.1.0"
@@ -3318,52 +3329,49 @@ dependencies = [
 
 [[package]]
 name = "tentacle"
-version = "0.2.0-alpha.4"
+version = "0.2.0-alpha.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "flatbuffers 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "flatbuffers-verifier 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flatbuffers 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flatbuffers-verifier 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "parity-multiaddr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "tentacle-secio 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tentacle-secio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio-threadpool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "tokio-yamux 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-yamux 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "tentacle-discovery"
-version = "0.2.0"
+version = "0.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "flatbuffers 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "flatbuffers-verifier 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flatbuffers 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flatbuffers-verifier 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
- "tentacle 0.2.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tentacle 0.2.0-alpha.14 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
- "trust-dns 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "tentacle-secio"
-version = "0.1.1"
+version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "flatbuffers 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "flatbuffers-verifier 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flatbuffers 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flatbuffers-verifier 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3486,7 +3494,7 @@ name = "tokio"
 version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
  "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3509,7 +3517,7 @@ name = "tokio-codec"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -3519,7 +3527,7 @@ name = "tokio-core"
 version = "0.1.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3564,7 +3572,7 @@ name = "tokio-io"
 version = "0.1.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -3622,7 +3630,7 @@ name = "tokio-tcp"
 version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3680,7 +3688,7 @@ name = "tokio-udp"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3694,7 +3702,7 @@ name = "tokio-uds"
 version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.46 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3710,7 +3718,7 @@ name = "tokio-uds"
 version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.46 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3724,11 +3732,11 @@ dependencies = [
 
 [[package]]
 name = "tokio-yamux"
-version = "0.1.5"
+version = "0.1.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3758,49 +3766,6 @@ name = "transient-hashmap"
 version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
-[[package]]
-name = "trust-dns"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "data-encoding-macro 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "radix_trie 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
- "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "trust-dns-proto 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "trust-dns-proto"
-version = "0.6.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
- "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "tokio-udp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
 [[package]]
 name = "try-lock"
 version = "0.2.2"
@@ -3819,7 +3784,7 @@ dependencies = [
 [[package]]
 name = "tx_pool"
 version = "0.6.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "cita-crypto 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -3961,7 +3926,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 [[package]]
 name = "util"
 version = "0.6.0"
-source = "git+https://github.com/cryptape/cita-common.git?branch=develop#3ec4e19ca77563c261ba36bc179cac484901bea0"
+source = "git+https://github.com/cryptape/cita-common.git?branch=develop#73402b55138919f85b50b066f2e5c1f8b32e6b3c"
 dependencies = [
  "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cita-types 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)",
@@ -4008,6 +3973,16 @@ name = "void"
 version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "walkdir"
+version = "2.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "want"
 version = "0.0.6"
@@ -4078,7 +4053,7 @@ version = "0.7.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -4118,17 +4093,14 @@ dependencies = [
 [[package]]
 name = "zktx"
 version = "0.0.1"
-source = "git+https://github.com/cryptape/zktx.git#fe4fcb702c6a6c8bef560a3e3d2ee027fa64ad67"
+source = "git+https://github.com/cryptape/zktx.git#03fcc4b02432f42e53563deccdaaa767fd7a0ad6"
 dependencies = [
  "bellman 0.0.4 (git+https://github.com/cryptape/bellman.git?branch=0.0.4_modified)",
  "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "jubjub 0.0.1 (git+https://github.com/cryptape/jubjub-prototype.git?branch=modified)",
  "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "pairing 0.11.0 (git+https://github.com/cryptape/pairing.git?branch=0.11-release)",
- "protobuf 1.7.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
- "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -4177,6 +4149,7 @@ dependencies = [
 "checksum bindgen 0.37.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1b25ab82877ea8fe6ce1ce1f8ac54361f0218bad900af9eb11803994bf67c221"
 "checksum bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c"
 "checksum bit-vec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "02b4ff8b16e6076c3e14220b39fbc1fabb6737522281a388998046859400895f"
+"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
 "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
 "checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e"
 "checksum blake2b 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)" = "<none>"
@@ -4191,7 +4164,7 @@ dependencies = [
 "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
 "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855"
 "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb"
-"checksum bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "40ade3d27603c2cb345eb0912aec461a6dec7e06a4ae48589904e808335c7afa"
+"checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c"
 "checksum cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "389803e36973d242e7fecb092b2de44a3d35ac62524b3b9339e51d577d668e02"
 "checksum cexpr 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "42aac45e9567d97474a834efdee3081b3c942b2205be932092f53354ce503d6c"
 "checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"
@@ -4231,8 +4204,6 @@ dependencies = [
 "checksum curl-sys 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)" = "08459503c415173da1ce6b41036a37b8bfdd86af46d45abb9964d4c61fe670ef"
 "checksum custom_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "ef8ae57c4978a2acd8b869ce6b9ca1dfe817bff704c220209fdef2c0b75a01b9"
 "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97"
-"checksum data-encoding-macro 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9b87bf377fc964606c3679c1de6822a9a9d8b69aae2651ca4af28cb2d1550b37"
-"checksum data-encoding-macro-internal 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "22b318a8d6d56c45df45c61fcc7d2dbf98ea014d4987e7c74ef1f86c9b87e503"
 "checksum db 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)" = "<none>"
 "checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850"
 "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a"
@@ -4241,7 +4212,6 @@ dependencies = [
 "checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd"
 "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0"
 "checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85"
-"checksum endian-type 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d"
 "checksum engine 0.6.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)" = "<none>"
 "checksum enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180"
 "checksum env_logger 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "15abd780e45b3ea4f76b4e9a26ff4843258dd8a3eed2775a0e7368c2e7936c2f"
@@ -4262,12 +4232,15 @@ dependencies = [
 "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
 "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1"
 "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
+"checksum filetime 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2f8c63033fcba1f51ef744505b3cad42510432b904c062afa67ad7ece008429d"
 "checksum fixed-hash 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0d5ec8112f00ea8a483e04748a85522184418fd1cf02890b626d8fc28683f7de"
-"checksum flatbuffers 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea0c34f669be9911826facafe996adfda978aeee67285a13556869e2d8b8331f"
-"checksum flatbuffers-verifier 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "228f0226833a59e66d5ba28d15fca4efce5d598314d56179b22b3d89fbb6bf10"
+"checksum flatbuffers 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2fc1af59fd8248b59beb048d614a869ce211315c195f5412334e47f5b7e22726"
+"checksum flatbuffers-verifier 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb67f9057183996c00b19cd934f9e79f09aecf7c29e4424cf262288f5a2a84ae"
 "checksum flate2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3b0c7353385f92079524de3b7116cf99d73947c08a7472774e9b3b04bff3b901"
 "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
 "checksum fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"
+"checksum fsevent 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c4bbbf71584aeed076100b5665ac14e3d85eeb31fdbb45fbd41ef9a682b5ec05"
+"checksum fsevent-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a772d36c338d07a032d5375a36f15f9a7043bf0cb8ce7cee658e037c6032874"
 "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
 "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
 "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
@@ -4295,6 +4268,8 @@ dependencies = [
 "checksum hyper 0.12.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0aeedb8ca5f0f96be00f84073c6d0d5f962ecad020ef543dff99a7c12717a60e"
 "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
 "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d"
+"checksum inotify 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "40b54539f3910d6f84fbf9a643efd6e3aa6e4f001426c0329576128255994718"
+"checksum inotify-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e74a1aa87c59aeff6ef2cc2fa62d41bc43f54952f55652656b18a02fd5e356c0"
 "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
 "checksum itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4833d6978da405305126af4ac88569b5d71ff758581ce5a987dbfa3755f694fc"
 "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b"
@@ -4345,9 +4320,9 @@ dependencies = [
 "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125"
 "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
 "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
-"checksum nibble_vec 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c8d77f3db4bce033f4d04db08079b2ef1c3d02b44e86f25d08886fafa7756ffa"
 "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
 "checksum nom 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05aec50c70fd288702bcd93284a8444607f3292dbdf2a30de5ea5dcdbe72287b"
+"checksum notify 4.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "abb1581693e44d8a0ec347ef12289625063f52a1dddc3f3c9befd5fc59e88943"
 "checksum ntp 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5a6db8a93b2f1ae56aa64c5bfa0a4a5a07d59ec92da3ec090d5a6b8e1cfe3965"
 "checksum num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e"
 "checksum num-bigint 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)" = "e63899ad0da84ce718c14936262a41cee2c79c981fc0a0e7c7beb47d5a07e8c1"
@@ -4366,7 +4341,7 @@ dependencies = [
 "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37"
 "checksum pairing 0.11.0 (git+https://github.com/cryptape/pairing.git?branch=0.11-release)" = "<none>"
 "checksum panic_hook 0.0.1 (git+https://github.com/cryptape/cita-common.git?branch=develop)" = "<none>"
-"checksum parity-multiaddr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "143cb29a33d708ccc4b00686c93acee8c76d8e188b0156a5214fcec63b59a6fc"
+"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0"
 "checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076"
 "checksum parity-rocksdb 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cd55d2d6d6000ec99f021cf52c9acc7d2a402e14f95ced4c5de230696fabe00b"
 "checksum parity-rocksdb-sys 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0e59eda423021494a6cf1be74f6989add403f53157409993f794e17b123cab51"
@@ -4377,12 +4352,9 @@ dependencies = [
 "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
 "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c"
 "checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995"
-"checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8"
-"checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a"
 "checksum proc-macro2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "77997c53ae6edd6d187fec07ec41b207063b5ee6f33680e9fa86d405cdd313d4"
 "checksum proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "3d7b7eaaa90b4a90a932a9ea6666c95a389e424eff347f0f793979289429feee"
 "checksum proof 0.6.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)" = "<none>"
-"checksum protobuf 1.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "52fbc45bf6709565e44ef31847eb7407b3c3c80af811ee884a04da071dcca12b"
 "checksum protobuf 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "56c363dfc36e450457f4fa05a91d8c3f0fed00fc21142b4ce2cb7b525675eaeb"
 "checksum pubsub 0.6.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)" = "<none>"
 "checksum pubsub_kafka 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)" = "<none>"
@@ -4394,7 +4366,6 @@ dependencies = [
 "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
 "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8"
 "checksum quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd636425967c33af890042c483632d33fa7a18f19ad1d7ea72e8998c6ef8dea5"
-"checksum radix_trie 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ebcf72e767017c1aa4b63d4dd0b0b836a243b648fd81d41c6bf6e850ef7a95c7"
 "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1"
 "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
 "checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c"
@@ -4433,6 +4404,7 @@ dependencies = [
 "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
 "checksum ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7153dd96dade874ab973e098cb62fcdbb89a03682e46b144fd09550998d4a4a7"
 "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9"
+"checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267"
 "checksum scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28"
 "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27"
 "checksum secp256k1 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfaccd3a23619349e0878d9a241f34b1982343cdf67367058cd7d078d326b63e"
@@ -4453,7 +4425,6 @@ dependencies = [
 "checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d"
 "checksum smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "153ffa32fd170e9944f7e0838edf824a754ec4c1fc64746fcc9fe1f8fa602e5d"
 "checksum snappy 0.1.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)" = "<none>"
-"checksum socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d11a52082057d87cb5caa31ad812f4504b97ab44732cd8359df2e9ff9f48e7"
 "checksum sodiumoxide 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71c0682b4406fa25d621b19d2e70b5f6c8627e39b4b7ce0e24b2ef05d0fbe1ca"
 "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55"
 "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8"
@@ -4470,9 +4441,9 @@ dependencies = [
 "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
 "checksum tempfile 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "11ce2fe9db64b842314052e2421ac61a73ce41b898dc8e3750398b219c5fc1e0"
 "checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a"
-"checksum tentacle 0.2.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "832ff188e39ac2534c8dd0dab05b87017137671eb8e8de6082a3c2e52629ba25"
-"checksum tentacle-discovery 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "39a377a602798077a0b1414490fea3df8239625782d9b8bffcaeb94ca2b0d59e"
-"checksum tentacle-secio 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f13591b37fad9bfdc167a646eb7cdd97faac3d606bac3be04107d9f2a816fcc"
+"checksum tentacle 0.2.0-alpha.14 (registry+https://github.com/rust-lang/crates.io-index)" = "047295b0c9f01be1790d8c94f722c81ab59788e6576d3b2c5c95d44700bfce8d"
+"checksum tentacle-discovery 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "48f049945da9545ef3208a10a28a33ca64e9672dab762ad28cfc861262f9a770"
+"checksum tentacle-secio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1f7e6cfc62a132bec2b68c0827dcbfbe7b54744783aeaf15219acaeb8e07e8cd"
 "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f"
 "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
 "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6"
@@ -4504,13 +4475,11 @@ dependencies = [
 "checksum tokio-udp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "da941144b816d0dcda4db3a1ba87596e4df5e860a72b70783fe435891f80601c"
 "checksum tokio-uds 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "65ae5d255ce739e8537221ed2942e0445f4b3b813daebac1c0050ddaaa3587f9"
 "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445"
-"checksum tokio-yamux 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "50e8f25455f7b9e9202b5cf713170bd94e01886d44905dce2db8060e738c44e1"
+"checksum tokio-yamux 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "a6b5045fcdbb9cfe770bf5a1453f28115e23023949327607ab6e78a55a23630d"
 "checksum toml 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "736b60249cb25337bc196faa43ee12c705e426f3d55c214d73a4e7be06f92cb4"
 "checksum toml 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4a2ecc31b0351ea18b3fe11274b8db6e4d82bce861bbb22e6dbed40417902c65"
 "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079"
 "checksum transient-hashmap 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aeb4b191d033a35edfce392a38cdcf9790b6cebcb30fa690c312c29da4dc433e"
-"checksum trust-dns 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "65096825b064877da37eeeb9a83390bd23433eabfc503a6476dc5b1949034aa7"
-"checksum trust-dns-proto 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "09144f0992b0870fa8d2972cc069cbf1e3c0fda64d1f3d45c4d68d0e0b52ad4e"
 "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382"
 "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1"
 "checksum tx_pool 0.6.0 (git+https://github.com/cryptape/cita-common.git?branch=develop)" = "<none>"
@@ -4539,6 +4508,7 @@ dependencies = [
 "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
 "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
 "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
+"checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1"
 "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3"
 "checksum which 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e84a603e7e0b1ce1aa1ee2b109c7be00155ce52df5081590d1ffb93f4f515cb2"
 "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
diff --git a/README-CN.md b/README-CN.md
index 33c251ee7..bf6792242 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -2,7 +2,7 @@
 
 [![Circle CI Status](https://circleci.com/gh/cryptape/cita.svg?branch=develop)](https://circleci.com/gh/cryptape/cita)
 
-[![All Contributors](https://img.shields.io/badge/all_contributors-47-orange.svg?style=flat-square)](#contributors)
+[![All Contributors](https://img.shields.io/badge/all_contributors-54-orange.svg?style=flat-square)](#contributors)
 
 [English](./README.md) | 简体中文
 
@@ -102,7 +102,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
 
 <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
 <!-- prettier-ignore -->
-<table><tr><td align="center"><a href="https://github.com/kaikai1024"><img src="https://avatars0.githubusercontent.com/u/8768261?v=4" width="100px;" alt="kaikai"/><br /><sub><b>kaikai</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=kaikai1024" title="Code">💻</a></td><td align="center"><a href="https://twitter.com/zhangyaning1985"><img src="https://avatars0.githubusercontent.com/u/161756?v=4" width="100px;" alt="zhangyaning"/><br /><sub><b>zhangyaning</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=u2" title="Code">💻</a></td><td align="center"><a href="https://yangby-cryptape.github.io/"><img src="https://avatars1.githubusercontent.com/u/30993023?v=4" width="100px;" alt="Boyu Yang"/><br /><sub><b>Boyu Yang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=yangby-cryptape" title="Code">💻</a></td><td align="center"><a href="https://github.com/rink1969"><img src="https://avatars1.githubusercontent.com/u/1633038?v=4" width="100px;" alt="zhiwei"/><br /><sub><b>zhiwei</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rink1969" title="Code">💻</a></td><td align="center"><a href="https://www.driftluo.com"><img src="https://avatars3.githubusercontent.com/u/19374080?v=4" width="100px;" alt="漂流"/><br /><sub><b>漂流</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=driftluo" title="Code">💻</a></td><td align="center"><a href="https://ouwenkg.github.io/"><img src="https://avatars0.githubusercontent.com/u/11801722?v=4" width="100px;" alt="AsceticBear"/><br /><sub><b>AsceticBear</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=ouwenkg" title="Code">💻</a></td><td align="center"><a href="https://github.com/jerry-yu"><img src="https://avatars2.githubusercontent.com/u/2151472?v=4" width="100px;" alt="yubo"/><br /><sub><b>yubo</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jerry-yu" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/zhouyun-zoe"><img src="https://avatars0.githubusercontent.com/u/36949326?v=4" width="100px;" alt="zhouyun-zoe"/><br /><sub><b>zhouyun-zoe</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=zhouyun-zoe" title="Documentation">📖</a></td><td align="center"><a href="https://github.com/volzkzg"><img src="https://avatars2.githubusercontent.com/u/2860864?v=4" width="100px;" alt="Bicheng Gao"/><br /><sub><b>Bicheng Gao</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=volzkzg" title="Code">💻</a></td><td align="center"><a href="https://github.com/EighteenZi"><img src="https://avatars3.githubusercontent.com/u/31607114?v=4" width="100px;" alt="lhf"/><br /><sub><b>lhf</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=EighteenZi" title="Code">💻</a></td><td align="center"><a href="http://ahorn.me"><img src="https://avatars0.githubusercontent.com/u/1160419?v=4" width="100px;" alt="LinFeng Qian"/><br /><sub><b>LinFeng Qian</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=TheWaWaR" title="Code">💻</a></td><td align="center"><a href="https://github.com/keroro520"><img src="https://avatars3.githubusercontent.com/u/1870648?v=4" width="100px;" alt="keroro"/><br /><sub><b>keroro</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=keroro520" title="Code">💻</a></td><td align="center"><a href="https://github.com/leeyr338"><img src="https://avatars3.githubusercontent.com/u/38514341?v=4" width="100px;" alt="Yaorong"/><br /><sub><b>Yaorong</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=leeyr338" title="Code">💻</a></td><td align="center"><a href="https://github.com/suyanlong"><img src="https://avatars2.githubusercontent.com/u/16421423?v=4" width="100px;" alt="suyanlong"/><br /><sub><b>suyanlong</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=suyanlong" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/Keith-CY"><img src="https://avatars1.githubusercontent.com/u/7271329?v=4" width="100px;" alt="Chen Yu"/><br /><sub><b>Chen Yu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=Keith-CY" title="Code">💻</a></td><td align="center"><a href="https://zhangsoledad.github.io/salon"><img src="https://avatars2.githubusercontent.com/u/3198439?v=4" width="100px;" alt="zhangsoledad"/><br /><sub><b>zhangsoledad</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=zhangsoledad" title="Code">💻</a></td><td align="center"><a href="https://github.com/hezhengjun"><img src="https://avatars0.githubusercontent.com/u/30688033?v=4" width="100px;" alt="hezhengjun"/><br /><sub><b>hezhengjun</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=hezhengjun" title="Code">💻</a></td><td align="center"><a href="https://github.com/zeroqn"><img src="https://avatars0.githubusercontent.com/u/23418132?v=4" width="100px;" alt="zeroqn"/><br /><sub><b>zeroqn</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=zeroqn" title="Code">💻</a></td><td align="center"><a href="https://github.com/urugang"><img src="https://avatars1.githubusercontent.com/u/11461821?v=4" width="100px;" alt="urugang"/><br /><sub><b>urugang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=urugang" title="Code">💻</a></td><td align="center"><a href="https://justjjy.com"><img src="https://avatars0.githubusercontent.com/u/1695400?v=4" width="100px;" alt="Jiang Jinyang"/><br /><sub><b>Jiang Jinyang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jjyr" title="Code">💻</a></td><td align="center"><a href="https://twitter.com/janhxie"><img src="https://avatars0.githubusercontent.com/u/5958?v=4" width="100px;" alt="Jan Xie"/><br /><sub><b>Jan Xie</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=janx" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/jerry-sl"><img src="https://avatars0.githubusercontent.com/u/5476062?v=4" width="100px;" alt="Sun Lei"/><br /><sub><b>Sun Lei</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jerry-sl" title="Code">💻</a></td><td align="center"><a href="https://github.com/chuchenxihyl"><img src="https://avatars1.githubusercontent.com/u/23721562?v=4" width="100px;" alt="hyl"/><br /><sub><b>hyl</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=chuchenxihyl" title="Code">💻</a></td><td align="center"><a href="http://terrytai.me"><img src="https://avatars3.githubusercontent.com/u/5960?v=4" width="100px;" alt="Terry Tai"/><br /><sub><b>Terry Tai</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=poshboytl" title="Code">💻</a></td><td align="center"><a href="https://bll.io"><img src="https://avatars0.githubusercontent.com/u/9641495?v=4" width="100px;" alt="Ke Wang"/><br /><sub><b>Ke Wang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=kilb" title="Code">💻</a></td><td align="center"><a href="http://accu.cc"><img src="https://avatars3.githubusercontent.com/u/12387889?v=4" width="100px;" alt="Mohanson"/><br /><sub><b>Mohanson</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=mohanson" title="Code">💻</a></td><td align="center"><a href="https://www.jianshu.com/u/3457636b07c5"><img src="https://avatars3.githubusercontent.com/u/17267434?v=4" width="100px;" alt="quanzhan lu"/><br /><sub><b>quanzhan lu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=luqz" title="Code">💻</a></td><td align="center"><a href="https://github.com/duanyytop"><img src="https://avatars1.githubusercontent.com/u/5823268?v=4" width="100px;" alt="duanyytop"/><br /><sub><b>duanyytop</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=duanyytop" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/clearloop"><img src="https://avatars0.githubusercontent.com/u/26088946?v=4" width="100px;" alt="clearloop"/><br /><sub><b>clearloop</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=clearloop" title="Code">💻</a></td><td align="center"><a href="https://github.com/hot3246624"><img src="https://avatars3.githubusercontent.com/u/9135770?v=4" width="100px;" alt="nokodemion"/><br /><sub><b>nokodemion</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=hot3246624" title="Code">💻</a></td><td align="center"><a href="http://rainchen.com"><img src="https://avatars0.githubusercontent.com/u/71397?v=4" width="100px;" alt="Rain Chen"/><br /><sub><b>Rain Chen</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rainchen" title="Code">💻</a></td><td align="center"><a href="https://github.com/daogangtang"><img src="https://avatars2.githubusercontent.com/u/629594?v=4" width="100px;" alt="Daogang Tang"/><br /><sub><b>Daogang Tang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=daogangtang" title="Code">💻</a></td><td align="center"><a href="https://github.com/jiangxianliang007"><img src="https://avatars1.githubusercontent.com/u/24754263?v=4" width="100px;" alt="xianliang jiang"/><br /><sub><b>xianliang jiang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jiangxianliang007" title="Code">💻</a></td><td align="center"><a href="https://github.com/vinberm"><img src="https://avatars0.githubusercontent.com/u/17666225?v=4" width="100px;" alt="Nov"/><br /><sub><b>Nov</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=vinberm" title="Code">💻</a></td><td align="center"><a href="https://github.com/rairyx"><img src="https://avatars2.githubusercontent.com/u/5009854?v=4" width="100px;" alt="Rai Yang"/><br /><sub><b>Rai Yang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rairyx" title="Code">💻</a></td></tr><tr><td align="center"><a href="http://www.huwenchao.com/"><img src="https://avatars0.githubusercontent.com/u/1630721?v=4" width="100px;" alt="Wenchao Hu"/><br /><sub><b>Wenchao Hu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=huwenchao" title="Code">💻</a></td><td align="center"><a href="https://github.com/Kayryu"><img src="https://avatars1.githubusercontent.com/u/35792093?v=4" width="100px;" alt="kaiyu"/><br /><sub><b>kaiyu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=Kayryu" title="Code">💻</a></td><td align="center"><a href="https://ashchan.com"><img src="https://avatars2.githubusercontent.com/u/1391?v=4" width="100px;" alt="James Chen"/><br /><sub><b>James Chen</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=ashchan" title="Code">💻</a></td><td align="center"><a href="https://github.com/rev-chaos"><img src="https://avatars1.githubusercontent.com/u/32355308?v=4" width="100px;" alt="rev-chaos"/><br /><sub><b>rev-chaos</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rev-chaos" title="Code">💻</a></td><td align="center"><a href="https://github.com/KaoImin"><img src="https://avatars1.githubusercontent.com/u/24822778?v=4" width="100px;" alt="Eason Gao"/><br /><sub><b>Eason Gao</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=KaoImin" title="Code">💻</a></td><td align="center"><a href="http://qinix.com"><img src="https://avatars1.githubusercontent.com/u/1946663?v=4" width="100px;" alt="Eric Zhang"/><br /><sub><b>Eric Zhang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=qinix" title="Code">💻</a></td><td align="center"><a href="https://github.com/jasl"><img src="https://avatars2.githubusercontent.com/u/1024162?v=4" width="100px;" alt="Jun Jiang"/><br /><sub><b>Jun Jiang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jasl" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://blog.priewienv.me"><img src="https://avatars1.githubusercontent.com/u/9765170?v=4" width="100px;" alt="PRIEWIENV"/><br /><sub><b>PRIEWIENV</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=PRIEWIENV" title="Code">💻</a></td><td align="center"><a href="https://gitter.im"><img src="https://avatars2.githubusercontent.com/u/8518239?v=4" width="100px;" alt="The Gitter Badger"/><br /><sub><b>The Gitter Badger</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=gitter-badger" title="Code">💻</a></td><td align="center"><a href="https://github.com/classicalliu"><img src="https://avatars3.githubusercontent.com/u/13375784?v=4" width="100px;" alt="CL"/><br /><sub><b>CL</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=classicalliu" title="Code">💻</a></td><td align="center"><a href="https://github.com/programmer-liu"><img src="https://avatars2.githubusercontent.com/u/25048144?v=4" width="100px;" alt="programmer-liu"/><br /><sub><b>programmer-liu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=programmer-liu" title="Code">💻</a></td><td align="center"><a href="https://github.com/yejiayu"><img src="https://avatars3.githubusercontent.com/u/10446547?v=4" width="100px;" alt="Jiayu Ye"/><br /><sub><b>Jiayu Ye</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=yejiayu" title="Code">💻</a></td></tr></table>
+<table><tr><td align="center"><a href="https://github.com/kaikai1024"><img src="https://avatars0.githubusercontent.com/u/8768261?v=4" width="100px;" alt="kaikai"/><br /><sub><b>kaikai</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=kaikai1024" title="Code">💻</a></td><td align="center"><a href="https://twitter.com/zhangyaning1985"><img src="https://avatars0.githubusercontent.com/u/161756?v=4" width="100px;" alt="zhangyaning"/><br /><sub><b>zhangyaning</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=u2" title="Code">💻</a></td><td align="center"><a href="https://yangby-cryptape.github.io/"><img src="https://avatars1.githubusercontent.com/u/30993023?v=4" width="100px;" alt="Boyu Yang"/><br /><sub><b>Boyu Yang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=yangby-cryptape" title="Code">💻</a></td><td align="center"><a href="https://github.com/rink1969"><img src="https://avatars1.githubusercontent.com/u/1633038?v=4" width="100px;" alt="zhiwei"/><br /><sub><b>zhiwei</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rink1969" title="Code">💻</a></td><td align="center"><a href="https://www.driftluo.com"><img src="https://avatars3.githubusercontent.com/u/19374080?v=4" width="100px;" alt="漂流"/><br /><sub><b>漂流</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=driftluo" title="Code">💻</a></td><td align="center"><a href="https://ouwenkg.github.io/"><img src="https://avatars0.githubusercontent.com/u/11801722?v=4" width="100px;" alt="AsceticBear"/><br /><sub><b>AsceticBear</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=ouwenkg" title="Code">💻</a></td><td align="center"><a href="https://github.com/jerry-yu"><img src="https://avatars2.githubusercontent.com/u/2151472?v=4" width="100px;" alt="yubo"/><br /><sub><b>yubo</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jerry-yu" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/zhouyun-zoe"><img src="https://avatars0.githubusercontent.com/u/36949326?v=4" width="100px;" alt="zhouyun-zoe"/><br /><sub><b>zhouyun-zoe</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=zhouyun-zoe" title="Documentation">📖</a></td><td align="center"><a href="https://github.com/volzkzg"><img src="https://avatars2.githubusercontent.com/u/2860864?v=4" width="100px;" alt="Bicheng Gao"/><br /><sub><b>Bicheng Gao</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=volzkzg" title="Code">💻</a></td><td align="center"><a href="https://github.com/EighteenZi"><img src="https://avatars3.githubusercontent.com/u/31607114?v=4" width="100px;" alt="lhf"/><br /><sub><b>lhf</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=EighteenZi" title="Code">💻</a></td><td align="center"><a href="http://ahorn.me"><img src="https://avatars0.githubusercontent.com/u/1160419?v=4" width="100px;" alt="LinFeng Qian"/><br /><sub><b>LinFeng Qian</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=TheWaWaR" title="Code">💻</a></td><td align="center"><a href="https://github.com/keroro520"><img src="https://avatars3.githubusercontent.com/u/1870648?v=4" width="100px;" alt="keroro"/><br /><sub><b>keroro</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=keroro520" title="Code">💻</a></td><td align="center"><a href="https://github.com/leeyr338"><img src="https://avatars3.githubusercontent.com/u/38514341?v=4" width="100px;" alt="Yaorong"/><br /><sub><b>Yaorong</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=leeyr338" title="Code">💻</a></td><td align="center"><a href="https://github.com/suyanlong"><img src="https://avatars2.githubusercontent.com/u/16421423?v=4" width="100px;" alt="suyanlong"/><br /><sub><b>suyanlong</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=suyanlong" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/Keith-CY"><img src="https://avatars1.githubusercontent.com/u/7271329?v=4" width="100px;" alt="Chen Yu"/><br /><sub><b>Chen Yu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=Keith-CY" title="Code">💻</a></td><td align="center"><a href="https://zhangsoledad.github.io/salon"><img src="https://avatars2.githubusercontent.com/u/3198439?v=4" width="100px;" alt="zhangsoledad"/><br /><sub><b>zhangsoledad</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=zhangsoledad" title="Code">💻</a></td><td align="center"><a href="https://github.com/hezhengjun"><img src="https://avatars0.githubusercontent.com/u/30688033?v=4" width="100px;" alt="hezhengjun"/><br /><sub><b>hezhengjun</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=hezhengjun" title="Code">💻</a></td><td align="center"><a href="https://github.com/zeroqn"><img src="https://avatars0.githubusercontent.com/u/23418132?v=4" width="100px;" alt="zeroqn"/><br /><sub><b>zeroqn</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=zeroqn" title="Code">💻</a></td><td align="center"><a href="https://github.com/urugang"><img src="https://avatars1.githubusercontent.com/u/11461821?v=4" width="100px;" alt="urugang"/><br /><sub><b>urugang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=urugang" title="Code">💻</a></td><td align="center"><a href="https://justjjy.com"><img src="https://avatars0.githubusercontent.com/u/1695400?v=4" width="100px;" alt="Jiang Jinyang"/><br /><sub><b>Jiang Jinyang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jjyr" title="Code">💻</a></td><td align="center"><a href="https://twitter.com/janhxie"><img src="https://avatars0.githubusercontent.com/u/5958?v=4" width="100px;" alt="Jan Xie"/><br /><sub><b>Jan Xie</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=janx" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/jerry-sl"><img src="https://avatars0.githubusercontent.com/u/5476062?v=4" width="100px;" alt="Sun Lei"/><br /><sub><b>Sun Lei</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jerry-sl" title="Code">💻</a></td><td align="center"><a href="https://github.com/chuchenxihyl"><img src="https://avatars1.githubusercontent.com/u/23721562?v=4" width="100px;" alt="hyl"/><br /><sub><b>hyl</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=chuchenxihyl" title="Code">💻</a></td><td align="center"><a href="http://terrytai.me"><img src="https://avatars3.githubusercontent.com/u/5960?v=4" width="100px;" alt="Terry Tai"/><br /><sub><b>Terry Tai</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=poshboytl" title="Code">💻</a></td><td align="center"><a href="https://bll.io"><img src="https://avatars0.githubusercontent.com/u/9641495?v=4" width="100px;" alt="Ke Wang"/><br /><sub><b>Ke Wang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=kilb" title="Code">💻</a></td><td align="center"><a href="http://accu.cc"><img src="https://avatars3.githubusercontent.com/u/12387889?v=4" width="100px;" alt="Mohanson"/><br /><sub><b>Mohanson</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=mohanson" title="Code">💻</a></td><td align="center"><a href="https://www.jianshu.com/u/3457636b07c5"><img src="https://avatars3.githubusercontent.com/u/17267434?v=4" width="100px;" alt="quanzhan lu"/><br /><sub><b>quanzhan lu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=luqz" title="Code">💻</a></td><td align="center"><a href="https://github.com/duanyytop"><img src="https://avatars1.githubusercontent.com/u/5823268?v=4" width="100px;" alt="duanyytop"/><br /><sub><b>duanyytop</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=duanyytop" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/clearloop"><img src="https://avatars0.githubusercontent.com/u/26088946?v=4" width="100px;" alt="clearloop"/><br /><sub><b>clearloop</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=clearloop" title="Code">💻</a></td><td align="center"><a href="https://github.com/hot3246624"><img src="https://avatars3.githubusercontent.com/u/9135770?v=4" width="100px;" alt="nokodemion"/><br /><sub><b>nokodemion</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=hot3246624" title="Code">💻</a></td><td align="center"><a href="http://rainchen.com"><img src="https://avatars0.githubusercontent.com/u/71397?v=4" width="100px;" alt="Rain Chen"/><br /><sub><b>Rain Chen</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rainchen" title="Code">💻</a></td><td align="center"><a href="https://github.com/daogangtang"><img src="https://avatars2.githubusercontent.com/u/629594?v=4" width="100px;" alt="Daogang Tang"/><br /><sub><b>Daogang Tang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=daogangtang" title="Code">💻</a></td><td align="center"><a href="https://github.com/jiangxianliang007"><img src="https://avatars1.githubusercontent.com/u/24754263?v=4" width="100px;" alt="xianliang jiang"/><br /><sub><b>xianliang jiang</b></sub></a><br /><a href="https://github.com/cryptape/cita/issues?q=author%3Ajiangxianliang007" title="Bug reports">🐛</a></td><td align="center"><a href="https://github.com/vinberm"><img src="https://avatars0.githubusercontent.com/u/17666225?v=4" width="100px;" alt="Nov"/><br /><sub><b>Nov</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=vinberm" title="Code">💻</a></td><td align="center"><a href="https://github.com/rairyx"><img src="https://avatars2.githubusercontent.com/u/5009854?v=4" width="100px;" alt="Rai Yang"/><br /><sub><b>Rai Yang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rairyx" title="Code">💻</a></td></tr><tr><td align="center"><a href="http://www.huwenchao.com/"><img src="https://avatars0.githubusercontent.com/u/1630721?v=4" width="100px;" alt="Wenchao Hu"/><br /><sub><b>Wenchao Hu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=huwenchao" title="Code">💻</a></td><td align="center"><a href="https://github.com/Kayryu"><img src="https://avatars1.githubusercontent.com/u/35792093?v=4" width="100px;" alt="kaiyu"/><br /><sub><b>kaiyu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=Kayryu" title="Code">💻</a></td><td align="center"><a href="https://ashchan.com"><img src="https://avatars2.githubusercontent.com/u/1391?v=4" width="100px;" alt="James Chen"/><br /><sub><b>James Chen</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=ashchan" title="Code">💻</a></td><td align="center"><a href="https://github.com/rev-chaos"><img src="https://avatars1.githubusercontent.com/u/32355308?v=4" width="100px;" alt="rev-chaos"/><br /><sub><b>rev-chaos</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rev-chaos" title="Code">💻</a></td><td align="center"><a href="https://github.com/KaoImin"><img src="https://avatars1.githubusercontent.com/u/24822778?v=4" width="100px;" alt="Eason Gao"/><br /><sub><b>Eason Gao</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=KaoImin" title="Code">💻</a></td><td align="center"><a href="http://qinix.com"><img src="https://avatars1.githubusercontent.com/u/1946663?v=4" width="100px;" alt="Eric Zhang"/><br /><sub><b>Eric Zhang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=qinix" title="Code">💻</a></td><td align="center"><a href="https://github.com/jasl"><img src="https://avatars2.githubusercontent.com/u/1024162?v=4" width="100px;" alt="Jun Jiang"/><br /><sub><b>Jun Jiang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jasl" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://blog.priewienv.me"><img src="https://avatars1.githubusercontent.com/u/9765170?v=4" width="100px;" alt="PRIEWIENV"/><br /><sub><b>PRIEWIENV</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=PRIEWIENV" title="Code">💻</a></td><td align="center"><a href="https://gitter.im"><img src="https://avatars2.githubusercontent.com/u/8518239?v=4" width="100px;" alt="The Gitter Badger"/><br /><sub><b>The Gitter Badger</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=gitter-badger" title="Code">💻</a></td><td align="center"><a href="https://github.com/classicalliu"><img src="https://avatars3.githubusercontent.com/u/13375784?v=4" width="100px;" alt="CL"/><br /><sub><b>CL</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=classicalliu" title="Code">💻</a></td><td align="center"><a href="https://github.com/programmer-liu"><img src="https://avatars2.githubusercontent.com/u/25048144?v=4" width="100px;" alt="programmer-liu"/><br /><sub><b>programmer-liu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=programmer-liu" title="Code">💻</a></td><td align="center"><a href="https://github.com/yejiayu"><img src="https://avatars3.githubusercontent.com/u/10446547?v=4" width="100px;" alt="Jiayu Ye"/><br /><sub><b>Jiayu Ye</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=yejiayu" title="Code">💻</a></td><td align="center"><a href="https://github.com/QingYanL"><img src="https://avatars3.githubusercontent.com/u/48231505?v=4" width="100px;" alt="liyanzi"/><br /><sub><b>liyanzi</b></sub></a><br /><a href="https://github.com/cryptape/cita/issues?q=author%3AQingYanL" title="Bug reports">🐛</a></td><td align="center"><a href="https://github.com/YUJIAYIYIYI"><img src="https://avatars0.githubusercontent.com/u/40654430?v=4" width="100px;" alt="JiaYi"/><br /><sub><b>JiaYi</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=YUJIAYIYIYI" title="Documentation">📖</a></td></tr><tr><td align="center"><a href="https://github.com/timmyz"><img src="https://avatars0.githubusercontent.com/u/795528?v=4" width="100px;" alt="Timmy Zhang"/><br /><sub><b>Timmy Zhang</b></sub></a><br /><a href="#ideas-timmyz" title="Ideas, Planning, & Feedback">🤔</a></td><td align="center"><a href="https://github.com/wuyuyue"><img src="https://avatars3.githubusercontent.com/u/40381396?v=4" width="100px;" alt="Wu Yuyue"/><br /><sub><b>Wu Yuyue</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=wuyuyue" title="Documentation">📖</a></td><td align="center"><a href="https://github.com/xiangmeiLu"><img src="https://avatars2.githubusercontent.com/u/30581938?v=4" width="100px;" alt="xiangmeiLu"/><br /><sub><b>xiangmeiLu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=xiangmeiLu" title="Documentation">📖</a></td><td align="center"><a href="https://github.com/mingxiaowu"><img src="https://avatars0.githubusercontent.com/u/42978282?v=4" width="100px;" alt="mingxiaowu"/><br /><sub><b>mingxiaowu</b></sub></a><br /><a href="https://github.com/cryptape/cita/issues?q=author%3Amingxiaowu" title="Bug reports">🐛</a></td><td align="center"><a href="https://github.com/wangfh666"><img src="https://avatars0.githubusercontent.com/u/41322861?s=400&v=4" width="100px;" alt="wangfh666"/><br /><sub><b>wangfh666</b></sub></a><br /><a href="https://github.com/cryptape/cita/issues?q=author%3Awangfh666" title="Bug reports">🐛</a></td></tr></table>
 
 <!-- ALL-CONTRIBUTORS-LIST:END -->
 
diff --git a/README.md b/README.md
index cdd03cc46..e13a0828e 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 [![Circle CI Status](https://circleci.com/gh/cryptape/cita.svg?branch=develop)](https://circleci.com/gh/cryptape/cita)
 
-[![All Contributors](https://img.shields.io/badge/all_contributors-47-orange.svg?style=flat-square)](#contributors)
+[![All Contributors](https://img.shields.io/badge/all_contributors-54-orange.svg?style=flat-square)](#contributors)
 
 English | [简体中文](./README-CN.md)
 
@@ -84,7 +84,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
 
 <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
 <!-- prettier-ignore -->
-<table><tr><td align="center"><a href="https://github.com/kaikai1024"><img src="https://avatars0.githubusercontent.com/u/8768261?v=4" width="100px;" alt="kaikai"/><br /><sub><b>kaikai</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=kaikai1024" title="Code">💻</a></td><td align="center"><a href="https://twitter.com/zhangyaning1985"><img src="https://avatars0.githubusercontent.com/u/161756?v=4" width="100px;" alt="zhangyaning"/><br /><sub><b>zhangyaning</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=u2" title="Code">💻</a></td><td align="center"><a href="https://yangby-cryptape.github.io/"><img src="https://avatars1.githubusercontent.com/u/30993023?v=4" width="100px;" alt="Boyu Yang"/><br /><sub><b>Boyu Yang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=yangby-cryptape" title="Code">💻</a></td><td align="center"><a href="https://github.com/rink1969"><img src="https://avatars1.githubusercontent.com/u/1633038?v=4" width="100px;" alt="zhiwei"/><br /><sub><b>zhiwei</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rink1969" title="Code">💻</a></td><td align="center"><a href="https://www.driftluo.com"><img src="https://avatars3.githubusercontent.com/u/19374080?v=4" width="100px;" alt="漂流"/><br /><sub><b>漂流</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=driftluo" title="Code">💻</a></td><td align="center"><a href="https://ouwenkg.github.io/"><img src="https://avatars0.githubusercontent.com/u/11801722?v=4" width="100px;" alt="AsceticBear"/><br /><sub><b>AsceticBear</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=ouwenkg" title="Code">💻</a></td><td align="center"><a href="https://github.com/jerry-yu"><img src="https://avatars2.githubusercontent.com/u/2151472?v=4" width="100px;" alt="yubo"/><br /><sub><b>yubo</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jerry-yu" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/zhouyun-zoe"><img src="https://avatars0.githubusercontent.com/u/36949326?v=4" width="100px;" alt="zhouyun-zoe"/><br /><sub><b>zhouyun-zoe</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=zhouyun-zoe" title="Documentation">📖</a></td><td align="center"><a href="https://github.com/volzkzg"><img src="https://avatars2.githubusercontent.com/u/2860864?v=4" width="100px;" alt="Bicheng Gao"/><br /><sub><b>Bicheng Gao</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=volzkzg" title="Code">💻</a></td><td align="center"><a href="https://github.com/EighteenZi"><img src="https://avatars3.githubusercontent.com/u/31607114?v=4" width="100px;" alt="lhf"/><br /><sub><b>lhf</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=EighteenZi" title="Code">💻</a></td><td align="center"><a href="http://ahorn.me"><img src="https://avatars0.githubusercontent.com/u/1160419?v=4" width="100px;" alt="LinFeng Qian"/><br /><sub><b>LinFeng Qian</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=TheWaWaR" title="Code">💻</a></td><td align="center"><a href="https://github.com/keroro520"><img src="https://avatars3.githubusercontent.com/u/1870648?v=4" width="100px;" alt="keroro"/><br /><sub><b>keroro</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=keroro520" title="Code">💻</a></td><td align="center"><a href="https://github.com/leeyr338"><img src="https://avatars3.githubusercontent.com/u/38514341?v=4" width="100px;" alt="Yaorong"/><br /><sub><b>Yaorong</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=leeyr338" title="Code">💻</a></td><td align="center"><a href="https://github.com/suyanlong"><img src="https://avatars2.githubusercontent.com/u/16421423?v=4" width="100px;" alt="suyanlong"/><br /><sub><b>suyanlong</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=suyanlong" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/Keith-CY"><img src="https://avatars1.githubusercontent.com/u/7271329?v=4" width="100px;" alt="Chen Yu"/><br /><sub><b>Chen Yu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=Keith-CY" title="Code">💻</a></td><td align="center"><a href="https://zhangsoledad.github.io/salon"><img src="https://avatars2.githubusercontent.com/u/3198439?v=4" width="100px;" alt="zhangsoledad"/><br /><sub><b>zhangsoledad</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=zhangsoledad" title="Code">💻</a></td><td align="center"><a href="https://github.com/hezhengjun"><img src="https://avatars0.githubusercontent.com/u/30688033?v=4" width="100px;" alt="hezhengjun"/><br /><sub><b>hezhengjun</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=hezhengjun" title="Code">💻</a></td><td align="center"><a href="https://github.com/zeroqn"><img src="https://avatars0.githubusercontent.com/u/23418132?v=4" width="100px;" alt="zeroqn"/><br /><sub><b>zeroqn</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=zeroqn" title="Code">💻</a></td><td align="center"><a href="https://github.com/urugang"><img src="https://avatars1.githubusercontent.com/u/11461821?v=4" width="100px;" alt="urugang"/><br /><sub><b>urugang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=urugang" title="Code">💻</a></td><td align="center"><a href="https://justjjy.com"><img src="https://avatars0.githubusercontent.com/u/1695400?v=4" width="100px;" alt="Jiang Jinyang"/><br /><sub><b>Jiang Jinyang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jjyr" title="Code">💻</a></td><td align="center"><a href="https://twitter.com/janhxie"><img src="https://avatars0.githubusercontent.com/u/5958?v=4" width="100px;" alt="Jan Xie"/><br /><sub><b>Jan Xie</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=janx" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/jerry-sl"><img src="https://avatars0.githubusercontent.com/u/5476062?v=4" width="100px;" alt="Sun Lei"/><br /><sub><b>Sun Lei</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jerry-sl" title="Code">💻</a></td><td align="center"><a href="https://github.com/chuchenxihyl"><img src="https://avatars1.githubusercontent.com/u/23721562?v=4" width="100px;" alt="hyl"/><br /><sub><b>hyl</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=chuchenxihyl" title="Code">💻</a></td><td align="center"><a href="http://terrytai.me"><img src="https://avatars3.githubusercontent.com/u/5960?v=4" width="100px;" alt="Terry Tai"/><br /><sub><b>Terry Tai</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=poshboytl" title="Code">💻</a></td><td align="center"><a href="https://bll.io"><img src="https://avatars0.githubusercontent.com/u/9641495?v=4" width="100px;" alt="Ke Wang"/><br /><sub><b>Ke Wang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=kilb" title="Code">💻</a></td><td align="center"><a href="http://accu.cc"><img src="https://avatars3.githubusercontent.com/u/12387889?v=4" width="100px;" alt="Mohanson"/><br /><sub><b>Mohanson</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=mohanson" title="Code">💻</a></td><td align="center"><a href="https://www.jianshu.com/u/3457636b07c5"><img src="https://avatars3.githubusercontent.com/u/17267434?v=4" width="100px;" alt="quanzhan lu"/><br /><sub><b>quanzhan lu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=luqz" title="Code">💻</a></td><td align="center"><a href="https://github.com/duanyytop"><img src="https://avatars1.githubusercontent.com/u/5823268?v=4" width="100px;" alt="duanyytop"/><br /><sub><b>duanyytop</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=duanyytop" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/clearloop"><img src="https://avatars0.githubusercontent.com/u/26088946?v=4" width="100px;" alt="clearloop"/><br /><sub><b>clearloop</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=clearloop" title="Code">💻</a></td><td align="center"><a href="https://github.com/hot3246624"><img src="https://avatars3.githubusercontent.com/u/9135770?v=4" width="100px;" alt="nokodemion"/><br /><sub><b>nokodemion</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=hot3246624" title="Code">💻</a></td><td align="center"><a href="http://rainchen.com"><img src="https://avatars0.githubusercontent.com/u/71397?v=4" width="100px;" alt="Rain Chen"/><br /><sub><b>Rain Chen</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rainchen" title="Code">💻</a></td><td align="center"><a href="https://github.com/daogangtang"><img src="https://avatars2.githubusercontent.com/u/629594?v=4" width="100px;" alt="Daogang Tang"/><br /><sub><b>Daogang Tang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=daogangtang" title="Code">💻</a></td><td align="center"><a href="https://github.com/jiangxianliang007"><img src="https://avatars1.githubusercontent.com/u/24754263?v=4" width="100px;" alt="xianliang jiang"/><br /><sub><b>xianliang jiang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jiangxianliang007" title="Code">💻</a></td><td align="center"><a href="https://github.com/vinberm"><img src="https://avatars0.githubusercontent.com/u/17666225?v=4" width="100px;" alt="Nov"/><br /><sub><b>Nov</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=vinberm" title="Code">💻</a></td><td align="center"><a href="https://github.com/rairyx"><img src="https://avatars2.githubusercontent.com/u/5009854?v=4" width="100px;" alt="Rai Yang"/><br /><sub><b>Rai Yang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rairyx" title="Code">💻</a></td></tr><tr><td align="center"><a href="http://www.huwenchao.com/"><img src="https://avatars0.githubusercontent.com/u/1630721?v=4" width="100px;" alt="Wenchao Hu"/><br /><sub><b>Wenchao Hu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=huwenchao" title="Code">💻</a></td><td align="center"><a href="https://github.com/Kayryu"><img src="https://avatars1.githubusercontent.com/u/35792093?v=4" width="100px;" alt="kaiyu"/><br /><sub><b>kaiyu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=Kayryu" title="Code">💻</a></td><td align="center"><a href="https://ashchan.com"><img src="https://avatars2.githubusercontent.com/u/1391?v=4" width="100px;" alt="James Chen"/><br /><sub><b>James Chen</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=ashchan" title="Code">💻</a></td><td align="center"><a href="https://github.com/rev-chaos"><img src="https://avatars1.githubusercontent.com/u/32355308?v=4" width="100px;" alt="rev-chaos"/><br /><sub><b>rev-chaos</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rev-chaos" title="Code">💻</a></td><td align="center"><a href="https://github.com/KaoImin"><img src="https://avatars1.githubusercontent.com/u/24822778?v=4" width="100px;" alt="Eason Gao"/><br /><sub><b>Eason Gao</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=KaoImin" title="Code">💻</a></td><td align="center"><a href="http://qinix.com"><img src="https://avatars1.githubusercontent.com/u/1946663?v=4" width="100px;" alt="Eric Zhang"/><br /><sub><b>Eric Zhang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=qinix" title="Code">💻</a></td><td align="center"><a href="https://github.com/jasl"><img src="https://avatars2.githubusercontent.com/u/1024162?v=4" width="100px;" alt="Jun Jiang"/><br /><sub><b>Jun Jiang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jasl" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://blog.priewienv.me"><img src="https://avatars1.githubusercontent.com/u/9765170?v=4" width="100px;" alt="PRIEWIENV"/><br /><sub><b>PRIEWIENV</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=PRIEWIENV" title="Code">💻</a></td><td align="center"><a href="https://gitter.im"><img src="https://avatars2.githubusercontent.com/u/8518239?v=4" width="100px;" alt="The Gitter Badger"/><br /><sub><b>The Gitter Badger</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=gitter-badger" title="Code">💻</a></td><td align="center"><a href="https://github.com/classicalliu"><img src="https://avatars3.githubusercontent.com/u/13375784?v=4" width="100px;" alt="CL"/><br /><sub><b>CL</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=classicalliu" title="Code">💻</a></td><td align="center"><a href="https://github.com/programmer-liu"><img src="https://avatars2.githubusercontent.com/u/25048144?v=4" width="100px;" alt="programmer-liu"/><br /><sub><b>programmer-liu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=programmer-liu" title="Code">💻</a></td><td align="center"><a href="https://github.com/yejiayu"><img src="https://avatars3.githubusercontent.com/u/10446547?v=4" width="100px;" alt="Jiayu Ye"/><br /><sub><b>Jiayu Ye</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=yejiayu" title="Code">💻</a></td></tr></table>
+<table><tr><td align="center"><a href="https://github.com/kaikai1024"><img src="https://avatars0.githubusercontent.com/u/8768261?v=4" width="100px;" alt="kaikai"/><br /><sub><b>kaikai</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=kaikai1024" title="Code">💻</a></td><td align="center"><a href="https://twitter.com/zhangyaning1985"><img src="https://avatars0.githubusercontent.com/u/161756?v=4" width="100px;" alt="zhangyaning"/><br /><sub><b>zhangyaning</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=u2" title="Code">💻</a></td><td align="center"><a href="https://yangby-cryptape.github.io/"><img src="https://avatars1.githubusercontent.com/u/30993023?v=4" width="100px;" alt="Boyu Yang"/><br /><sub><b>Boyu Yang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=yangby-cryptape" title="Code">💻</a></td><td align="center"><a href="https://github.com/rink1969"><img src="https://avatars1.githubusercontent.com/u/1633038?v=4" width="100px;" alt="zhiwei"/><br /><sub><b>zhiwei</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rink1969" title="Code">💻</a></td><td align="center"><a href="https://www.driftluo.com"><img src="https://avatars3.githubusercontent.com/u/19374080?v=4" width="100px;" alt="漂流"/><br /><sub><b>漂流</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=driftluo" title="Code">💻</a></td><td align="center"><a href="https://ouwenkg.github.io/"><img src="https://avatars0.githubusercontent.com/u/11801722?v=4" width="100px;" alt="AsceticBear"/><br /><sub><b>AsceticBear</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=ouwenkg" title="Code">💻</a></td><td align="center"><a href="https://github.com/jerry-yu"><img src="https://avatars2.githubusercontent.com/u/2151472?v=4" width="100px;" alt="yubo"/><br /><sub><b>yubo</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jerry-yu" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/zhouyun-zoe"><img src="https://avatars0.githubusercontent.com/u/36949326?v=4" width="100px;" alt="zhouyun-zoe"/><br /><sub><b>zhouyun-zoe</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=zhouyun-zoe" title="Documentation">📖</a></td><td align="center"><a href="https://github.com/volzkzg"><img src="https://avatars2.githubusercontent.com/u/2860864?v=4" width="100px;" alt="Bicheng Gao"/><br /><sub><b>Bicheng Gao</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=volzkzg" title="Code">💻</a></td><td align="center"><a href="https://github.com/EighteenZi"><img src="https://avatars3.githubusercontent.com/u/31607114?v=4" width="100px;" alt="lhf"/><br /><sub><b>lhf</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=EighteenZi" title="Code">💻</a></td><td align="center"><a href="http://ahorn.me"><img src="https://avatars0.githubusercontent.com/u/1160419?v=4" width="100px;" alt="LinFeng Qian"/><br /><sub><b>LinFeng Qian</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=TheWaWaR" title="Code">💻</a></td><td align="center"><a href="https://github.com/keroro520"><img src="https://avatars3.githubusercontent.com/u/1870648?v=4" width="100px;" alt="keroro"/><br /><sub><b>keroro</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=keroro520" title="Code">💻</a></td><td align="center"><a href="https://github.com/leeyr338"><img src="https://avatars3.githubusercontent.com/u/38514341?v=4" width="100px;" alt="Yaorong"/><br /><sub><b>Yaorong</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=leeyr338" title="Code">💻</a></td><td align="center"><a href="https://github.com/suyanlong"><img src="https://avatars2.githubusercontent.com/u/16421423?v=4" width="100px;" alt="suyanlong"/><br /><sub><b>suyanlong</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=suyanlong" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/Keith-CY"><img src="https://avatars1.githubusercontent.com/u/7271329?v=4" width="100px;" alt="Chen Yu"/><br /><sub><b>Chen Yu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=Keith-CY" title="Code">💻</a></td><td align="center"><a href="https://zhangsoledad.github.io/salon"><img src="https://avatars2.githubusercontent.com/u/3198439?v=4" width="100px;" alt="zhangsoledad"/><br /><sub><b>zhangsoledad</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=zhangsoledad" title="Code">💻</a></td><td align="center"><a href="https://github.com/hezhengjun"><img src="https://avatars0.githubusercontent.com/u/30688033?v=4" width="100px;" alt="hezhengjun"/><br /><sub><b>hezhengjun</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=hezhengjun" title="Code">💻</a></td><td align="center"><a href="https://github.com/zeroqn"><img src="https://avatars0.githubusercontent.com/u/23418132?v=4" width="100px;" alt="zeroqn"/><br /><sub><b>zeroqn</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=zeroqn" title="Code">💻</a></td><td align="center"><a href="https://github.com/urugang"><img src="https://avatars1.githubusercontent.com/u/11461821?v=4" width="100px;" alt="urugang"/><br /><sub><b>urugang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=urugang" title="Code">💻</a></td><td align="center"><a href="https://justjjy.com"><img src="https://avatars0.githubusercontent.com/u/1695400?v=4" width="100px;" alt="Jiang Jinyang"/><br /><sub><b>Jiang Jinyang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jjyr" title="Code">💻</a></td><td align="center"><a href="https://twitter.com/janhxie"><img src="https://avatars0.githubusercontent.com/u/5958?v=4" width="100px;" alt="Jan Xie"/><br /><sub><b>Jan Xie</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=janx" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/jerry-sl"><img src="https://avatars0.githubusercontent.com/u/5476062?v=4" width="100px;" alt="Sun Lei"/><br /><sub><b>Sun Lei</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jerry-sl" title="Code">💻</a></td><td align="center"><a href="https://github.com/chuchenxihyl"><img src="https://avatars1.githubusercontent.com/u/23721562?v=4" width="100px;" alt="hyl"/><br /><sub><b>hyl</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=chuchenxihyl" title="Code">💻</a></td><td align="center"><a href="http://terrytai.me"><img src="https://avatars3.githubusercontent.com/u/5960?v=4" width="100px;" alt="Terry Tai"/><br /><sub><b>Terry Tai</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=poshboytl" title="Code">💻</a></td><td align="center"><a href="https://bll.io"><img src="https://avatars0.githubusercontent.com/u/9641495?v=4" width="100px;" alt="Ke Wang"/><br /><sub><b>Ke Wang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=kilb" title="Code">💻</a></td><td align="center"><a href="http://accu.cc"><img src="https://avatars3.githubusercontent.com/u/12387889?v=4" width="100px;" alt="Mohanson"/><br /><sub><b>Mohanson</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=mohanson" title="Code">💻</a></td><td align="center"><a href="https://www.jianshu.com/u/3457636b07c5"><img src="https://avatars3.githubusercontent.com/u/17267434?v=4" width="100px;" alt="quanzhan lu"/><br /><sub><b>quanzhan lu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=luqz" title="Code">💻</a></td><td align="center"><a href="https://github.com/duanyytop"><img src="https://avatars1.githubusercontent.com/u/5823268?v=4" width="100px;" alt="duanyytop"/><br /><sub><b>duanyytop</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=duanyytop" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://github.com/clearloop"><img src="https://avatars0.githubusercontent.com/u/26088946?v=4" width="100px;" alt="clearloop"/><br /><sub><b>clearloop</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=clearloop" title="Code">💻</a></td><td align="center"><a href="https://github.com/hot3246624"><img src="https://avatars3.githubusercontent.com/u/9135770?v=4" width="100px;" alt="nokodemion"/><br /><sub><b>nokodemion</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=hot3246624" title="Code">💻</a></td><td align="center"><a href="http://rainchen.com"><img src="https://avatars0.githubusercontent.com/u/71397?v=4" width="100px;" alt="Rain Chen"/><br /><sub><b>Rain Chen</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rainchen" title="Code">💻</a></td><td align="center"><a href="https://github.com/daogangtang"><img src="https://avatars2.githubusercontent.com/u/629594?v=4" width="100px;" alt="Daogang Tang"/><br /><sub><b>Daogang Tang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=daogangtang" title="Code">💻</a></td><td align="center"><a href="https://github.com/jiangxianliang007"><img src="https://avatars1.githubusercontent.com/u/24754263?v=4" width="100px;" alt="xianliang jiang"/><br /><sub><b>xianliang jiang</b></sub></a><br /><a href="https://github.com/cryptape/cita/issues?q=author%3Ajiangxianliang007" title="Bug reports">🐛</a></td><td align="center"><a href="https://github.com/vinberm"><img src="https://avatars0.githubusercontent.com/u/17666225?v=4" width="100px;" alt="Nov"/><br /><sub><b>Nov</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=vinberm" title="Code">💻</a></td><td align="center"><a href="https://github.com/rairyx"><img src="https://avatars2.githubusercontent.com/u/5009854?v=4" width="100px;" alt="Rai Yang"/><br /><sub><b>Rai Yang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rairyx" title="Code">💻</a></td></tr><tr><td align="center"><a href="http://www.huwenchao.com/"><img src="https://avatars0.githubusercontent.com/u/1630721?v=4" width="100px;" alt="Wenchao Hu"/><br /><sub><b>Wenchao Hu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=huwenchao" title="Code">💻</a></td><td align="center"><a href="https://github.com/Kayryu"><img src="https://avatars1.githubusercontent.com/u/35792093?v=4" width="100px;" alt="kaiyu"/><br /><sub><b>kaiyu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=Kayryu" title="Code">💻</a></td><td align="center"><a href="https://ashchan.com"><img src="https://avatars2.githubusercontent.com/u/1391?v=4" width="100px;" alt="James Chen"/><br /><sub><b>James Chen</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=ashchan" title="Code">💻</a></td><td align="center"><a href="https://github.com/rev-chaos"><img src="https://avatars1.githubusercontent.com/u/32355308?v=4" width="100px;" alt="rev-chaos"/><br /><sub><b>rev-chaos</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=rev-chaos" title="Code">💻</a></td><td align="center"><a href="https://github.com/KaoImin"><img src="https://avatars1.githubusercontent.com/u/24822778?v=4" width="100px;" alt="Eason Gao"/><br /><sub><b>Eason Gao</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=KaoImin" title="Code">💻</a></td><td align="center"><a href="http://qinix.com"><img src="https://avatars1.githubusercontent.com/u/1946663?v=4" width="100px;" alt="Eric Zhang"/><br /><sub><b>Eric Zhang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=qinix" title="Code">💻</a></td><td align="center"><a href="https://github.com/jasl"><img src="https://avatars2.githubusercontent.com/u/1024162?v=4" width="100px;" alt="Jun Jiang"/><br /><sub><b>Jun Jiang</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=jasl" title="Code">💻</a></td></tr><tr><td align="center"><a href="https://blog.priewienv.me"><img src="https://avatars1.githubusercontent.com/u/9765170?v=4" width="100px;" alt="PRIEWIENV"/><br /><sub><b>PRIEWIENV</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=PRIEWIENV" title="Code">💻</a></td><td align="center"><a href="https://gitter.im"><img src="https://avatars2.githubusercontent.com/u/8518239?v=4" width="100px;" alt="The Gitter Badger"/><br /><sub><b>The Gitter Badger</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=gitter-badger" title="Code">💻</a></td><td align="center"><a href="https://github.com/classicalliu"><img src="https://avatars3.githubusercontent.com/u/13375784?v=4" width="100px;" alt="CL"/><br /><sub><b>CL</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=classicalliu" title="Code">💻</a></td><td align="center"><a href="https://github.com/programmer-liu"><img src="https://avatars2.githubusercontent.com/u/25048144?v=4" width="100px;" alt="programmer-liu"/><br /><sub><b>programmer-liu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=programmer-liu" title="Code">💻</a></td><td align="center"><a href="https://github.com/yejiayu"><img src="https://avatars3.githubusercontent.com/u/10446547?v=4" width="100px;" alt="Jiayu Ye"/><br /><sub><b>Jiayu Ye</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=yejiayu" title="Code">💻</a></td><td align="center"><a href="https://github.com/QingYanL"><img src="https://avatars3.githubusercontent.com/u/48231505?v=4" width="100px;" alt="liyanzi"/><br /><sub><b>liyanzi</b></sub></a><br /><a href="https://github.com/cryptape/cita/issues?q=author%3AQingYanL" title="Bug reports">🐛</a></td><td align="center"><a href="https://github.com/YUJIAYIYIYI"><img src="https://avatars0.githubusercontent.com/u/40654430?v=4" width="100px;" alt="JiaYi"/><br /><sub><b>JiaYi</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=YUJIAYIYIYI" title="Documentation">📖</a></td></tr><tr><td align="center"><a href="https://github.com/timmyz"><img src="https://avatars0.githubusercontent.com/u/795528?v=4" width="100px;" alt="Timmy Zhang"/><br /><sub><b>Timmy Zhang</b></sub></a><br /><a href="#ideas-timmyz" title="Ideas, Planning, & Feedback">🤔</a></td><td align="center"><a href="https://github.com/wuyuyue"><img src="https://avatars3.githubusercontent.com/u/40381396?v=4" width="100px;" alt="Wu Yuyue"/><br /><sub><b>Wu Yuyue</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=wuyuyue" title="Documentation">📖</a></td><td align="center"><a href="https://github.com/xiangmeiLu"><img src="https://avatars2.githubusercontent.com/u/30581938?v=4" width="100px;" alt="xiangmeiLu"/><br /><sub><b>xiangmeiLu</b></sub></a><br /><a href="https://github.com/cryptape/cita/commits?author=xiangmeiLu" title="Documentation">📖</a></td><td align="center"><a href="https://github.com/mingxiaowu"><img src="https://avatars0.githubusercontent.com/u/42978282?v=4" width="100px;" alt="mingxiaowu"/><br /><sub><b>mingxiaowu</b></sub></a><br /><a href="https://github.com/cryptape/cita/issues?q=author%3Amingxiaowu" title="Bug reports">🐛</a></td><td align="center"><a href="https://github.com/wangfh666"><img src="https://avatars0.githubusercontent.com/u/41322861?s=400&v=4" width="100px;" alt="wangfh666"/><br /><sub><b>wangfh666</b></sub></a><br /><a href="https://github.com/cryptape/cita/issues?q=author%3Awangfh666" title="Bug reports">🐛</a></td></tr></table>
 
 <!-- ALL-CONTRIBUTORS-LIST:END -->
 
diff --git a/cita-auth/src/handler.rs b/cita-auth/src/handler.rs
index af706dc7d..162605594 100644
--- a/cita-auth/src/handler.rs
+++ b/cita-auth/src/handler.rs
@@ -200,7 +200,7 @@ impl MsgHandler {
             if !to.is_empty() && Address::from_str(to).is_err() {
                 return Err(Error::InvalidValue);
             }
-        } else if tx_version == 1 {
+        } else if tx_version < 3 {
             // old to must be empty
             if !tx.get_to().is_empty() {
                 return Err(Error::InvalidValue);
@@ -247,7 +247,7 @@ impl MsgHandler {
                     Some(ChainId::V0(chain_id))
                 }
             }
-            1 => {
+            version if version < 3 => {
                 // old chain id must be empty
                 if req.get_chain_id() != 0 || req.get_chain_id_v1().len() != 32 {
                     None
@@ -393,100 +393,136 @@ impl MsgHandler {
         self.history_heights.update_time_stamp();
     }
 
-    pub fn handle_remote_msg(&mut self) {
-        loop {
-            // send request to get chain id if we have not got it
-            // chain id need version
-            // so get chain id after get version
-            if self.chain_id.is_none() && self.config_info.version.is_some() {
-                trace!("chain id is not ready");
-                let msg: Message = MiscellaneousReq::new().into();
-                self.tx_pub
-                    .send((
-                        routing_key!(Auth >> MiscellaneousReq).into(),
-                        msg.try_into().unwrap(),
-                    ))
-                    .unwrap();
-            }
+    fn daily_task(&mut self) {
+        if self.is_need_proposal_new_block && self.is_ready() {
+            self.dispatcher.proposal_tx_list(
+                (self.history_heights.next_height() - 1) as usize, // todo fix bft
+                &self.tx_pub,
+                &self.config_info,
+            );
+            // after proposal new block clear flag
+            self.is_need_proposal_new_block = false;
+        }
+    }
 
-            // block hashes of some height we not have
-            // we will send request for these height
-            if !self.history_heights.is_init() {
-                trace!("history block hashes is not ready");
-                self.send_block_tx_hashes_req(true);
+    fn get_chain_id(&mut self) {
+        if self.chain_id.is_none() && self.config_info.version.is_some() {
+            trace!("chain id is not ready");
+            let msg: Message = MiscellaneousReq::new().into();
+            if let Ok(rabbit_mq_msg) = msg.try_into() {
+                if let Err(e) = self
+                    .tx_pub
+                    .send((routing_key!(Auth >> MiscellaneousReq).into(), rabbit_mq_msg))
+                {
+                    error!("Send MiscellaneousReq message error {:?}", e);
+                }
+            } else {
+                error!("Can not get rabbit mq message from MiscellaneousReq.");
             }
+        }
+    }
 
-            // Daily tasks
-            {
-                if self.is_need_proposal_new_block && self.is_ready() {
-                    self.dispatcher.proposal_tx_list(
-                        (self.history_heights.next_height() - 1) as usize, // todo fix bft
-                        &self.tx_pub,
-                        &self.config_info,
-                    );
-                    // after proposal new block clear flag
-                    self.is_need_proposal_new_block = false;
-                }
+    fn process_msg(&mut self) {
+        if let Ok((key, payload)) = self.rx_sub.recv_timeout(Duration::new(3, 0)) {
+            if Message::try_from(&payload).is_err() {
+                error!("Can not get message from payload {:?}", &payload);
+                return;
             }
 
-            // process message from MQ
-            if let Ok((key, payload)) = self.rx_sub.recv_timeout(Duration::new(3, 0)) {
-                let mut msg = Message::try_from(&payload).unwrap();
-                let rounting_key = RoutingKey::from(&key);
-                trace!("process message key = {}", key);
-                match rounting_key {
-                    // we got this message when chain reach new height or response the BlockTxHashesReq
-                    routing_key!(Chain >> BlockTxHashes) => {
-                        let block_tx_hashes = msg.take_block_tx_hashes().unwrap();
+            let mut msg = Message::try_from(&payload).unwrap();
+            let rounting_key = RoutingKey::from(&key);
+            trace!("process message key = {}", key);
+            match rounting_key {
+                // we got this message when chain reach new height or response the BlockTxHashesReq
+                routing_key!(Chain >> BlockTxHashes) => {
+                    if let Some(block_tx_hashes) = msg.take_block_tx_hashes() {
                         self.deal_block_tx_hashes(&block_tx_hashes)
+                    } else {
+                        error!("Can not get block tx hashes from message {:?}.", msg);
                     }
-                    routing_key!(Executor >> BlackList) => {
-                        let black_list = msg.take_black_list().unwrap();
+                }
+                routing_key!(Executor >> BlackList) => {
+                    if let Some(black_list) = msg.take_black_list() {
                         self.deal_black_list(&black_list);
+                    } else {
+                        error!("Can not get black list from message {:?}.", msg);
                     }
-                    routing_key!(Net >> Request) | routing_key!(Jsonrpc >> RequestNewTxBatch) => {
+                }
+                routing_key!(Net >> Request) | routing_key!(Jsonrpc >> RequestNewTxBatch) => {
+                    if let Some(newtx_req) = msg.take_request() {
                         let is_local = rounting_key.is_sub_module(SubModules::Jsonrpc);
-                        let newtx_req = msg.take_request().unwrap();
                         self.deal_request(is_local, newtx_req);
+                    } else {
+                        error!("Can not get request from message {:?}.", msg);
                     }
-                    routing_key!(Executor >> Miscellaneous) => {
-                        let miscellaneous = msg.take_miscellaneous().unwrap();
+                }
+                routing_key!(Executor >> Miscellaneous) => {
+                    if let Some(miscellaneous) = msg.take_miscellaneous() {
                         self.deal_miscellaneous(&miscellaneous);
+                    } else {
+                        error!("Can not get miscellaneous from message {:?}.", msg);
                     }
-                    routing_key!(Snapshot >> SnapshotReq) => {
-                        let snapshot_req = msg.take_snapshot_req().unwrap();
+                }
+                routing_key!(Snapshot >> SnapshotReq) => {
+                    if let Some(snapshot_req) = msg.take_snapshot_req() {
                         self.deal_snapshot(&snapshot_req);
+                    } else {
+                        error!("Can not get snapshot from message {:?}.", msg);
                     }
-                    routing_key!(Net >> GetBlockTxn) => {
-                        let mut get_block_txn = msg.take_get_block_txn().unwrap();
+                }
+                routing_key!(Net >> GetBlockTxn) => {
+                    if let Some(mut get_block_txn) = msg.take_get_block_txn() {
                         let origin = msg.get_origin();
                         self.deal_get_block_txn(&mut get_block_txn, origin);
+                    } else {
+                        error!("Can not get block txn from message {:?}.", msg);
                     }
-                    // Compact proposal
-                    routing_key!(Consensus >> VerifyBlockReq) => {
-                        if !self.is_ready() {
-                            info!("Net/Consensus >> CompactProposal: auth is not ready");
-                        } else {
-                            self.deal_signed_proposal(msg);
-                        }
+                }
+                // Compact proposal
+                routing_key!(Consensus >> VerifyBlockReq) => {
+                    if !self.is_ready() {
+                        info!("Net/Consensus >> CompactProposal: auth is not ready");
+                    } else {
+                        self.deal_signed_proposal(msg);
                     }
-                    routing_key!(Net >> BlockTxn) => {
-                        if !self.is_ready() || self.verify_block_req.is_none() {
-                            info!("Net >> BlockTxn: auth is not ready");
-                        } else {
-                            let verify_block_req = self.verify_block_req.clone();
-                            if let Some(verify_block_req) = verify_block_req {
-                                self.deal_block_txn(msg, verify_block_req);
-                            }
+                }
+                routing_key!(Net >> BlockTxn) => {
+                    if !self.is_ready() || self.verify_block_req.is_none() {
+                        info!("Net >> BlockTxn: auth is not ready");
+                    } else {
+                        let verify_block_req = self.verify_block_req.clone();
+                        if let Some(verify_block_req) = verify_block_req {
+                            self.deal_block_txn(msg, verify_block_req);
                         }
                     }
-                    _ => {
-                        error!("receive unexpected message key {}", key);
-                    }
+                }
+                _ => {
+                    error!("receive unexpected message key {}", key);
                 }
             }
         }
     }
+    pub fn handle_remote_msg(&mut self) {
+        loop {
+            // send request to get chain id if we have not got it
+            // chain id need version
+            // so get chain id after get version
+            self.get_chain_id();
+
+            // block hashes of some height we not have
+            // we will send request for these height
+            if !self.history_heights.is_init() {
+                trace!("history block hashes is not ready");
+                self.send_block_tx_hashes_req(true);
+            }
+
+            // Daily tasks
+            self.daily_task();
+
+            // process message from MQ
+            self.process_msg();
+        }
+    }
 
     fn deal_block_tx_hashes(&mut self, block_tx_hashes: &BlockTxHashes) {
         let height = block_tx_hashes.get_height();
@@ -510,7 +546,10 @@ impl MsgHandler {
             } else {
                 Some(Address::from(block_tx_hashes.get_admin_address()))
             };
-            if block_tx_hashes.get_version() == 1 && self.config_info.version == Some(0) {
+            let block_tx_version = block_tx_hashes.get_version();
+            let check_version = block_tx_version > 0 && block_tx_version < 3;
+            // Get chain id according to version
+            if check_version && self.config_info.version == Some(0) {
                 trace!("Fetch new chain id");
                 let msg: Message = MiscellaneousReq::new().into();
                 self.tx_pub
@@ -838,7 +877,7 @@ impl MsgHandler {
         if let Some(version) = self.config_info.version {
             self.chain_id = if version == 0 {
                 Some(ChainId::V0(miscellaneous.chain_id))
-            } else if version == 1 {
+            } else if version < 3 {
                 if miscellaneous.chain_id_v1.len() == 32 {
                     Some(ChainId::V1(U256::from(
                         miscellaneous.chain_id_v1.as_slice(),
diff --git a/cita-bft b/cita-bft
index 8ace80204..7041bda10 160000
--- a/cita-bft
+++ b/cita-bft
@@ -1,1 +1,1 @@
-Subproject commit 8ace8020470ae9c016275fb03445e31da83e6677
+Subproject commit 7041bda10499e88e7646f5df707b8058c09c9c67
diff --git a/cita-chain/src/forward.rs b/cita-chain/src/forward.rs
index 945eefb9b..1b43acfd4 100644
--- a/cita-chain/src/forward.rs
+++ b/cita-chain/src/forward.rs
@@ -389,7 +389,7 @@ impl Forward {
 
         let block = OpenBlock::from(proto_block);
         debug!(
-            "consensus block {} tx hash {:?} len {} version {}",
+            "consensus block {} txs_root {:?} txs_len {} block_version {}",
             block.number(),
             block.transactions_root(),
             block.body().transactions().len(),
@@ -628,7 +628,7 @@ impl Forward {
     fn deal_snapshot_req(&self, snapshot_req: &SnapshotReq) {
         match snapshot_req.cmd {
             Cmd::Snapshot => {
-                info!("receive Snapshot::Snapshot {:?}", snapshot_req);
+                info!("snapshot: receive Snapshot::Snapshot {:?}", snapshot_req);
                 let chain = self.chain.clone();
                 let ctx_pub = self.ctx_pub.clone();
                 let snapshot_req = snapshot_req.clone();
@@ -636,17 +636,17 @@ impl Forward {
                 let _ = snapshot_builder.spawn(move || {
                     take_snapshot(&chain, &snapshot_req);
                     snapshot_response(&ctx_pub, Resp::SnapshotAck, true, None, None);
-                    info!("Taking snapshot finished!!!");
+                    info!("snapshot: Taking snapshot finished!!!");
                 });
             }
             Cmd::Begin => {
-                info!("receive Snapshot::Begin: {:?}", snapshot_req);
+                info!("snapshot: receive Snapshot::Begin: {:?}", snapshot_req);
                 let mut is_snapshot = self.chain.is_snapshot.write();
                 *is_snapshot = true;
                 snapshot_response(&self.ctx_pub, Resp::BeginAck, true, None, None);
             }
             Cmd::Restore => {
-                info!("receive Snapshot::Restore {:?}", snapshot_req);
+                info!("snapshot: receive Snapshot::Restore {:?}", snapshot_req);
                 match restore_snapshot(&self.chain.clone(), snapshot_req) {
                     Ok(proof) => {
                         let height = self.chain.get_current_height();
@@ -659,17 +659,17 @@ impl Forward {
                         );
                     }
                     Err(err) => {
-                        error!("snapshot restore failed: {:?}", err);
+                        error!("snapshot: snapshot restore failed: {:?}", err);
                         snapshot_response(&self.ctx_pub, Resp::RestoreAck, false, None, None);
                     }
                 }
             }
             Cmd::Clear => {
-                info!("receive Snapshot::Clear: {:?}", snapshot_req);
+                info!("snapshot: receive Snapshot::Clear: {:?}", snapshot_req);
                 snapshot_response(&self.ctx_pub, Resp::ClearAck, true, None, None);
             }
             Cmd::End => {
-                info!("receive Snapshot::End {:?}", snapshot_req);
+                info!("snapshot: receive Snapshot::End {:?}", snapshot_req);
                 let chain = self.chain.clone();
                 let ctx_pub = self.ctx_pub.clone();
                 thread::spawn(move || {
@@ -700,7 +700,7 @@ fn take_snapshot(chain: &Arc<Chain>, snapshot_req: &SnapshotReq) {
     let current_height = chain.get_current_height();
     if block_at == 0 || block_at > current_height {
         warn!(
-            "block height is equal to 0 or bigger than current height, \
+            "snapshot: snapshot block height is equal to 0 or bigger than current height, \
              and be set to current height!"
         );
         block_at = current_height;
@@ -714,12 +714,12 @@ fn take_snapshot(chain: &Arc<Chain>, snapshot_req: &SnapshotReq) {
 fn restore_snapshot(chain: &Arc<Chain>, snapshot_req: &SnapshotReq) -> Result<Proof, String> {
     let file_name = snapshot_req.file.clone() + "_chain.rlp";
     let reader = PackedReader::create(Path::new(&file_name))
-        .map_err(|e| format!("Couldn't open snapshot file: {}", e))
-        .and_then(|x| x.ok_or_else(|| "Snapshot file has invalid format.".into()));
+        .map_err(|e| format!("snapshot: Couldn't open snapshot file: {}", e))
+        .and_then(|x| x.ok_or_else(|| "snapshot: Snapshot file has invalid format.".into()));
     let reader = match reader {
         Ok(r) => r,
         Err(e) => {
-            warn!("get reader failed: {:?}", e);
+            warn!("snapshot: get reader failed: {:?}", e);
             return Err(e);
         }
     };
@@ -742,7 +742,7 @@ fn restore_snapshot(chain: &Arc<Chain>, snapshot_req: &SnapshotReq) -> Result<Pr
             Ok(proof)
         }
         Err(e) => {
-            warn!("restore_using failed: {:?}", e);
+            warn!("snapshot: restore_using failed: {:?}", e);
             Err(e)
         }
     }
@@ -755,7 +755,7 @@ fn snapshot_response(
     height: Option<u64>,
     proof: Option<Proof>,
 ) {
-    info!("snapshot_response ack: {:?}, flag: {}", ack, flag);
+    info!("snapshot: snapshot_response ack: {:?}, flag: {}", ack, flag);
     let mut resp = SnapshotResp::new();
     resp.set_resp(ack);
     resp.set_flag(flag);
diff --git a/cita-executor/core/src/contracts/solc/sys_config.rs b/cita-executor/core/src/contracts/solc/sys_config.rs
index b50c85829..d2dc7f2b7 100644
--- a/cita-executor/core/src/contracts/solc/sys_config.rs
+++ b/cita-executor/core/src/contracts/solc/sys_config.rs
@@ -321,7 +321,7 @@ impl<'a> SysConfig<'a> {
                 .unwrap_or_else(SysConfig::default_chain_id);
 
             Some(ChainId::V0(id_v0))
-        } else if version == 1 {
+        } else if version < 3 {
             let id_v1 = self
                 .chain_id_v1(BlockId::Pending)
                 .unwrap_or_else(SysConfig::default_chain_id_v1);
diff --git a/cita-executor/core/src/contracts/solc/version_management.rs b/cita-executor/core/src/contracts/solc/version_management.rs
index 3c644294c..0379cd2ef 100644
--- a/cita-executor/core/src/contracts/solc/version_management.rs
+++ b/cita-executor/core/src/contracts/solc/version_management.rs
@@ -78,6 +78,6 @@ mod tests {
         let executor = init_executor(vec![]);
         let version_management = VersionManager::new(&executor);
         let version = version_management.get_version(BlockId::Pending).unwrap();
-        assert_eq!(version, 1);
+        assert_eq!(version, 2);
     }
 }
diff --git a/cita-executor/core/src/executive.rs b/cita-executor/core/src/executive.rs
index 2497f3e0e..5e487b5b9 100644
--- a/cita-executor/core/src/executive.rs
+++ b/cita-executor/core/src/executive.rs
@@ -113,6 +113,7 @@ pub struct Executive<'a, B: 'a + StateBackend> {
     native_factory: &'a NativeFactory,
     /// Check EconomicalModel
     economical_model: EconomicalModel,
+    chain_version: u32,
 }
 
 impl<'a, B: 'a + StateBackend> Executive<'a, B> {
@@ -126,6 +127,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
         native_factory: &'a NativeFactory,
         static_flag: bool,
         economical_model: EconomicalModel,
+        chain_version: u32,
     ) -> Self {
         Executive {
             state,
@@ -136,6 +138,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
             depth: 0,
             static_flag,
             economical_model,
+            chain_version,
         }
     }
 
@@ -154,6 +157,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
         parent_depth: usize,
         static_flag: bool,
         economical_model: EconomicalModel,
+        chain_version: u32,
     ) -> Self {
         Executive {
             state,
@@ -164,6 +168,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
             depth: parent_depth + 1,
             static_flag,
             economical_model,
+            chain_version,
         }
     }
 
@@ -198,6 +203,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
             vm_tracer,
             is_static,
             economical_model,
+            self.chain_version,
         )
     }
 
@@ -1240,7 +1246,7 @@ mod tests {
             nonce: U256::zero().to_string(),
             block_limit: 100u64,
             chain_id: 1.into(),
-            version: 1,
+            version: 2,
         }
         .fake_sign(keypair.address().clone());
         let sender = t.sender();
@@ -1264,6 +1270,7 @@ mod tests {
                 &native_factory,
                 false,
                 EconomicalModel::Charge,
+                0,
             );
             let opts = TransactOptions {
                 tracing: false,
@@ -1298,7 +1305,7 @@ mod tests {
             nonce: U256::zero().to_string(),
             block_limit: 100u64,
             chain_id: 1.into(),
-            version: 1,
+            version: 2,
         }
         .fake_sign(keypair.address().clone());
         let sender = t.sender();
@@ -1313,6 +1320,7 @@ mod tests {
             .unwrap();
         let mut info = EnvInfo::default();
         info.gas_limit = U256::from(100_000);
+        let conf = BlockSysConfig::default();
 
         let executed = {
             let mut ex = Executive::new(
@@ -1323,12 +1331,13 @@ mod tests {
                 &native_factory,
                 false,
                 EconomicalModel::Charge,
+                conf.chain_version,
             );
             let opts = TransactOptions {
                 tracing: false,
                 vm_tracing: false,
             };
-            ex.transact(&t, opts, &BlockSysConfig::default()).unwrap()
+            ex.transact(&t, opts, &conf).unwrap()
         };
 
         let schedule = Schedule::new_v1();
@@ -1360,7 +1369,7 @@ mod tests {
             nonce: U256::zero().to_string(),
             block_limit: 100u64,
             chain_id: 1.into(),
-            version: 1,
+            version: 2,
         }
         .fake_sign(keypair.address().clone());
 
@@ -1371,6 +1380,7 @@ mod tests {
         state.add_balance(t.sender(), &U256::from(100_042)).unwrap();
         let mut info = EnvInfo::default();
         info.gas_limit = U256::from(100_000);
+        let conf = BlockSysConfig::default();
 
         let result = {
             let mut ex = Executive::new(
@@ -1381,12 +1391,13 @@ mod tests {
                 &native_factory,
                 false,
                 EconomicalModel::Charge,
+                conf.chain_version,
             );
             let opts = TransactOptions {
                 tracing: false,
                 vm_tracing: false,
             };
-            ex.transact(&t, opts, &BlockSysConfig::default())
+            ex.transact(&t, opts, &conf)
         };
 
         match result {
@@ -1411,7 +1422,7 @@ mod tests {
             nonce: U256::zero().to_string(),
             block_limit: 100u64,
             chain_id: 1.into(),
-            version: 1,
+            version: 2,
         }
         .fake_sign(keypair.address().clone());
 
@@ -1421,6 +1432,7 @@ mod tests {
         let mut state = get_temp_state();
         let mut info = EnvInfo::default();
         info.gas_limit = U256::from(100_000);
+        let conf = BlockSysConfig::default();
 
         let result = {
             let mut ex = Executive::new(
@@ -1431,12 +1443,13 @@ mod tests {
                 &native_factory,
                 false,
                 EconomicalModel::Quota,
+                conf.chain_version,
             );
             let opts = TransactOptions {
                 tracing: false,
                 vm_tracing: false,
             };
-            ex.transact(&t, opts, &BlockSysConfig::default())
+            ex.transact(&t, opts, &conf)
         };
 
         assert!(result.is_ok());
@@ -1480,6 +1493,7 @@ contract HelloWorld {
         let mut substate = Substate::new();
         let mut tracer = ExecutiveTracer::default();
         let mut vm_tracer = ExecutiveVMTracer::toplevel();
+        let conf = BlockSysConfig::default();
 
         let mut ex = Executive::new(
             &mut state,
@@ -1489,6 +1503,7 @@ contract HelloWorld {
             &native_factory,
             false,
             EconomicalModel::Quota,
+            conf.chain_version,
         );
         let res = ex.create(&params, &mut substate, &mut tracer, &mut vm_tracer);
         assert!(res.is_err());
@@ -1534,6 +1549,7 @@ contract AbiTest {
         let mut substate = Substate::new();
         let mut tracer = ExecutiveTracer::default();
         let mut vm_tracer = ExecutiveVMTracer::toplevel();
+        let conf = BlockSysConfig::default();
 
         {
             let mut ex = Executive::new(
@@ -1544,6 +1560,7 @@ contract AbiTest {
                 &native_factory,
                 false,
                 EconomicalModel::Quota,
+                conf.chain_version,
             );
             let _ = ex.create(&params, &mut substate, &mut tracer, &mut vm_tracer);
         }
@@ -1597,6 +1614,8 @@ contract AbiTest {
         let info = EnvInfo::default();
         let engine = NullEngine::default();
         let mut substate = Substate::new();
+        let conf = BlockSysConfig::default();
+
         {
             let mut ex = Executive::new(
                 &mut state,
@@ -1606,6 +1625,7 @@ contract AbiTest {
                 &native_factory,
                 false,
                 EconomicalModel::Quota,
+                conf.chain_version,
             );
             let mut out = vec![];
             let _ = ex.call(
@@ -1675,6 +1695,8 @@ contract AbiTest {
         let info = EnvInfo::default();
         let engine = NullEngine::default();
         let mut substate = Substate::new();
+        let conf = BlockSysConfig::default();
+
         {
             let mut ex = Executive::new(
                 &mut state,
@@ -1684,6 +1706,7 @@ contract AbiTest {
                 &native_factory,
                 false,
                 EconomicalModel::Quota,
+                conf.chain_version,
             );
             let mut out = vec![];
             let res = ex.call(
@@ -1758,6 +1781,8 @@ contract AbiTest {
         let info = EnvInfo::default();
         let engine = NullEngine::default();
         let mut substate = Substate::new();
+        let conf = BlockSysConfig::default();
+
         {
             let mut ex = Executive::new(
                 &mut state,
@@ -1767,6 +1792,7 @@ contract AbiTest {
                 &native_factory,
                 false,
                 EconomicalModel::Quota,
+                conf.chain_version,
             );
             let mut out = vec![];
             let res = ex.call(
@@ -1857,6 +1883,8 @@ contract FakePermissionManagement {
         let info = EnvInfo::default();
         let engine = NullEngine::default();
         let mut substate = Substate::new();
+        let conf = BlockSysConfig::default();
+
         {
             let mut ex = Executive::new(
                 &mut state,
@@ -1866,6 +1894,7 @@ contract FakePermissionManagement {
                 &native_factory,
                 false,
                 EconomicalModel::Quota,
+                conf.chain_version,
             );
             let mut out = vec![];
             let res = ex.call(
diff --git a/cita-executor/core/src/externalities.rs b/cita-executor/core/src/externalities.rs
index 5297fe129..ffdda4b2d 100644
--- a/cita-executor/core/src/externalities.rs
+++ b/cita-executor/core/src/externalities.rs
@@ -91,6 +91,7 @@ where
     vm_tracer: &'a mut V,
     static_flag: bool,
     economical_model: EconomicalModel,
+    chain_version: u32,
 }
 
 impl<'a, T: 'a, V: 'a, B: 'a> Externalities<'a, T, V, B>
@@ -115,6 +116,7 @@ where
         vm_tracer: &'a mut V,
         static_flag: bool,
         economical_model: EconomicalModel,
+        chain_version: u32,
     ) -> Self {
         Externalities {
             state,
@@ -131,6 +133,7 @@ where
             vm_tracer,
             static_flag,
             economical_model,
+            chain_version,
         }
     }
 }
@@ -248,6 +251,7 @@ where
             self.depth,
             self.static_flag,
             self.economical_model,
+            self.chain_version,
         );
 
         // TODO: handle internal error separately
@@ -320,6 +324,7 @@ where
             self.depth,
             self.static_flag,
             self.economical_model,
+            self.chain_version,
         );
 
         match ex.call(
@@ -418,6 +423,16 @@ where
 
         let address = self.origin_info.address;
         let balance = self.balance(&address)?;
+
+        if self.chain_version > 1 {
+            if &address == refund_address {
+                self.state.sub_balance(&address, &balance)?;
+            } else {
+                self.state
+                    .transfer_balance(&address, refund_address, &balance)?;
+            }
+        }
+
         self.tracer.trace_suicide(address, balance, *refund_address);
         self.substate.suicides.insert(address);
         Ok(())
diff --git a/cita-executor/core/src/libexecutor/auto_exec.rs b/cita-executor/core/src/libexecutor/auto_exec.rs
index b77bf10db..862476d13 100644
--- a/cita-executor/core/src/libexecutor/auto_exec.rs
+++ b/cita-executor/core/src/libexecutor/auto_exec.rs
@@ -41,11 +41,12 @@ lazy_static! {
     static ref AUTO_EXEC_HASH: Vec<u8> = method_tools::encode_to_vec(AUTO_EXEC);
 }
 
-// pub fn auto_exec(state: &mut State<StateDB>) -> evm::Result<FinalizationResult> {
 pub fn auto_exec(
     state: &mut State<StateDB>,
     auto_exec_quota_limit: u64,
     economical_model: EconomicalModel,
+    env_info: EnvInfo,
+    chain_version: u32,
 ) {
     let hash = &*AUTO_EXEC_HASH;
     let params = ActionParams {
@@ -68,7 +69,7 @@ pub fn auto_exec(
     let mut trace_output = tracer.prepare_trace_output();
     let output = OutputPolicy::Return(BytesRef::Flexible(&mut out), trace_output.as_mut());
     let factory = Factory::new(VMType::Interpreter, 1024 * 32);
-    let env_info = EnvInfo::default();
+
     let engine = NullEngine::default();
     let native_factory = NativeFactory::default();
     let origin_info = OriginInfo::from(&params);
@@ -87,6 +88,7 @@ pub fn auto_exec(
         &mut vm_tracer,
         false,
         economical_model,
+        chain_version,
     );
     let res = {
         factory
diff --git a/cita-executor/core/src/libexecutor/block.rs b/cita-executor/core/src/libexecutor/block.rs
index 3bb1e30e8..a332f6ab1 100644
--- a/cita-executor/core/src/libexecutor/block.rs
+++ b/cita-executor/core/src/libexecutor/block.rs
@@ -172,11 +172,22 @@ impl ExecutedBlock {
 
     /// Turn this into a `ClosedBlock`.
     pub fn close(mut self, conf: &BlockSysConfig) -> ClosedBlock {
+        let mut env_info = self.env_info();
+        // In protocol version 0, 1:
+        // Auto Execution's env info author is default address
+        // In protocol version > 1:
+        // Auto Execution's env info author is block author
+        if conf.chain_version < 2 {
+            env_info.author = Address::default();
+        }
+
         if conf.auto_exec {
             auto_exec(
                 &mut self.state,
                 conf.auto_exec_quota_limit,
                 conf.economical_model,
+                env_info,
+                conf.chain_version,
             );
             self.state.commit().expect("commit trie error");
         }
diff --git a/cita-executor/core/src/libexecutor/command.rs b/cita-executor/core/src/libexecutor/command.rs
index 3d35e13c0..74d09252a 100644
--- a/cita-executor/core/src/libexecutor/command.rs
+++ b/cita-executor/core/src/libexecutor/command.rs
@@ -307,6 +307,7 @@ impl Commander for Executor {
             &self.factories.native,
             false,
             EconomicalModel::Quota,
+            self.sys_config.block_sys_config.chain_version,
         )
         .transact(t, options, &conf)
         .map_err(Into::into)
diff --git a/cita-executor/core/src/libexecutor/executor.rs b/cita-executor/core/src/libexecutor/executor.rs
index 4c4a2678d..4718693d9 100644
--- a/cita-executor/core/src/libexecutor/executor.rs
+++ b/cita-executor/core/src/libexecutor/executor.rs
@@ -451,7 +451,7 @@ pub fn make_consensus_config(sys_config: GlobalSysConfig) -> ConsensusConfig {
     consensus_config.set_validators(validators);
     consensus_config.set_check_quota(sys_config.block_sys_config.check_options.quota);
     consensus_config.set_block_interval(sys_config.block_interval);
-    consensus_config.set_version(sys_config.chain_version);
+    consensus_config.set_version(sys_config.block_sys_config.chain_version);
     if sys_config.emergency_brake {
         let super_admin_account = sys_config
             .block_sys_config
diff --git a/cita-executor/core/src/libexecutor/sys_config.rs b/cita-executor/core/src/libexecutor/sys_config.rs
index a54852e29..c46ae685c 100644
--- a/cita-executor/core/src/libexecutor/sys_config.rs
+++ b/cita-executor/core/src/libexecutor/sys_config.rs
@@ -35,7 +35,6 @@ pub struct GlobalSysConfig {
     /// Interval time for creating a block (milliseconds)
     pub block_interval: u64,
     pub emergency_brake: bool,
-    pub chain_version: u32,
     pub block_sys_config: BlockSysConfig,
 }
 
@@ -49,7 +48,6 @@ impl Default for GlobalSysConfig {
             changed_height: 0,
             block_interval: 3000,
             emergency_brake: false,
-            chain_version: 0,
             block_sys_config: BlockSysConfig::default(),
         }
     }
@@ -141,7 +139,7 @@ impl GlobalSysConfig {
             .unwrap_or_else(EmergencyBrake::default_state);
 
         let version_manager = VersionManager::new(executor);
-        conf.chain_version = version_manager
+        conf.block_sys_config.chain_version = version_manager
             .get_version(block_id)
             .unwrap_or_else(VersionManager::default_version);
 
@@ -175,6 +173,7 @@ pub struct BlockSysConfig {
     pub group_accounts: HashMap<Address, Vec<Address>>,
     pub check_options: CheckOptions,
     pub economical_model: EconomicalModel,
+    pub chain_version: u32,
 }
 
 impl Default for BlockSysConfig {
@@ -190,6 +189,7 @@ impl Default for BlockSysConfig {
             group_accounts: HashMap::new(),
             check_options: CheckOptions::default(),
             economical_model: EconomicalModel::Quota,
+            chain_version: 0,
         }
     }
 }
diff --git a/cita-executor/core/src/state/mod.rs b/cita-executor/core/src/state/mod.rs
index 76df4eecd..9a27dc51b 100644
--- a/cita-executor/core/src/state/mod.rs
+++ b/cita-executor/core/src/state/mod.rs
@@ -760,6 +760,7 @@ impl<B: Backend> State<B> {
             &native_factory,
             false,
             conf.economical_model,
+            conf.chain_version,
         )
         .transact(t, options, conf)
         {
diff --git a/cita-executor/evm/src/interpreter/mod.rs b/cita-executor/evm/src/interpreter/mod.rs
index 72ac56090..5bf5764ec 100644
--- a/cita-executor/evm/src/interpreter/mod.rs
+++ b/cita-executor/evm/src/interpreter/mod.rs
@@ -182,7 +182,9 @@ impl<Cost: CostType> evm::Evm for Interpreter<Cost> {
                 gasometer.current_gas = gasometer.current_gas + *gas;
             }
 
-            if trace_executed {
+            let expect_mem_len =
+                mem_written.unwrap_or_default().0 + mem_written.unwrap_or_default().1;
+            if trace_executed && expect_mem_len < self.mem.len() {
                 ext.trace_executed(
                     gasometer.current_gas.as_u256(),
                     stack.peek_top(info.ret),
diff --git a/cita-forever b/cita-forever
index 1b941c645..98151d3c9 160000
--- a/cita-forever
+++ b/cita-forever
@@ -1,1 +1,1 @@
-Subproject commit 1b941c645bd5566442a2ac46b1712153a34034d7
+Subproject commit 98151d3c9fd89445e08946d01e113dacb8f76002
diff --git a/cita-network/Cargo.toml b/cita-network/Cargo.toml
index 3810c55f9..c9c083958 100644
--- a/cita-network/Cargo.toml
+++ b/cita-network/Cargo.toml
@@ -5,9 +5,8 @@ authors = ["Cryptape Technologies <contact@cryptape.com>"]
 edition = "2018"
 
 [dependencies]
-fnv = "1.0.6"
-tentacle-discovery = "0.2.0"
-tentacle = "0.2.0-alpha.4"
+tentacle-discovery = "0.2.4"
+tentacle = "0.2.0-alpha.14"
 tokio = "0.1.14"
 futures = "0.1.25"
 cita-types = { git = "https://github.com/cryptape/cita-common.git", branch = "develop" }
@@ -24,6 +23,8 @@ bytes = "0.4"
 byteorder = "1.3"
 rand = "0.4.5"
 dotenv = "0.13.0"
+fnv = "1.0.6"
+notify = "4.0.10"
 
 [dev-dependencies]
 tempfile = "3.0.5"
diff --git a/cita-network/src/config.rs b/cita-network/src/config.rs
index e0c41b422..05d60a157 100644
--- a/cita-network/src/config.rs
+++ b/cita-network/src/config.rs
@@ -29,6 +29,7 @@ pub struct NetConfig {
     pub peers: Option<Vec<PeerConfig>>,
     pub max_connects: Option<usize>,
     pub enable_tls: Option<bool>,
+    pub enable_discovery: Option<bool>,
 }
 
 #[derive(Debug, Deserialize, Clone)]
@@ -94,5 +95,6 @@ mod tests {
         assert_eq!(config.max_connects, Some(4));
         assert_eq!(config.enable_tls, Some(true));
         assert_eq!(config.peers.unwrap().len(), 2);
+        assert_eq!(config.enable_discovery, None);
     }
 }
diff --git a/cita-network/src/main.rs b/cita-network/src/main.rs
index 0f60bda04..f3e2fbbd0 100644
--- a/cita-network/src/main.rs
+++ b/cita-network/src/main.rs
@@ -99,6 +99,9 @@ use clap::App;
 use dotenv;
 use futures::prelude::*;
 use logger::{debug, info};
+use notify::{RecommendedWatcher, RecursiveMode, Watcher};
+use std::path::Path;
+use std::sync::mpsc::channel;
 use std::thread;
 use tentacle::{builder::ServiceBuilder, secio::SecioKeyPair};
 use util::micro_service_init;
@@ -106,6 +109,8 @@ use util::set_panic_handler;
 
 include!(concat!(env!("OUT_DIR"), "/build_info.rs"));
 
+const NOTIFY_DELAY_SECS: u64 = 1;
+
 fn main() {
     // init app
     let matches = App::new("network")
@@ -124,12 +129,29 @@ fn main() {
     micro_service_init!("cita-network", "CITA:network", stdout);
     info!("Version: {}", get_build_info_str(true));
 
-    let config_path = matches.value_of("config").unwrap_or("network.toml");
+    let config_file = matches.value_of("config").unwrap_or("network.toml");
+
+    let config_path = Path::new(config_file);
+    let mut dir = config_path
+        .parent()
+        .unwrap_or_else(|| Path::new(""))
+        .to_str()
+        .unwrap();
+    if dir.is_empty() {
+        dir = ".";
+    }
+    let fname = config_path
+        .file_name()
+        .expect("Wrong config file")
+        .to_str()
+        .unwrap()
+        .to_string()
+        .clone();
 
     // Init config
     debug!("Config path {:?}", config_path);
-    let config = NetConfig::new(&config_path);
-    debug!("Network config is {:?}", config);
+    let config = NetConfig::new(&config_file);
+    debug!("Network config is {:?}", config_file);
 
     let addr_path = matches.value_of("address").unwrap_or("address");
     let own_addr = AddressConfig::new(&addr_path);
@@ -147,14 +169,25 @@ fn main() {
     mq_agent.set_nodes_mgr_client(nodes_mgr.client());
     mq_agent.set_network_client(network_mgr.client());
 
-    let discovery_meta = create_discovery_meta(nodes_mgr.client());
-
     let transfer_meta = create_transfer_meta(network_mgr.client(), nodes_mgr.client());
-
     let mut service_cfg = ServiceBuilder::default()
-        .insert_protocol(discovery_meta)
         .insert_protocol(transfer_meta)
         .forever(true);
+
+    let discovery_flag = config.enable_discovery.unwrap_or(true);
+    let (tx, rx) = channel();
+    let mut watcher: RecommendedWatcher =
+        Watcher::new(tx, std::time::Duration::from_secs(NOTIFY_DELAY_SECS)).unwrap();
+    if discovery_flag {
+        let discovery_meta = create_discovery_meta(nodes_mgr.client());
+        service_cfg = service_cfg.insert_protocol(discovery_meta);
+    } else if watcher.watch(dir, RecursiveMode::NonRecursive).is_ok() {
+        let notify_client = nodes_mgr.client();
+        thread::spawn(move || {
+            NodesManager::notify_config_change(rx, notify_client, fname);
+        });
+    }
+
     if nodes_mgr.is_enable_tls() {
         service_cfg = service_cfg.key_pair(SecioKeyPair::secp256k1_generated());
     }
diff --git a/cita-network/src/network.rs b/cita-network/src/network.rs
index be08c076b..02c25cdac 100644
--- a/cita-network/src/network.rs
+++ b/cita-network/src/network.rs
@@ -30,6 +30,7 @@ use libproto::{TryFrom, TryInto};
 use logger::{error, info, trace, warn};
 use pubsub::channel::{unbounded, Receiver, Sender};
 use serde_json;
+use std::iter::FromIterator;
 use std::sync::atomic::{AtomicBool, Ordering};
 use std::sync::Arc;
 
@@ -215,7 +216,7 @@ impl LocalMessage {
 
                     let peers_info = PeersInfo {
                         amount: peers.len() as u32,
-                        peers: Some(peers),
+                        peers: Some(std::collections::HashMap::from_iter(peers)),
                         error_message: None,
                     };
 
diff --git a/cita-network/src/node_manager.rs b/cita-network/src/node_manager.rs
index 1871a5d12..a464b7bb9 100644
--- a/cita-network/src/node_manager.rs
+++ b/cita-network/src/node_manager.rs
@@ -20,22 +20,23 @@ use crate::config::NetConfig;
 use crate::p2p_protocol::transfer::TRANSFER_PROTOCOL_ID;
 use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
 use cita_types::Address;
-use fnv::FnvHashMap;
+use fnv::FnvHashMap as HashMap;
 use libproto::{Message as ProtoMessage, TryInto};
 use logger::{debug, error, info, trace, warn};
+use notify::DebouncedEvent;
 use pubsub::channel::{select, tick, unbounded, Receiver, Sender};
 use rand;
+use std::sync::mpsc::Receiver as StdReceiver;
 use std::{
-    collections::HashMap,
-    collections::HashSet,
+    collections::{BTreeMap, BTreeSet},
     convert::Into,
     io::Cursor,
     net::{SocketAddr, ToSocketAddrs},
     time::{Duration, Instant},
 };
 use tentacle::{
-    multiaddr::ToMultiaddr,
     service::{DialProtocol, ServiceControl, SessionType, TargetSession},
+    utils::socketaddr_to_multiaddr,
     SessionId,
 };
 
@@ -69,17 +70,73 @@ pub const DIALED_ERROR_SCORE: i32 = 25;
 // A node is dialed error by client, should need DIALED_ERROR_SCORE each time.
 pub const KEEP_ON_LINE_SCORE: i32 = 5;
 
-type IsTranslated = bool;
+#[derive(Debug, PartialEq)]
+pub enum NodeSource {
+    FromConfig,
+    FromDiscovery,
+}
+
+#[derive(Debug)]
+pub struct NodeStatus {
+    // score: Score for a node, it will affect whether the node will be chosen to dail again,
+    // or be deleted from the known_addresses list. But for now, it useless.
+    pub score: i32,
+
+    // session_id: Indicates that this node has been connected to a session. 'None' for has not
+    // connected yet.
+    pub session_id: Option<SessionId>,
+    pub node_src: NodeSource,
+}
+
+impl NodeStatus {
+    pub fn new(score: i32, session_id: Option<SessionId>, node_src: NodeSource) -> Self {
+        NodeStatus {
+            score,
+            session_id,
+            node_src,
+        }
+    }
+}
+
+#[derive(Debug)]
+pub struct SessionInfo {
+    pub ty: SessionType,
+    pub addr: SocketAddr,
+}
+
+impl SessionInfo {
+    pub fn new(ty: SessionType, addr: SocketAddr) -> Self {
+        SessionInfo { ty, addr }
+    }
+}
+
+#[derive(Debug)]
+pub struct TransformAddr {
+    // Real linked addr
+    pub conn_addr: SocketAddr,
+    // Outbound addr transformed from Inbound addr
+    pub trans_addr: Option<SocketAddr>,
+}
+
+impl TransformAddr {
+    pub fn new(conn_addr: SocketAddr, trans_addr: Option<SocketAddr>) -> Self {
+        TransformAddr {
+            conn_addr,
+            trans_addr,
+        }
+    }
+}
 
 pub struct NodesManager {
-    check_connected_nodes: Receiver<Instant>,
-    known_addrs: FnvHashMap<SocketAddr, NodeStatus>,
-    config_addrs: HashMap<String, IsTranslated>,
-    translated_addrs: HashSet<SocketAddr>,
-    connected_addrs: HashMap<SessionId, SocketAddr>,
+    known_addrs: HashMap<SocketAddr, NodeStatus>,
+    config_addrs: BTreeMap<String, Option<SocketAddr>>,
+
+    connected_addrs: HashMap<SessionId, TransformAddr>,
     pending_connected_addrs: HashMap<SessionId, SessionInfo>,
+
     connected_peer_keys: HashMap<Address, SessionId>,
-    repeated_session: HashMap<SessionId, SocketAddr>,
+
+    check_connected_nodes: Receiver<Instant>,
     max_connects: usize,
     nodes_manager_client: NodesManagerClient,
     nodes_manager_service_receiver: Receiver<NodesManagerMessage>,
@@ -91,7 +148,7 @@ pub struct NodesManager {
 }
 
 impl NodesManager {
-    pub fn new(known_addrs: FnvHashMap<SocketAddr, NodeStatus>) -> Self {
+    pub fn new(known_addrs: HashMap<SocketAddr, NodeStatus>) -> Self {
         let mut node_mgr = NodesManager::default();
         node_mgr.known_addrs = known_addrs;
         node_mgr
@@ -106,11 +163,11 @@ impl NodesManager {
         if let Some(enable_tls) = cfg.enable_tls {
             node_mgr.enable_tls = enable_tls;
         }
-        if let Some(known_addrs) = cfg.peers {
-            for addr in known_addrs {
+        if let Some(cfg_addrs) = cfg.peers {
+            for addr in cfg_addrs {
                 if let (Some(ip), Some(port)) = (addr.ip, addr.port) {
                     let addr_str = format!("{}:{}", ip, port);
-                    node_mgr.config_addrs.insert(addr_str, false);
+                    node_mgr.config_addrs.insert(addr_str, None);
                 } else {
                     warn!("[NodeManager] ip(host) & port 'MUST' be set in peers.");
                 }
@@ -118,10 +175,45 @@ impl NodesManager {
         } else {
             warn!("[NodeManager] Does not set any peers in config file!");
         }
-
         node_mgr
     }
 
+    pub fn notify_config_change(
+        rx: StdReceiver<DebouncedEvent>,
+        node_client: NodesManagerClient,
+        fname: String,
+    ) {
+        loop {
+            match rx.recv() {
+                Ok(event) => match event {
+                    DebouncedEvent::Create(path_buf) | DebouncedEvent::Write(path_buf) => {
+                        if path_buf.is_file() {
+                            let file_name = path_buf.file_name().unwrap().to_str().unwrap();
+                            if file_name == fname {
+                                info!("file {} changed, will auto reload!", file_name);
+
+                                let config = NetConfig::new(file_name);
+                                if let Some(peers) = config.peers {
+                                    let mut addr_strs = Vec::new();
+                                    for addr in peers {
+                                        if let (Some(ip), Some(port)) = (addr.ip, addr.port) {
+                                            addr_strs.push(format!("{}:{}", ip, port));
+                                        }
+                                    }
+                                    node_client.fix_modified_config(ModifiedConfigPeersReq::new(
+                                        addr_strs,
+                                    ));
+                                }
+                            }
+                        }
+                    }
+                    _ => trace!("file notify event: {:?}", event),
+                },
+                Err(e) => warn!("watch error: {:?}", e),
+            }
+        }
+    }
+
     pub fn run(&mut self) {
         loop {
             select! {
@@ -203,7 +295,7 @@ impl NodesManager {
 
                     // The node will get time sugar, the nodes which in config file can get 2, and the
                     // other nodes which discovered by P2P can get 1.
-                    value.score += if self.translated_addrs.contains(&*key) {
+                    value.score += if value.node_src == NodeSource::FromConfig {
                         2
                     } else {
                         1
@@ -215,7 +307,7 @@ impl NodesManager {
                 if let Some(ref mut ctrl) = self.service_ctrl {
                     self.dialing_node = Some(*key);
                     info!("Trying to dial: {:?}", self.dialing_node);
-                    match ctrl.dial((*key).to_multiaddr().unwrap(), DialProtocol::All) {
+                    match ctrl.dial(socketaddr_to_multiaddr(*key), DialProtocol::All) {
                         Ok(_) => {
                             // Need DIALING_SCORE for every dial.
                             value.score -= DIALING_SCORE;
@@ -252,7 +344,7 @@ impl NodesManager {
     pub fn translate_address(&mut self) {
         for (key, value) in self.config_addrs.iter_mut() {
             // The address has translated.
-            if *value {
+            if value.is_some() {
                 debug!("[NodeManager] The Address {:?} has been translated.", key);
                 continue;
             }
@@ -260,10 +352,9 @@ impl NodesManager {
                 Ok(mut result) => {
                     if let Some(socket_addr) = result.next() {
                         // An init node from config file, give it FULL_SCORE.
-                        let node_status = NodeStatus::new(FULL_SCORE, None);
+                        let node_status = NodeStatus::new(FULL_SCORE, None, NodeSource::FromConfig);
                         self.known_addrs.insert(socket_addr, node_status);
-                        self.translated_addrs.insert(socket_addr);
-                        *value = true;
+                        *value = Some(socket_addr);
                     } else {
                         error!("[NodeManager] Can not convert to socket address!");
                     }
@@ -288,12 +379,10 @@ impl Default for NodesManager {
         // Set enable_tls = false as default.
         NodesManager {
             check_connected_nodes: ticker,
-            known_addrs: FnvHashMap::default(),
-            config_addrs: HashMap::default(),
-            translated_addrs: HashSet::default(),
+            known_addrs: HashMap::default(),
+            config_addrs: BTreeMap::default(),
             connected_addrs: HashMap::default(),
             connected_peer_keys: HashMap::default(),
-            repeated_session: HashMap::default(),
             pending_connected_addrs: HashMap::default(),
             max_connects: DEFAULT_MAX_CONNECTS,
             nodes_manager_client: client,
@@ -307,35 +396,6 @@ impl Default for NodesManager {
     }
 }
 
-#[derive(Debug)]
-pub struct NodeStatus {
-    // score: Score for a node, it will affect whether the node will be chosen to dail again,
-    // or be deleted from the known_addresses list. But for now, it useless.
-    pub score: i32,
-
-    // session_id: Indicates that this node has been connected to a session. 'None' for has not
-    // connected yet.
-    pub session_id: Option<SessionId>,
-}
-
-impl NodeStatus {
-    pub fn new(score: i32, session_id: Option<SessionId>) -> Self {
-        NodeStatus { score, session_id }
-    }
-}
-
-#[derive(Debug)]
-pub struct SessionInfo {
-    pub ty: SessionType,
-    pub addr: SocketAddr,
-}
-
-impl SessionInfo {
-    pub fn new(ty: SessionType, addr: SocketAddr) -> Self {
-        SessionInfo { ty, addr }
-    }
-}
-
 #[derive(Clone, Debug)]
 pub struct NodesManagerClient {
     sender: Sender<NodesManagerMessage>,
@@ -398,6 +458,10 @@ impl NodesManagerClient {
         self.send_req(NodesManagerMessage::AddConnectedNode(req));
     }
 
+    pub fn fix_modified_config(&self, req: ModifiedConfigPeersReq) {
+        self.send_req(NodesManagerMessage::ModifiedConfigPeers(req));
+    }
+
     fn send_req(&self, req: NodesManagerMessage) {
         if let Err(e) = self.sender.try_send(req) {
             warn!(
@@ -423,6 +487,7 @@ pub enum NodesManagerMessage {
     AddRepeatedNode(AddRepeatedNodeReq),
     ConnectedSelf(ConnectedSelfReq),
     GetPeersInfo(GetPeersInfoReq),
+    ModifiedConfigPeers(ModifiedConfigPeersReq),
 }
 
 impl NodesManagerMessage {
@@ -441,6 +506,7 @@ impl NodesManagerMessage {
             NodesManagerMessage::AddRepeatedNode(req) => req.handle(service),
             NodesManagerMessage::ConnectedSelf(req) => req.handle(service),
             NodesManagerMessage::GetPeersInfo(req) => req.handle(service),
+            NodesManagerMessage::ModifiedConfigPeers(req) => req.handle(service),
         }
     }
 }
@@ -505,17 +571,16 @@ impl AddConnectedNodeReq {
             );
 
             // It is a repeated_session, but not a repeated node.
-            if self.ty == SessionType::Outbound {
-                if let Some(dialing_addr) = service.dialing_node {
-                    if self.ty == SessionType::Outbound {
-                        if let Some(ref mut node_status) =
-                            service.known_addrs.get_mut(&dialing_addr)
-                        {
-                            node_status.session_id = Some(*repeated_id);
-                            node_status.score += SUCCESS_DIALING_SCORE;
-                        }
+            if let Some(dialing_addr) = service.dialing_node {
+                if self.ty == SessionType::Outbound {
+                    if let Some(ref mut node_status) = service.known_addrs.get_mut(&dialing_addr) {
+                        node_status.session_id = Some(*repeated_id);
+                        node_status.score += SUCCESS_DIALING_SCORE;
+
+                        let _ = service.connected_addrs.entry(*repeated_id).and_modify(|v| {
+                            v.trans_addr = Some(dialing_addr);
+                        });
                     }
-                    service.repeated_session.insert(*repeated_id, dialing_addr);
                 }
             }
 
@@ -548,6 +613,9 @@ impl AddConnectedNodeReq {
                     "[NodeManager] Add session [{:?}], address: {:?} to Connected_addrs.",
                     self.session_id, session_info.addr
                 );
+                let _ = service
+                    .connected_addrs
+                    .insert(self.session_id, TransformAddr::new(session_info.addr, None));
 
                 // If it is an active connection, need to set this node in known_addrs has been connected.
                 if self.ty == SessionType::Outbound {
@@ -558,16 +626,14 @@ impl AddConnectedNodeReq {
                         node_status.score += SUCCESS_DIALING_SCORE;
                     }
                 }
-                service
-                    .connected_addrs
-                    .insert(self.session_id, session_info.addr);
-
-                // Add connected peer keys
-                let _ = service
-                    .connected_peer_keys
-                    .insert(self.init_msg.peer_key, self.session_id);
             }
 
+            // Add connected peer keys
+            // Because AddRepeatedNodeReq maybe already did above action
+            let _ = service
+                .connected_peer_keys
+                .insert(self.init_msg.peer_key, self.session_id);
+
             info!(
                 "[NodeManager] connected_addrs info: {:?}",
                 service.connected_addrs
@@ -612,7 +678,7 @@ impl NetworkInitReq {
 
         if let Some(ref mut ctrl) = service.service_ctrl {
             // FIXME: handle the error!
-            let ret = ctrl.send_message_to(self.session_id, TRANSFER_PROTOCOL_ID, buf);
+            let ret = ctrl.send_message_to(self.session_id, TRANSFER_PROTOCOL_ID, buf.into());
             info!(
                 "[NodeManager] Send network init message!, id: {:?}, peer_addr: {:?}, ret: {:?}",
                 self.session_id, peer_key, ret,
@@ -623,11 +689,12 @@ impl NetworkInitReq {
 
 pub struct AddNodeReq {
     addr: SocketAddr,
+    source: NodeSource,
 }
 
 impl AddNodeReq {
-    pub fn new(addr: SocketAddr) -> Self {
-        AddNodeReq { addr }
+    pub fn new(addr: SocketAddr, source: NodeSource) -> Self {
+        AddNodeReq { addr, source }
     }
 
     pub fn handle(self, service: &mut NodesManager) {
@@ -639,7 +706,7 @@ impl AddNodeReq {
             return;
         }
         // Add a new node, using a default node status.
-        let default_node_status = NodeStatus::new(FULL_SCORE, None);
+        let default_node_status = NodeStatus::new(FULL_SCORE, None, self.source);
         service
             .known_addrs
             .entry(self.addr)
@@ -685,9 +752,23 @@ impl AddRepeatedNodeReq {
         if let Some(ref mut node_status) = service.known_addrs.get_mut(&self.addr) {
             node_status.session_id = Some(self.session_id);
             node_status.score += SUCCESS_DIALING_SCORE;
-        }
-        service.repeated_session.insert(self.session_id, self.addr);
 
+            if let Some(session_info) = service.pending_connected_addrs.remove(&self.session_id) {
+                let _ = service.connected_addrs.insert(
+                    self.session_id,
+                    TransformAddr::new(session_info.addr, Some(self.addr)),
+                );
+            } else {
+                let _ = service
+                    .connected_addrs
+                    .entry(self.session_id)
+                    .and_modify(|v| {
+                        v.trans_addr = Some(self.addr);
+                    });
+            }
+        } else {
+            warn!("[NodeManager] Cant find repeated sock addr in known addrs");
+        }
         // This dialing is finished.
         service.dialing_node = None;
     }
@@ -750,10 +831,9 @@ impl PendingConnectedNodeReq {
             "[NodeManager] Session [{:?}], address: {:?} pending to add to Connected_addrs.",
             self.session_id, self.addr
         );
-        let session_info = SessionInfo::new(self.ty, self.addr);
         service
             .pending_connected_addrs
-            .insert(self.session_id, session_info);
+            .insert(self.session_id, SessionInfo::new(self.ty, self.addr));
     }
 }
 
@@ -770,44 +850,33 @@ impl DelConnectedNodeReq {
         info!("[NodeManager] Disconnected session [{:?}]", self.session_id);
 
         if let Some(addr) = service.connected_addrs.remove(&self.session_id) {
-            self.reset_node_status(addr, service);
-        }
-
-        if let Some(addr) = service.repeated_session.remove(&self.session_id) {
-            self.reset_node_status(addr, service);
-        }
+            let trans_addr = addr.trans_addr.unwrap_or(addr.conn_addr);
+            self.fix_node_status(trans_addr, service);
 
-        // Remove connected peer keys
-        for (key, value) in service.connected_peer_keys.iter() {
-            if self.session_id == *value {
-                info!(
-                    "[NodeManager] Remove session [{:?}] from connected_peer_keys.",
-                    *value
-                );
-                service.connected_peer_keys.remove(&key.clone());
-                break;
+            // Remove connected peer keys
+            for (key, value) in service.connected_peer_keys.iter() {
+                if self.session_id == *value {
+                    info!(
+                        "[NodeManager] Remove session [{:?}] from connected_peer_keys.",
+                        *value
+                    );
+                    service.connected_peer_keys.remove(&key.clone());
+                    break;
+                }
             }
         }
 
         // Remove pending connected
         if let Some(session_info) = service.pending_connected_addrs.remove(&self.session_id) {
             if session_info.ty == SessionType::Outbound {
-                // Dial a node, but the session was closed by server, means this dial may refused.
-                if let Some(ref mut node_status) = service.known_addrs.get_mut(&session_info.addr) {
-                    node_status.score -= REFUSED_SCORE;
-                    info!(
-                        "[NodeManager] Node [{:?}] leave score [{:?}].",
-                        session_info.addr, node_status.score
-                    );
-                }
-
+                self.fix_node_status(session_info.addr, service);
                 // Close a session which open as client, end of this dialing.
                 service.dialing_node = None;
             }
         }
     }
 
-    fn reset_node_status(&self, addr: SocketAddr, service: &mut NodesManager) {
+    fn fix_node_status(&self, addr: SocketAddr, service: &mut NodesManager) {
         // Set the node as disconnected in known_addrs
         if let Some(ref mut node_status) = service.known_addrs.get_mut(&addr) {
             if let Some(session_id) = node_status.session_id {
@@ -850,7 +919,7 @@ impl BroadcastReq {
         let mut buf = Vec::with_capacity(CITA_FRAME_HEADER_LEN + self.key.len() + msg_bytes.len());
         pubsub_message_to_network_message(&mut buf, Some((self.key, msg_bytes)));
         if let Some(ref mut ctrl) = service.service_ctrl {
-            let _ = ctrl.filter_broadcast(TargetSession::All, TRANSFER_PROTOCOL_ID, buf);
+            let _ = ctrl.filter_broadcast(TargetSession::All, TRANSFER_PROTOCOL_ID, buf.into());
         }
     }
 }
@@ -879,7 +948,7 @@ impl SingleTxReq {
         pubsub_message_to_network_message(&mut buf, Some((self.key, msg_bytes)));
         if let Some(ref mut ctrl) = service.service_ctrl {
             // FIXME: handle the error!
-            let _ = ctrl.send_message_to(self.dst, TRANSFER_PROTOCOL_ID, buf);
+            let _ = ctrl.send_message_to(self.dst, TRANSFER_PROTOCOL_ID, buf.into());
         }
     }
 }
@@ -918,8 +987,8 @@ impl GetPeersInfoReq {
         let mut peers = HashMap::default();
 
         for (key, value) in service.connected_peer_keys.iter() {
-            if let Some(socket_addr) = service.connected_addrs.get(&value) {
-                peers.insert(key.clone(), socket_addr.ip().to_string());
+            if let Some(addr) = service.connected_addrs.get(&value) {
+                peers.insert(key.clone(), addr.conn_addr.ip().to_string());
             } else {
                 warn!(
                     "[NodeManager] Can not get socket address for session {} from connected_addr. It must be something wrong!",
@@ -950,3 +1019,42 @@ impl ConnectedSelfReq {
         service.dialing_node = None;
     }
 }
+
+pub struct ModifiedConfigPeersReq {
+    peers: Vec<String>,
+}
+
+impl ModifiedConfigPeersReq {
+    pub fn new(peers: Vec<String>) -> Self {
+        ModifiedConfigPeersReq { peers }
+    }
+
+    pub fn handle(self, service: &mut NodesManager) {
+        // If new config deleted some peer,disconnect and remove it from known addrs
+        let mut keys: BTreeSet<_> = service.config_addrs.keys().cloned().collect();
+        for peer in &self.peers {
+            keys.remove(peer);
+        }
+
+        info!("left peers {:?}", self.peers);
+
+        // The remainder in keys will be disconnected
+        for key in keys {
+            service.config_addrs.remove(&key).and_then(|addr| {
+                addr.and_then(|addr| {
+                    service.known_addrs.remove(&addr).and_then(|node_status| {
+                        node_status.session_id.and_then(|sid| {
+                            service
+                                .service_ctrl
+                                .as_mut()
+                                .and_then(|ctrl| ctrl.disconnect(sid).ok())
+                        })
+                    })
+                })
+            });
+        }
+        for peer in self.peers {
+            service.config_addrs.entry(peer).or_insert(None);
+        }
+    }
+}
diff --git a/cita-network/src/p2p_protocol/node_discovery.rs b/cita-network/src/p2p_protocol/node_discovery.rs
index 2bb7a2f17..0940a52ef 100644
--- a/cita-network/src/p2p_protocol/node_discovery.rs
+++ b/cita-network/src/p2p_protocol/node_discovery.rs
@@ -15,14 +15,14 @@
 // You should have received a copy of the GNU General Public License
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-use crate::node_manager::{AddNodeReq, GetRandomNodesReq, NodesManagerClient};
+use crate::node_manager::{AddNodeReq, GetRandomNodesReq, NodeSource, NodesManagerClient};
 use logger::{info, warn};
 use pubsub::channel::unbounded;
 use tentacle::{
     builder::MetaBuilder,
-    multiaddr::{Multiaddr, ToMultiaddr},
+    multiaddr::Multiaddr,
     service::{ProtocolHandle, ProtocolMeta},
-    utils::multiaddr_to_socketaddr,
+    utils::{multiaddr_to_socketaddr, socketaddr_to_multiaddr},
     ProtocolId, SessionId,
 };
 use tentacle_discovery::{
@@ -46,7 +46,7 @@ impl NodesAddressManager {
 impl AddressManager for NodesAddressManager {
     fn add_new_addr(&mut self, _session_id: SessionId, addr: Multiaddr) {
         let address = multiaddr_to_socketaddr(&addr).unwrap();
-        let req = AddNodeReq::new(address);
+        let req = AddNodeReq::new(address, NodeSource::FromDiscovery);
         self.nodes_mgr_client.add_node(req);
 
         info!("[NodeDiscovery] Add node {:?} to manager", address);
@@ -76,9 +76,7 @@ impl AddressManager for NodesAddressManager {
             ret
         );
 
-        ret.into_iter()
-            .map(|addr| addr.to_multiaddr().unwrap())
-            .collect()
+        ret.into_iter().map(socketaddr_to_multiaddr).collect()
     }
 }
 
diff --git a/env.sh b/env.sh
index e57d7e985..de223f4e8 100755
--- a/env.sh
+++ b/env.sh
@@ -13,7 +13,7 @@ fi
 
 if test -f "${SOURCE_DIR}/Cargo.toml"; then
     readonly CONTAINER_NAME='cita_build_container'
-    readonly DOCKER_IMAGE='cita/cita-build:ubuntu-18.04-20190413'
+    readonly DOCKER_IMAGE='cita/cita-build:ubuntu-18.04-20190429'
 else
     readonly CONTAINER_NAME='cita_run_container'
     readonly DOCKER_IMAGE='cita/cita-run:ubuntu-18.04-20190419'
@@ -35,6 +35,12 @@ if [[ "$3" == "port" ]]; then
     echo -e "\033[0;32mExpose ports: ${EXPOSE[*]} \033[0m"
 fi
 
+# Expose parameter for docker needs something like "-p 1337:1337 -p 1338:1338", but not "-p 1337:1337 1338:1338"
+EXPOSE_PARAM=()
+for port in "${EXPOSE[@]}"; do
+    EXPOSE_PARAM+=" -p ${port}"
+done
+
 # Docker Arguments
 USER_ID="$(id -u "$USER")"
 readonly WORKDIR='/opt/cita'
@@ -59,12 +65,17 @@ if ! docker ps | grep "${CONTAINER_NAME}" > '/dev/null' 2>&1; then
            --env "USER_ID=${USER_ID}" \
            --workdir "${WORKDIR}" \
            --name "${CONTAINER_NAME}" \
-           -p "${EXPOSE[@]}" "${DOCKER_IMAGE}" \
+           ${EXPOSE_PARAM[@]} "${DOCKER_IMAGE}" \
            /bin/bash -c "${INIT_CMD}"
     # Wait entrypoint.sh to finish
     sleep 3
 fi
 
+# If running "cita port" command, need to exit, means the command have finished.
+if [[ "$3" == "port" ]]; then
+    exit 0
+fi
+
 # Run commands through docker container
 # $0=`realpath`, $1="bin/cita", $2="bebop",
 # $3="command/--daemon", $4="config/command"
diff --git a/release_guide.md b/release_guide.md
index 1ba318c54..609f4865e 100644
--- a/release_guide.md
+++ b/release_guide.md
@@ -1,6 +1,201 @@
 # Release Guide
 
-TBD
+The code repository has two main branches:
+
+- `develop`: nightly build.
+- `master`: production release.
+
+The basic distribution process is all code changes need to be merged into the `master` branch and marked the new version when the code develop can be released as a version.
+
+More details will be explained in the following sections.
+
+The specific process follows the following steps:
+
+1. [Prepare Branch] (#Prepare Branch)
+2. [Test and Update Log] (#Test and Update Log)
+3. [Merge Branch] (#Merge Branch)
+4. [Release] (#Release)
+5. [Other Notes] (#Other Notes)
+
+## Prepare the Branch
+
+### Type of Version
+
+Use a semantic version and follow [Semantic Versioning]
+
+The excerpts are as follows:
+
+> Version format: Major Version Number. Minor Version Number. Revision Number, and the rule of version number increment are as follows:
+>
+> 1. Major Version Number: if you make incompatible API changes,
+> 2. Minor Version Number: if you make a backward compatible feature addition,
+> 3. Revision Number: if you make a backward compatibility fix.
+>    The pre-release version number and version compilation metadata can be added after "Major Version Number. Minor Version Number. Revision Number" as an extension.
+
+### Create a Release Branch
+
+***New branch naming follows the `release-` format***
+
+To get the latest code firstly and the specific operation is as follows:
+
+```shell
+git fetch origin
+```
+
+`origin` stands for `CITA` official code repository address, which can be viewed via `git remote -v`.
+
+The process is divided into version release (Major Version Number x and Minor Version Number y) and revision patch release (Revision Number z).
+
+#### Version Release
+
+Create a new branch `release-x.y.0` from the latest `develop`, as follows:
+
+```shell
+git checkout origin/develop -b release-x.y.0
+```
+
+#### Revision Patch Release
+
+Create a new branch `release-x.y.1` from the `tag` (`vx.y.0`) that requires a revision, as follows:
+
+```shell
+git checkout tags/vx.y.0 -b release-x.y.1
+```
+
+### Push Branch
+
+Push the created release branch `release-x.y.z` to the official repository, as follows:
+
+```shell
+git push origin release-x.y.z
+```
+
+### Setting Branch Protection
+
+Contact the administrator to set branch protection for the release branch `release-x.y.z`.
+
+## Test and ChangeLog
+
+Broadcast internal mail:
+
+- Inform the test team to test the release branch
+- Inform the toolchain team to adapt to the new version
+
+Merge the bug fixes occurred during the test into the release branch `release-x.y.z`.
+
+If the test passes, modify the update log and update the release date with other information.
+
+## Merge Branch
+
+### Merge into the master branch
+
+Merge the release branch `release-x.y.z` into the `master` branch via pull request.
+
+### Version tag
+
+***New version tag naming follows `vx.y.z` format***
+
+1. Update the master branch code as follows:
+
+```shell
+git checkout origin/master && git pull
+```
+
+2. Create tag as follows:
+
+```shell
+git tag -a vx.y.z -m 'vx.y.z'
+```
+
+3. Push tag to the code repository, as follows:
+
+```shell
+git push origin vx.y.z
+```
+
+### Merge into the develop Branch
+
+***The transition branch is named `merge-master-to-develop`***
+
+Merge the `master` branch into the `develop` branch. Because of the branch protection, we need to create a middle branch `merge-master-to-develop` via `pull request`.
+
+1. Update the `master` branch code as follows:
+
+```shell
+git checkout origin/master && git pull
+```
+
+2. Create `merge-master-to-develop` as follows:
+
+```shell
+git checkout -b merge-master-to-develop
+```
+
+3. Push the branch to the code repository as follows:
+
+```shell
+git push origin merge-master-to-develop
+```
+
+4. Merge into `develop`
+
+Merge the transition branch `merge-master-to-develop` into the `develop` branch via pull request.
+
+## Release
+
+### File Packaging
+
+***Tarball uses `.tar.gz` suffix***
+
+Releasing the new version needs to package the following files:
+
+- Source code cita_src.tar.gz
+- Releasing files of three different algorithms:
+    - cita_secp256k1_sha3.tar.gz
+    - cita_ed25519_blake2b.tar.gz
+    - cita_sm2_sm3.tar.gz
+
+### Announcement of Releasing
+
+1. Draft an announcement with a brief description of the new version and upgrade tips with an update log in both Chinese and English.
+2. Upload the required files for the release.
+3. Release the new version
+
+### Mail Broadcast
+
+Write a new version of the message and broadcast it.
+
+### CITAHub talk Posting
+
+Post a new theme about the version releasing in [Information Edition].
+
+### Clearing Branches
+
+***If branch protection is set, contact the administrator to manually delete***
+
+1. Clean up the release branch, as follows:
+
+```shell
+git push --delete origin release-x.y.z
+```
+
+2. Clean up the transition branch as follows:
+
+```shell
+git push --delete origin merge-master-to-develop
+```
+
+### Update Version of CITAHub Docs
+
+[CITAHub Docs] updates three days later. The testing and supplement of documents will be done during this time.
+
+## Other Notes
+
+- If you need to modify the release announcement after releasing, hand it over to the publisher.
+
+[CITAhub Docs]: https://docs.citahub.com/en/welcome
+[Semantic Versioning]: https://semver.org/
+[Information Edition]: https://talk.citahub.com/c/9-category
 
 ----------------------
 
@@ -43,7 +238,7 @@ TBD
 
 首先获取最新的代码，具体操作如下：
 
-```
+```shell
 git fetch origin
 ```
 
@@ -55,7 +250,7 @@ git fetch origin
 
 从最新 `develop` 创建新的分支 `release-x.y.0`，具体操作如下：
 
-```
+```shell
 git checkout origin/develop -b release-x.y.0
 ```
 
@@ -63,7 +258,7 @@ git checkout origin/develop -b release-x.y.0
 
 从需要修订版本的 `tag`(`vx.y.0`) 创建新的分支 `release-x.y.1`，具体操作如下：
 
-```
+```shell
 git checkout tags/vx.y.0 -b release-x.y.1
 ```
 
@@ -71,7 +266,7 @@ git checkout tags/vx.y.0 -b release-x.y.1
 
 把创建的发布分支 `release-x.y.z` 推送到官方仓库，具体操作如下：
 
-```
+```shell
 git push origin release-x.y.z
 ```
 
@@ -102,19 +297,19 @@ git push origin release-x.y.z
 
 1. 更新 `master` 分支代码，具体操作如下：
 
-```
+```shell
 git checkout origin/master && git pull
 ```
 
 2. 创建 `tag`，具体操作如下：
 
-```
+```shell
 git tag -a vx.y.z -m 'vx.y.z'
 ```
 
 3. 推送 `tag` 到代码仓库，具体操作如下：
 
-```
+```shell
 git push origin vx.y.z
 ```
 
@@ -126,19 +321,19 @@ git push origin vx.y.z
 
 1. 更新 `master` 分支代码，具体操作如下：
 
-```
+```shell
 git checkout origin/master && git pull
 ```
 
 2. 创建 `merge-master-to-develop`，具体操作如下：
 
-```
+```shell
 git checkout -b merge-master-to-develop
 ```
 
 3. 推送分支到代码仓库，具体操作如下：
 
-```
+```shell
 git push origin merge-master-to-develop
 ```
 
@@ -150,7 +345,7 @@ git push origin merge-master-to-develop
 
 ### 文件打包
 
-***压缩包使用 .tar.gz 后缀***
+***压缩包使用 `.tar.gz` 后缀***
 
 新版本发布需要打包以下文件：
 
@@ -174,30 +369,29 @@ git push origin merge-master-to-develop
 
 在[信息版]发布新版本主题贴。
 
-### CITAHub Docs 确认更新
-
-确定 [CITAHub Docs] 更新到新版本。
-
 ### 清理分支
 
 ***如果设置了分支保护，联系管理员手动删除***
 
 1. 清理发布分支，具体操作如下：
 
-```
+```shell
 git push --delete origin release-x.y.z
 ```
 
 2. 清理过渡分支，具体操作如下：
 
-```
+```shell
 git push --delete origin merge-master-to-develop
 ```
 
+### CITAHub Docs 版本更新
+
+[CITAHub Docs] 延后三天进行版本更新，期间进行文档的测试和补充。
+
 ## 其他
 
 * 若发布之后，需要修改发版公告，交由发版人操作。
-* 发版之前确认新版本相关的文档已经更新到 [CITAHub Docs]
 
 [CITAhub Docs]: https://docs.citahub.com/zh-CN/welcome
 [Semantic Versioning]: https://semver.org/
diff --git a/scripts/bench.sh b/scripts/bench.sh
deleted file mode 100755
index 1eb6bd2f0..000000000
--- a/scripts/bench.sh
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/bin/bash
-
-sudo() {
- set -o noglob
-    if [ "$(whoami)" == "root" ] ; then
-        $*
-    else
-        /usr/bin/sudo $*
-    fi
-    set +o noglob
-}
-
-if [[ `uname` == 'Darwin' ]]
-then
-    SCRIPT_PATH=`realpath $0`
-    SOURCE_DIR=$(realpath $(dirname ${SCRIPT_PATH})/..)
-else
-    SCRIPT_PATH=`readlink -f $0`
-    SOURCE_DIR=$(readlink -f $(dirname ${SCRIPT_PATH})/..)
-fi
-
-cd ${SOURCE_DIR}
-
-echo "################################################################################"
-echo "1) check whether docker support"
-IMAGE="cryptape/cita-build"
-sudo docker images 2>&1 | grep ${IMAGE} > /dev/null 2>&1
-if [ $? == 0 ]; then
-    echo "run in docker"
-    # Only allocate tty if we detect one
-    if [ -t 1 ]; then
-        DOCKER_RUN_OPTIONS="-t"
-    fi
-    if [ -t 0 ]; then
-        DOCKER_RUN_OPTIONS="${DOCKER_RUN_OPTIONS} -i"
-    fi
-
-    docker run --rm ${DOCKER_RUN_OPTIONS} \
-           --volume ${SOURCE_DIR}:${SOURCE_DIR} \
-           --volume ${HOME}/.cargo/registry:/root/.cargo/registry  \
-           --volume ${HOME}/.cargo/git:/root/.cargo/git \
-           --volume /etc/localtime:/etc/localtime \
-           --workdir "$(pwd)" $IMAGE "${SCRIPT_PATH}"
-    exit $?
-else
-    echo "run in native machine"
-fi
-
-set -e
-echo "################################################################################"
-echo "2) show git status and commit"
-git status --short
-git rev-parse HEAD
-
-echo "################################################################################"
-echo "3) setup & build & test"
-echo "################################################################################"
-echo "3.1) setup"
-source ${HOME}/.cargo/env
-scripts/config_rabbitmq.sh
-# For native machine, skip this step.
-# scripts/install_develop.sh
-
-echo "################################################################################"
-echo "3.2) build"
-time make release
-
-echo "################################################################################"
-echo "3.3) benchmark in develop"
-time make bench
-
-echo "################################################################################"
-echo "3.4) benchmark in deploy"
-echo "################################################################################"
-echo "3.4.1) chain_performance"
-echo "################################################################################"
-echo "performance test for create"
-time bash tests/wrk_benchmark_test/chain_performance.sh 1 10000 0 0
-echo "################################################################################"
-echo "performance test for call"
-time bash tests/wrk_benchmark_test/chain_performance.sh 2 10000 0 0
-echo "################################################################################"
-echo "performance test for store"
-time bash tests/wrk_benchmark_test/chain_performance.sh 3 10000 0 0
diff --git a/scripts/ci.sh b/scripts/ci.sh
deleted file mode 100755
index b6b0a6ebc..000000000
--- a/scripts/ci.sh
+++ /dev/null
@@ -1,190 +0,0 @@
-#!/usr/bin/env bash
-
-DOCKER_IMAGE="cita/cita-build:ubuntu-18.04-20190304"
-
-if [[ `uname` == 'Darwin' ]]
-then
-    SCRIPT_PATH=$(realpath $0)
-    SOURCE_DIR=$(realpath "$(dirname ${SCRIPT_PATH})/..")
-else
-    SCRIPT_PATH=$(readlink -f $0)
-    SOURCE_DIR=$(readlink -f "$(dirname ${SCRIPT_PATH})/..")
-fi
-
-DEFAULT_HASH="sha3hash"
-DEFAULT_CRYPT="secp256k1"
-
-SELECT_HASH="${DEFAULT_HASH}"
-SELECT_CRYPT="${DEFAULT_CRYPT}"
-
-exec 2>&1
-
-function draw_title () {
-    printf "############################################################################\n"
-    printf "##### %-64s #####\n" "$*"
-    printf "############################################################################\n"
-}
-
-function show_version () {
-    draw_title "Show Version"
-    echo "[Info ] Git status as follow:"
-    git status --short | while read line; do
-        echo "    ${line}"
-    done
-    echo "[Info ] Git version is [$(git rev-parse HEAD)]."
-}
-
-function test_if_has_docker () {
-    local docker_bin=$(which docker)
-    if [ -z "${docker_bin}" ]; then
-        echo "[Warn ] There is no docker."
-        return 1
-    else
-        echo "[Info ] The docker is [${docker_bin}]."
-    fi
-    local image_id=$(docker images --quiet "${DOCKER_IMAGE}")
-    if [ -z "${image_id}" ]; then
-        echo "[Warn ] There is no image [${DOCKER_IMAGE}]."
-        return 1
-    else
-        echo "[Info ] The image id is [${image_id}]."
-    fi
-    return 0
-}
-
-function run_in_docker () {
-    draw_title "Run in Docker"
-    # Only allocate tty if we detect one
-    if [ -t 1 ]; then
-        DOCKER_RUN_OPTIONS="-t"
-    fi
-    if [ -t 0 ]; then
-        DOCKER_RUN_OPTIONS="${DOCKER_RUN_OPTIONS} -i"
-    fi
-    local cargo_home=/opt/.cargo
-    local workdir=/opt/cita
-    docker run --rm ${DOCKER_RUN_OPTIONS} \
-           --volume ${SOURCE_DIR}:${workdir} \
-           --volume ${HOME}/.docker_cargo/registry:${cargo_home}/registry \
-           --volume ${HOME}/.docker_cargo/git:${cargo_home}/git \
-           --volume /etc/localtime:/etc/localtime \
-           --env USER_ID=`id -u $USER` \
-           --workdir ${workdir} \
-           "${DOCKER_IMAGE}" ./scripts/ci.sh
-}
-
-function run_in_machine () {
-    draw_title "Run in Machine"
-    draw_title "    1) Setup"
-    local cargo_home=${CARGO_HOME}
-    if [ ! -d "${cargo_home}" ]; then
-        cargo_home=${HOME}/.cargo
-    fi
-    source ${cargo_home}/env
-    scripts/config_rabbitmq.sh
-    # For native machine, skip this step.
-    # scripts/install_develop.sh
-    draw_title "    2) Format"
-    time make fmt
-    draw_title "    3) Build"
-    draw_title "        3.1) Build for Debug"
-    time make debug
-    draw_title "        3.2) Check Cargo.lock After Build"
-    if [ $(git status --short Cargo.lock | wc -l) -ne 0 ]; then
-        echo "[Error] Please update Cargo.lock BEFORE commit."
-        exit 1
-    fi
-    draw_title "    4) Unit Test"
-    time make test
-    draw_title "    5) Integrate Test"
-    draw_title "        5.1) Basic Test (contract create/call, node start/stop)"
-    time ./tests/integrate_test/cita_basic.sh
-    draw_title "        5.2.1) Byzantine Test (EconomicalModel = Quota)"
-    time ./tests/integrate_test/cita_byzantinetest.sh quota
-    draw_title "        5.2.2) Byzantine Test (EconomicalModel = Charge)"
-    time ./tests/integrate_test/cita_byzantinetest.sh charge
-    if [ "${DEFAULT_HASH}" = "${SELECT_HASH}" ] \
-            && [ "${DEFAULT_CRYPT}" = "${SELECT_CRYPT}" ]; then
-        draw_title "        5.3.1) JSONRPC schema mock test (EconomicalModel = Quota)"
-        time ./tests/integrate_test/cita_jsonrpc_schema_mock.sh quota
-    # TODO: We should add it back later
-        # draw_title "        5.3.2) JSONRPC schema mock test (EconomicalModel = Charge)"
-        # time ./tests/integrate_test/cita_jsonrpc_schema_mock.sh charge
-        draw_title "        5.4) Crosschain transaction test"
-        time ./tests/integrate_test/cita_crosschain.sh
-        draw_title "        5.5) EconomicalModel = Charge transfer value tests"
-        time ./tests/integrate_test/cita_charge_mode.sh
-    else
-        echo "[Info ] Skip JSONRPC schema mock test."
-        echo "[Info ] Skip Crosschain transaction test."
-    fi
-}
-
-function replace_algorithm () {
-    ./scripts/replace_default_feature.sh "${SOURCE_DIR}" "${DEFAULT_HASH}" "${SELECT_HASH}"
-    ./scripts/replace_default_feature.sh "${SOURCE_DIR}" "${DEFAULT_CRYPT}" "${SELECT_CRYPT}"
-}
-
-function restore_algorithm () {
-    ./scripts/replace_default_feature.sh "${SOURCE_DIR}" "${SELECT_HASH}" "${DEFAULT_HASH}"
-    ./scripts/replace_default_feature.sh "${SOURCE_DIR}" "${SELECT_CRYPT}" "${DEFAULT_CRYPT}"
-}
-
-function show_usage () {
-    local script_name="$(basename $0)"
-    echo "
-    Usage:
-        ${script_name} sha3hash secp256k1
-        ${script_name} blake2bhash ed25519
-        ${script_name} sm3hash sm2
-"
-}
-
-function check_args () {
-    draw_title "Check Command Line Arguments"
-    local select_hash="$1"
-    local select_crypt="$2"
-    if [ -z "${select_hash}" ]; then
-        echo "[Info ] Use the default hash algorithm."
-    elif [ "${select_hash}" = "sha3hash" ] \
-            || [ "${select_hash}" = "blake2bhash" ] \
-            || [ "${select_hash}" = "sm3hash" ]; then
-        SELECT_HASH="${select_hash}"
-        echo "[Info ] Select the hash algorithm [${SELECT_HASH}]."
-    else
-        echo "[ERROR] Unknown algorithm [${select_hash}]."
-        show_usage
-        exit 1
-    fi
-    if [ -z "${select_crypt}" ]; then
-        echo "[Info ] Use the default crypt algorithm."
-    elif [ "${select_crypt}" = "secp256k1" ] \
-            || [ "${select_crypt}" = "ed25519" ] \
-            || [ "${select_crypt}" = "sm2" ]; then
-        SELECT_CRYPT="${select_crypt}"
-        echo "[Info ] Select the hash algorithm [${SELECT_CRYPT}]."
-    else
-        echo "[ERROR] Unknown algorithm [${select_crypt}]."
-        show_usage
-        exit 1
-    fi
-}
-
-function main () {
-    check_args "$@"
-    cd  "${SOURCE_DIR}"
-    show_version
-    test_if_has_docker
-    has_docker=$?
-    replace_algorithm
-    set -e -o pipefail
-    if [ ${has_docker} -eq 0 ]; then
-        run_in_docker
-    else
-        run_in_machine
-    fi
-    set +e
-    restore_algorithm
-}
-
-main "$@"
diff --git a/scripts/cita b/scripts/cita
index fa42f2c9a..4fd2d3add 100755
--- a/scripts/cita
+++ b/scripts/cita
@@ -78,7 +78,8 @@ This is the primary script for controlling the $SCRIPT node.
         use "cita append -h" to get more information.
         "cita-config" has the same function.
     port <ports>
-        Sets docker port, for example: "cita port 1337:1337"
+        Sets docker port, for example: "cita port 1337:1337 1338:1338",
+        expose docker port 1337 and 1338.
  SERVICE CONTROL COMMANDS
     setup <node>
         Ensuring the required runtime environment for $SCRIPT node, like
diff --git a/scripts/config_rabbitmq.sh b/scripts/config_rabbitmq.sh
deleted file mode 100755
index 591311894..000000000
--- a/scripts/config_rabbitmq.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-sudo(){
-    set -o noglob
-    if [ "$(whoami)" == "root" ] ; then
-        $*
-    else
-        /usr/bin/sudo $*
-    fi
-    set +o noglob
-}
-
-cat <<EOF > /tmp/rabbitmq.config
-[
-    {rabbit, [{tcp_listeners, [{"127.0.0.1", 5672}]}]}
-].
-EOF
-sudo cp /tmp/rabbitmq.config /etc/rabbitmq/rabbitmq.config
-
-sudo /etc/init.d/rabbitmq-server restart
-(sudo rabbitmqctl list_vhosts | grep dev) && sudo rabbitmqctl delete_vhost dev
-sudo rabbitmqctl add_vhost dev
-sudo rabbitmqctl set_permissions -p dev guest '.*' '.*' '.*'
-exit 0
diff --git a/scripts/config_tool/create_genesis.py b/scripts/config_tool/create_genesis.py
index 56ce266fb..c2300fac5 100755
--- a/scripts/config_tool/create_genesis.py
+++ b/scripts/config_tool/create_genesis.py
@@ -239,13 +239,12 @@ def init_permission_contracts(self):
             self.mine_contract_on_chain_tester(addr, data['bin'] + extra)
 
     def set_account_value(self, address, value):
-        for addr in address:
-            self.accounts[addr] = {
-                'code': '',
-                'storage': {},
-                'nonce': '1',
-                'value': value,
-            }
+        self.accounts[address] = {
+            'code': '',
+            'storage': {},
+            'nonce': '1',
+            'value': value,
+        }
 
     def save_to_file(self, filepath):
         with open(filepath, 'w') as stream:
@@ -276,6 +275,11 @@ def parse_arguments():
         '--output', required=True, help='Path of the output file.')
     parser.add_argument(
         '--timestamp', type=int, help='Specify a timestamp to use.')
+    parser.add_argument(
+        '--init_token',
+        type=lambda x: hex(int(x,16)),
+        default=hex(int("0xffffffffffffffffffffffffff", 16)),
+        help='Init token for this chain, INIT_TOKEN is a hexadecimal number')
     parser.add_argument('--prevhash', help='Prevhash of genesis.')
     args = parser.parse_args()
     return dict(
@@ -284,12 +288,13 @@ def parse_arguments():
         init_data_file=args.init_data_file,
         output=args.output,
         timestamp=args.timestamp,
+        init_token=args.init_token,
         prevhash=args.prevhash,
     )
 
 
 def core(contracts_dir, contracts_docs_dir, init_data_file, output, timestamp,
-         prevhash):
+         init_token, prevhash):
     # pylint: disable=too-many-arguments
     replaceLogRecord()
     if solidity.get_solidity() is None:
@@ -306,13 +311,10 @@ def core(contracts_dir, contracts_docs_dir, init_data_file, output, timestamp,
     )
     with open(init_data_file, 'r') as stream:
         data = yaml.safe_load(stream)
-    address = data['Contracts'][2]['NodeManager'][0]['nodes']
     super_admin = data['Contracts'][6]['Admin'][0]['admin']
-    address.append(super_admin)
-    value = '0xffffffffffffffffffffffffff'
     genesis_data.init_normal_contracts()
     genesis_data.init_permission_contracts()
-    genesis_data.set_account_value(address, value)
+    genesis_data.set_account_value(super_admin, init_token)
     genesis_data.save_to_file(output)
 
 
diff --git a/scripts/config_tool/create_init_data.py b/scripts/config_tool/create_init_data.py
index f92c768cc..5443dcec5 100755
--- a/scripts/config_tool/create_init_data.py
+++ b/scripts/config_tool/create_init_data.py
@@ -46,7 +46,7 @@
 - Admin:
   - admin: '0x4b5ae4567ad5d9fb92bc9afd6a657e6fa13a2523'
 - VersionManager:
-  - version: 1
+  - version: 2
 - PriceManager:
   - quotaPrice: 1000000
 '''
diff --git a/scripts/config_tool/genesis b/scripts/config_tool/genesis
index a07086ac2..c883acdff 160000
--- a/scripts/config_tool/genesis
+++ b/scripts/config_tool/genesis
@@ -1,1 +1,1 @@
-Subproject commit a07086ac2752fc5917927c9731084f28474e8c9c
+Subproject commit c883acdff4d950e434c148c8671dde355bd26613
diff --git a/scripts/contracts/src/common/Admin.sol b/scripts/contracts/src/common/Admin.sol
index 92e9c9094..95d14c036 100644
--- a/scripts/contracts/src/common/Admin.sol
+++ b/scripts/contracts/src/common/Admin.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "./Error.sol";
 
diff --git a/scripts/contracts/src/common/Check.sol b/scripts/contracts/src/common/Check.sol
index 219d66cf0..d722add9c 100644
--- a/scripts/contracts/src/common/Check.sol
+++ b/scripts/contracts/src/common/Check.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../../interaction/interface/IAuthorization.sol";
 import "../../interaction/interface/IAllGroups.sol";
diff --git a/scripts/contracts/src/common/EconomicalType.sol b/scripts/contracts/src/common/EconomicalType.sol
index 92995a9d0..7cfb0f4dd 100644
--- a/scripts/contracts/src/common/EconomicalType.sol
+++ b/scripts/contracts/src/common/EconomicalType.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 contract EconomicalType {
 
diff --git a/scripts/contracts/src/common/Error.sol b/scripts/contracts/src/common/Error.sol
index cc1729d66..c24b1350a 100644
--- a/scripts/contracts/src/common/Error.sol
+++ b/scripts/contracts/src/common/Error.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 /// @title The enum data of error
 /// @author ["Cryptape Technologies <contact@cryptape.com>"]
diff --git a/scripts/contracts/src/common/ReservedAddrConstant.sol b/scripts/contracts/src/common/ReservedAddrConstant.sol
index 99ccf85b4..cab83312a 100644
--- a/scripts/contracts/src/common/ReservedAddrConstant.sol
+++ b/scripts/contracts/src/common/ReservedAddrConstant.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 /* solium-disable */
 
diff --git a/scripts/contracts/src/common/ReservedAddrPublic.sol b/scripts/contracts/src/common/ReservedAddrPublic.sol
index 73d43c3e6..ea1b4695c 100644
--- a/scripts/contracts/src/common/ReservedAddrPublic.sol
+++ b/scripts/contracts/src/common/ReservedAddrPublic.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 /* solium-disable */
 
diff --git a/scripts/contracts/src/lib/AddressArray.sol b/scripts/contracts/src/lib/AddressArray.sol
index 2c7c15493..fdf8fbed7 100644
--- a/scripts/contracts/src/lib/AddressArray.sol
+++ b/scripts/contracts/src/lib/AddressArray.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 /// @title A library for operation of address array
 /// @author ["Cryptape Technologies <contact@cryptape.com>"]
diff --git a/scripts/contracts/src/lib/ContractCheck.sol b/scripts/contracts/src/lib/ContractCheck.sol
index da7318953..5a4340de3 100644
--- a/scripts/contracts/src/lib/ContractCheck.sol
+++ b/scripts/contracts/src/lib/ContractCheck.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 /// @title A library for operation of contract
 /// @author ["Cryptape Technologies <contact@cryptape.com>"]
diff --git a/scripts/contracts/src/lib/SafeMath.sol b/scripts/contracts/src/lib/SafeMath.sol
index 825917948..63458aecc 100644
--- a/scripts/contracts/src/lib/SafeMath.sol
+++ b/scripts/contracts/src/lib/SafeMath.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 /**
  * @title SafeMath
diff --git a/scripts/contracts/src/native/CrossChain.sol b/scripts/contracts/src/native/CrossChain.sol
index 003ab15f8..b610b330d 100644
--- a/scripts/contracts/src/native/CrossChain.sol
+++ b/scripts/contracts/src/native/CrossChain.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 // TODO
 // If solidity support return variable length data in cross-contract calls,
diff --git a/scripts/contracts/src/permission_management/Authorization.sol b/scripts/contracts/src/permission_management/Authorization.sol
index 7ea81385c..fcd0489ff 100644
--- a/scripts/contracts/src/permission_management/Authorization.sol
+++ b/scripts/contracts/src/permission_management/Authorization.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../lib/AddressArray.sol";
 import "../common/ReservedAddrPublic.sol";
diff --git a/scripts/contracts/src/permission_management/Permission.sol b/scripts/contracts/src/permission_management/Permission.sol
index 155ec1ae8..4ae5ef3d5 100644
--- a/scripts/contracts/src/permission_management/Permission.sol
+++ b/scripts/contracts/src/permission_management/Permission.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../common/ReservedAddrPublic.sol";
 import "../../interaction/interface/IPermission.sol";
diff --git a/scripts/contracts/src/permission_management/PermissionCreator.sol b/scripts/contracts/src/permission_management/PermissionCreator.sol
index 54deb2e2a..9118e4340 100644
--- a/scripts/contracts/src/permission_management/PermissionCreator.sol
+++ b/scripts/contracts/src/permission_management/PermissionCreator.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "./Permission.sol";
 import "../common/ReservedAddrPublic.sol";
diff --git a/scripts/contracts/src/permission_management/PermissionManagement.sol b/scripts/contracts/src/permission_management/PermissionManagement.sol
index 9a289ec3c..85c49cc66 100644
--- a/scripts/contracts/src/permission_management/PermissionManagement.sol
+++ b/scripts/contracts/src/permission_management/PermissionManagement.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "./PermissionCreator.sol";
 import "../common/Check.sol";
diff --git a/scripts/contracts/src/role_management/Role.sol b/scripts/contracts/src/role_management/Role.sol
index 5e8533f63..f076e780f 100644
--- a/scripts/contracts/src/role_management/Role.sol
+++ b/scripts/contracts/src/role_management/Role.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../lib/AddressArray.sol";
 import "../common/ReservedAddrPublic.sol";
diff --git a/scripts/contracts/src/role_management/RoleAuth.sol b/scripts/contracts/src/role_management/RoleAuth.sol
index 4458ec6ff..28fa6c4b6 100644
--- a/scripts/contracts/src/role_management/RoleAuth.sol
+++ b/scripts/contracts/src/role_management/RoleAuth.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "./RoleCreator.sol";
 import "../../interaction/interface/IAuthorization.sol";
diff --git a/scripts/contracts/src/role_management/RoleCreator.sol b/scripts/contracts/src/role_management/RoleCreator.sol
index c2e9980b3..d2e492599 100644
--- a/scripts/contracts/src/role_management/RoleCreator.sol
+++ b/scripts/contracts/src/role_management/RoleCreator.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "./Role.sol";
 import "../common/ReservedAddrPublic.sol";
diff --git a/scripts/contracts/src/role_management/RoleManagement.sol b/scripts/contracts/src/role_management/RoleManagement.sol
index d21c979dc..221f32249 100644
--- a/scripts/contracts/src/role_management/RoleManagement.sol
+++ b/scripts/contracts/src/role_management/RoleManagement.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "./RoleCreator.sol";
 import "../common/Check.sol";
diff --git a/scripts/contracts/src/system/AutoExec.sol b/scripts/contracts/src/system/AutoExec.sol
index d3953736c..3b35ed616 100644
--- a/scripts/contracts/src/system/AutoExec.sol
+++ b/scripts/contracts/src/system/AutoExec.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../common/Admin.sol";
 import "../common/ReservedAddrConstant.sol";
diff --git a/scripts/contracts/src/system/BatchTx.sol b/scripts/contracts/src/system/BatchTx.sol
index 2581c9216..3f534206b 100644
--- a/scripts/contracts/src/system/BatchTx.sol
+++ b/scripts/contracts/src/system/BatchTx.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../../interaction/interface/IBatchTx.sol";
 
diff --git a/scripts/contracts/src/system/ChainManager.sol b/scripts/contracts/src/system/ChainManager.sol
index 5c582360c..c1d2b732e 100644
--- a/scripts/contracts/src/system/ChainManager.sol
+++ b/scripts/contracts/src/system/ChainManager.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../common/Error.sol";
 
diff --git a/scripts/contracts/src/system/EmergencyBrake.sol b/scripts/contracts/src/system/EmergencyBrake.sol
index 0ba5fbec0..7067440ff 100644
--- a/scripts/contracts/src/system/EmergencyBrake.sol
+++ b/scripts/contracts/src/system/EmergencyBrake.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../common/Admin.sol";
 import "../common/ReservedAddrPublic.sol";
diff --git a/scripts/contracts/src/system/NodeManager.sol b/scripts/contracts/src/system/NodeManager.sol
index 9f2dceebf..72b7f2524 100644
--- a/scripts/contracts/src/system/NodeManager.sol
+++ b/scripts/contracts/src/system/NodeManager.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../lib/SafeMath.sol";
 import "../lib/AddressArray.sol";
diff --git a/scripts/contracts/src/system/PriceManager.sol b/scripts/contracts/src/system/PriceManager.sol
index ab351c5c0..1e248f956 100644
--- a/scripts/contracts/src/system/PriceManager.sol
+++ b/scripts/contracts/src/system/PriceManager.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../common/Admin.sol";
 import "../common/ReservedAddrPublic.sol";
diff --git a/scripts/contracts/src/system/QuotaManager.sol b/scripts/contracts/src/system/QuotaManager.sol
index 487fbb020..bd7776791 100644
--- a/scripts/contracts/src/system/QuotaManager.sol
+++ b/scripts/contracts/src/system/QuotaManager.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../common/Error.sol";
 import "../lib/AddressArray.sol";
diff --git a/scripts/contracts/src/system/SysConfig.sol b/scripts/contracts/src/system/SysConfig.sol
index 1b0a09281..2dd8b5e74 100644
--- a/scripts/contracts/src/system/SysConfig.sol
+++ b/scripts/contracts/src/system/SysConfig.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../common/EconomicalType.sol";
 import "../common/Admin.sol";
diff --git a/scripts/contracts/src/system/VersionManager.sol b/scripts/contracts/src/system/VersionManager.sol
index c2d7fb3b7..18dbcd4f2 100644
--- a/scripts/contracts/src/system/VersionManager.sol
+++ b/scripts/contracts/src/system/VersionManager.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../common/Admin.sol";
 import "../common/ReservedAddrPublic.sol";
diff --git a/scripts/contracts/src/user_management/AllGroups.sol b/scripts/contracts/src/user_management/AllGroups.sol
index c101871ca..83be42ce4 100644
--- a/scripts/contracts/src/user_management/AllGroups.sol
+++ b/scripts/contracts/src/user_management/AllGroups.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../lib/AddressArray.sol";
 import "../common/ReservedAddrConstant.sol";
diff --git a/scripts/contracts/src/user_management/Group.sol b/scripts/contracts/src/user_management/Group.sol
index fcdc218dc..9cebd6810 100644
--- a/scripts/contracts/src/user_management/Group.sol
+++ b/scripts/contracts/src/user_management/Group.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "../lib/AddressArray.sol";
 import "../common/ReservedAddrPublic.sol";
diff --git a/scripts/contracts/src/user_management/GroupCreator.sol b/scripts/contracts/src/user_management/GroupCreator.sol
index b18ddf2c2..7116ea3c6 100644
--- a/scripts/contracts/src/user_management/GroupCreator.sol
+++ b/scripts/contracts/src/user_management/GroupCreator.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "./Group.sol";
 import "../common/ReservedAddrPublic.sol";
diff --git a/scripts/contracts/src/user_management/GroupManagement.sol b/scripts/contracts/src/user_management/GroupManagement.sol
index db7366d9d..0bd36eea6 100644
--- a/scripts/contracts/src/user_management/GroupManagement.sol
+++ b/scripts/contracts/src/user_management/GroupManagement.sol
@@ -1,4 +1,4 @@
-pragma solidity ^0.4.24;
+pragma solidity 0.4.24;
 
 import "./GroupCreator.sol";
 import "../lib/AddressArray.sol";
diff --git a/scripts/create_cita_config.py b/scripts/create_cita_config.py
index e328c1e8e..53bf0a9e6 100755
--- a/scripts/create_cita_config.py
+++ b/scripts/create_cita_config.py
@@ -162,11 +162,7 @@ def __init__(self, chain_name, output_dir):
                                              'authorities.list')
         self.nodes = NetworkAddressList()
         self.enable_tls = False
-        self.root_ca_name = 'rootCA'
-        self.node_ca_name = chain_name
-        self.server_ca_name = 'server'
         self.prefix_subj = '/C=CN/ST=ZJ/O=Cryptape, Inc./CN='
-        self.ca_days = 36525
 
     def template_create_from_arguments(self, args, contracts_dir_src,
                                        configs_dir_src):
@@ -234,69 +230,15 @@ def template_load_from_existed(self):
             nodes_str = ''.join(stream.readlines()).replace('\n', ',')
         self.nodes = NetworkAddressList.from_str(nodes_str)
 
-    def encrypted_create_rootca(self, tls):
-        self.enable_tls = tls
-        if not self.enable_tls:
-            return
-        subj = self.prefix_subj + 'cita'
-        cmd = f'openssl req -newkey rsa:1024 -nodes' \
-            f' -keyout {self.template_dir}/{self.root_ca_name}.key' \
-            f' -days {self.ca_days} -x509' \
-            f' -out {self.template_dir}/{self.root_ca_name}.crt' \
-            f' -subj "{subj}"'
-        os.system(cmd)
-
-    def encrypted_load_from_existed(self):
-        root_ca = f'{self.template_dir}/{self.root_ca_name}.key'
-        if os.path.isfile(root_ca):
-            self.enable_tls = True
-
-    def encrypted_create_nodeca(self, node_id):
-        if not self.enable_tls:
-            return
-        node_dir = os.path.join(self.output_root, f'{node_id}')
-        need_directory(node_dir)
-
-        subj = self.prefix_subj + f'{self.node_ca_name}{node_id}.cita'
-
-        cmd = f'openssl req -newkey rsa:1024 -nodes' \
-            f' -keyout {node_dir}/{self.node_ca_name}.key' \
-            f' -days {self.ca_days}' \
-            f' -out {node_dir}/{self.node_ca_name}.csr' \
-            f' -subj "{subj}"'
-        os.system(cmd)
-
-        cmd = f'openssl x509 -CAcreateserial -req' \
-            f' -in {node_dir}/{self.node_ca_name}.csr' \
-            f' -CA {self.template_dir}/{self.root_ca_name}.crt' \
-            f' -CAkey {self.template_dir}/{self.root_ca_name}.key' \
-            f' -days {self.ca_days}' \
-            f' -out {node_dir}/{self.node_ca_name}.crt'
-        os.system(cmd)
-
-        cmd = f'openssl pkcs12 -export' \
-            f' -in {node_dir}/{self.node_ca_name}.crt' \
-            f' -inkey {node_dir}/{self.node_ca_name}.key' \
-            f' -out {node_dir}/{self.server_ca_name}.pfx ' \
-            f' -password pass:server.tls.cita'
-        os.system(cmd)
-
-        for suffix in ('crt', 'csr', 'key'):
-            os.remove(f'{node_dir}/{self.node_ca_name}.{suffix}')
-        shutil.copyfile(f'{self.template_dir}/{self.root_ca_name}.crt',
-                        f'{node_dir}/{self.root_ca_name}.crt')
-
     def create_peer_data(self, node_id, node):
-        ret = dict(id_card=node_id, ip=node['host'], port=node['port'])
-        if self.enable_tls:
-            ret['common_name'] = '{}{}.cita'.format(self.node_ca_name, node_id)
+        ret = dict(ip=node['host'], port=node['port'])
         return ret
 
     def create_init_data(self, super_admin, contract_arguments):
         from create_init_data import core as create_init_data
         create_init_data(self.init_data_file, super_admin, contract_arguments)
 
-    def create_genesis(self, timestamp, resource_dir):
+    def create_genesis(self, timestamp, init_token, resource_dir):
         from create_genesis import core as create_genesis
         prevhash = generate_prevhash(resource_dir)
         if resource_dir is not None:
@@ -304,7 +246,7 @@ def create_genesis(self, timestamp, resource_dir):
                             os.path.join(self.configs_dir, 'resource'), False)
         create_genesis(self.contracts_dir, self.contracts_docs_dir,
                        self.init_data_file, self.genesis_path, timestamp,
-                       prevhash)
+                       init_token, prevhash)
 
     def append_node(self, node):
         # For append mode: use the first element to store the new node
@@ -359,7 +301,6 @@ def append_node(self, node):
         network_full_config = os.path.join(self.configs_dir, 'network.toml')
         with open(network_full_config, 'rt') as stream:
             network_data = toml.load(stream)
-            self.encrypted_create_nodeca(node_id)
             network_data['peers'].append(self.create_peer_data(node_id, node))
             config = network_data['peers']
         with open(network_full_config, 'wt') as stream:
@@ -380,7 +321,6 @@ def append_node(self, node):
         network_config = os.path.join(node_dir, 'network.toml')
         with open(network_config, 'rt') as stream:
             network_data = toml.load(stream)
-            network_data['id_card'] = node_id
             network_data['port'] = node['port']
             if self.enable_tls:
                 network_data['enable_tls'] = True
@@ -399,8 +339,8 @@ def run_subcmd_create(args, work_dir):
         args, os.path.join(work_dir, 'scripts/contracts'),
         os.path.join(work_dir, 'scripts/config_tool/config_example'))
     info.create_init_data(args.super_admin, args.contract_arguments)
-    info.create_genesis(args.timestamp, args.resource_dir)
-    info.encrypted_create_rootca(args.enable_tls)
+    info.create_genesis(args.timestamp, args.init_token, args.resource_dir)
+    info.enable_tls = args.enable_tls
     for node in args.nodes:
         info.append_node(node)
 
@@ -408,7 +348,6 @@ def run_subcmd_create(args, work_dir):
 def run_subcmd_append(args, work_dir):
     info = ChainInfo(args.chain_name, work_dir)
     info.template_load_from_existed()
-    info.encrypted_load_from_existed()
     info.append_node(args.node)
 
 
@@ -490,6 +429,12 @@ def parse_arguments():
         action='store_true',
         help='Logs will output to stdout')
 
+    pcreate.add_argument(
+        '--init_token',
+        type=lambda x: hex(int(x,16)),
+        default=hex(int("0xffffffffffffffffffffffffff", 16)),
+        help='Init token for this chain, INIT_TOKEN is a hexadecimal number')
+
     #
     # Subcommand: append
     #
diff --git a/scripts/txtool/txtool/make_tx.py b/scripts/txtool/txtool/make_tx.py
index 444b23fcf..a79357d5f 100644
--- a/scripts/txtool/txtool/make_tx.py
+++ b/scripts/txtool/txtool/make_tx.py
@@ -19,7 +19,7 @@
 from url_util import endpoint
 from util import hex2bytes, run_command, remove_hex_0x
 
-LATEST_VERSION = 1
+LATEST_VERSION = 2
 
 accounts_path = Path("../output/transaction")
 if not accounts_path.is_dir():
@@ -139,7 +139,7 @@ def _blake2b_ed25519_deploy_data(current_height,
         chainid = get_chainid()
         logger.debug("chainid is {}".format(chainid))
         tx.chain_id = chainid
-    elif version == 1:
+    elif version < 3:
         chainid = get_chainid_v1()
         logger.debug("chainid_v1 is {}".format(chainid))
         tx.chain_id_v1 = chainid.to_bytes(32, byteorder='big')
@@ -148,7 +148,7 @@ def _blake2b_ed25519_deploy_data(current_height,
     if receiver is not None:
         if version == 0:
             tx.to = receiver
-        elif version == 1:
+        elif version < 3:
             tx.to_v1 = hex2bytes(receiver)
         else:
             logger.error("unexpected version {}".format(version))
@@ -202,7 +202,7 @@ def _sha3_secp256k1_deploy_data(current_height,
         chainid = get_chainid()
         logger.debug("chainid is {}".format(chainid))
         tx.chain_id = chainid
-    elif version == 1:
+    elif version < 3:
         chainid = get_chainid_v1()
         logger.debug("chainid_v1 is {}".format(chainid))
         tx.chain_id_v1 = chainid.to_bytes(32, byteorder='big')
@@ -211,7 +211,7 @@ def _sha3_secp256k1_deploy_data(current_height,
     if receiver is not None:
         if version == 0:
             tx.to = receiver
-        elif version == 1:
+        elif version < 3:
             tx.to_v1 = hex2bytes(receiver)
         else:
             logger.error("unexpected version {}".format(version))
@@ -259,7 +259,7 @@ def parse_arguments():
         action='store_false',
         help="Use ecdsa and sha3.")
     parser.add_argument(
-        "--version", help="Tansaction version.", default=1, type=int)
+        "--version", help="Tansaction version.", default=2, type=int)
     parser.add_argument("--chain_id", default=0, type=int)
     parser.set_defaults(newcrypto=False)
 
diff --git a/style-guide/logging.md b/style-guide/logging.md
new file mode 100644
index 000000000..a9e182bba
--- /dev/null
+++ b/style-guide/logging.md
@@ -0,0 +1,55 @@
+# Logging Format
+
+TBD
+
+----------------
+
+# 日志格式
+
+日志分为三个部分，以 `|` 符号分隔，分别是
+
+* [时间](#时间)
+* [位置](#位置)
+* [消息](#消息)
+
+每个部分内部以 `-` 符号分隔。
+
+参考实现如下所示：
+
+```
+"{d(%Y-%m-%d - %H:%M:%S)} | {T:10} - {t:10} - {L:5} | {l:5} - {m}{n}"
+```
+
+可适当修改数字调整相关信息的字符长度。
+
+## 时间
+
+使用 `local` 时间。
+
+## 位置
+
+日志产生位置的相关信息：
+
+* 线程名称： 当前线程的名称
+* 所在路径： 日志的 `module::path`
+* 所在行数： 日志所在的行数
+
+## 消息
+
+日志消息的相关信息：
+
+* 级别： 日志等级
+* 主题： 每个模块的主题固定，增加主题先提交此文档，主题用 `[]` 标记。 若无则省略
+
+    - `cita-chain`: TBD
+    - `cita-executor`: TBD
+    - `cita-bft`: TBD
+    - `cita-auth`: TBD
+    - `cita-jsonrpc`: TBD
+    - `cita-network`: TBD
+    - `cita-forever`: TBD
+
+* 内容： 具体的消息内容。
+
+    - 避免无意义的数据
+    - `Hash` 值用 `0x1234...5678` 格式
diff --git a/tools/relayer-parser/src/transaction.rs b/tools/relayer-parser/src/transaction.rs
index 98a891aa6..d04803c27 100644
--- a/tools/relayer-parser/src/transaction.rs
+++ b/tools/relayer-parser/src/transaction.rs
@@ -61,7 +61,7 @@ fn sign(
     tx.set_valid_until_block(height.low_u64() + 100);
     tx.set_quota(1_000_000);
     tx.set_chain_id_v1(H256::from(chain_id).to_vec());
-    tx.set_version(1);
+    tx.set_version(2);
     tx.set_value(vec![0u8; 32]);
     tx.sign(*pkey).take_transaction_with_sig()
 }


Test patch:
diff --git a/cita-executor/core/src/tests/amend_data_test.rs b/cita-executor/core/src/tests/amend_data_test.rs
index 691d00d65..4e6beea66 100644
--- a/cita-executor/core/src/tests/amend_data_test.rs
+++ b/cita-executor/core/src/tests/amend_data_test.rs
@@ -51,6 +51,7 @@ fn call_vm(
         &native_factory,
         false,
         EconomicalModel::Quota,
+        0,
     );
     let mut out = vec![];
     ex.call(
diff --git a/cita-executor/core/src/tests/grpc_test.rs b/cita-executor/core/src/tests/grpc_test.rs
index 3f73e29bd..ecce136b0 100644
--- a/cita-executor/core/src/tests/grpc_test.rs
+++ b/cita-executor/core/src/tests/grpc_test.rs
@@ -129,6 +129,7 @@ fn call_vm(params: ActionParams) -> evm::Result<evm::FinalizationResult> {
         &native_factory,
         false,
         EconomicalModel::Quota,
+        0,
     );
     let mut out = vec![];
     ex.call(
diff --git a/scripts/contracts/tests/package.json b/scripts/contracts/tests/package.json
index 840a70b2e..226995a70 100644
--- a/scripts/contracts/tests/package.json
+++ b/scripts/contracts/tests/package.json
@@ -4,9 +4,9 @@
   "description": "CITA contract test using web3",
   "main": "",
   "devDependencies": {
-    "eslint": "^5.15.2",
+    "eslint": "^5.16.0",
     "eslint-config-airbnb-base": "^13.1.0",
-    "eslint-plugin-import": "^2.16.0"
+    "eslint-plugin-import": "^2.17.2"
   },
   "scripts": {
     "unit_group": "eslint test/unit/group.js && mocha test/unit/group.js -t 20s --exit",
@@ -34,9 +34,9 @@
   "author": "Cryptape Technologies <contact@cryptape.com>",
   "license": "GPL-3.0+",
   "dependencies": {
-    "@cryptape/cita-sdk": "^0.21.2",
+    "@cryptape/cita-sdk": "^0.23.1",
     "chai": "^4.2.0",
-    "log4js": "^4.0.2",
-    "mocha": "^6.0.2"
+    "log4js": "^4.1.0",
+    "mocha": "^6.1.4"
   }
 }
diff --git a/scripts/contracts/tests/yarn.lock b/scripts/contracts/tests/yarn.lock
index f24b9df3b..c3ece95e4 100644
--- a/scripts/contracts/tests/yarn.lock
+++ b/scripts/contracts/tests/yarn.lock
@@ -18,18 +18,18 @@
     esutils "^2.0.2"
     js-tokens "^4.0.0"
 
-"@cryptape/cita-sdk@^0.21.2":
-  version "0.21.2"
-  resolved "https://registry.yarnpkg.com/@cryptape/cita-sdk/-/cita-sdk-0.21.2.tgz#37607d1fc74d446cba44d4067e931838ff2a075b"
-  integrity sha512-2hcUor7VIzRRvkRm1yQbDFYgQ+Z/dUYyhUnd0H23L4IB8Nwih34jSl6W7vnW2jeWGEfnlEBOxbS3nuLYrGNizw==
+"@cryptape/cita-sdk@^0.23.1":
+  version "0.23.1"
+  resolved "https://registry.yarnpkg.com/@cryptape/cita-sdk/-/cita-sdk-0.23.1.tgz#9d970cba62358f7a20d2500bd3e529211d1833a3"
+  integrity sha512-S9/WxMdRgCBuESgw9WJumyXZ4XEJFOrER2N0oyu33FlxWfmyN5h0R8jLSfJW17dPiAJxjIzxRypkiy+AK/S41g==
   dependencies:
-    "@cryptape/cita-signer" "^2.2.3"
+    "@cryptape/cita-signer" "^2.3.0"
     web3 "1.0.0-beta.37"
 
-"@cryptape/cita-signer@^2.2.3":
-  version "2.2.3"
-  resolved "https://registry.yarnpkg.com/@cryptape/cita-signer/-/cita-signer-2.2.3.tgz#2000f8a19b8bb9f45b5a0e42b2c7cc034e7b8b82"
-  integrity sha512-KA06lG33uCj10/AcIOWbl/qnXf0qh4QIdHtiIMJMdLLUQcA7E06HTF+1acbeFHMDT5Q6O8SOFesskp0Ze8ReoA==
+"@cryptape/cita-signer@^2.3.0":
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/@cryptape/cita-signer/-/cita-signer-2.3.0.tgz#bb84405b06cf0a6b2dc253375fe23010416ed58f"
+  integrity sha512-J88vs3+U0XSvcj+nE/zSa/TmLSzRTX/sJYQXSyb/RBTdMcloYpkP5SEYK/kNCVbXYFv7NiXoGpzPP9q6PTWwhQ==
   dependencies:
     ec "^0.0.1"
     elliptic "^6.4.0"
@@ -37,17 +37,17 @@
     web3 "1.0.0-beta.37"
 
 "@types/node@^10.3.2":
-  version "10.14.1"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.1.tgz#8701cd760acc20beba5ffe0b7a1b879f39cb8c41"
-  integrity sha512-Rymt08vh1GaW4vYB6QP61/5m/CFLGnFZP++bJpWbiNxceNa6RBipDmb413jvtSf/R1gg5a/jQVl2jY4XVRscEA==
+  version "10.14.6"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.6.tgz#9cbfcb62c50947217f4d88d4d274cc40c22625a9"
+  integrity sha512-Fvm24+u85lGmV4hT5G++aht2C5I4Z4dYlWZIh62FAfFO/TfzXtPpoLI6I7AuBWkIFqZCnhFOoTT7RjjaIL5Fjg==
 
 accepts@~1.3.5:
-  version "1.3.5"
-  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
-  integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I=
+  version "1.3.7"
+  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+  integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
   dependencies:
-    mime-types "~2.1.18"
-    negotiator "0.6.1"
+    mime-types "~2.1.24"
+    negotiator "0.6.2"
 
 acorn-jsx@^5.0.0:
   version "5.0.1"
@@ -118,30 +118,18 @@ argparse@^1.0.7:
   dependencies:
     sprintf-js "~1.0.2"
 
-arr-diff@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
-  integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
-
-arr-flatten@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
-  integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
-
-arr-union@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
-  integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
-
 array-flatten@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
   integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
 
-array-unique@^0.3.2:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
-  integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+array-includes@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d"
+  integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.7.0"
 
 asn1.js@^4.0.0:
   version "4.10.1"
@@ -169,11 +157,6 @@ assertion-error@^1.1.0:
   resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
   integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
 
-assign-symbols@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
-  integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
-
 astral-regex@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
@@ -196,11 +179,6 @@ asynckit@^0.4.0:
   resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
   integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
 
-atob@^2.1.1:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
-  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-
 aws-sign2@~0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
@@ -221,19 +199,6 @@ base64-js@^1.0.2:
   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
   integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==
 
-base@^0.11.1:
-  version "0.11.2"
-  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
-  integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
-  dependencies:
-    cache-base "^1.0.1"
-    class-utils "^0.3.5"
-    component-emitter "^1.2.1"
-    define-property "^1.0.0"
-    isobject "^3.0.1"
-    mixin-deep "^1.2.0"
-    pascalcase "^0.1.1"
-
 bcrypt-pbkdf@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
@@ -262,9 +227,9 @@ bluebird@^2.9.34:
   integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=
 
 bluebird@^3.5.0:
-  version "3.5.3"
-  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
-  integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
+  version "3.5.4"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714"
+  integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==
 
 bn.js@4.11.6:
   version "4.11.6"
@@ -276,7 +241,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.6, bn.js@^4.4.0:
   resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
   integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
 
-body-parser@1.18.3, body-parser@^1.16.0:
+body-parser@1.18.3:
   version "1.18.3"
   resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
   integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=
@@ -292,6 +257,22 @@ body-parser@1.18.3, body-parser@^1.16.0:
     raw-body "2.3.3"
     type-is "~1.6.16"
 
+body-parser@^1.16.0:
+  version "1.19.0"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+  integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+  dependencies:
+    bytes "3.1.0"
+    content-type "~1.0.4"
+    debug "2.6.9"
+    depd "~1.1.2"
+    http-errors "1.7.2"
+    iconv-lite "0.4.24"
+    on-finished "~2.3.0"
+    qs "6.7.0"
+    raw-body "2.4.0"
+    type-is "~1.6.17"
+
 brace-expansion@^1.1.7:
   version "1.1.11"
   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -300,22 +281,6 @@ brace-expansion@^1.1.7:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
 
-braces@^2.3.1:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
-  integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
-  dependencies:
-    arr-flatten "^1.1.0"
-    array-unique "^0.3.2"
-    extend-shallow "^2.0.1"
-    fill-range "^4.0.0"
-    isobject "^3.0.1"
-    repeat-element "^1.1.2"
-    snapdragon "^0.8.1"
-    snapdragon-node "^2.0.1"
-    split-string "^3.0.2"
-    to-regex "^3.0.1"
-
 brorand@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
@@ -432,30 +397,20 @@ bytes@3.0.0:
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
   integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
 
-cache-base@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
-  integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
-  dependencies:
-    collection-visit "^1.0.0"
-    component-emitter "^1.2.1"
-    get-value "^2.0.6"
-    has-value "^1.0.0"
-    isobject "^3.0.1"
-    set-value "^2.0.0"
-    to-object-path "^0.3.0"
-    union-value "^1.0.0"
-    unset-value "^1.0.0"
+bytes@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+  integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
 
 callsites@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3"
-  integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+  integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
 
 camelcase@^5.0.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45"
-  integrity sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+  integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
 
 caseless@~0.12.0:
   version "0.12.0"
@@ -501,16 +456,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
     inherits "^2.0.1"
     safe-buffer "^5.0.1"
 
-class-utils@^0.3.5:
-  version "0.3.6"
-  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
-  integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
-  dependencies:
-    arr-union "^3.1.0"
-    define-property "^0.2.5"
-    isobject "^3.0.0"
-    static-extend "^0.1.1"
-
 cli-cursor@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
@@ -537,14 +482,6 @@ code-point-at@^1.0.0:
   resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
   integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
 
-collection-visit@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
-  integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
-  dependencies:
-    map-visit "^1.0.0"
-    object-visit "^1.0.0"
-
 color-convert@^1.9.0:
   version "1.9.3"
   resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@@ -565,9 +502,9 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
     delayed-stream "~1.0.0"
 
 commander@^2.8.1:
-  version "2.19.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
-  integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
+  version "2.20.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
+  integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
 
 commander@~2.8.1:
   version "2.8.1"
@@ -576,11 +513,6 @@ commander@~2.8.1:
   dependencies:
     graceful-readlink ">= 1.0.0"
 
-component-emitter@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
-  integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
-
 concat-map@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -616,11 +548,6 @@ cookiejar@^2.1.1:
   resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
   integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
 
-copy-descriptor@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
-  integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
-
 core-util-is@1.0.2, core-util-is@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@@ -705,7 +632,7 @@ date-format@^2.0.0:
   resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.0.0.tgz#7cf7b172f1ec564f0003b39ea302c5498fb98c8f"
   integrity sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA==
 
-debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+debug@2.6.9, debug@^2.2.0, debug@^2.6.8, debug@^2.6.9:
   version "2.6.9"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
   integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
@@ -719,7 +646,7 @@ debug@3.2.6, debug@^3.1.0:
   dependencies:
     ms "^2.1.1"
 
-debug@^4.0.1:
+debug@^4.0.1, debug@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
   integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
@@ -815,28 +742,6 @@ define-properties@^1.1.2, define-properties@^1.1.3:
   dependencies:
     object-keys "^1.0.12"
 
-define-property@^0.2.5:
-  version "0.2.5"
-  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
-  integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
-  dependencies:
-    is-descriptor "^0.1.0"
-
-define-property@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
-  integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
-  dependencies:
-    is-descriptor "^1.0.0"
-
-define-property@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
-  integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
-  dependencies:
-    is-descriptor "^1.0.2"
-    isobject "^3.0.1"
-
 delayed-stream@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@@ -860,11 +765,6 @@ destroy@~1.0.4:
   resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
   integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
 
-detect-file@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
-  integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
-
 diff@3.5.0:
   version "3.5.0"
   resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
@@ -969,7 +869,7 @@ error-ex@^1.2.0:
   dependencies:
     is-arrayish "^0.2.1"
 
-es-abstract@^1.12.0, es-abstract@^1.5.0, es-abstract@^1.5.1:
+es-abstract@^1.12.0, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.7.0:
   version "1.13.0"
   resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
   integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
@@ -1017,29 +917,30 @@ eslint-import-resolver-node@^0.3.2:
     debug "^2.6.9"
     resolve "^1.5.0"
 
-eslint-module-utils@^2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz#546178dab5e046c8b562bbb50705e2456d7bda49"
-  integrity sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==
+eslint-module-utils@^2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a"
+  integrity sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==
   dependencies:
     debug "^2.6.8"
     pkg-dir "^2.0.0"
 
-eslint-plugin-import@^2.16.0:
-  version "2.16.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz#97ac3e75d0791c4fac0e15ef388510217be7f66f"
-  integrity sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==
+eslint-plugin-import@^2.17.2:
+  version "2.17.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz#d227d5c6dc67eca71eb590d2bb62fb38d86e9fcb"
+  integrity sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==
   dependencies:
+    array-includes "^3.0.3"
     contains-path "^0.1.0"
     debug "^2.6.9"
     doctrine "1.5.0"
     eslint-import-resolver-node "^0.3.2"
-    eslint-module-utils "^2.3.0"
+    eslint-module-utils "^2.4.0"
     has "^1.0.3"
     lodash "^4.17.11"
     minimatch "^3.0.4"
     read-pkg-up "^2.0.0"
-    resolve "^1.9.0"
+    resolve "^1.10.0"
 
 eslint-restricted-globals@^0.1.1:
   version "0.1.1"
@@ -1064,10 +965,10 @@ eslint-visitor-keys@^1.0.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
   integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==
 
-eslint@^5.15.2:
-  version "5.15.2"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.15.2.tgz#0237bbb2362f89f4effef2f191eb0fea5279c0a5"
-  integrity sha512-I8VM4SILpMwUvsRt83bQVwIRQAJ2iPMXun1FVZ/lV1OHklH2tJaXqoDnNzdiFc6bnCtGKXvQIQNP3kj1eMskSw==
+eslint@^5.16.0:
+  version "5.16.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
+  integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==
   dependencies:
     "@babel/code-frame" "^7.0.0"
     ajv "^6.9.1"
@@ -1089,7 +990,7 @@ eslint@^5.15.2:
     import-fresh "^3.0.0"
     imurmurhash "^0.1.4"
     inquirer "^6.2.2"
-    js-yaml "^3.12.0"
+    js-yaml "^3.13.0"
     json-stable-stringify-without-jsonify "^1.0.1"
     levn "^0.3.0"
     lodash "^4.17.11"
@@ -1229,26 +1130,6 @@ execa@^1.0.0:
     signal-exit "^3.0.0"
     strip-eof "^1.0.0"
 
-expand-brackets@^2.1.4:
-  version "2.1.4"
-  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
-  integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
-  dependencies:
-    debug "^2.3.3"
-    define-property "^0.2.5"
-    extend-shallow "^2.0.1"
-    posix-character-classes "^0.1.0"
-    regex-not "^1.0.0"
-    snapdragon "^0.8.1"
-    to-regex "^3.0.1"
-
-expand-tilde@^2.0.0, expand-tilde@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
-  integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
-  dependencies:
-    homedir-polyfill "^1.0.1"
-
 express@^4.14.0:
   version "4.16.4"
   resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
@@ -1285,21 +1166,6 @@ express@^4.14.0:
     utils-merge "1.0.1"
     vary "~1.1.2"
 
-extend-shallow@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
-  integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
-  dependencies:
-    is-extendable "^0.1.0"
-
-extend-shallow@^3.0.0, extend-shallow@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
-  integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
-  dependencies:
-    assign-symbols "^1.0.0"
-    is-extendable "^1.0.1"
-
 extend@~3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
@@ -1314,20 +1180,6 @@ external-editor@^3.0.3:
     iconv-lite "^0.4.24"
     tmp "^0.0.33"
 
-extglob@^2.0.4:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
-  integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
-  dependencies:
-    array-unique "^0.3.2"
-    define-property "^1.0.0"
-    expand-brackets "^2.1.4"
-    extend-shallow "^2.0.1"
-    fragment-cache "^0.2.1"
-    regex-not "^1.0.0"
-    snapdragon "^0.8.1"
-    to-regex "^3.0.1"
-
 extsprintf@1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
@@ -1389,16 +1241,6 @@ file-type@^6.1.0:
   resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
   integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
 
-fill-range@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
-  integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
-  dependencies:
-    extend-shallow "^2.0.1"
-    is-number "^3.0.0"
-    repeat-string "^1.6.1"
-    to-regex-range "^2.1.0"
-
 finalhandler@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
@@ -1412,29 +1254,19 @@ finalhandler@1.1.1:
     statuses "~1.4.0"
     unpipe "~1.0.0"
 
-find-up@^2.0.0, find-up@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
-  integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
-  dependencies:
-    locate-path "^2.0.0"
-
-find-up@^3.0.0:
+find-up@3.0.0, find-up@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
   integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
   dependencies:
     locate-path "^3.0.0"
 
-findup-sync@2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
-  integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=
+find-up@^2.0.0, find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
   dependencies:
-    detect-file "^1.0.0"
-    is-glob "^3.1.0"
-    micromatch "^3.0.4"
-    resolve-dir "^1.0.1"
+    locate-path "^2.0.0"
 
 flat-cache@^2.0.1:
   version "2.0.1"
@@ -1464,11 +1296,6 @@ for-each@^0.3.3:
   dependencies:
     is-callable "^1.1.3"
 
-for-in@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
-  integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
-
 forever-agent@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
@@ -1488,13 +1315,6 @@ forwarded@~0.1.2:
   resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
   integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
 
-fragment-cache@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
-  integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
-  dependencies:
-    map-cache "^0.2.2"
-
 fresh@0.5.2:
   version "0.5.2"
   resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
@@ -1562,6 +1382,11 @@ get-caller-file@^1.0.1:
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
   integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
 
+get-caller-file@^2.0.1:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+  integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
 get-func-name@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
@@ -1587,11 +1412,6 @@ get-stream@^4.0.0:
   dependencies:
     pump "^3.0.0"
 
-get-value@^2.0.3, get-value@^2.0.6:
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
-  integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
-
 getpass@^0.1.1:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
@@ -1611,26 +1431,6 @@ glob@7.1.3, glob@^7.1.2, glob@^7.1.3:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-global-modules@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
-  integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
-  dependencies:
-    global-prefix "^1.0.1"
-    is-windows "^1.0.1"
-    resolve-dir "^1.0.0"
-
-global-prefix@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
-  integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
-  dependencies:
-    expand-tilde "^2.0.2"
-    homedir-polyfill "^1.0.1"
-    ini "^1.3.4"
-    is-windows "^1.0.1"
-    which "^1.2.14"
-
 global@~4.3.0:
   version "4.3.2"
   resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
@@ -1640,14 +1440,14 @@ global@~4.3.0:
     process "~0.5.1"
 
 globals@^11.7.0:
-  version "11.11.0"
-  resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e"
-  integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==
+  version "11.12.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
 
 google-protobuf@^3.5.0:
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.7.0.tgz#5c7228b68d24a7c93706c1a44efdb8ee883cea43"
-  integrity sha512-QZwgOBPfvnAdnYA+tizEs9CbE42mMXFPGCmYAh0podfJbGPkBIEC6vR9gMSGxjaSB8t2GCGLhOHiX9OrseOWCA==
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.7.1.tgz#9ef0fa3bc9ee416ba3fbe32b21ec6b7626f898e2"
+  integrity sha512-6fvlUey6cNKtWSEn1bt4CT4wc2EID1fVluHS1dOnqIlxyIu3cBid2BvWE8Rwl6wN+hRTgiAKhfyydAGV/weZYQ==
 
 got@7.1.0, got@^7.1.0:
   version "7.1.0"
@@ -1719,37 +1519,6 @@ has-to-string-tag-x@^1.2.0:
   dependencies:
     has-symbol-support-x "^1.4.1"
 
-has-value@^0.3.1:
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
-  integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
-  dependencies:
-    get-value "^2.0.3"
-    has-values "^0.1.4"
-    isobject "^2.0.0"
-
-has-value@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
-  integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
-  dependencies:
-    get-value "^2.0.6"
-    has-values "^1.0.0"
-    isobject "^3.0.0"
-
-has-values@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
-  integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
-
-has-values@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
-  integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
-  dependencies:
-    is-number "^3.0.0"
-    kind-of "^4.0.0"
-
 has@^1.0.1, has@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
@@ -1795,13 +1564,6 @@ hmac-drbg@^1.0.0:
     minimalistic-assert "^1.0.0"
     minimalistic-crypto-utils "^1.0.1"
 
-homedir-polyfill@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
-  integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
-  dependencies:
-    parse-passwd "^1.0.0"
-
 hosted-git-info@^2.1.4:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
@@ -1817,6 +1579,17 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
     setprototypeof "1.1.0"
     statuses ">= 1.4.0 < 2"
 
+http-errors@1.7.2:
+  version "1.7.2"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+  integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.3"
+    setprototypeof "1.1.1"
+    statuses ">= 1.5.0 < 2"
+    toidentifier "1.0.0"
+
 http-https@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b"
@@ -1838,7 +1611,7 @@ iconv-lite@0.4.23:
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
-iconv-lite@^0.4.24:
+iconv-lite@0.4.24, iconv-lite@^0.4.24:
   version "0.4.24"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
   integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -1853,9 +1626,9 @@ idna-uts46-hx@^2.3.1:
     punycode "2.1.0"
 
 ieee754@^1.1.4:
-  version "1.1.12"
-  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
-  integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==
+  version "1.1.13"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
+  integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
 
 ignore@^4.0.6:
   version "4.0.6"
@@ -1888,15 +1661,10 @@ inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, i
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
   integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
 
-ini@^1.3.4:
-  version "1.3.5"
-  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
-  integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
-
 inquirer@^6.2.2:
-  version "6.2.2"
-  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406"
-  integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==
+  version "6.3.1"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7"
+  integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==
   dependencies:
     ansi-escapes "^3.2.0"
     chalk "^2.4.2"
@@ -1909,7 +1677,7 @@ inquirer@^6.2.2:
     run-async "^2.2.0"
     rxjs "^6.4.0"
     string-width "^2.1.0"
-    strip-ansi "^5.0.0"
+    strip-ansi "^5.1.0"
     through "^2.3.6"
 
 invert-kv@^2.0.0:
@@ -1917,35 +1685,16 @@ invert-kv@^2.0.0:
   resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
   integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
 
-ipaddr.js@1.8.0:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
-  integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4=
-
-is-accessor-descriptor@^0.1.6:
-  version "0.1.6"
-  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
-  integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
-  dependencies:
-    kind-of "^3.0.2"
-
-is-accessor-descriptor@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
-  integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
-  dependencies:
-    kind-of "^6.0.0"
+ipaddr.js@1.9.0:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65"
+  integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==
 
 is-arrayish@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
   integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
 
-is-buffer@^1.1.5:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
-  integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
-
 is-buffer@~2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
@@ -1956,60 +1705,11 @@ is-callable@^1.1.3, is-callable@^1.1.4:
   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
   integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
 
-is-data-descriptor@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
-  integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
-  dependencies:
-    kind-of "^3.0.2"
-
-is-data-descriptor@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
-  integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
-  dependencies:
-    kind-of "^6.0.0"
-
 is-date-object@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
   integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
 
-is-descriptor@^0.1.0:
-  version "0.1.6"
-  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
-  integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
-  dependencies:
-    is-accessor-descriptor "^0.1.6"
-    is-data-descriptor "^0.1.4"
-    kind-of "^5.0.0"
-
-is-descriptor@^1.0.0, is-descriptor@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
-  integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
-  dependencies:
-    is-accessor-descriptor "^1.0.0"
-    is-data-descriptor "^1.0.0"
-    kind-of "^6.0.2"
-
-is-extendable@^0.1.0, is-extendable@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
-  integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
-
-is-extendable@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
-  integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
-  dependencies:
-    is-plain-object "^2.0.4"
-
-is-extglob@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
-  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
-
 is-fullwidth-code-point@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
@@ -2027,13 +1727,6 @@ is-function@^1.0.1:
   resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
   integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
 
-is-glob@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
-  integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
-  dependencies:
-    is-extglob "^2.1.0"
-
 is-hex-prefixed@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
@@ -2044,13 +1737,6 @@ is-natural-number@^4.0.1:
   resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
   integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=
 
-is-number@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
-  integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
-  dependencies:
-    kind-of "^3.0.2"
-
 is-object@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
@@ -2061,13 +1747,6 @@ is-plain-obj@^1.1.0:
   resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
   integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
 
-is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
-  integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
-  dependencies:
-    isobject "^3.0.1"
-
 is-promise@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
@@ -2102,12 +1781,7 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0:
   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
   integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
 
-is-windows@^1.0.1, is-windows@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
-  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
-
-isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+isarray@^1.0.0, isarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
   integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
@@ -2117,18 +1791,6 @@ isexe@^2.0.0:
   resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
   integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
 
-isobject@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
-  integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
-  dependencies:
-    isarray "1.0.0"
-
-isobject@^3.0.0, isobject@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
-  integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
-
 isstream@~0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -2157,18 +1819,10 @@ js-tokens@^4.0.0:
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
   integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
 
-js-yaml@3.12.0:
-  version "3.12.0"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
-  integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==
-  dependencies:
-    argparse "^1.0.7"
-    esprima "^4.0.0"
-
-js-yaml@^3.12.0:
-  version "3.12.2"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc"
-  integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==
+js-yaml@3.13.1, js-yaml@^3.13.0:
+  version "3.13.1"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
+  integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
   dependencies:
     argparse "^1.0.7"
     esprima "^4.0.0"
@@ -2230,30 +1884,6 @@ keccakjs@^0.2.1:
     browserify-sha3 "^0.0.4"
     sha3 "^1.2.2"
 
-kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
-  version "3.2.2"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
-  integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
-  dependencies:
-    is-buffer "^1.1.5"
-
-kind-of@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
-  integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
-  dependencies:
-    is-buffer "^1.1.5"
-
-kind-of@^5.0.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
-  integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
-
-kind-of@^6.0.0, kind-of@^6.0.2:
-  version "6.0.2"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
-  integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
-
 lcid@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
@@ -2307,16 +1937,16 @@ log-symbols@2.2.0:
   dependencies:
     chalk "^2.0.1"
 
-log4js@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.0.2.tgz#0c73e623ca4448669653eb0e9f629beacc7fbbe3"
-  integrity sha512-KE7HjiieVDPPdveA3bJZSuu0n8chMkFl8mIoisBFxwEJ9FmXe4YzNuiqSwYUiR1K8q8/5/8Yd6AClENY1RA9ww==
+log4js@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.1.0.tgz#57983c6a443546a8c8607e9cb045d2a117c27644"
+  integrity sha512-eDa+zZPeVEeK6QGJAePyXM6pg4P3n3TO5rX9iZMVY48JshsTyLJZLIL5HipI1kQ2qLsSyOpUqNND/C5H4WhhiA==
   dependencies:
     date-format "^2.0.0"
-    debug "^3.1.0"
+    debug "^4.1.1"
     flatted "^2.0.0"
     rfdc "^1.1.2"
-    streamroller "^1.0.1"
+    streamroller "^1.0.4"
 
 lowercase-keys@^1.0.0:
   version "1.0.1"
@@ -2337,18 +1967,6 @@ map-age-cleaner@^0.1.1:
   dependencies:
     p-defer "^1.0.0"
 
-map-cache@^0.2.2:
-  version "0.2.2"
-  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
-  integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
-
-map-visit@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
-  integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
-  dependencies:
-    object-visit "^1.0.0"
-
 md5.js@^1.3.4:
   version "1.3.5"
   resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
@@ -2364,9 +1982,9 @@ media-typer@0.3.0:
   integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
 
 mem@^4.0.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/mem/-/mem-4.2.0.tgz#5ee057680ed9cb8dad8a78d820f9a8897a102025"
-  integrity sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA==
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
+  integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==
   dependencies:
     map-age-cleaner "^0.1.1"
     mimic-fn "^2.0.0"
@@ -2382,25 +2000,6 @@ methods@~1.1.2:
   resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
   integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
 
-micromatch@^3.0.4:
-  version "3.1.10"
-  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
-  integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
-  dependencies:
-    arr-diff "^4.0.0"
-    array-unique "^0.3.2"
-    braces "^2.3.1"
-    define-property "^2.0.2"
-    extend-shallow "^3.0.2"
-    extglob "^2.0.4"
-    fragment-cache "^0.2.1"
-    kind-of "^6.0.2"
-    nanomatch "^1.2.9"
-    object.pick "^1.3.0"
-    regex-not "^1.0.0"
-    snapdragon "^0.8.1"
-    to-regex "^3.0.2"
-
 miller-rabin@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
@@ -2409,17 +2008,17 @@ miller-rabin@^4.0.0:
     bn.js "^4.0.0"
     brorand "^1.0.1"
 
-mime-db@~1.38.0:
-  version "1.38.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad"
-  integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==
+mime-db@1.40.0:
+  version "1.40.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
+  integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==
 
-mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.18, mime-types@~2.1.19:
-  version "2.1.22"
-  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd"
-  integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==
+mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24:
+  version "2.1.24"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
+  integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
   dependencies:
-    mime-db "~1.38.0"
+    mime-db "1.40.0"
 
 mime@1.4.1:
   version "1.4.1"
@@ -2432,9 +2031,9 @@ mimic-fn@^1.0.0:
   integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
 
 mimic-fn@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.0.0.tgz#0913ff0b121db44ef5848242c38bbb35d44cabde"
-  integrity sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA==
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+  integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
 mimic-response@^1.0.0:
   version "1.0.1"
@@ -2470,14 +2069,6 @@ minimist@0.0.8:
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
   integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
 
-mixin-deep@^1.2.0:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
-  integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==
-  dependencies:
-    for-in "^1.0.2"
-    is-extendable "^1.0.1"
-
 mkdirp-promise@^5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
@@ -2492,39 +2083,39 @@ mkdirp@*, mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1:
   dependencies:
     minimist "0.0.8"
 
-mocha@^6.0.2:
-  version "6.0.2"
-  resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.0.2.tgz#cdc1a6fdf66472c079b5605bac59d29807702d2c"
-  integrity sha512-RtTJsmmToGyeTznSOMoM6TPEk1A84FQaHIciKrRqARZx+B5ccJ5tXlmJzEKGBxZdqk9UjpRsesZTUkZmR5YnuQ==
+mocha@^6.1.4:
+  version "6.1.4"
+  resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.1.4.tgz#e35fada242d5434a7e163d555c705f6875951640"
+  integrity sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==
   dependencies:
     ansi-colors "3.2.3"
     browser-stdout "1.3.1"
     debug "3.2.6"
     diff "3.5.0"
     escape-string-regexp "1.0.5"
-    findup-sync "2.0.0"
+    find-up "3.0.0"
     glob "7.1.3"
     growl "1.10.5"
     he "1.2.0"
-    js-yaml "3.12.0"
+    js-yaml "3.13.1"
     log-symbols "2.2.0"
     minimatch "3.0.4"
     mkdirp "0.5.1"
     ms "2.1.1"
-    node-environment-flags "1.0.4"
+    node-environment-flags "1.0.5"
     object.assign "4.1.0"
     strip-json-comments "2.0.1"
     supports-color "6.0.0"
     which "1.3.1"
     wide-align "1.1.3"
-    yargs "12.0.5"
-    yargs-parser "11.1.1"
+    yargs "13.2.2"
+    yargs-parser "13.0.0"
     yargs-unparser "1.5.0"
 
 mock-fs@^4.1.0:
-  version "4.8.0"
-  resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.8.0.tgz#eb0784ceba4b34c91a924a5112eeb36e1b5a9e29"
-  integrity sha512-Gwj4KnJOW15YeTJKO5frFd/WDO5Mc0zxXqL9oHx3+e9rBqW8EVARqQHSaIXznUdljrD6pvbNGW2ZGXKPEfYJfw==
+  version "4.9.0"
+  resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.9.0.tgz#7fc0c2f82965050b2776f8eb4eb63ca53a92ff86"
+  integrity sha512-aUj0qIniTNxzGqAC61Bvro7YD37tIBnMw3wpClucUVgNBS7r6YQn/M4wuoH7SGteKz4SvC1OBeDsfpG0MYC+1Q==
 
 mout@^0.11.0:
   version "0.11.1"
@@ -2561,53 +2152,37 @@ nan@2.10.0:
   integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==
 
 nan@^2.0.8, nan@^2.3.3:
-  version "2.13.1"
-  resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd"
-  integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA==
+  version "2.13.2"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
+  integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==
 
 nano-json-stream-parser@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
   integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=
 
-nanomatch@^1.2.9:
-  version "1.2.13"
-  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
-  integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
-  dependencies:
-    arr-diff "^4.0.0"
-    array-unique "^0.3.2"
-    define-property "^2.0.2"
-    extend-shallow "^3.0.2"
-    fragment-cache "^0.2.1"
-    is-windows "^1.0.2"
-    kind-of "^6.0.2"
-    object.pick "^1.3.0"
-    regex-not "^1.0.0"
-    snapdragon "^0.8.1"
-    to-regex "^3.0.1"
-
 natural-compare@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
   integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
 
-negotiator@0.6.1:
-  version "0.6.1"
-  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
-  integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=
+negotiator@0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+  integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
 
 nice-try@^1.0.4:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
   integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
 
-node-environment-flags@1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.4.tgz#0b784a6551426bfc16d3b2208424dcbc2b2ff038"
-  integrity sha512-M9rwCnWVLW7PX+NUWe3ejEdiLYinRpsEre9hMkU/6NS4h+EEulYaDH1gCEZ2gyXsmw+RXYDaV2JkkTNcsPDJ0Q==
+node-environment-flags@1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a"
+  integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==
   dependencies:
     object.getownpropertydescriptors "^2.0.3"
+    semver "^5.7.0"
 
 normalize-package-data@^2.3.2:
   version "2.5.0"
@@ -2649,26 +2224,10 @@ object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
   integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
 
-object-copy@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
-  integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
-  dependencies:
-    copy-descriptor "^0.1.0"
-    define-property "^0.2.5"
-    kind-of "^3.0.3"
-
 object-keys@^1.0.11, object-keys@^1.0.12:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032"
-  integrity sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==
-
-object-visit@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
-  integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
-  dependencies:
-    isobject "^3.0.0"
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+  integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
 
 object.assign@4.1.0, object.assign@^4.1.0:
   version "4.1.0"
@@ -2698,13 +2257,6 @@ object.getownpropertydescriptors@^2.0.3:
     define-properties "^1.1.2"
     es-abstract "^1.5.1"
 
-object.pick@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
-  integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
-  dependencies:
-    isobject "^3.0.1"
-
 oboe@2.1.3:
   version "2.1.3"
   resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.3.tgz#2b4865dbd46be81225713f4e9bfe4bcf4f680a4f"
@@ -2745,7 +2297,7 @@ optionator@^0.8.2:
     type-check "~0.3.2"
     wordwrap "~1.0.0"
 
-os-locale@^3.0.0:
+os-locale@^3.0.0, os-locale@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
   integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
@@ -2775,9 +2327,9 @@ p-finally@^1.0.0:
   integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
 
 p-is-promise@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5"
-  integrity sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
+  integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
 
 p-limit@^1.1.0:
   version "1.3.0"
@@ -2820,14 +2372,14 @@ p-try@^1.0.0:
   integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
 
 p-try@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"
-  integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+  integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
 
 parent-module@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.0.tgz#df250bdc5391f4a085fb589dad761f5ad6b865b5"
-  integrity sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+  integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
   dependencies:
     callsites "^3.0.0"
 
@@ -2858,20 +2410,10 @@ parse-json@^2.2.0:
   dependencies:
     error-ex "^1.2.0"
 
-parse-passwd@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
-  integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
-
 parseurl@~1.3.2:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
-  integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=
-
-pascalcase@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
-  integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+  integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
 
 path-exists@^3.0.0:
   version "3.0.0"
@@ -2965,11 +2507,6 @@ pkg-dir@^2.0.0:
   dependencies:
     find-up "^2.1.0"
 
-posix-character-classes@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
-  integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
-
 prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@@ -2996,12 +2533,12 @@ progress@^2.0.0:
   integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
 
 proxy-addr@~2.0.4:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
-  integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34"
+  integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==
   dependencies:
     forwarded "~0.1.2"
-    ipaddr.js "1.8.0"
+    ipaddr.js "1.9.0"
 
 psl@^1.1.24:
   version "1.1.31"
@@ -3048,6 +2585,11 @@ qs@6.5.2, qs@~6.5.2:
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
   integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
 
+qs@6.7.0:
+  version "6.7.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+  integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
 query-string@^5.0.1:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
@@ -3092,6 +2634,16 @@ raw-body@2.3.3:
     iconv-lite "0.4.23"
     unpipe "1.0.0"
 
+raw-body@2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+  integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+  dependencies:
+    bytes "3.1.0"
+    http-errors "1.7.2"
+    iconv-lite "0.4.24"
+    unpipe "1.0.0"
+
 read-pkg-up@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
@@ -3122,29 +2674,11 @@ readable-stream@^2.3.0, readable-stream@^2.3.5:
     string_decoder "~1.1.1"
     util-deprecate "~1.0.1"
 
-regex-not@^1.0.0, regex-not@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
-  integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
-  dependencies:
-    extend-shallow "^3.0.2"
-    safe-regex "^1.1.0"
-
 regexpp@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
   integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
 
-repeat-element@^1.1.2:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
-  integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
-
-repeat-string@^1.6.1:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
-  integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
-
 request@^2.79.0:
   version "2.88.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
@@ -3181,28 +2715,20 @@ require-main-filename@^1.0.1:
   resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
   integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
 
-resolve-dir@^1.0.0, resolve-dir@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
-  integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
-  dependencies:
-    expand-tilde "^2.0.0"
-    global-modules "^1.0.0"
+require-main-filename@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+  integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
 
 resolve-from@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
   integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
 
-resolve-url@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
-  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
-
-resolve@^1.10.0, resolve@^1.5.0, resolve@^1.9.0:
-  version "1.10.0"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba"
-  integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==
+resolve@^1.10.0, resolve@^1.5.0:
+  version "1.10.1"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18"
+  integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==
   dependencies:
     path-parse "^1.0.6"
 
@@ -3214,11 +2740,6 @@ restore-cursor@^2.0.0:
     onetime "^2.0.0"
     signal-exit "^3.0.2"
 
-ret@~0.1.10:
-  version "0.1.15"
-  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
-  integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
-
 rfdc@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.2.tgz#e6e72d74f5dc39de8f538f65e00c36c18018e349"
@@ -3247,9 +2768,9 @@ run-async@^2.2.0:
     is-promise "^2.1.0"
 
 rxjs@^6.4.0:
-  version "6.4.0"
-  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504"
-  integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==
+  version "6.5.1"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.1.tgz#f7a005a9386361921b8524f38f54cbf80e5d08f4"
+  integrity sha512-y0j31WJc83wPu31vS1VlAFW5JGrnGC+j+TtGAa1fRQphy48+fDYiDmX8tjGloToEsMkxnouOg/1IzXGKkJnZMg==
   dependencies:
     tslib "^1.9.0"
 
@@ -3258,13 +2779,6 @@ safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 
-safe-regex@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
-  integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
-  dependencies:
-    ret "~0.1.10"
-
 "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
@@ -3304,10 +2818,10 @@ seek-bzip@^1.0.5:
   dependencies:
     commander "~2.8.1"
 
-"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1:
-  version "5.6.0"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
-  integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
+"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1, semver@^5.7.0:
+  version "5.7.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
+  integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==
 
 send@0.16.2:
   version "0.16.2"
@@ -3354,26 +2868,6 @@ set-blocking@^2.0.0:
   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
   integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
 
-set-value@^0.4.3:
-  version "0.4.3"
-  resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
-  integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE=
-  dependencies:
-    extend-shallow "^2.0.1"
-    is-extendable "^0.1.1"
-    is-plain-object "^2.0.1"
-    to-object-path "^0.3.0"
-
-set-value@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
-  integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==
-  dependencies:
-    extend-shallow "^2.0.1"
-    is-extendable "^0.1.1"
-    is-plain-object "^2.0.3"
-    split-string "^3.0.1"
-
 setimmediate@1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f"
@@ -3389,6 +2883,11 @@ setprototypeof@1.1.0:
   resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
   integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
 
+setprototypeof@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+  integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
 sha.js@^2.4.0, sha.js@^2.4.8:
   version "2.4.11"
   resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
@@ -3444,57 +2943,6 @@ slice-ansi@^2.1.0:
     astral-regex "^1.0.0"
     is-fullwidth-code-point "^2.0.0"
 
-snapdragon-node@^2.0.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
-  integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
-  dependencies:
-    define-property "^1.0.0"
-    isobject "^3.0.0"
-    snapdragon-util "^3.0.1"
-
-snapdragon-util@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
-  integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
-  dependencies:
-    kind-of "^3.2.0"
-
-snapdragon@^0.8.1:
-  version "0.8.2"
-  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
-  integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
-  dependencies:
-    base "^0.11.1"
-    debug "^2.2.0"
-    define-property "^0.2.5"
-    extend-shallow "^2.0.1"
-    map-cache "^0.2.2"
-    source-map "^0.5.6"
-    source-map-resolve "^0.5.0"
-    use "^3.1.0"
-
-source-map-resolve@^0.5.0:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
-  integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
-  dependencies:
-    atob "^2.1.1"
-    decode-uri-component "^0.2.0"
-    resolve-url "^0.2.1"
-    source-map-url "^0.4.0"
-    urix "^0.1.0"
-
-source-map-url@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
-  integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
-
-source-map@^0.5.6:
-  version "0.5.7"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
-  integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
-
 spdx-correct@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
@@ -3517,16 +2965,9 @@ spdx-expression-parse@^3.0.0:
     spdx-license-ids "^3.0.0"
 
 spdx-license-ids@^3.0.0:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e"
-  integrity sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==
-
-split-string@^3.0.1, split-string@^3.0.2:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
-  integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
-  dependencies:
-    extend-shallow "^3.0.0"
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1"
+  integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==
 
 sprintf-js@~1.0.2:
   version "1.0.3"
@@ -3548,15 +2989,7 @@ sshpk@^1.7.0:
     safer-buffer "^2.0.2"
     tweetnacl "~0.14.0"
 
-static-extend@^0.1.1:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
-  integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
-  dependencies:
-    define-property "^0.2.5"
-    object-copy "^0.1.0"
-
-"statuses@>= 1.4.0 < 2":
+"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2":
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
   integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
@@ -3566,10 +2999,10 @@ statuses@~1.4.0:
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
   integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
 
-streamroller@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-1.0.3.tgz#cb51e7e382f799a9381a5d7490ce3053b325fba3"
-  integrity sha512-P7z9NwP51EltdZ81otaGAN3ob+/F88USJE546joNq7bqRNTe6jc74fTBDyynxP4qpIfKlt/CesEYicuMzI0yJg==
+streamroller@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-1.0.4.tgz#d485c7624796d5e2eb34190c79afcbf006afb5e6"
+  integrity sha512-Wc2Gm5ygjSX8ZpW9J7Y9FwiSzTlKSvcl0FTTMd3rn7RoxDXpBW+xD9TY5sWL2n0UR61COB0LG1BQvN6nTUQbLQ==
   dependencies:
     async "^2.6.1"
     date-format "^2.0.0"
@@ -3638,10 +3071,10 @@ strip-ansi@^4.0.0:
   dependencies:
     ansi-regex "^3.0.0"
 
-strip-ansi@^5.0.0, strip-ansi@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.1.0.tgz#55aaa54e33b4c0649a7338a43437b1887d153ec4"
-  integrity sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==
+strip-ansi@^5.1.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+  integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
   dependencies:
     ansi-regex "^4.1.0"
 
@@ -3791,30 +3224,10 @@ to-buffer@^1.1.1:
   resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
   integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
 
-to-object-path@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
-  integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
-  dependencies:
-    kind-of "^3.0.2"
-
-to-regex-range@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
-  integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
-  dependencies:
-    is-number "^3.0.0"
-    repeat-string "^1.6.1"
-
-to-regex@^3.0.1, to-regex@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
-  integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
-  dependencies:
-    define-property "^2.0.2"
-    extend-shallow "^3.0.2"
-    regex-not "^1.0.2"
-    safe-regex "^1.1.0"
+toidentifier@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+  integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
 
 tough-cookie@~2.4.3:
   version "2.4.3"
@@ -3853,13 +3266,13 @@ type-detect@^4.0.0, type-detect@^4.0.5:
   resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
   integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
 
-type-is@~1.6.16:
-  version "1.6.16"
-  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
-  integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==
+type-is@~1.6.16, type-is@~1.6.17:
+  version "1.6.18"
+  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+  integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
   dependencies:
     media-typer "0.3.0"
-    mime-types "~2.1.18"
+    mime-types "~2.1.24"
 
 typedarray-to-buffer@^3.1.2:
   version "3.1.5"
@@ -3886,16 +3299,6 @@ underscore@1.8.3:
   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
   integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=
 
-union-value@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
-  integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=
-  dependencies:
-    arr-union "^3.1.0"
-    get-value "^2.0.6"
-    is-extendable "^0.1.1"
-    set-value "^0.4.3"
-
 universalify@^0.1.0:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
@@ -3906,14 +3309,6 @@ unpipe@1.0.0, unpipe@~1.0.0:
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
   integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
 
-unset-value@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
-  integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
-  dependencies:
-    has-value "^0.3.1"
-    isobject "^3.0.0"
-
 uri-js@^4.2.2:
   version "4.2.2"
   resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
@@ -3921,11 +3316,6 @@ uri-js@^4.2.2:
   dependencies:
     punycode "^2.1.0"
 
-urix@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
-  integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
-
 url-parse-lax@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
@@ -3943,11 +3333,6 @@ url-to-options@^1.0.1:
   resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
   integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
 
-use@^3.1.0:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
-  integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
-
 utf8@2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.1.tgz#2e01db02f7d8d0944f77104f1609eb0c304cf768"
@@ -4238,7 +3623,7 @@ which-module@^2.0.0:
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
   integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
 
-which@1.3.1, which@^1.2.14, which@^1.2.9:
+which@1.3.1, which@^1.2.9:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
   integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
@@ -4333,7 +3718,7 @@ xtend@^4.0.0:
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
   integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
 
-"y18n@^3.2.1 || ^4.0.0":
+"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
   integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
@@ -4343,7 +3728,15 @@ yaeti@^0.0.6:
   resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
   integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
 
-yargs-parser@11.1.1, yargs-parser@^11.1.1:
+yargs-parser@13.0.0, yargs-parser@^13.0.0:
+  version "13.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b"
+  integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
+yargs-parser@^11.1.1:
   version "11.1.1"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
   integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==
@@ -4360,7 +3753,24 @@ yargs-unparser@1.5.0:
     lodash "^4.17.11"
     yargs "^12.0.5"
 
-yargs@12.0.5, yargs@^12.0.5:
+yargs@13.2.2:
+  version "13.2.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993"
+  integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==
+  dependencies:
+    cliui "^4.0.0"
+    find-up "^3.0.0"
+    get-caller-file "^2.0.1"
+    os-locale "^3.1.0"
+    require-directory "^2.1.1"
+    require-main-filename "^2.0.0"
+    set-blocking "^2.0.0"
+    string-width "^3.0.0"
+    which-module "^2.0.0"
+    y18n "^4.0.0"
+    yargs-parser "^13.0.0"
+
+yargs@^12.0.5:
   version "12.0.5"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
   integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==
diff --git a/tests/compatibility/check_genesis.py b/tests/compatibility/check_genesis.py
index 6cf102b9b..aaade5f04 100644
--- a/tests/compatibility/check_genesis.py
+++ b/tests/compatibility/check_genesis.py
@@ -7,7 +7,7 @@
 
 NODE_KEYS = [
     '0x98a476f1687bc3d60a2da2adbcba2c46958e61fa2fb4042cd7bc5816a710195b',
-    '0x312b5d21c330b0e88e86f3c5440c63bfddde72d1e155eca9c2d5d9929d012e1a'
+    '0x0958fc78ca04a68fd52c5622ef2ca3cdb177cce96303c25fe1f487c6436a6dac'
 ]
 
 
diff --git a/tests/integrate_test/blockNumber.sh b/tests/integrate_test/blockNumber.sh
index 0c88aa70e..ef6c9f0bf 100755
--- a/tests/integrate_test/blockNumber.sh
+++ b/tests/integrate_test/blockNumber.sh
@@ -15,4 +15,9 @@ if [ $? -ne 0 ]; then
 fi
 
 height=$(echo ${response}|jq ".result"|sed 's/\"//g')
+
+if [ "$height" == null ]; then
+   exit 1
+fi
+
 echo $((height))
diff --git a/tests/integrate_test/box_executor_test.sh b/tests/integrate_test/box_executor_test.sh
index ac559868e..e03390e2c 100755
--- a/tests/integrate_test/box_executor_test.sh
+++ b/tests/integrate_test/box_executor_test.sh
@@ -14,7 +14,7 @@ else
     SOURCE_DIR=$(readlink -f $(dirname $0)/../..)
 fi
 BINARY_DIR=${SOURCE_DIR}/target/install
-TESTS_DIR=${SOURCE_DIR}/tests/interfaces/rpc/tests
+TESTS_DIR=${SOURCE_DIR}/tests/jsondata/rpc/tests
 CHAIN_NAME="mock-chain"
 NODE_NAME="${CHAIN_NAME}/0"
 NODE_DIR="${BINARY_DIR}/${NODE_NAME}"
@@ -37,7 +37,7 @@ if [ ! -d "resource" ]; then
     mkdir resource
 fi
 
-AUTHORITIES=`cat ${SOURCE_DIR}/tests/interfaces/rpc/config/authorities | xargs echo |sed "s/ /,/g"`
+AUTHORITIES=`cat ${SOURCE_DIR}/tests/interfaces/config/authorities | xargs echo |sed "s/ /,/g"`
 ${BINARY_DIR}/scripts/create_cita_config.py create \
              --nodes "127.0.0.1:4000,127.0.0.1:4001,127.0.0.1:4002,127.0.0.1:4003" \
              --chain_name ${CHAIN_NAME} \
@@ -66,7 +66,7 @@ echo -n "DONE"
 echo -n "4) testing ...  "
 AMQP_URL=amqp://guest:guest@localhost/${NODE_NAME} \
     timeout 100s ${BINARY_DIR}/bin/box_executor \
-    -m ${SOURCE_DIR}/tests/interfaces/rpc/config/blockchain.yaml
+    -m ${SOURCE_DIR}/tests/interfaces/config/blockchain.yaml
 echo -n "DONE"
 
 ################################################################################
diff --git a/tests/integrate_test/cita_discovery.sh b/tests/integrate_test/cita_discovery.sh
index 128de9807..cbcff0cc4 100755
--- a/tests/integrate_test/cita_discovery.sh
+++ b/tests/integrate_test/cita_discovery.sh
@@ -67,7 +67,7 @@ test_node_entry() {
 
     # check every node's peer count reach to 4
     for i in {0..4} ; do
-        timeout=$(check_peer_count $i 4 60)||(echo "FAILED"
+        timeout=$(check_peer_count $i 4 90)||(echo "FAILED"
                                               echo "error msg: ${timeout}"
                                               exit 1)
     done
@@ -87,7 +87,7 @@ test_node_exit() {
 
     # check every node's peer count is 2
     for i in {0..2} ; do
-        timeout=$(check_peer_count $i 2 60)||(echo "FAILED"
+        timeout=$(check_peer_count $i 2 90)||(echo "FAILED"
                                               echo "error msg: ${timeout}"
                                               exit 1)
     done
@@ -108,7 +108,7 @@ test_parallel_entry() {
     # check every node's peer count reach to 7
     for i in {0..7} ; do
         # needs more time for 8 nodes discovery each other.
-        timeout=$(check_peer_count $i 7 180)||(echo "FAILED"
+        timeout=$(check_peer_count $i 7 240)||(echo "FAILED"
                                                echo "error msg: ${timeout}"
                                                exit 1)
     done
@@ -127,7 +127,7 @@ test_parallel_exit() {
 
     # check every node's peer count is 3
     for i in {0..3} ; do
-        timeout=$(check_peer_count $i 3 60)||(echo "FAILED"
+        timeout=$(check_peer_count $i 3 90)||(echo "FAILED"
                                               echo "error msg: ${timeout}"
                                               exit 1)
     done
@@ -154,7 +154,7 @@ test_parallel_entry_exit() {
 
     # check every node's peer count is 3
     for i in {0..3} ; do
-        timeout=$(check_peer_count $i 3 90)||(echo "FAILED"
+        timeout=$(check_peer_count $i 3 120)||(echo "FAILED"
                                               echo "error msg: ${timeout}"
                                               exit 1)
     done
@@ -194,14 +194,14 @@ test_entry_and_known_node_restart() {
     bin/cita bebop start node/4 > /dev/null
 
     # check every node0 peer count is 4
-    timeout=$(check_peer_count 0 4 90)||(echo "FAILED"
+    timeout=$(check_peer_count 0 4 120)||(echo "FAILED"
                                          echo "error msg: ${timeout}"
                                          exit 1)
     # stop all connected nodes in node4
     for i in {0..3} ; do
         bin/cita bebop stop node/$i > /dev/null
     done
-    timeout=$(check_peer_count 4 0 90)||(echo "FAILED"
+    timeout=$(check_peer_count 4 0 120)||(echo "FAILED"
                                          echo "error msg: ${timeout}"
                                          exit 1)
     # start all nodes
@@ -212,7 +212,7 @@ test_entry_and_known_node_restart() {
     # check every node's peer count is 4
     for i in {0..4} ; do
         # needs more time to for checking, because node0 may not have enough score in node4
-        timeout=$(check_peer_count $i 4 180)||(echo "FAILED"
+        timeout=$(check_peer_count $i 4 240)||(echo "FAILED"
                                               echo "error msg: ${timeout}"
                                               exit 1)
     done
@@ -236,13 +236,13 @@ test_repeated_address() {
 
     # node[0..3]'s peer count is 3
     for i in {0..3} ; do
-        timeout=$(check_peer_count $i 3 90)||(echo "FAILED"
+        timeout=$(check_peer_count $i 3 120)||(echo "FAILED"
                                               echo "error msg: ${timeout}"
                                               exit 1)
     done
 
     # node4's peer count is 0
-    timeout=$(check_peer_count 4 0 90)||(echo "FAILED"
+    timeout=$(check_peer_count 4 0 120)||(echo "FAILED"
                                          echo "error msg: ${timeout}"
                                          exit 1)
     bin/cita bebop stop node/4 > /dev/null
@@ -273,7 +273,7 @@ test_max_connected_limit_as_client() {
 
     # make sure that node[0..3] has been connected each other
     for i in {0..3} ; do
-        timeout=$(check_peer_count $i 3 90)||(echo "FAILED"
+        timeout=$(check_peer_count $i 3 120)||(echo "FAILED"
                                               echo "error msg: ${timeout}"
                                               exit 1)
     done
@@ -286,13 +286,13 @@ test_max_connected_limit_as_client() {
 
         # it is necessary to wait for a few seconds for each check
         sleep 3
-        timeout=$(check_peer_count $i 3 90)||(echo "FAILED"
+        timeout=$(check_peer_count $i 3 120)||(echo "FAILED"
                                               echo "error msg: ${timeout}"
                                               exit 1)
     done
 
     # node4's peer count is 0
-    timeout=$(check_peer_count 4 0 90)||(echo "FAILED"
+    timeout=$(check_peer_count 4 0 120)||(echo "FAILED"
                                          echo "error msg: ${timeout}"
                                          exit 1)
 
@@ -329,7 +329,7 @@ test_max_connected_limit_as_server() {
 
         # it is necessary to wait for a few seconds for each check
         sleep 3
-        timeout=$(check_peer_count_max $i 2 90)||(echo "FAILED"
+        timeout=$(check_peer_count_max $i 2 120)||(echo "FAILED"
                                               echo "error msg: ${timeout}"
                                               exit 1)
     done
@@ -370,7 +370,7 @@ main() {
 
     # Pre-check peer count, it is OK to check node0 only
     echo -n "4) pre-check peer count  ...  "
-    timeout=$(check_peer_count 0 3 60)||(echo "FAILED"
+    timeout=$(check_peer_count 0 3 90)||(echo "FAILED"
                                          echo "error msg: ${timeout}"
                                          exit 1)
     echo "${timeout}s DONE"
diff --git a/tests/integrate_test/cita_jsonrpc_schema_mock.sh b/tests/integrate_test/cita_jsonrpc_schema_mock.sh
index b868cd38a..937416f2b 100755
--- a/tests/integrate_test/cita_jsonrpc_schema_mock.sh
+++ b/tests/integrate_test/cita_jsonrpc_schema_mock.sh
@@ -33,7 +33,7 @@ if [ ! -d "resource" ]; then
     mkdir resource
 fi
 
-AUTHORITIES=`cat ${SOURCE_DIR}/tests/interfaces/rpc/config/authorities |xargs echo |sed "s/ /,/g"`
+AUTHORITIES=`cat ${SOURCE_DIR}/tests/interfaces/config/authorities |xargs echo |sed "s/ /,/g"`
 
 ${BINARY_DIR}/scripts/create_cita_config.py create --nodes "127.0.0.1:4000,127.0.0.1:4001,127.0.0.1:4002,127.0.0.1:4003" \
              --chain_name "mock-chain" \
@@ -55,14 +55,14 @@ echo "DONE"
 echo -n "4) generate mock data  ...  "
 AMQP_URL=amqp://guest:guest@localhost/mock-chain/0 \
         ${BINARY_DIR}/bin/chain-executor-mock \
-        -m ${SOURCE_DIR}/tests/interfaces/rpc/config/blockchain.yaml
+        -m ${SOURCE_DIR}/tests/interfaces/config/blockchain.yaml
 echo "DONE"
 
 ################################################################################
 echo -n "5) check mock data  ...  "
-python3 ${SOURCE_DIR}/tests/interfaces/rpc/test_runner.py \
+python3 ${SOURCE_DIR}/tests/interfaces/rpc_test_runner.py \
         --rpc-url http://127.0.0.1:1337 \
-        --directory ${SOURCE_DIR}/tests/interfaces/rpc/
+        --directory ${SOURCE_DIR}/tests/jsondata/rpc/
 echo "DONE"
 
 ################################################################################
diff --git a/tests/integrate_test/test_charge_mode.py b/tests/integrate_test/test_charge_mode.py
index 21c6998f1..6c2991d22 100644
--- a/tests/integrate_test/test_charge_mode.py
+++ b/tests/integrate_test/test_charge_mode.py
@@ -126,6 +126,12 @@ def get_miner_with_balance(miner_privkeys):
     raise Exception('Get miner with balance timeout(60)')
 
 
+def transfer_token_to_miner(superadmin_privkey, miner_privkeys, version):
+    for privkey in miner_privkeys:
+        address = key_address(privkey)
+        test_transfer(superadmin_privkey, address, 100000000000000, version)
+
+
 def key_address(privkey):
     """ Get the address of a privkey """
     hash_obj = sha3.keccak_256()
@@ -150,6 +156,10 @@ def main():
         "--version", help="Tansaction version.", default=1, type=int)
     args = parser.parse_args()
 
+    # Transfers 100000000000000 tokens from super admin to each miner
+    super_privkey = '0x5f0258a4778057a8a7d97809bd209055b2fbafa654ce7d31ec7191066b9225e6'
+    transfer_token_to_miner(super_privkey, args.miner_privkeys, args.version)
+
     miner_privkey = get_miner_with_balance(args.miner_privkeys)
     version = args.version
 
diff --git a/tests/interfaces/README.md b/tests/interfaces/README.md
deleted file mode 100644
index 4f1f09b73..000000000
--- a/tests/interfaces/README.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# CITA Interfaces
-
-CITA RPC specifications and tests.
-
-## 目的
-
-主要是为了测试API接口的所有类型能正常工作，对于EVM内不同情况的但是RPC接口一致的情况，不属于本测试覆盖范围，部分EVM指令的测试需要EVM内部构造测试用例。
-
-## 分类
-
-- blockNumber
-
-  正确参数：[正确结果[包含交易内容，不包含交易内容]，错误结果]
-
-  错误参数：[个数错误，类型错误]
-
-- sendRawTransaction 暂时不处理
-
-- getBlockByHash
-
-  正确参数：
-
-  - 参数：[hash, latest, earliest, 创世块]
-  - 返回：[有结果[有交易，无交易]，无结果]
-
-  错误参数：...
-
-- getBlockByNumber
-
-  正确参数：...
-
-  错误参数：...
-
-- getTransactionReceipt
-
-  正确参数:
-
-  - 有结果
-    - 交易正常处理
-    - 交易处理失败：ReceiptError的类型参见ReceiptError，对于权限类别的验证，这里不覆盖。
-  - 无结果
-
-  错误参数：
-
-- getLogs
-
-  正确参数：几种组合...
-
-  错误参数：...
-
-- call
-
-  正确参数: [...]
-
-  错误参数: ...
-
-- getTransaction...
-
-- getTransactionCount ...
-
-- getCode ...
-
-- getAbi...
-
-- newFilter ...
-
-- newBlockFilter 暂时不测试
-
-- uninstallFilter 暂时不测试
-
-- getFilterChanges 暂时不测试
-
-- getFilterLogs 暂时不测试
-
-- getTransactionProof 暂时不测试
-
-## 原则
-
-根据以上测试数据构造数据和测试用例
diff --git a/tests/interfaces/rpc/config/authorities b/tests/interfaces/config/authorities
similarity index 100%
rename from tests/interfaces/rpc/config/authorities
rename to tests/interfaces/config/authorities
diff --git a/tests/interfaces/rpc/config/blockchain.yaml b/tests/interfaces/config/blockchain.yaml
similarity index 100%
rename from tests/interfaces/rpc/config/blockchain.yaml
rename to tests/interfaces/config/blockchain.yaml
diff --git a/tests/interfaces/rpc/config/contracts/AccountGasLimitReached.sol b/tests/interfaces/config/contracts/AccountGasLimitReached.sol
similarity index 100%
rename from tests/interfaces/rpc/config/contracts/AccountGasLimitReached.sol
rename to tests/interfaces/config/contracts/AccountGasLimitReached.sol
diff --git a/tests/interfaces/rpc/config/contracts/ERC20-Token/BasicToken.sol b/tests/interfaces/config/contracts/ERC20-Token/BasicToken.sol
similarity index 100%
rename from tests/interfaces/rpc/config/contracts/ERC20-Token/BasicToken.sol
rename to tests/interfaces/config/contracts/ERC20-Token/BasicToken.sol
diff --git a/tests/interfaces/rpc/config/contracts/ERC20-Token/ERC20.sol b/tests/interfaces/config/contracts/ERC20-Token/ERC20.sol
similarity index 100%
rename from tests/interfaces/rpc/config/contracts/ERC20-Token/ERC20.sol
rename to tests/interfaces/config/contracts/ERC20-Token/ERC20.sol
diff --git a/tests/interfaces/rpc/config/contracts/ERC20-Token/ERC20Basic.sol b/tests/interfaces/config/contracts/ERC20-Token/ERC20Basic.sol
similarity index 100%
rename from tests/interfaces/rpc/config/contracts/ERC20-Token/ERC20Basic.sol
rename to tests/interfaces/config/contracts/ERC20-Token/ERC20Basic.sol
diff --git a/tests/interfaces/rpc/config/contracts/ERC20-Token/SafeMath.sol b/tests/interfaces/config/contracts/ERC20-Token/SafeMath.sol
similarity index 100%
rename from tests/interfaces/rpc/config/contracts/ERC20-Token/SafeMath.sol
rename to tests/interfaces/config/contracts/ERC20-Token/SafeMath.sol
diff --git a/tests/interfaces/rpc/config/contracts/ERC20-Token/StandardToken.sol b/tests/interfaces/config/contracts/ERC20-Token/StandardToken.sol
similarity index 100%
rename from tests/interfaces/rpc/config/contracts/ERC20-Token/StandardToken.sol
rename to tests/interfaces/config/contracts/ERC20-Token/StandardToken.sol
diff --git a/tests/interfaces/rpc/config/contracts/HelloWorld.sol b/tests/interfaces/config/contracts/HelloWorld.sol
similarity index 100%
rename from tests/interfaces/rpc/config/contracts/HelloWorld.sol
rename to tests/interfaces/config/contracts/HelloWorld.sol
diff --git a/tests/interfaces/rpc/config/contracts/Reverted.sol b/tests/interfaces/config/contracts/Reverted.sol
similarity index 100%
rename from tests/interfaces/rpc/config/contracts/Reverted.sol
rename to tests/interfaces/config/contracts/Reverted.sol
diff --git a/tests/interfaces/rpc/config/contracts/SimpleStorage.sol b/tests/interfaces/config/contracts/SimpleStorage.sol
similarity index 100%
rename from tests/interfaces/rpc/config/contracts/SimpleStorage.sol
rename to tests/interfaces/config/contracts/SimpleStorage.sol
diff --git a/tests/interfaces/rpc/schemas/block.json b/tests/interfaces/rpc/schemas/block.json
deleted file mode 100644
index 6055112aa..000000000
--- a/tests/interfaces/rpc/schemas/block.json
+++ /dev/null
@@ -1,127 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "description": "A JSON RPC 2.0 response, source https://github.com/fge/sample-json-schemas",
-  "title": "Block",
-  "type": "object",
-  "properties": {
-    "result": {
-      "type": "object",
-      "properties": {
-        "version": {
-          "type": "integer",
-          "description": "QUANTITY - version of the block."
-        },
-        "hash": {
-          "type": "string",
-          "description": "DATA, 32 Bytes - hash of the block."
-        },
-        "header": {
-          "type": "object",
-          "required": [
-            "timestamp",
-            "prevHash",
-            "number",
-            "stateRoot",
-            "transactionsRoot",
-            "receiptsRoot",
-            "quotaUsed",
-            "proof"
-          ],
-          "properties": {
-            "timestamp": {
-              "type": "integer",
-              "description": "QUANTITY - the unix timestamp for when the block was collated."
-            },
-            "prevHash": {
-              "type": "string",
-              "description": "DATA, 32 Bytes - hash of the parent block."
-            },
-            "number": {
-              "type": "string",
-              "description": "QUANTITY - the block number. null when its pending block."
-            },
-            "stateRoot": {
-              "type": "string",
-              "description": "DATA, 32 Bytes - the root of the final state trie of the block."
-            },
-            "transactionsRoot": {
-              "type": "string",
-              "description": "DATA, 32 Bytes - the root of the transaction trie of the block."
-            },
-            "receiptsRoot": {
-              "type": "string",
-              "description": "DATA, 32 Bytes - the root of the receipts trie of the block."
-            },
-            "quotaUsed": {
-              "type": "string",
-              "description": "QUANTITY - the total used quota by all transactions in this block."
-            },
-            "proof": {
-              "oneOf": [
-                {
-                  "type": "null",
-                  "description": "DATA - proof can be null. (only the genesis block)"
-                },
-                {
-                  "type": "object",
-                  "properties": {
-                    "proposal": {
-                      "type": "string",
-                      "description": "DATA, 32 Bytes - the hash of proposal."
-                    },
-                    "height": {
-                      "type": "integer",
-                      "description": "QUANTITY - the block number of proposal."
-                    },
-                    "round": {
-                      "type": "integer",
-                      "description": "QUANTITY - the round number of proposal."
-                    },
-                    "commits": {
-                      "type": "object",
-                      "description": "OBJECT - the keys are signers address, the values are the signatures."
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        },
-        "body": {
-          "type": "object",
-          "properties": {
-            "transactions": {
-              "type": "array",
-              "items": {
-                "oneOf": [
-                  {
-                    "type": "string",
-                    "description": "DATA, 32 Bytes - hash of the transaction."
-                  },
-                  {
-                    "type": "object",
-                    "properties": {
-                      "hash": {
-                        "type": "string",
-                        "description": "DATA, 32 Bytes - hash of the transaction."
-                      },
-                      "content": {
-                        "type": "string",
-                        "description": "DATA - transaction content."
-                      }
-                    },
-                    "required": [
-                      "hash",
-                      "content"
-                    ]
-                  }
-                ]
-              },
-              "description": "Array - Array of transaction objects, or 32 Bytes transaction hashes depending on the last given parameter."
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/blockNumber.json b/tests/interfaces/rpc/schemas/blockNumber.json
deleted file mode 100644
index d06013ce0..000000000
--- a/tests/interfaces/rpc/schemas/blockNumber.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "blockNumber",
-  "description": "blockNumber JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "blockNumber.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "blockNumber"
-            ]
-          },
-          "params": {
-            "oneOf": [
-              {
-                "type": "array",
-                "maxItems": 0
-              }
-            ]
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "blockNumber.json#/response/definitions/response-obj"
-      }
-    ],
-    "definitions": {
-      "response-obj": {
-        "properties": {
-          "result": {
-            "type": "string",
-            "description": "QUANTITY - the block number."
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/call.json b/tests/interfaces/rpc/schemas/call.json
deleted file mode 100644
index 797143e40..000000000
--- a/tests/interfaces/rpc/schemas/call.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "call",
-  "description": "call JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "call.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "call"
-            ]
-          },
-          "params": {
-            "type": "array",
-            "items": [
-              {
-                "type": "object",
-                "properties": {
-                  "from": {
-                    "type": "string",
-                    "description": "DATA, 20 Bytes - (optional) The address the transaction is sent from."
-                  },
-                  "to": {
-                    "type": "string",
-                    "description": "DATA, 20 Bytes - The address the transaction is directed to."
-                  },
-                  "data": {
-                    "type": "string",
-                    "description": "DATA - (optional) Hash of the method signature and encoded parameters."
-                  }
-                },
-                "required": [
-                  "to"
-                ]
-              },
-              {
-                "type": "string",
-                "description": "QUANTITY|TAG - integer of a block number, or the string \"earliest\", \"latest\", as in the default block parameter."
-              }
-            ],
-            "minItems": 2,
-            "maxItems": 2
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "call.json#/response/definitions/response-obj"
-      }
-    ],
-    "definitions": {
-      "response-obj": {
-        "properties": {
-          "result": {
-            "type": "string",
-            "description": "DATA, 32 Bytes - hash of the transaction."
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/getAbi.json b/tests/interfaces/rpc/schemas/getAbi.json
deleted file mode 100644
index 874e0f260..000000000
--- a/tests/interfaces/rpc/schemas/getAbi.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "getAbi",
-  "description": "getAbi JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "getAbi.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "getAbi"
-            ]
-          },
-          "params": {
-            "type": "array",
-            "items": [
-              {
-                "type": "string",
-                "description": "DATA - 20 Bytes - address."
-              },
-              {
-                "type": "string",
-                "description": "QUANTITY|TAG - integer block number(Hex string), or the string 'latest', 'earliest'"
-              }
-            ],
-            "minItems": 2,
-            "maxItems": 2
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "getAbi.json#/response/definitions/response-obj"
-      }
-    ],
-    "definitions": {
-      "response-obj": {
-        "properties": {
-          "result": {
-            "type": "string"
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/getBlockByHash.json b/tests/interfaces/rpc/schemas/getBlockByHash.json
deleted file mode 100644
index 54194f7d8..000000000
--- a/tests/interfaces/rpc/schemas/getBlockByHash.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "getBlockByHash",
-  "description": "getBlockByHash JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "getBlockByHash.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "getBlockByHash"
-            ]
-          },
-          "params": {
-            "type": "array",
-            "items": [
-              {
-                "type": "string",
-                "description": "DATA, 32 Bytes - hash of a block."
-              },
-              {
-                "type": "boolean",
-                "description": "Boolean - If true it returns the full transaction objects, if false only the hashes of the transactions."
-              }
-            ],
-            "minItems": 2,
-            "maxItems": 2
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "block.json"
-      }
-    ]
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/getBlockByNumber.json b/tests/interfaces/rpc/schemas/getBlockByNumber.json
deleted file mode 100644
index a883313f2..000000000
--- a/tests/interfaces/rpc/schemas/getBlockByNumber.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "getBlockByNumber",
-  "description": "getBlockByNumber JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "getBlockByNumber.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "getBlockByNumber"
-            ]
-          },
-          "params": {
-            "type": "array",
-            "items": [
-              {
-                "type": "string",
-                "description": "QUANTITY|TAG - integer of a block number, or the string \"earliest\", \"latest\", as in the default block parameter."
-              },
-              {
-                "type": "boolean",
-                "description": "Boolean - If true it returns the full transaction objects, if false only the hashes of the transactions."
-              }
-            ],
-            "minItems": 2,
-            "maxItems": 2
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "block.json"
-      }
-    ]
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/getCode.json b/tests/interfaces/rpc/schemas/getCode.json
deleted file mode 100644
index 085b0ab01..000000000
--- a/tests/interfaces/rpc/schemas/getCode.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "getCode",
-  "description": "getCode JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "getCode.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "getCode"
-            ]
-          },
-          "params": {
-            "type": "array",
-            "items": [
-              {
-                "type": "string",
-                "description": "DATA - 20 Bytes - address."
-              },
-              {
-                "type": "string",
-                "description": "QUANTITY|TAG - integer block number(Hex string), or the string 'latest', 'earliest'"
-              }
-            ],
-            "minItems": 2,
-            "maxItems": 2
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "getCode.json#/response/definitions/response-obj"
-      }
-    ],
-    "definitions": {
-      "response-obj": {
-        "properties": {
-          "result": {
-            "type": "string"
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/getFilterChanges.json b/tests/interfaces/rpc/schemas/getFilterChanges.json
deleted file mode 100644
index 0736c0147..000000000
--- a/tests/interfaces/rpc/schemas/getFilterChanges.json
+++ /dev/null
@@ -1,96 +0,0 @@
-{
-    "$schema": "http://json-schema.org/draft-04/schema#",
-    "title": "getFilterChanges",
-    "description": "getFilterChanges JSON-RPC method request and response schema.",
-    "request": {
-        "id": "#request",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-request.json"
-            },
-            {
-                "$ref": "#/definitions/request-obj"
-            }
-        ],
-        "definitions": {
-            "request-obj": {
-                "id": "#request-obj",
-                "properties": {
-                    "method": {
-                        "type": "string",
-                        "enum": [
-                            "getFilterChanges"
-                        ]
-                    },
-                    "params": {
-                        "type": "array",
-                        "items": [
-                            {
-                                "type": "string",
-                                "description": "`QUANTITY` - The filter id."
-                            }
-                        ],
-                        "minItems": 1,
-                        "maxItems": 1
-                    }
-                }
-            }
-        }
-    },
-    "response": {
-        "id": "#response",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-response.json"
-            },
-            {
-                "$ref": "#/definitions/response-obj"
-            }
-        ],
-        "definitions": {
-            "response-obj": {
-                "id": "#response-obj",
-                "properties": {
-                    "result": {
-                        "type": "array",
-                        "items": {
-                            "type": "object",
-                            "properties": {
-                                "address": {
-                                    "type": "string"
-                                },
-                                "topics": {
-                                    "type": "array",
-                                    "items": {
-                                        "type": "string"
-                                    }
-                                },
-                                "data": {
-                                    "type": "string"
-                                },
-                                "blockHash": {
-                                    "type": "string"
-                                },
-                                "blockNumber": {
-                                    "type": "string"
-                                },
-                                "transactionHash": {
-                                    "type": "string"
-                                },
-                                "transactionIndex": {
-                                    "type": "string"
-                                },
-                                "logIndex": {
-                                    "type": "string"
-                                },
-                                "transactionLogIndex": {
-                                    "type": "string"
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/tests/interfaces/rpc/schemas/getFilterLogs.json b/tests/interfaces/rpc/schemas/getFilterLogs.json
deleted file mode 100644
index 4e705f933..000000000
--- a/tests/interfaces/rpc/schemas/getFilterLogs.json
+++ /dev/null
@@ -1,96 +0,0 @@
-{
-    "$schema": "http://json-schema.org/draft-04/schema#",
-    "title": "getFilterLogs",
-    "description": "getFilterLogs JSON-RPC method request and response schema.",
-    "request": {
-        "id": "#request",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-request.json"
-            },
-            {
-                "$ref": "#/definitions/request-obj"
-            }
-        ],
-        "definitions": {
-            "request-obj": {
-                "id": "#request-obj",
-                "properties": {
-                    "method": {
-                        "type": "string",
-                        "enum": [
-                            "getFilterLogs"
-                        ]
-                    },
-                    "params": {
-                        "type": "array",
-                        "items": [
-                            {
-                                "type": "string",
-                                "description": "`QUANTITY` - The filter id."
-                            }
-                        ],
-                        "minItems": 1,
-                        "maxItems": 1
-                    }
-                }
-            }
-        }
-    },
-    "response": {
-        "id": "#response",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-response.json"
-            },
-            {
-                "$ref": "#/definitions/response-obj"
-            }
-        ],
-        "definitions": {
-            "response-obj": {
-                "id": "#response-obj",
-                "properties": {
-                    "result": {
-                        "type": "array",
-                        "items": {
-                            "type": "object",
-                            "properties": {
-                                "address": {
-                                    "type": "string"
-                                },
-                                "topics": {
-                                    "type": "array",
-                                    "items": {
-                                        "type": "string"
-                                    }
-                                },
-                                "data": {
-                                    "type": "string"
-                                },
-                                "blockHash": {
-                                    "type": "string"
-                                },
-                                "blockNumber": {
-                                    "type": "string"
-                                },
-                                "transactionHash": {
-                                    "type": "string"
-                                },
-                                "transactionIndex": {
-                                    "type": "string"
-                                },
-                                "logIndex": {
-                                    "type": "string"
-                                },
-                                "transactionLogIndex": {
-                                    "type": "string"
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/tests/interfaces/rpc/schemas/getLogs.json b/tests/interfaces/rpc/schemas/getLogs.json
deleted file mode 100644
index abeefc92c..000000000
--- a/tests/interfaces/rpc/schemas/getLogs.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "getLogs",
-  "description": "getLogs JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "getLogs.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "topics": {
-        "type": "array",
-        "items": {
-          "oneOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            },
-            {
-              "$ref": "getLogs.json#/request/definitions/topics"
-            }
-          ]
-        }
-      },
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "getLogs"
-            ]
-          },
-          "params": {
-            "type": "array",
-            "items": [
-              {
-                "type": "object",
-                "properties": {
-                  "fromBlock": {
-                    "type": "string",
-                    "description": "QUANTITY|TAG - (optional, default: latest) Integer block number(Hex string), or latest or earliest."
-                  },
-                  "toBlock": {
-                    "type": "string",
-                    "description": "QUANTITY|TAG - (optional, default: latest) Integer block number(Hex string), or latest or earliest."
-                  },
-                  "address": {
-                    "oneOf": [
-                      {
-                        "type": "string"
-                      },
-                      {
-                        "type": "array",
-                        "items": {
-                          "type": "string"
-                        }
-                      }
-                    ],
-                    "description": "DATA|Array, 20 Bytes - (optional) Contract address or a list of addresses from which logs should originate."
-                  },
-                  "topics": {
-                    "$ref": "getLogs.json#/request/definitions/topics"
-                  }
-                }
-              }
-            ],
-            "minItems": 1,
-            "maxItems": 1
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "getLogs.json#/response/definitions/response-obj"
-      }
-    ],
-    "definitions": {
-      "response-obj": {
-        "id": "#response-obj",
-        "properties": {
-          "result": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "address": {
-                  "type": "string"
-                },
-                "topics": {
-                  "type": "array",
-                  "items": {
-                    "type": "string"
-                  }
-                },
-                "data": {
-                  "type": "string"
-                },
-                "blockHash": {
-                  "type": "string"
-                },
-                "blockNumber": {
-                  "type": "string"
-                },
-                "transactionHash": {
-                  "type": "string"
-                },
-                "transactionIndex": {
-                  "type": "string"
-                },
-                "logIndex": {
-                  "type": "string"
-                },
-                "transactionLogIndex": {
-                  "type": "string"
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/getMetaData.json b/tests/interfaces/rpc/schemas/getMetaData.json
deleted file mode 100644
index 1ab247d66..000000000
--- a/tests/interfaces/rpc/schemas/getMetaData.json
+++ /dev/null
@@ -1,110 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "getMetaData",
-  "description": "getMetaData JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "getMetaData.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "getMetaData"
-            ]
-          },
-          "params": {
-            "type": "array",
-            "items": [
-              {
-                "type": "string",
-                "description": "QUANTITY|TAG - integer of a block number, or the string \"earliest\", \"latest\", as in the default block parameter."
-              }
-            ],
-            "minItems": 1,
-            "maxItems": 1
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "getMetaData.json#/response/definitions/response-obj"
-      }
-    ],
-    "definitions": {
-      "response-obj": {
-        "properties": {
-          "result": {
-            "type": "object",
-            "properties": {
-              "chainId": {
-                "type": "integer",
-                "description": "The id of current chain"
-              },
-              "chainName": {
-                "type": "string",
-                "description": "The name of current chain"
-              },
-              "operator": {
-                "type": "string",
-                "description": "The operator of current chain"
-              },
-              "website": {
-                "type": "string",
-                "description": "Current operator's website URL"
-              },
-              "genesisTimestamp": {
-                "type": "integer",
-                "description": "Genesis block's timestamp (milliseconds)"
-              },
-              "validators": {
-                "type": "array",
-                "items": [
-                  {
-                    "type": "string",
-                    "description": "Node's address"
-                  }
-                ]
-              },
-              "blockInterval": {
-                "type": "integer",
-                "description": "The interval time for creating a block (milliseconds)"
-              },
-              "tokenName": {
-                "type": "string"
-              },
-              "tokenSymbol": {
-                "type": "string"
-              },
-              "tokenAvata": {
-                "type": "string"
-              },
-              "version": {
-                "type": "integer"
-              },
-              "economicalModel": {
-                "type": "integer"
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/getTransaction.json b/tests/interfaces/rpc/schemas/getTransaction.json
deleted file mode 100644
index 9783ad10e..000000000
--- a/tests/interfaces/rpc/schemas/getTransaction.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "getTransaction",
-  "description": "getTransaction JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "getTransaction.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "getTransaction"
-            ]
-          },
-          "params": {
-            "type": "array",
-            "items": [
-              {
-                "type": "string",
-                "description": "DATA, transaction data"
-              }
-            ],
-            "minItems": 1,
-            "maxItems": 1
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "getTransaction.json#/response/definitions/response-obj"
-      }
-    ],
-    "definitions": {
-      "response-obj": {
-        "properties": {
-          "result": {
-            "type": "object",
-            "properties": {
-              "hash": {
-                "type": "string"
-              },
-              "content": {
-                "type": "string"
-              },
-              "blockNumber": {
-                "type": "string"
-              },
-              "blockHash": {
-                "type": "string"
-              },
-              "index": {
-                "type": "string"
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/getTransactionCount.json b/tests/interfaces/rpc/schemas/getTransactionCount.json
deleted file mode 100644
index 06fb0efae..000000000
--- a/tests/interfaces/rpc/schemas/getTransactionCount.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "getTransactionCount",
-  "description": "getTransactionCount JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "getTransactionCount.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "getTransactionCount"
-            ]
-          },
-          "params": {
-            "type": "array",
-            "items": [
-              {
-                "type": "string",
-                "description": "DATA - 20 Bytes - address."
-              },
-              {
-                "type": "string",
-                "description": "QUANTITY|TAG - integer block number(Hex string), or the string 'latest', 'earliest'"
-              }
-            ],
-            "minItems": 2,
-            "maxItems": 2
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "getTransactionCount.json#/response/definitions/response-obj"
-      }
-    ],
-    "definitions": {
-      "response-obj": {
-        "properties": {
-          "result": {
-            "type": "string",
-            "description": "QUANTITY"
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/getTransactionReceipt.json b/tests/interfaces/rpc/schemas/getTransactionReceipt.json
deleted file mode 100644
index 3b53e9112..000000000
--- a/tests/interfaces/rpc/schemas/getTransactionReceipt.json
+++ /dev/null
@@ -1,191 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "getTransactionReceipt",
-  "description": "getTransactionReceipt JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "getTransactionReceipt.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "getTransactionReceipt"
-            ]
-          },
-          "params": {
-            "type": "array",
-            "items": [
-              {
-                "type": "string",
-                "description": "DATA, 32 Bytes - Hash of a block."
-              }
-            ],
-            "minItems": 1,
-            "maxItems": 1
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "getTransactionReceipt.json#/response/definitions/response-obj"
-      }
-    ],
-    "definitions": {
-      "response-obj": {
-        "id": "#response-obj",
-        "properties": {
-          "result": {
-            "oneOf": [
-              {
-                "type": "null",
-                "description": "When with invalid transaction hash"
-              },
-              {
-                "type": "object",
-                "properties": {
-                  "transactionHash": {
-                    "type": "string",
-                    "description": "DATA, 32 Bytes - hash of the transaction."
-                  },
-                  "transactionIndex": {
-                    "type": "string",
-                    "description": "QUANTITY - transaction index in the block."
-                  },
-                  "blockHash": {
-                    "type": "string",
-                    "description": "DATA, 32 Bytes - hash of the block where this transaction was in. null when its not in block."
-                  },
-                  "blockNumber": {
-                    "type": "string",
-                    "description": "QUANTITY - block number where this transaction was in. null when its not in block"
-                  },
-                  "cumulativeQuotaUsed": {
-                    "type": "string",
-                    "description": "QUANTITY - The total amount of quota used when this transaction was executed in the block."
-                  },
-                  "quotaUsed": {
-                    "type": "string",
-                    "description": "QUANTITY - The amount of quota used by this specific transaction alone."
-                  },
-                  "contractAddress": {
-                    "oneOf": [
-                      {
-                        "type": "string",
-                        "description": "DATA, 20 Bytes - The contract address created, if the transaction was a contract creation, otherwise null."
-                      },
-                      {
-                        "type": "null"
-                      }
-                    ]
-                  },
-                  "logs": {
-                    "type": "array",
-                    "items": {
-                      "type": "object",
-                      "properties": {
-                        "address": {
-                          "type": "string"
-                        },
-                        "topics": {
-                          "type": "array",
-                          "items": [
-                            {
-                              "type": "string"
-                            }
-                          ]
-                        },
-                        "data": {
-                          "type": "string"
-                        },
-                        "blockHash": {
-                          "type": "string"
-                        },
-                        "blockNumber": {
-                          "type": "string"
-                        },
-                        "transactionHash": {
-                          "type": "string"
-                        },
-                        "transactionIndex": {
-                          "type": "string"
-                        },
-                        "logIndex": {
-                          "type": "string"
-                        },
-                        "transactionLogIndex": {
-                          "type": "string"
-                        }
-                      },
-                      "required": [
-                        "address",
-                        "topics",
-                        "data",
-                        "blockHash",
-                        "blockNumber",
-                        "transactionHash",
-                        "transactionIndex",
-                        "logIndex",
-                        "transactionLogIndex"
-                      ]
-                    }
-                  },
-                  "root": {
-                    "oneOf": [
-                      {
-                        "type": "string",
-                        "description": "DATA 32 bytes of post-transaction stateroot."
-                      },
-                      {
-                        "type": "null"
-                      }
-                    ]
-                  },
-                  "errorMessage": {
-                    "oneOf": [
-                      {
-                        "type": "string",
-                        "description": "error message, optional"
-                      },
-                      {
-                        "type": "null"
-                      }
-                    ]
-                  }
-                },
-                "required": [
-                  "transactionHash",
-                  "transactionIndex",
-                  "blockHash",
-                  "blockNumber",
-                  "cumulativeQuotaUsed",
-                  "quotaUsed",
-                  "contractAddress",
-                  "logs",
-                  "root",
-                  "errorMessage"
-                ]
-              }
-            ]
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/getVersion.json b/tests/interfaces/rpc/schemas/getVersion.json
deleted file mode 100644
index dca666845..000000000
--- a/tests/interfaces/rpc/schemas/getVersion.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "getVersion",
-  "description": "getVersion JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "getVersion.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "getVersion"
-            ]
-          },
-          "params": {
-            "oneOf": [
-              {
-                "type": "array",
-                "maxItems": 0
-              }
-            ]
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "getVersion.json#/response/definitions/response-obj"
-      }
-    ],
-    "definitions": {
-      "response-obj": {
-        "properties": {
-          "result": {
-            "type": "object",
-            "properties": {
-              "softwareVersion": {
-                "type": "string",
-                "description": "The version of software"
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/jsonrpc-request.json b/tests/interfaces/rpc/schemas/jsonrpc-request.json
deleted file mode 100644
index 5600e208c..000000000
--- a/tests/interfaces/rpc/schemas/jsonrpc-request.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
-    "$schema": "http://json-schema.org/draft-04/schema#",
-    "description": "A JSON RPC 2.0 request, source https://github.com/fge/sample-json-schemas",
-    "oneOf": [
-        {
-            "description": "An individual request",
-            "$ref": "#/definitions/request"
-        },
-        {
-            "description": "An array of requests",
-            "type": "array",
-            "items": {
-                "$ref": "#/definitions/request"
-            }
-        }
-    ],
-    "definitions": {
-        "request": {
-            "type": "object",
-            "required": [
-                "jsonrpc",
-                "method"
-            ],
-            "properties": {
-                "jsonrpc": {
-                    "enum": [
-                        "2.0",
-                        "1.0"
-                    ]
-                },
-                "method": {
-                    "type": "string"
-                },
-                "id": {
-                    "type": [
-                        "string",
-                        "number",
-                        "null"
-                    ],
-                    "note": [
-                        "While allowed, null should be avoided: http://www.jsonrpc.org/specification#id1",
-                        "While allowed, a number with a fractional part should be avoided: http://www.jsonrpc.org/specification#id2"
-                    ]
-                },
-                "params": {
-                    "type": [
-                        "array",
-                        "object"
-                    ]
-                }
-            }
-        }
-    }
-}
diff --git a/tests/interfaces/rpc/schemas/jsonrpc-response.json b/tests/interfaces/rpc/schemas/jsonrpc-response.json
deleted file mode 100644
index 76bd2d3e3..000000000
--- a/tests/interfaces/rpc/schemas/jsonrpc-response.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
-    "$schema": "http://json-schema.org/draft-04/schema#",
-    "description": "A JSON RPC 2.0 response, source https://github.com/fge/sample-json-schemas",
-    "oneOf": [
-        {
-            "$ref": "#/definitions/success"
-        },
-        {
-            "$ref": "#/definitions/error"
-        },
-        {
-            "type": "array",
-            "items": {
-                "oneOf": [
-                    {
-                        "$ref": "#/definitions/success"
-                    },
-                    {
-                        "$ref": "#/definitions/error"
-                    }
-                ]
-            }
-        }
-    ],
-    "definitions": {
-        "common": {
-            "required": [
-                "id",
-                "jsonrpc"
-            ],
-            "not": {
-                "description": "cannot have result and error at the same time",
-                "required": [
-                    "result",
-                    "error"
-                ]
-            },
-            "type": "object",
-            "properties": {
-                "id": {
-                    "type": [
-                        "string",
-                        "integer",
-                        "null"
-                    ],
-                    "note": [
-                        "spec says a number which should not contain a fractional part",
-                        "We choose integer here, but this is unenforceable with some languages"
-                    ]
-                },
-                "jsonrpc": {
-                    "enum": [
-                        "2.0",
-                        "1.0"
-                    ]
-                }
-            }
-        },
-        "success": {
-            "description": "A success. The result member is then required and can be anything.",
-            "allOf": [
-                {
-                    "$ref": "#/definitions/common"
-                },
-                {
-                    "required": [
-                        "result"
-                    ]
-                }
-            ]
-        },
-        "error": {
-            "allOf": [
-                {
-                    "$ref": "#/definitions/common"
-                },
-                {
-                    "required": [
-                        "error"
-                    ],
-                    "properties": {
-                        "error": {
-                            "type": "object",
-                            "required": [
-                                "code",
-                                "message"
-                            ],
-                            "properties": {
-                                "code": {
-                                    "type": "integer",
-                                    "note": [
-                                        "unenforceable in some languages"
-                                    ]
-                                },
-                                "message": {
-                                    "type": "string"
-                                },
-                                "data": {
-                                    "description": "optional, can be anything"
-                                }
-                            }
-                        }
-                    }
-                }
-            ]
-        }
-    }
-}
diff --git a/tests/interfaces/rpc/schemas/newBlockFilter.json b/tests/interfaces/rpc/schemas/newBlockFilter.json
deleted file mode 100644
index 5319ea423..000000000
--- a/tests/interfaces/rpc/schemas/newBlockFilter.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
-    "$schema": "http://json-schema.org/draft-04/schema#",
-    "title": "newBlockFilter",
-    "description": "newBlockFilter JSON-RPC method request and response schema.",
-    "request": {
-        "id": "#request",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-request.json"
-            },
-            {
-                "$ref": "#/request/definitions/request-obj"
-            }
-        ],
-        "definitions": {
-            "request-obj": {
-                "id": "#request-obj",
-                "properties": {
-                    "method": {
-                        "type": "string",
-                        "enum": [
-                            "newBlockFilter"
-                        ]
-                    },
-                    "params": {
-                        "type": "array",
-                        "maxItems": 0
-                    }
-                }
-            }
-        }
-    },
-    "response": {
-        "id": "#response",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-response.json"
-            },
-            {
-                "$ref": "#/response/definitions/response-obj"
-            }
-        ],
-        "definitions": {
-            "response-obj": {
-                "properties": {
-                    "result": {
-                        "type": "string",
-                        "description": "QUANTITY"
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/tests/interfaces/rpc/schemas/newFilter.json b/tests/interfaces/rpc/schemas/newFilter.json
deleted file mode 100644
index f800f1e21..000000000
--- a/tests/interfaces/rpc/schemas/newFilter.json
+++ /dev/null
@@ -1,100 +0,0 @@
-{
-    "$schema": "http://json-schema.org/draft-04/schema#",
-    "title": "newFilter",
-    "description": "newFilter JSON-RPC method request and response schema.",
-    "request": {
-        "id": "#request",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-request.json"
-            },
-            {
-                "$ref": "#/definitions/request-obj"
-            }
-        ],
-        "definitions": {
-            "request-obj": {
-                "id": "#request-obj",
-                "properties": {
-                    "method": {
-                        "type": "string",
-                        "enum": [
-                            "newFilter"
-                        ]
-                    },
-                    "params": {
-                        "type": "array",
-                        "items": [
-                            {
-                                "type": "object",
-                                "properties": {
-                                    "fromBlock": {
-                                        "type": "string",
-                                        "description": "QUANTITY|TAG - (optional, default: latest) Integer block number(Hex string), or latest or earliest."
-                                    },
-                                    "toBlock": {
-                                        "type": "string",
-                                        "description": "QUANTITY|TAG - (optional, default: latest) Integer block number(Hex string), or latest or earliest."
-                                    },
-                                    "address": {
-                                        "oneOf": [
-                                            {
-                                                "type": "string"
-                                            },
-                                            {
-                                                "type": "array",
-                                                "items": {
-                                                    "type": "string"
-                                                }
-                                            }
-                                        ],
-                                        "description": "DATA|Array, 20 Bytes - (optional) Contract address or a list of addresses from which logs should originate."
-                                    },
-                                    "topics": {
-                                        "type": "array",
-                                        "items": {
-                                            "oneOf": [
-                                                {
-                                                    "type": "string"
-                                                },
-                                                {
-                                                    "type": "null"
-                                                },
-                                                {
-                                                    "$ref": "#topics"
-                                                }
-                                            ]
-                                        }
-                                    }
-                                }
-                            }
-                        ],
-                        "minItems": 1,
-                        "maxItems": 1
-                    }
-                }
-            }
-        }
-    },
-    "response": {
-        "id": "#response",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-response.json"
-            },
-            {
-                "$ref": "#/definitions/response-obj"
-            }
-        ],
-        "definitions": {
-            "response-obj": {
-                "id": "#response-obj",
-                "properties": {
-                    "result": {
-                        "type": "string"
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/tests/interfaces/rpc/schemas/peerCount.json b/tests/interfaces/rpc/schemas/peerCount.json
deleted file mode 100644
index d45d7bb0c..000000000
--- a/tests/interfaces/rpc/schemas/peerCount.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
-    "$schema": "http://json-schema.org/draft-04/schema#",
-    "title": "peerCount",
-    "description": "peerCount JSON-RPC method request and response schema.",
-    "request": {
-        "id": "#request",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-request.json"
-            },
-            {
-                "$ref": "#/request/definitions/request-obj"
-            }
-        ],
-        "definitions": {
-            "request-obj": {
-                "id": "#request-obj",
-                "properties": {
-                    "method": {
-                        "type": "string",
-                        "enum": [
-                            "peerCount"
-                        ]
-                    },
-                    "params": {
-                        "oneOf": [
-                            {
-                                "type": "array",
-                                "maxItems": 0
-                            }
-                        ]
-                    }
-                }
-            }
-        }
-    },
-    "response": {
-        "id": "#response",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-response.json"
-            },
-            {
-                "$ref": "#/response/definitions/response-obj"
-            }
-        ],
-        "definitions": {
-            "response-obj": {
-                "properties": {
-                    "result": {
-                        "type": "string",
-                        "description": "QUANTITY - peer count."
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/tests/interfaces/rpc/schemas/peersInfo.json b/tests/interfaces/rpc/schemas/peersInfo.json
deleted file mode 100644
index 3ee810209..000000000
--- a/tests/interfaces/rpc/schemas/peersInfo.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
-  "$schema": "http://json-schema.org/draft-04/schema#",
-  "title": "peersInfo",
-  "description": "peersInfo JSON-RPC method request and response schema.",
-  "request": {
-    "id": "#request",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-request.json"
-      },
-      {
-        "$ref": "peersInfo.json#/request/definitions/request-obj"
-      }
-    ],
-    "definitions": {
-      "request-obj": {
-        "id": "#request-obj",
-        "properties": {
-          "method": {
-            "type": "string",
-            "enum": [
-              "peersInfo"
-            ]
-          },
-          "params": {
-            "oneOf": [
-              {
-                "type": "array",
-                "maxItems": 0
-              }
-            ]
-          }
-        }
-      }
-    }
-  },
-  "response": {
-    "id": "#response",
-    "allOf": [
-      {
-        "$ref": "jsonrpc-response.json"
-      },
-      {
-        "$ref": "peersInfo.json#/response/definitions/response-obj"
-      }
-    ],
-    "definitions": {
-      "response-obj": {
-        "properties": {
-          "result": {
-            "type": "object",
-            "properties": {
-              "amount": {
-                "type": "integer",
-                "description": "The amount of peers connected in this node"
-              },
-              "peers": {
-                "type": "object",
-                "description": "The peers info, including peer address and peer ip"
-	          },
-	          "errorMessage": {
-                  "oneOf": [
-                      {
-                          "type": "string",
-                          "description": "Error message for this call"
-                      },
-                      {
-                          "type": "null"
-                      }
-                  ]
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/tests/interfaces/rpc/schemas/sendTransaction.json b/tests/interfaces/rpc/schemas/sendTransaction.json
deleted file mode 100644
index 888d8c152..000000000
--- a/tests/interfaces/rpc/schemas/sendTransaction.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-    "$schema": "http://json-schema.org/draft-04/schema#",
-    "title": "sendRawTransaction",
-    "description": "sendRawTransaction JSON-RPC method request and response schema.",
-    "request": {
-        "id": "#request",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-request.json"
-            },
-            {
-                "$ref": "#/request/definitions/request-obj"
-            }
-        ],
-        "definitions": {
-            "request-obj": {
-                "id": "#request-obj",
-                "properties": {
-                    "method": {
-                        "type": "string",
-                        "enum": [
-                            "sendRawTransaction"
-                        ]
-                    },
-                    "params": {
-                        "type": "array",
-                        "items": [
-                            {
-                                "type": "string",
-                                "description": "DATA, transaction data"
-                            }
-                        ],
-                        "minItems": 1,
-                        "maxItems": 1
-                    }
-                }
-            }
-        }
-    },
-    "response": {
-        "id": "#response",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-response.json"
-            },
-            {
-                "$ref": "#/response/definitions/response-obj"
-            }
-        ],
-        "definitions": {
-            "response-obj": {
-                "properties": {
-                    "result": {
-                        "type": "string",
-                        "description": "DATA, 32 Bytes - hash of the transaction."
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/tests/interfaces/rpc/schemas/uninstallFilter.json b/tests/interfaces/rpc/schemas/uninstallFilter.json
deleted file mode 100644
index 256fcea76..000000000
--- a/tests/interfaces/rpc/schemas/uninstallFilter.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-    "$schema": "http://json-schema.org/draft-04/schema#",
-    "title": "uninstallFilter",
-    "description": "uninstallFilter JSON-RPC method request and response schema.",
-    "request": {
-        "id": "#request",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-request.json"
-            },
-            {
-                "$ref": "#/request/definitions/request-obj"
-            }
-        ],
-        "definitions": {
-            "request-obj": {
-                "id": "#request-obj",
-                "properties": {
-                    "method": {
-                        "type": "string",
-                        "enum": [
-                            "uninstallFilter"
-                        ]
-                    },
-                    "params": {
-                        "type": "array",
-                        "items": [
-                            {
-                                "type": "string",
-                                "description": "`QUANTITY` - The filter id."
-                            }
-                        ],
-                        "minItems": 1,
-                        "maxItems": 1
-                    }
-                }
-            }
-        }
-    },
-    "response": {
-        "id": "#response",
-        "allOf": [
-            {
-                "$ref": "jsonrpc-response.json"
-            },
-            {
-                "$ref": "#/response/definitions/response-obj"
-            }
-        ],
-        "definitions": {
-            "response-obj": {
-                "properties": {
-                    "result": {
-                        "type": "boolean",
-                        "description": "true if the filter was successfully uninstalled, otherwise false."
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/tests/interfaces/rpc/tests/blockNumber.json b/tests/interfaces/rpc/tests/blockNumber.json
deleted file mode 100644
index 5b29353ee..000000000
--- a/tests/interfaces/rpc/tests/blockNumber.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-  "title": "blockNumber",
-  "schema": {
-    "$ref": "../schemas/blockNumber.json"
-  },
-  "tests": [
-    {
-      "title": "Simple blockNumber",
-      "request": {
-        "method": "blockNumber",
-        "params": []
-      },
-      "expectedResponse": {
-        "result": "0xe"
-      },
-      "asserts": [
-        {
-          "description": "response should be equal",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/interfaces/rpc/tests/call.json b/tests/interfaces/rpc/tests/call.json
deleted file mode 100644
index e553c1965..000000000
--- a/tests/interfaces/rpc/tests/call.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "title": "call",
-  "schema": {
-    "$ref": "../schemas/call.json"
-  },
-  "tests": [
-    {
-      "title": "call with params and success",
-      "request": {
-        "method": "call",
-        "params": [
-          {
-            "to": "0xa31af83ee35e753a2bb19c2a82468080c2e92eee",
-            "data": "0x6d4ce63c"
-          },
-          "0xd"
-        ]
-      },
-      "expectedResponse": {
-        "result": "0x0000000000000000000000000000000000000000000000000000000011228899"
-      },
-      "asserts": [
-        {
-          "description": "call result should be equal (SimpleStorage::get())",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    },
-    {
-      "title": "call with wrong param `to`",
-      "request": {
-        "method": "call",
-        "params": [
-          {
-            "to": "0xeffb1dab2e6ed61aa213eacaefbd1a9a41000000",
-            "data": "0x6d4ce63c"
-          },
-          "0xd"
-        ]
-      },
-      "expectedResponse": {
-        "result": "0x"
-      },
-      "asserts": [
-        {
-          "description": "call with nonexistent address should return empty result(0x) (SimpleStorage::get())",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    },
-    {
-      "title": "call with no parameters",
-      "request": {
-        "method": "call",
-        "params": [],
-        "shouldFailSchema": true
-      },
-      "expectedResponse": {
-        "error": {
-          "message": "missing value for required argument 0",
-          "code": -32602
-        }
-      },
-      "asserts": [
-        {
-          "description": "response should be an error",
-          "program": ".receivedResponse.error != null"
-        },
-        {
-          "description": "error code should be -32602",
-          "program": ".receivedResponse.error.code == .expectedResponse.error.code"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/interfaces/rpc/tests/getAbi.json b/tests/interfaces/rpc/tests/getAbi.json
deleted file mode 100644
index 9b0057d6d..000000000
--- a/tests/interfaces/rpc/tests/getAbi.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "title": "getAbi",
-  "schema": {
-    "$ref": "../schemas/getAbi.json"
-  },
-  "tests": [
-    {
-      "title": "getAbi with params and success",
-      "request": {
-        "method": "getAbi",
-        "params": [
-          "0xa31af83ee35e753a2bb19c2a82468080c2e92eee",
-          "pending"
-        ]
-      },
-      "expectedResponse": {
-        "result": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000030f5b7b22636f6e7374616e74223a66616c73652c22696e70757473223a5b7b226e616d65223a2278222c2274797065223a2275696e74323536227d5d2c226e616d65223a22736574222c226f757470757473223a5b5d2c2270617961626c65223a66616c73652c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22636f6e7374616e74223a747275652c22696e70757473223a5b5d2c226e616d65223a22676574222c226f757470757473223a5b7b226e616d65223a22222c2274797065223a2275696e74323536227d5d2c2270617961626c65223a66616c73652c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c2270617961626c65223a66616c73652c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a22636f6e7374727563746f72227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c226e616d65223a22222c2274797065223a2261646472657373227d2c7b22696e6465786564223a66616c73652c226e616d65223a22222c2274797065223a2275696e74323536227d5d2c226e616d65223a22496e6974222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c226e616d65223a22222c2274797065223a2261646472657373227d2c7b22696e6465786564223a66616c73652c226e616d65223a22222c2274797065223a2275696e74323536227d5d2c226e616d65223a22536574222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c226e616d65223a22222c2274797065223a2275696e74323536227d5d2c226e616d65223a2253746f726564222c2274797065223a226576656e74227d5d0000000000000000000000000000000000"
-      },
-      "asserts": [
-        {
-          "description": "getAbi result should be equal",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    },
-    {
-      "title": "getAbi with wrong param `contract address`",
-      "request": {
-        "method": "getAbi",
-        "params": [
-          "0xeffb1dab2e6ed61aa213eacaefbd1a9a41000000",
-          "pending"
-        ]
-      },
-      "expectedResponse": {
-        "result": "0x"
-      },
-      "asserts": [
-        {
-          "description": "getAbi with nonexistent address should return empty result(0x)",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    },
-    {
-      "title": "getAbi with no parameters",
-      "request": {
-        "method": "getAbi",
-        "params": [],
-        "shouldFailSchema": true
-      },
-      "expectedResponse": {
-        "error": {
-          "message": "missing value for required argument 0",
-          "code": -32602
-        }
-      },
-      "asserts": [
-        {
-          "description": "response should be an error",
-          "program": ".receivedResponse.error != null"
-        },
-        {
-          "description": "error code should be -32602",
-          "program": ".receivedResponse.error.code == .expectedResponse.error.code"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/interfaces/rpc/tests/getBlockByNumber.json b/tests/interfaces/rpc/tests/getBlockByNumber.json
deleted file mode 100644
index db783d700..000000000
--- a/tests/interfaces/rpc/tests/getBlockByNumber.json
+++ /dev/null
@@ -1,180 +0,0 @@
-{
-  "title": "getBlockByNumber",
-  "schema": {
-    "$ref": "../schemas/getBlockByNumber.json"
-  },
-  "tests": [
-    {
-      "title": "getBlockByNumber without full transactions",
-      "request": {
-        "method": "getBlockByNumber",
-        "params": [
-          "0x1",
-          false
-        ]
-      },
-      "expectedResponse": {
-        "result": {
-          "body": {
-            "transactions": []
-          },
-          "header": {
-            "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-            "timestamp": 1524000003000,
-            "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-            "number": "0x1",
-            "stateRoot": "0xa420c038e87b94f4ce35ec52f202a4273601fb7c4066a3bdd71e6a5051a27f9d",
-            "proposer": "0x0000000000000000000000000000000000000000",
-            "proof": null,
-            "prevHash": "0x1cb3a47e4c8f8523e9769b9bfdd8f627acdf8441633931befb639e21e27fd9a7",
-            "quotaUsed": "0x0"
-          },
-          "version": 0,
-          "hash": "0x19d6117ac0a8e2bff5798b64a3ab6e0f723103a62f6ef1f4cadcee90563b783a"
-        }
-      },
-      "asserts": [
-        {
-          "description": "BlockNumber has blockHeader hash",
-          "program": ".receivedResponse.result.header.number == .expectedResponse.result.header.number"
-        },
-        {
-          "description": "transactionsRoot should be equal",
-          "program": ".receivedResponse.result.header.transactionsRoot == .expectedResponse.result.header.transactionsRoot"
-        },
-        {
-          "description": "receiptsRoot should be equal",
-          "program": ".receivedResponse.result.header.receiptsRoot == .expectedResponse.result.header.receiptsRoot"
-        },
-        {
-          "description": "transactions should be []",
-          "program": "(.receivedResponse.result.transactions | length) == 0"
-        },
-        {
-          "description": "proposer should be equal",
-          "program": ".receivedResponse.result.proposer == .expectedResponse.result.proposer"
-        }
-      ]
-    },
-    {
-      "title": "getBlockByNumber with full transactions",
-      "request": {
-        "method": "getBlockByNumber",
-        "params": [
-          "0x2",
-          true
-        ]
-      },
-      "expectedResponse": {
-        "result": {
-          "version": 0,
-          "hash": "0x35cd08bbcca3fa970d315c8cd13114675e7604e384abeaeba6e1f7eb4d2e2140",
-          "header": {
-            "timestamp": 1524000006000,
-            "prevHash": "0x893da150f0d4d115b9df51dfa945df08b277696fc63eccbf352bc6ac49aec924",
-            "number": "0x2",
-            "stateRoot": "0x64e21eb904b8862f81249287e716031786a22078d570327bab8413632a39b39a",
-            "transactionsRoot": "0xd7363c838d68065c7a8b02b2f5e27efe15c512f421a4a6ede23ef0a389ca7ef6",
-            "receiptsRoot": "0x70c729037e4abdb23544bd676a6217dcddf767aae53b7168df11a8082c1d2a6e",
-            "quotaUsed": "0xc8c7",
-            "proof": {
-              "Bft": {
-                "proposal": "0x0000000000000000000000000000000000000000000000000000000000000000",
-                "height": 1,
-                "round": 0,
-                "commits": {
-                  "0x31d40cd88d6a884d2c95cf261c9f8ca495240af2": "0x34dcb4f04b5315365566422e2ec37ad78087a0338b4f99b45e56262069f69ad25323adff577862ddec9ac2ef5568440982cefd3c62783ff2ee1f4e7a3286073e00"
-                }
-              }
-            },
-            "proposer": "0x0000000000000000000000000000000000000000"
-          },
-          "body": {
-            "transactions": [
-              {
-                "hash": "0xd7363c838d68065c7a8b02b2f5e27efe15c512f421a4a6ede23ef0a389ca7ef6",
-                "content": "0x0ad00212013018a08d0620642aa002608060405234801561001057600080fd5b50610100806100206000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806382ab890a146044575b600080fd5b348015604f57600080fd5b50606c6004803603810190808035906020019092919050505060b5565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b60008082600080828254019250508190555033600054915091509150915600a165627a7a72305820e793b33d4ad38d89ddac8d58b2b81209ff512166ee08efc51df13795c96f29a9002932200000000000000000000000000000000000000000000000000000000000000000387b12413d1b3a31fd82d11f4e50d4d6f2164e301a0582b4052c0e54f691bb5692d3a37e4289f94ad571287dd200a8acb5cf6d999f955e326f8dd2054a08854ccced1c3101"
-              }
-            ]
-          }
-        }
-      },
-      "asserts": [
-        {
-          "description": "BlockNumber has blockHeader hash",
-          "program": ".receivedResponse.result.header.number == .expectedResponse.result.header.number"
-        },
-        {
-          "description": "transactionsRoot should be equal",
-          "program": ".receivedResponse.result.header.transactionsRoot == .expectedResponse.result.header.transactionsRoot"
-        },
-        {
-          "description": "receiptsRoot should be equal",
-          "program": ".receivedResponse.result.header.receiptsRoot == .expectedResponse.result.header.receiptsRoot"
-        },
-        {
-          "description": "transactions[0].hash should be the same",
-          "program": ".receivedResponse.result.transactions[0].hash == .expectedResponse.result.transactions[0].hash"
-        },
-        {
-          "description": "transactions[0].content should be the same",
-          "program": ".receivedResponse.result.transactions[0].content == .expectedResponse.result.transactions[0].content"
-        },
-        {
-          "description": "proposer should be equal",
-          "program": ".receivedResponse.result.proposer == .expectedResponse.result.proposer"
-        }
-      ]
-    },
-    {
-      "title": "getBlockByNumber with no parameters",
-      "request": {
-        "method": "getBlockByNumber",
-        "params": [],
-        "shouldFailSchema": true
-      },
-      "expectedResponse": {
-        "error": {
-          "message": "missing value for required argument 0",
-          "code": -32602
-        }
-      },
-      "asserts": [
-        {
-          "description": "response should be an error",
-          "program": ".receivedResponse.error != null"
-        },
-        {
-          "description": "error code should be -32602",
-          "program": ".receivedResponse.error.code == .expectedResponse.error.code"
-        }
-      ]
-    },
-    {
-      "title": "getBlockByNumber with one parameter",
-      "request": {
-        "method": "getBlockByNumber",
-        "params": [
-          "0xa"
-        ],
-        "shouldFailSchema": true
-      },
-      "expectedResponse": {
-        "error": {
-          "message": "missing value for required argument 1",
-          "code": -32602
-        }
-      },
-      "asserts": [
-        {
-          "description": "response should be an error",
-          "program": ".receivedResponse.error != null"
-        },
-        {
-          "description": "error code should be -32602",
-          "program": ".receivedResponse.error.code == .expectedResponse.error.code"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/interfaces/rpc/tests/getCode.json b/tests/interfaces/rpc/tests/getCode.json
deleted file mode 100644
index 14dd79781..000000000
--- a/tests/interfaces/rpc/tests/getCode.json
+++ /dev/null
@@ -1,89 +0,0 @@
-{
-  "title": "getCode",
-  "schema": {
-    "$ref": "../schemas/getCode.json"
-  },
-  "tests": [
-    {
-      "title": "getCode with params and success (HelloWorld.sol)",
-      "request": {
-        "method": "getCode",
-        "params": [
-          "0xfdde938c6f71b066eb34c1c92e5814186dbdcb5e",
-          "pending"
-        ]
-      },
-      "expectedResponse": {
-        "result": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806382ab890a146044575b600080fd5b348015604f57600080fd5b50606c6004803603810190808035906020019092919050505060b5565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b60008082600080828254019250508190555033600054915091509150915600a165627a7a72305820e793b33d4ad38d89ddac8d58b2b81209ff512166ee08efc51df13795c96f29a90029"
-      },
-      "asserts": [
-        {
-          "description": "getCode result should be equal",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    },
-    {
-      "title": "getCode with params and success (SimpleStorage.sol)",
-      "request": {
-        "method": "getCode",
-        "params": [
-          "0xa31af83ee35e753a2bb19c2a82468080c2e92eee",
-          "pending"
-        ]
-      },
-      "expectedResponse": {
-        "result": "0x60806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b1146100515780636d4ce63c1461007e575b600080fd5b34801561005d57600080fd5b5061007c600480360381019080803590602001909291905050506100a9565b005b34801561008a57600080fd5b50610093610155565b6040518082815260200191505060405180910390f35b7fc6d8c0af6d21f291e7c359603aa97e0ed500f04db6e983b9fce75a91c6b8da6b816040518082815260200191505060405180910390a1806000819055507ffd28ec3ec2555238d8ad6f9faf3e4cd10e574ce7e7ef28b73caa53f9512f65b93382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150565b600080549050905600a165627a7a723058200b008257b7c6ae78c1c2bde97f3c72005d0f7063ad98e02a3399ee94642fe7810029"
-      },
-      "asserts": [
-        {
-          "description": "getCode result should be equal",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    },
-    {
-      "title": "getCode with wrong address and get empty result",
-      "request": {
-        "method": "getCode",
-        "params": [
-          "0xeffb1dab2e6ed61aa213eacaefbd1a9a41e00000",
-          "pending"
-        ]
-      },
-      "expectedResponse": {
-        "result": "0x"
-      },
-      "asserts": [
-        {
-          "description": "getCode with nonexistent address should return empty result(0x)",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    },
-    {
-      "title": "getCode with no parameters",
-      "request": {
-        "method": "getCode",
-        "params": [],
-        "shouldFailSchema": true
-      },
-      "expectedResponse": {
-        "error": {
-          "message": "missing value for required argument 0",
-          "code": -32602
-        }
-      },
-      "asserts": [
-        {
-          "description": "response should be an error",
-          "program": ".receivedResponse.error != null"
-        },
-        {
-          "description": "error code should be -32602",
-          "program": ".receivedResponse.error.code == .expectedResponse.error.code"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/interfaces/rpc/tests/getLogs.json b/tests/interfaces/rpc/tests/getLogs.json
deleted file mode 100644
index 44d32f559..000000000
--- a/tests/interfaces/rpc/tests/getLogs.json
+++ /dev/null
@@ -1,155 +0,0 @@
-{
-  "title": "getLogs",
-  "schema": {
-    "$ref": "../schemas/getLogs.json"
-  },
-  "tests": [
-    {
-      "title": "getLogs with params and success",
-      "request": {
-        "method": "getLogs",
-        "params": [
-          {
-            "topics": ["0x8fb1356be6b2a4e49ee94447eb9dcb8783f51c41dcddfe7919f945017d163bf3"],
-            "fromBlock": "0x0",
-            "toBlock": "pending"
-          }
-        ]
-      },
-      "expectedResponse": {
-        "result": [
-          {
-            "address": "0xa31af83ee35e753a2bb19c2a82468080c2e92eee",
-            "blockHash": "0xbdb92db248f0a644300c76726be3966eea636e03c19236a57a92fb5b2c91a7a1",
-            "blockNumber": "0xc",
-            "data": "0x00000000000000000000000031d40cd88d6a884d2c95cf261c9f8ca495240af20000000000000000000000000000000000000000000000000000000000000064",
-            "logIndex": "0x0",
-            "topics": [
-              "0x8fb1356be6b2a4e49ee94447eb9dcb8783f51c41dcddfe7919f945017d163bf3"
-            ],
-            "transactionHash": "0xc5ad0b717f36ca25f8ba51356379a60e1bb0b3a087dc1bcbf4f33f8435ee5647",
-            "transactionIndex": "0x0",
-            "transactionLogIndex": "0x0"
-          }
-        ]
-      },
-      "asserts": [
-        {
-          "description": "getLogs data should be equal",
-          "program": ".receivedResponse.result[0].data == .expectedResponse.result[0].data"
-        },
-        {
-          "description": "getLogs transactionHash should be equal",
-          "program": ".receivedResponse.result[0].transactionHash == .expectedResponse.result[0].transactionHash"
-        }
-      ]
-    },
-    {
-      "title": "getLogs with params and success, return multiple results",
-      "request": {
-        "method": "getLogs",
-        "params": [
-          {
-            "topics": ["0xfd28ec3ec2555238d8ad6f9faf3e4cd10e574ce7e7ef28b73caa53f9512f65b9"],
-            "fromBlock": "0x0",
-            "toBlock": "pending"
-          }
-        ]
-      },
-      "expectedResponse": {
-        "result": [
-          {
-            "address": "0xa31af83ee35e753a2bb19c2a82468080c2e92eee",
-            "blockHash": "0x87d24baaa83e6dae8724eba9b74cda8d114eda6b12e772c9da8f461076b0f0d0",
-            "blockNumber": "0xd",
-            "data": "0x00000000000000000000000031d40cd88d6a884d2c95cf261c9f8ca495240af20000000000000000000000000000000000000000000000000000000011228899",
-            "logIndex": "0x1",
-            "topics": [
-              "0xfd28ec3ec2555238d8ad6f9faf3e4cd10e574ce7e7ef28b73caa53f9512f65b9"
-            ],
-            "transactionHash": "0x3cec6d1855956eb476e9fb26b0a3069614c00275aa7a6716fa5b08f9e1ecb978",
-            "transactionIndex": "0x0",
-            "transactionLogIndex": "0x1"
-          },
-          {
-            "address": "0xa31af83ee35e753a2bb19c2a82468080c2e92eee",
-            "blockHash": "0x9f019529228d46a89d16aa568c0f88b13189bc9d5bb46184d675d9e9508d200a",
-            "blockNumber": "0xe",
-            "data": "0x00000000000000000000000031d40cd88d6a884d2c95cf261c9f8ca495240af20000000000000000000000000000000000000000000000000000000011228899",
-            "logIndex": "0x1",
-            "topics": [
-              "0xfd28ec3ec2555238d8ad6f9faf3e4cd10e574ce7e7ef28b73caa53f9512f65b9"
-            ],
-            "transactionHash": "0x3cec6d1855956eb476e9fb26b0a3069614c00275aa7a6716fa5b08f9e1ecb978",
-            "transactionIndex": "0x0",
-            "transactionLogIndex": "0x1"
-          }
-        ]
-      },
-      "asserts": [
-        {
-          "description": "getLogs result[0].data should be equal",
-          "program": ".receivedResponse.result[0].data == .expectedResponse.result[0].data"
-        },
-        {
-          "description": "getLogs result[0].transactionHash should be equal",
-          "program": ".receivedResponse.result[0].transactionHash == .expectedResponse.result[0].transactionHash"
-        },
-        {
-          "description": "getLogs result[1] data should be equal",
-          "program": ".receivedResponse.result[1].data == .expectedResponse.result[1].data"
-        },
-        {
-          "description": "getLogs result[1].transactionHash should be equal",
-          "program": ".receivedResponse.result[1].transactionHash == .expectedResponse.result[1].transactionHash"
-        }
-      ]
-    },
-    {
-      "title": "getLogs with invalid topic return empty result",
-      "request": {
-        "method": "getLogs",
-        "params": [
-          {
-            "topics": ["0x8fb1356be6b2a4e49ee94447eb9dcb8783f51c41dcddfe7919f945017d000000"],
-            "fromBlock": "0x0",
-            "toBlock": "pending"
-          }
-        ]
-      },
-      "expectedResponse": {
-        "result": []
-      },
-      "asserts": [
-        {
-          "description": "Result should be []",
-          "program": "(.receivedResponse.result | length) == 0"
-        }
-      ]
-    },
-    {
-      "title": "getLogs with no parameters",
-      "request": {
-        "method": "getLogs",
-        "params": [],
-        "shouldFailSchema": true
-      },
-      "expectedResponse": {
-        "error": {
-          "message": "missing value for required argument 0",
-          "code": -32602
-        }
-      },
-      "asserts": [
-        {
-          "description": "response should be an error",
-          "program": ".receivedResponse.error != null"
-        },
-        {
-          "description": "error code should be -32602",
-          "program": ".receivedResponse.error.code == .expectedResponse.error.code"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/interfaces/rpc/tests/getMetaData.json b/tests/interfaces/rpc/tests/getMetaData.json
deleted file mode 100644
index d7384bcf0..000000000
--- a/tests/interfaces/rpc/tests/getMetaData.json
+++ /dev/null
@@ -1,92 +0,0 @@
-{
-  "title": "getMetaData",
-  "schema": {
-    "$ref": "../schemas/getMetaData.json"
-  },
-  "tests": [
-    {
-      "title": "getMetaData by hash (create contract HelloWorld.sol)",
-      "request": {
-        "method": "getMetaData",
-        "params": [
-          "0x0"
-        ]
-      },
-      "expectedResponse": {
-        "result": {
-          "chainId": 123,
-          "chainName": "mock-chain",
-          "operator": "test-operator",
-          "website": "https://www.example.com",
-          "genesisTimestamp": 1524000000,
-          "validators": [
-            "0x33cd649d8e600b7a7d3d5a20c40b63bf0637eda3",
-            "0x00a5d2abb7a544573761f856139ba73d093d89e7",
-            "0xcf51a608ef18ce5d70f485d603371da79bd3eb7e",
-            "0xba79eb663adde7deef1c58e5e5a339cf6c4477d2"
-          ],
-          "blockInterval": 3000,
-          "tokenName": "tokenName",
-          "tokenSymbol": "tokenSymbol",
-          "tokenAvatar": "tokenAvatar",
-          "version": 1,
-          "economicalModel": 0
-        }
-      },
-      "asserts": [
-        {
-          "description": "chainId should not null",
-          "program": ".receivedResponse.result.chainId != null"
-        },
-        {
-          "description": "chainName should equal",
-          "program": ".receivedResponse.result.chainName == .expectedResponse.result.chainName"
-        },
-        {
-          "description": "operator should equal",
-          "program": ".receivedResponse.result.operator == .expectedResponse.result.operator"
-        },
-        {
-          "description": "website should not null",
-          "program": ".receivedResponse.result.website != null"
-        },
-        {
-          "description": "genesisTimestamp should not null",
-          "program": ".receivedResponse.result.genesisTimestamp != null"
-        },
-        {
-          "description": "validators.length should >= 4 ",
-          "program": "(.receivedResponse.result.validators | length) >= 4"
-        },
-        {
-          "description": "blockInterval should equal",
-          "program": ".receivedResponse.result.blockInterval == .expectedResponse.result.blockInterval"
-        }
-      ]
-    },
-    {
-      "title": "getMetaData with no parameters",
-      "request": {
-        "method": "getMetaData",
-        "params": [],
-        "shouldFailSchema": true
-      },
-      "expectedResponse": {
-        "error": {
-          "message": "missing value for required argument 0",
-          "code": -32602
-        }
-      },
-      "asserts": [
-        {
-          "description": "response should be an error",
-          "program": ".receivedResponse.error != null"
-        },
-        {
-          "description": "error code should be -32602",
-          "program": ".receivedResponse.error.code == .expectedResponse.error.code"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/interfaces/rpc/tests/getTransaction.json b/tests/interfaces/rpc/tests/getTransaction.json
deleted file mode 100644
index 709a33ae7..000000000
--- a/tests/interfaces/rpc/tests/getTransaction.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-  "title": "getTransaction",
-  "schema": {
-    "$ref": "../schemas/getTransaction.json"
-  },
-  "tests": [
-    {
-      "title": "getTransaction by hash (create contract HelloWorld.sol, number=0x2)",
-      "request": {
-        "method": "getTransaction",
-        "params": [
-          "0xd7363c838d68065c7a8b02b2f5e27efe15c512f421a4a6ede23ef0a389ca7ef6"
-        ]
-      },
-      "expectedResponse": {
-        "result": {
-          "blockHash": "0x35cd08bbcca3fa970d315c8cd13114675e7604e384abeaeba6e1f7eb4d2e2140",
-          "blockNumber": "0x2",
-          "content": "0x0ad00212013018c09a0c20642aa002608060405234801561001057600080fd5b50610100806100206000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806382ab890a146044575b600080fd5b348015604f57600080fd5b50606c6004803603810190808035906020019092919050505060b5565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b60008082600080828254019250508190555033600054915091509150915600a165627a7a72305820e793b33d4ad38d89ddac8d58b2b81209ff512166ee08efc51df13795c96f29a9002932200000000000000000000000000000000000000000000000000000000000000000387b1241213af4cc0b123cfb6b2c7124e5866d44274e6a23b6c9758721f91161b0df4ff813dcd4d5d22d008765743ad69e605f32b926fc6a932005e7e95b2f98f7da521f00",
-          "hash": "0xd7363c838d68065c7a8b02b2f5e27efe15c512f421a4a6ede23ef0a389ca7ef6",
-          "index": "0x0"
-        }
-      },
-      "asserts": [
-        {
-          "description": "Transaction response hash",
-          "program": ".receivedResponse.result.hash == .expectedResponse.result.hash"
-        },
-        {
-          "description": "Transaction response content",
-          "program": ".receivedResponse.result.content == .expectedResponse.result.content"
-        }
-      ]
-    },
-    {
-      "title": "getTransaction with no parameters",
-      "request": {
-        "method": "getTransaction",
-        "params": [],
-        "shouldFailSchema": true
-      },
-      "expectedResponse": {
-        "error": {
-          "message": "missing value for required argument 0",
-          "code": -32602
-        }
-      },
-      "asserts": [
-        {
-          "description": "response should be an error",
-          "program": ".receivedResponse.error != null"
-        },
-        {
-          "description": "error code should be -32602",
-          "program": ".receivedResponse.error.code == .expectedResponse.error.code"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/interfaces/rpc/tests/getTransactionCount.json b/tests/interfaces/rpc/tests/getTransactionCount.json
deleted file mode 100644
index 3a8a91ba8..000000000
--- a/tests/interfaces/rpc/tests/getTransactionCount.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
-  "title": "getTransactionCount",
-  "schema": {
-    "$ref": "../schemas/getTransactionCount.json"
-  },
-  "tests": [
-    {
-      "title": "getTransactionCount success (BlockNumber = pending)",
-      "request": {
-        "method": "getTransactionCount",
-        "params": [
-          "0x31d40cd88d6a884d2c95cf261c9f8ca495240af2",
-          "pending"
-        ]
-      },
-      "expectedResponse": {
-        "result": "0xd"
-      },
-      "asserts": [
-        {
-          "description": "getTransactionCount result should be equal",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    },
-    {
-      "title": "getTransactionCount success (BlockNumber = latest)",
-      "request": {
-        "method": "getTransactionCount",
-        "params": [
-          "0x31d40cd88d6a884d2c95cf261c9f8ca495240af2",
-          "latest"
-        ]
-      },
-      "expectedResponse": {
-        "result": "0xb"
-      },
-      "asserts": [
-        {
-          "description": "getTransactionCount result should be equal",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    },
-    {
-      "title": "getTransactionCount success (BlockNumber = 0x9)",
-      "request": {
-        "method": "getTransactionCount",
-        "params": [
-          "0x31d40cd88d6a884d2c95cf261c9f8ca495240af2",
-          "0x9"
-        ]
-      },
-      "expectedResponse": {
-        "result": "0x7"
-      },
-      "asserts": [
-        {
-          "description": "getTransactionCount result should be equal",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    },
-    {
-      "title": "getTransactionCount with wrong sender address and get 0x0 result",
-      "request": {
-        "method": "getTransactionCount",
-        "params": [
-          "0x31d40cd88d6a884d2c95cf261c9f8ca495000000",
-          "pending"
-        ]
-      },
-      "expectedResponse": {
-        "result": "0x0"
-      },
-      "asserts": [
-        {
-          "description": "getTransactionCount result should be equal",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    },
-    {
-      "title": "getTransactionCount with no parameters",
-      "request": {
-        "method": "getTransactionCount",
-        "params": [],
-        "shouldFailSchema": true
-      },
-      "expectedResponse": {
-        "error": {
-          "message": "missing value for required argument 0",
-          "code": -32602
-        }
-      },
-      "asserts": [
-        {
-          "description": "response should be an error",
-          "program": ".receivedResponse.error != null"
-        },
-        {
-          "description": "error code should be -32602",
-          "program": ".receivedResponse.error.code == .expectedResponse.error.code"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/interfaces/rpc/tests/getTransactionReceipt.json b/tests/interfaces/rpc/tests/getTransactionReceipt.json
deleted file mode 100644
index 15a555ea7..000000000
--- a/tests/interfaces/rpc/tests/getTransactionReceipt.json
+++ /dev/null
@@ -1,306 +0,0 @@
-{
-  "title": "getTransactionReceipt",
-  "schema": {
-    "$ref": "../schemas/getTransactionReceipt.json"
-  },
-  "tests": [
-    {
-      "title": "getTransactionReceipt with transaction hash and success (HelloWorld.sol)",
-      "request": {
-        "method": "getTransactionReceipt",
-        "params": [
-          "0xd7363c838d68065c7a8b02b2f5e27efe15c512f421a4a6ede23ef0a389ca7ef6"
-        ]
-      },
-      "expectedResponse": {
-        "result": {
-          "blockHash": "0x35cd08bbcca3fa970d315c8cd13114675e7604e384abeaeba6e1f7eb4d2e2140",
-          "blockNumber": "0x2",
-          "contractAddress": "0xfdde938c6f71b066eb34c1c92e5814186dbdcb5e",
-          "cumulativeQuotaUsed": "0xc8c7",
-          "errorMessage": null,
-          "quotaUsed": "0xc8c7",
-          "logs": [
-          ],
-          "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
-          "root": null,
-          "transactionHash": "0xd7363c838d68065c7a8b02b2f5e27efe15c512f421a4a6ede23ef0a389ca7ef6",
-          "transactionIndex": "0x0"
-        }
-      },
-      "asserts": [
-        {
-          "description": "getTransactionReceipt result.transactionHash should be equal",
-          "program": ".receivedResponse.result.transactionHash == .expectedResponse.result.transactionHash"
-        },
-        {
-          "description": "getTransactionReceipt result.contractAddress should be equal",
-          "program": ".receivedResponse.result.contractAddress == .expectedResponse.result.contractAddress"
-        },
-        {
-          "description": "getTransactionReceipt result.logsBloom should be equal",
-          "program": ".receivedResponse.result.logsBloom == .expectedResponse.result.logsBloom"
-        },
-        {
-          "description": "getTransactionReceipt result.errorMessage should be equal (both `null`)",
-          "program": ".receivedResponse.result.errorMessage == .expectedResponse.result.errorMessage"
-        }
-      ]
-    },
-    {
-      "title": "getTransactionReceipt with transaction hash and success (SimpleStorage.sol)",
-      "request": {
-        "method": "getTransactionReceipt",
-        "params": [
-          "0xc5ad0b717f36ca25f8ba51356379a60e1bb0b3a087dc1bcbf4f33f8435ee5647"
-        ]
-      },
-      "expectedResponse": {
-        "result": {
-          "blockHash": "0xbdb92db248f0a644300c76726be3966eea636e03c19236a57a92fb5b2c91a7a1",
-          "blockNumber": "0xc",
-          "contractAddress": "0xa31af83ee35e753a2bb19c2a82468080c2e92eee",
-          "cumulativeQuotaUsed": "0x18827",
-          "errorMessage": null,
-          "quotaUsed": "0x18827",
-          "logs": [
-            {
-              "address": "0xa31af83ee35e753a2bb19c2a82468080c2e92eee",
-              "blockHash": "0xbdb92db248f0a644300c76726be3966eea636e03c19236a57a92fb5b2c91a7a1",
-              "blockNumber": "0xc",
-              "data": "0x00000000000000000000000031d40cd88d6a884d2c95cf261c9f8ca495240af20000000000000000000000000000000000000000000000000000000000000064",
-              "logIndex": "0x0",
-              "topics": [
-                "0x8fb1356be6b2a4e49ee94447eb9dcb8783f51c41dcddfe7919f945017d163bf3"
-              ],
-              "transactionHash": "0xc5ad0b717f36ca25f8ba51356379a60e1bb0b3a087dc1bcbf4f33f8435ee5647",
-              "transactionIndex": "0x0",
-              "transactionLogIndex": "0x0"
-            }
-          ],
-          "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000040000000000000000002000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
-          "root": null,
-          "transactionHash": "0xc5ad0b717f36ca25f8ba51356379a60e1bb0b3a087dc1bcbf4f33f8435ee5647",
-          "transactionIndex": "0x0"
-        }
-      },
-      "asserts": [
-        {
-          "description": "getTransactionReceipt result.transactionHash should be equal",
-          "program": ".receivedResponse.result.transactionHash == .expectedResponse.result.transactionHash"
-        },
-        {
-          "description": "getTransactionReceipt result.contractAddress should be equal",
-          "program": ".receivedResponse.result.contractAddress == .expectedResponse.result.contractAddress"
-        },
-        {
-          "description": "getTransactionReceipt result.logsBloom should be equal",
-          "program": ".receivedResponse.result.logsBloom == .expectedResponse.result.logsBloom"
-        },
-        {
-          "description": "getTransactionReceipt result.errorMessage should be equal (both `null`)",
-          "program": ".receivedResponse.result.errorMessage == .expectedResponse.result.errorMessage"
-        },
-        {
-          "description": "getTransactionReceipt result.logs[0].topics[0] should be equal",
-          "program": ".receivedResponse.result.logs[0].topics[0] == .expectedResponse.result.logs[0].topics[0]"
-        },
-        {
-          "description": "getTransactionReceipt result.logs[0].data should be equal",
-          "program": ".receivedResponse.result.logs[0].data == .expectedResponse.result.logs[0].data"
-        }
-      ]
-    },
-    {
-      "title": "getTransactionReceipt with transaction hash and return errorMessage(Not enough base quota.)",
-      "request": {
-        "method": "getTransactionReceipt",
-        "params": [
-          "0x8840f58cc0b47219144aa06aee10d9be688dc9538da7e683d8efec8063426b48"
-        ]
-      },
-      "expectedResponse": {
-        "result": {
-          "blockHash": "0x16c546532796ed01b49220e2e2f37ce2bba2faca24e3a7f510c69f5beb3459fa",
-          "blockNumber": "0x7",
-          "contractAddress": null,
-          "cumulativeQuotaUsed": "0x0",
-          "errorMessage": "Not enough base quota.",
-          "quotaUsed": "0x0",
-          "logs": [
-          ],
-          "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
-          "root": null,
-          "transactionHash": "0x8840f58cc0b47219144aa06aee10d9be688dc9538da7e683d8efec8063426b48",
-          "transactionIndex": "0x0"
-        }
-      },
-      "asserts": [
-        {
-          "description": "getTransactionReceipt result.transactionHash should be equal",
-          "program": ".receivedResponse.result.transactionHash == .expectedResponse.result.transactionHash"
-        },
-        {
-          "description": "getTransactionReceipt result.contractAddress should be equal",
-          "program": ".receivedResponse.result.contractAddress == .expectedResponse.result.contractAddress"
-        },
-        {
-          "description": "getTransactionReceipt result.logsBloom should be equal",
-          "program": ".receivedResponse.result.logsBloom == .expectedResponse.result.logsBloom"
-        },
-        {
-          "description": "getTransactionReceipt result.errorMessage should be equal",
-          "program": ".receivedResponse.result.errorMessage == .expectedResponse.result.errorMessage"
-        },
-        {
-          "description": "getTransactionReceipt result.logs should be equal",
-          "program": ".receivedResponse.result.logs == .expectedResponse.result.logs"
-        },
-        {
-          "description": "getTransactionReceipt result.quotaUsed should be equal",
-          "program": ".receivedResponse.result.quotaUsed == .expectedResponse.result.quotaUsed"
-        }
-      ]
-    },
-    {
-      "title": "getTransactionReceipt with transaction hash and return errorMessage(Out of quota.)",
-      "request": {
-        "method": "getTransactionReceipt",
-        "params": [
-          "0x2d3f3a3bab98e76139374501792e0bbee6e0b1b877bd8d3856153ec7fb0065ea"
-        ]
-      },
-      "expectedResponse": {
-        "result": {
-          "blockHash": "0xaa5d2b3ef948dfb989f2210840c061a5a47112b660fd9cf2a671ffadd51242d1",
-          "blockNumber": "0x8",
-          "contractAddress": null,
-          "cumulativeQuotaUsed": "0x40000001",
-          "errorMessage": "Out of quota.",
-          "quotaUsed": "0x40000001",
-          "logs": [
-          ],
-          "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
-          "root": null,
-          "transactionHash": "0x2d3f3a3bab98e76139374501792e0bbee6e0b1b877bd8d3856153ec7fb0065ea",
-          "transactionIndex": "0x0"
-        }
-      },
-      "asserts": [
-        {
-          "description": "getTransactionReceipt result.transactionHash should be equal",
-          "program": ".receivedResponse.result.transactionHash == .expectedResponse.result.transactionHash"
-        },
-        {
-          "description": "getTransactionReceipt result.contractAddress should be equal",
-          "program": ".receivedResponse.result.contractAddress == .expectedResponse.result.contractAddress"
-        },
-        {
-          "description": "getTransactionReceipt result.logsBloom should be equal",
-          "program": ".receivedResponse.result.logsBloom == .expectedResponse.result.logsBloom"
-        },
-        {
-          "description": "getTransactionReceipt result.errorMessage should be equal",
-          "program": ".receivedResponse.result.errorMessage == .expectedResponse.result.errorMessage"
-        },
-        {
-          "description": "getTransactionReceipt result.logs should be equal",
-          "program": ".receivedResponse.result.logs == .expectedResponse.result.logs"
-        },
-        {
-          "description": "getTransactionReceipt result.quotaUsed should be equal",
-          "program": ".receivedResponse.result.quotaUsed == .expectedResponse.result.quotaUsed"
-        }
-      ]
-    },
-    {
-      "title": "getTransactionReceipt with transaction hash and return EVM Error.",
-      "request": {
-        "method": "getTransactionReceipt",
-        "params": [
-          "0xcb55625ee53ac7479910a5b97b8cef92b109d9b5af4df422d2f922bcea1118be"
-        ]
-      },
-      "expectedResponse": {
-        "result": {
-          "blockHash": "0x91f4e498a95794fd9660e3687bf86f19668a5ea67fa44fdc76cf145f030aee2a",
-          "blockNumber": "0xa",
-          "contractAddress": null,
-          "cumulativeQuotaUsed": "0x2710",
-          "errorMessage": "Not enough stack elements to execute instruction.",
-          "quotaUsed": "0x2710",
-          "logs": [
-          ],
-          "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
-          "root": null,
-          "transactionHash": "0xcb55625ee53ac7479910a5b97b8cef92b109d9b5af4df422d2f922bcea1118be",
-          "transactionIndex": "0x0"
-        }
-      },
-      "asserts": [
-        {
-          "description": "getTransactionReceipt result.transactionHash should be equal",
-          "program": ".receivedResponse.result.transactionHash == .expectedResponse.result.transactionHash"
-        },
-        {
-          "description": "getTransactionReceipt result.contractAddress should be equal",
-          "program": ".receivedResponse.result.contractAddress == .expectedResponse.result.contractAddress"
-        },
-        {
-          "description": "getTransactionReceipt result.logsBloom should be equal",
-          "program": ".receivedResponse.result.logsBloom == .expectedResponse.result.logsBloom"
-        },
-        {
-          "description": "getTransactionReceipt result.errorMessage should be equal",
-          "program": ".receivedResponse.result.errorMessage == .expectedResponse.result.errorMessage"
-        },
-        {
-          "description": "getTransactionReceipt result.logs should be equal",
-          "program": ".receivedResponse.result.logs == .expectedResponse.result.logs"
-        }
-      ]
-    },
-    {
-      "title": "getTransactionReceipt with wrong transaction hash and get empty result",
-      "request": {
-        "method": "getTransactionReceipt",
-        "params": [
-          "0x25a1d215c49f14a14d33b9836a5e29dd5269c2e9337ab6eaa78766ea9a000000"
-        ]
-      },
-      "expectedResponse": {
-        "result": null
-      },
-      "asserts": [
-        {
-          "description": "getTransactionReceipt result should be equal",
-          "program": ".receivedResponse.result == .expectedResponse.result"
-        }
-      ]
-    },
-    {
-      "title": "getTransactionReceipt with no parameters",
-      "request": {
-        "method": "getTransactionReceipt",
-        "params": [],
-        "shouldFailSchema": true
-      },
-      "expectedResponse": {
-        "error": {
-          "message": "missing value for required argument 0",
-          "code": -32602
-        }
-      },
-      "asserts": [
-        {
-          "description": "response should be an error",
-          "program": ".receivedResponse.error != null"
-        },
-        {
-          "description": "error code should be -32602",
-          "program": ".receivedResponse.error.code == .expectedResponse.error.code"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/interfaces/rpc/tests/getVersion.json b/tests/interfaces/rpc/tests/getVersion.json
deleted file mode 100644
index e1caf32ef..000000000
--- a/tests/interfaces/rpc/tests/getVersion.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "title": "getVersion",
-  "schema": {
-    "$ref": "../schemas/getVersion.json"
-  },
-  "tests": [
-    {
-      "title": "getVersion success if enabled",
-      "request": {
-        "method": "getVersion",
-        "params": []
-      },
-      "expectedResponse": {
-        "result": {
-          "softwareVersion": "0.20"
-        }
-      },
-      "asserts": [
-        {
-          "description": "response should not null",
-          "program": ".receivedResponse.result != null"
-        },
-        {
-          "description": "response softwareVersion should more than expected",
-          "program": ".receivedResponse.result.softwareVersion >= .expectedResponse.result.softwareVersion"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/interfaces/rpc/tests/peersInfo.json b/tests/interfaces/rpc/tests/peersInfo.json
deleted file mode 100644
index 0d67a6b55..000000000
--- a/tests/interfaces/rpc/tests/peersInfo.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "title": "peersInfo",
-  "schema": {
-    "$ref": "../schemas/peersInfo.json"
-  },
-  "tests": [
-    {
-      "title": "peersInfo success if enabled",
-      "request": {
-        "method": "peersInfo",
-        "params": []
-      },
-      "expectedResponse": {
-        "result": {
-          "amount": 0,
-	      "peers": {
-            "0xd843d5b89d0fce6b9543fec3092c4ff4c3dceb23":"127.0.0.1",
-	        "0x9136a06f379a3c457df2a97e192633c8d89b28f6":"127.0.0.1",
-	        "0x0455dbff153d0086fae0b66bb62a037d17fa62bd":"127.0.0.1"
-	      },
-	      "errorMessage": null
-        }
-      },
-      "asserts": [
-        {
-          "description": "response should not null",
-          "program": ".receivedResponse.result != null"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/interfaces/rpc/test_runner.py b/tests/interfaces/rpc_test_runner.py
similarity index 100%
rename from tests/interfaces/rpc/test_runner.py
rename to tests/interfaces/rpc_test_runner.py
diff --git a/tests/jsondata b/tests/jsondata
index 6d0f876a1..712bc67ce 160000
--- a/tests/jsondata
+++ b/tests/jsondata
@@ -1,1 +1,1 @@
-Subproject commit 6d0f876a107ba4f50cbde1f22c903710b6f1f819
+Subproject commit 712bc67cef0638d79d76cb182ce89344b5584300