From 8d933ec72a0fa1a91c33b201c628eca44ab5f9b1 Mon Sep 17 00:00:00 2001 From: "aitor@oceanprotocol.com" Date: Thu, 26 Apr 2018 17:38:23 +0100 Subject: [PATCH 01/28] Ocean DB script --- ocean-agent/README.md | 1 + ocean-db/.dockerignore | 9 +++ ocean-db/.gitignore | 97 ++++++++++++++++++++++++++++++++ ocean-db/.pre-commit-config.yaml | 20 +++++++ ocean-db/.readthedocs.yml | 6 ++ ocean-db/.travis.yml | 55 ++++++++++++++++++ ocean-db/README.md | 18 ++++++ ocean-db/bdb-install.sh | 9 +++ parity/README.md | 3 + 9 files changed, 218 insertions(+) create mode 100644 ocean-agent/README.md create mode 100644 ocean-db/.dockerignore create mode 100644 ocean-db/.gitignore create mode 100644 ocean-db/.pre-commit-config.yaml create mode 100644 ocean-db/.readthedocs.yml create mode 100644 ocean-db/.travis.yml create mode 100644 ocean-db/README.md create mode 100755 ocean-db/bdb-install.sh create mode 100644 parity/README.md diff --git a/ocean-agent/README.md b/ocean-agent/README.md new file mode 100644 index 0000000..37e8007 --- /dev/null +++ b/ocean-agent/README.md @@ -0,0 +1 @@ +# Instructions to run an Ocean-Agent node using Docker compose diff --git a/ocean-db/.dockerignore b/ocean-db/.dockerignore new file mode 100644 index 0000000..dfd6a8c --- /dev/null +++ b/ocean-db/.dockerignore @@ -0,0 +1,9 @@ +.cache/ +.coverage +.eggs/ +.git/ +.gitignore +.ropeproject/ +.travis.yml +BigchainDB.egg-info/ +dist/ diff --git a/ocean-db/.gitignore b/ocean-db/.gitignore new file mode 100644 index 0000000..867c197 --- /dev/null +++ b/ocean-db/.gitignore @@ -0,0 +1,97 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Swap -- copypasta from https://github.com/github/gitignore/blob/master/Global/Vim.gitignore +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-v][a-z] +[._]sw[a-p] + +# Session +Session.vim + +# Temporary +.netrwhist +*~ +# Auto-generated tag files +tags + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +.pytest_cache/ +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Sphinx documentation +docs/build/ + +# PyBuilder +target/ + +# Ipython Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# Just in time documentation +docs/server/source/http-samples + +# Terraform state files +# See https://stackoverflow.com/a/41482391 +terraform.tfstate +terraform.tfstate.backup + +# tendermint data +tmdata/data +network/*/data + +# Docs that are fetched at build time +docs/contributing/source/cross-project-policies/*.md diff --git a/ocean-db/.pre-commit-config.yaml b/ocean-db/.pre-commit-config.yaml new file mode 100644 index 0000000..e53e35b --- /dev/null +++ b/ocean-db/.pre-commit-config.yaml @@ -0,0 +1,20 @@ +repos: +- repo: git://github.com/pre-commit/pre-commit-hooks + sha: v1.1.1 + hooks: + - id: trailing-whitespace + args: ['--no-markdown-linebreak-ext'] + - id: check-merge-conflict + - id: debug-statements + - id: check-added-large-files + - id: flake8 + +- repo: git://github.com/chewse/pre-commit-mirrors-pydocstyle + sha: v2.1.1 + hooks: + - id: pydocstyle + # list of error codes to check, see: http://www.pydocstyle.org/en/latest/error_codes.html + args: ['--select=D204,D201,D209,D210,D212,D300,D403'] + +# negate the exclude to only apply the hooks to 'bigchaindb' and 'tests' folder +exclude: '^(?!bigchaindb/)(?!tests/)' diff --git a/ocean-db/.readthedocs.yml b/ocean-db/.readthedocs.yml new file mode 100644 index 0000000..c8b8b04 --- /dev/null +++ b/ocean-db/.readthedocs.yml @@ -0,0 +1,6 @@ +build: + image: latest + +python: + version: 3.6 + pip_install: true diff --git a/ocean-db/.travis.yml b/ocean-db/.travis.yml new file mode 100644 index 0000000..fefdb4c --- /dev/null +++ b/ocean-db/.travis.yml @@ -0,0 +1,55 @@ +sudo: required + +dist: trusty + +services: + - docker + +language: python +cache: pip + +python: + - 3.5 + - 3.6 + +env: + global: + - DOCKER_COMPOSE_VERSION=1.19.0 + matrix: + - TOXENV=flake8 + - TOXENV=docsroot + - TOXENV=docsserver + +matrix: + fast_finish: true + exclude: + - python: 3.5 + env: TOXENV=flake8 + - python: 3.5 + env: TOXENV=docsroot + - python: 3.5 + env: TOXENV=docsserver + include: + - python: 3.5 + env: + - BIGCHAINDB_DATABASE_BACKEND=localmongodb + - BIGCHAINDB_DATABASE_SSL= + - python: 3.6 + env: + - BIGCHAINDB_DATABASE_BACKEND=localmongodb + - BIGCHAINDB_DATABASE_SSL= + - python: 3.6 + env: + - BIGCHAINDB_DATABASE_BACKEND=localmongodb + - BIGCHAINDB_DATABASE_SSL= + - BIGCHAINDB_CI_ABCI=enable + +before_install: sudo .ci/travis-before-install.sh + +install: .ci/travis-install.sh + +before_script: .ci/travis-before-script.sh + +script: .ci/travis_script.sh + +after_success: .ci/travis-after-success.sh diff --git a/ocean-db/README.md b/ocean-db/README.md new file mode 100644 index 0000000..f304a25 --- /dev/null +++ b/ocean-db/README.md @@ -0,0 +1,18 @@ +# Instructions for running BDB using Docker Compose + +* Install last versions of [Docker](https://docs.docker.com/install/) and [Docker Compose](https://github.com/docker/compose/releases) +* Install BDB and all the components +```bash +sh bdb-install.sh +``` + +* Start BDB compose +```bash +docker-compose up -d bdb +``` + + + + + + diff --git a/ocean-db/bdb-install.sh b/ocean-db/bdb-install.sh new file mode 100755 index 0000000..010f43d --- /dev/null +++ b/ocean-db/bdb-install.sh @@ -0,0 +1,9 @@ +#!/bin/sh -x + +curl -L https://github.com/bigchaindb/bigchaindb/archive/master.zip -o bigchaindb.zip +#unzip bigchaindb.zip -d . && mv bigchaindb-master/* . && rm -rf bigchaindb-master bigchaindb.zip +unzip bigchaindb.zip -d . && cd bigchaindb-master +docker-compose build bigchaindb +cd .. +rm -rf bigchaindb-master bigchaindb.zip + diff --git a/parity/README.md b/parity/README.md new file mode 100644 index 0000000..528d710 --- /dev/null +++ b/parity/README.md @@ -0,0 +1,3 @@ +# Instructions to run a Parity dev node using Docker Compose + + From 9c2c1dcdcf457ea442bc1000b047eeb175c75b83 Mon Sep 17 00:00:00 2001 From: "aitor@oceanprotocol.com" Date: Thu, 26 Apr 2018 17:39:32 +0100 Subject: [PATCH 02/28] removing not necessary files --- ocean-db/.dockerignore | 9 --- ocean-db/.gitignore | 97 -------------------------------- ocean-db/.pre-commit-config.yaml | 20 ------- ocean-db/.readthedocs.yml | 6 -- ocean-db/.travis.yml | 55 ------------------ 5 files changed, 187 deletions(-) delete mode 100644 ocean-db/.dockerignore delete mode 100644 ocean-db/.gitignore delete mode 100644 ocean-db/.pre-commit-config.yaml delete mode 100644 ocean-db/.readthedocs.yml delete mode 100644 ocean-db/.travis.yml diff --git a/ocean-db/.dockerignore b/ocean-db/.dockerignore deleted file mode 100644 index dfd6a8c..0000000 --- a/ocean-db/.dockerignore +++ /dev/null @@ -1,9 +0,0 @@ -.cache/ -.coverage -.eggs/ -.git/ -.gitignore -.ropeproject/ -.travis.yml -BigchainDB.egg-info/ -dist/ diff --git a/ocean-db/.gitignore b/ocean-db/.gitignore deleted file mode 100644 index 867c197..0000000 --- a/ocean-db/.gitignore +++ /dev/null @@ -1,97 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Swap -- copypasta from https://github.com/github/gitignore/blob/master/Global/Vim.gitignore -[._]*.s[a-v][a-z] -[._]*.sw[a-p] -[._]s[a-v][a-z] -[._]sw[a-p] - -# Session -Session.vim - -# Temporary -.netrwhist -*~ -# Auto-generated tag files -tags - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -.pytest_cache/ -nosetests.xml -coverage.xml -*.cover -.hypothesis/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py - -# Sphinx documentation -docs/build/ - -# PyBuilder -target/ - -# Ipython Notebook -.ipynb_checkpoints - -# pyenv -.python-version - -# Just in time documentation -docs/server/source/http-samples - -# Terraform state files -# See https://stackoverflow.com/a/41482391 -terraform.tfstate -terraform.tfstate.backup - -# tendermint data -tmdata/data -network/*/data - -# Docs that are fetched at build time -docs/contributing/source/cross-project-policies/*.md diff --git a/ocean-db/.pre-commit-config.yaml b/ocean-db/.pre-commit-config.yaml deleted file mode 100644 index e53e35b..0000000 --- a/ocean-db/.pre-commit-config.yaml +++ /dev/null @@ -1,20 +0,0 @@ -repos: -- repo: git://github.com/pre-commit/pre-commit-hooks - sha: v1.1.1 - hooks: - - id: trailing-whitespace - args: ['--no-markdown-linebreak-ext'] - - id: check-merge-conflict - - id: debug-statements - - id: check-added-large-files - - id: flake8 - -- repo: git://github.com/chewse/pre-commit-mirrors-pydocstyle - sha: v2.1.1 - hooks: - - id: pydocstyle - # list of error codes to check, see: http://www.pydocstyle.org/en/latest/error_codes.html - args: ['--select=D204,D201,D209,D210,D212,D300,D403'] - -# negate the exclude to only apply the hooks to 'bigchaindb' and 'tests' folder -exclude: '^(?!bigchaindb/)(?!tests/)' diff --git a/ocean-db/.readthedocs.yml b/ocean-db/.readthedocs.yml deleted file mode 100644 index c8b8b04..0000000 --- a/ocean-db/.readthedocs.yml +++ /dev/null @@ -1,6 +0,0 @@ -build: - image: latest - -python: - version: 3.6 - pip_install: true diff --git a/ocean-db/.travis.yml b/ocean-db/.travis.yml deleted file mode 100644 index fefdb4c..0000000 --- a/ocean-db/.travis.yml +++ /dev/null @@ -1,55 +0,0 @@ -sudo: required - -dist: trusty - -services: - - docker - -language: python -cache: pip - -python: - - 3.5 - - 3.6 - -env: - global: - - DOCKER_COMPOSE_VERSION=1.19.0 - matrix: - - TOXENV=flake8 - - TOXENV=docsroot - - TOXENV=docsserver - -matrix: - fast_finish: true - exclude: - - python: 3.5 - env: TOXENV=flake8 - - python: 3.5 - env: TOXENV=docsroot - - python: 3.5 - env: TOXENV=docsserver - include: - - python: 3.5 - env: - - BIGCHAINDB_DATABASE_BACKEND=localmongodb - - BIGCHAINDB_DATABASE_SSL= - - python: 3.6 - env: - - BIGCHAINDB_DATABASE_BACKEND=localmongodb - - BIGCHAINDB_DATABASE_SSL= - - python: 3.6 - env: - - BIGCHAINDB_DATABASE_BACKEND=localmongodb - - BIGCHAINDB_DATABASE_SSL= - - BIGCHAINDB_CI_ABCI=enable - -before_install: sudo .ci/travis-before-install.sh - -install: .ci/travis-install.sh - -before_script: .ci/travis-before-script.sh - -script: .ci/travis_script.sh - -after_success: .ci/travis-after-success.sh From 60e58ebb99a0c55079ded320ef1fe9b81e784a52 Mon Sep 17 00:00:00 2001 From: ssallam Date: Fri, 18 May 2018 16:32:42 +0200 Subject: [PATCH 03/28] Basic composer. --- parity/README.md | 2 - parity/parity/authorities/validator0.json | 22 ++++ parity/parity/authorities/validator0.pwd | 1 + parity/parity/authorities/validator1.json | 22 ++++ parity/parity/authorities/validator1.pwd | 1 + parity/parity/authorities/validator2.json | 22 ++++ parity/parity/authorities/validator2.pwd | 1 + parity/parity/config/chain.json | 150 ++++++++++++++++++++++ parity/parity/config/member.toml | 18 +++ parity/parity/config/validator.toml | 21 +++ parity/parity/keys/address_book.json | 1 + parity/parity/keys/dapps_history.json | 1 + parity/parity/keys/master0.json | 21 +++ parity/parity/keys/master1.json | 21 +++ parity/parity/keys/master10.json | 21 +++ parity/parity/keys/master11.json | 21 +++ parity/parity/keys/master12.json | 21 +++ parity/parity/keys/master13.json | 21 +++ parity/parity/keys/master14.json | 21 +++ parity/parity/keys/master15.json | 21 +++ parity/parity/keys/master16.json | 21 +++ parity/parity/keys/master17.json | 21 +++ parity/parity/keys/master18.json | 21 +++ parity/parity/keys/master19.json | 21 +++ parity/parity/keys/master2.json | 21 +++ parity/parity/keys/master20.json | 21 +++ parity/parity/keys/master3.json | 21 +++ parity/parity/keys/master4.json | 21 +++ parity/parity/keys/master5.json | 21 +++ parity/parity/keys/master6.json | 21 +++ parity/parity/keys/master7.json | 21 +++ parity/parity/keys/master8.json | 21 +++ parity/parity/keys/master9.json | 21 +++ parity/parity/keys/slave.json | 22 ++++ parity/parity/keys/validator.json | 0 parity/parity/node0.network.key | 1 + parity/parity/node1.network.key | 1 + parity/parity/node2.network.key | 1 + 38 files changed, 726 insertions(+), 2 deletions(-) create mode 100644 parity/parity/authorities/validator0.json create mode 100644 parity/parity/authorities/validator0.pwd create mode 100644 parity/parity/authorities/validator1.json create mode 100644 parity/parity/authorities/validator1.pwd create mode 100644 parity/parity/authorities/validator2.json create mode 100644 parity/parity/authorities/validator2.pwd create mode 100644 parity/parity/config/chain.json create mode 100644 parity/parity/config/member.toml create mode 100644 parity/parity/config/validator.toml create mode 100644 parity/parity/keys/address_book.json create mode 100644 parity/parity/keys/dapps_history.json create mode 100644 parity/parity/keys/master0.json create mode 100644 parity/parity/keys/master1.json create mode 100644 parity/parity/keys/master10.json create mode 100644 parity/parity/keys/master11.json create mode 100644 parity/parity/keys/master12.json create mode 100644 parity/parity/keys/master13.json create mode 100644 parity/parity/keys/master14.json create mode 100644 parity/parity/keys/master15.json create mode 100644 parity/parity/keys/master16.json create mode 100644 parity/parity/keys/master17.json create mode 100644 parity/parity/keys/master18.json create mode 100644 parity/parity/keys/master19.json create mode 100644 parity/parity/keys/master2.json create mode 100644 parity/parity/keys/master20.json create mode 100644 parity/parity/keys/master3.json create mode 100644 parity/parity/keys/master4.json create mode 100644 parity/parity/keys/master5.json create mode 100644 parity/parity/keys/master6.json create mode 100644 parity/parity/keys/master7.json create mode 100644 parity/parity/keys/master8.json create mode 100644 parity/parity/keys/master9.json create mode 100644 parity/parity/keys/slave.json create mode 100755 parity/parity/keys/validator.json create mode 100644 parity/parity/node0.network.key create mode 100644 parity/parity/node1.network.key create mode 100644 parity/parity/node2.network.key diff --git a/parity/README.md b/parity/README.md index 528d710..8650df4 100644 --- a/parity/README.md +++ b/parity/README.md @@ -1,3 +1 @@ # Instructions to run a Parity dev node using Docker Compose - - diff --git a/parity/parity/authorities/validator0.json b/parity/parity/authorities/validator0.json new file mode 100644 index 0000000..15d6d06 --- /dev/null +++ b/parity/parity/authorities/validator0.json @@ -0,0 +1,22 @@ +{ + "id": "0902d04b-f26e-5c1f-e3ae-78d2c1cb16e7", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "6a829fe7bc656d85f6c2e9fd21784952" + }, + "ciphertext": "1bfec0b054a648af8fdd0e85662206c65a4af0ed15fede4ad41ca9ab7b504ce2", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "95f96b5ee22dd537e06076eb8d7078eb7275d29af935782fe476696b11be50e5" + }, + "mac": "4af2215c3cd9447a5b0512d7d1c3ea5a4435981e1c8f48bf71d7a49c0e5b4986" + }, + "address": "00bd138abd70e2f00903268f3db08f2d25677c9e", + "name": "Validator0", + "meta": "{}" +} diff --git a/parity/parity/authorities/validator0.pwd b/parity/parity/authorities/validator0.pwd new file mode 100644 index 0000000..ce118da --- /dev/null +++ b/parity/parity/authorities/validator0.pwd @@ -0,0 +1 @@ +node0 diff --git a/parity/parity/authorities/validator1.json b/parity/parity/authorities/validator1.json new file mode 100644 index 0000000..cdf3b7a --- /dev/null +++ b/parity/parity/authorities/validator1.json @@ -0,0 +1,22 @@ +{ + "id": "e854acbe-e6b2-e812-9f84-7b0945a1f14f", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "1b90ae52dcc1bc285ae3846d0ca9be53" + }, + "ciphertext": "b80f21bfb2029dafc89c36c6838e7a9e711ee13ec3e6900c3b097e45ae2ece7c", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "d823ab988002888a19336ab6650b83a4c536b42612148c9c5337ec4d92e981d1" + }, + "mac": "f8d1e53f4be85b0f77aa02bfe08b93eacdef74995822a59ddaea0497a69318af" + }, + "address": "00aa39d30f0d20ff03a22ccfc30b7efbfca597c2", + "name": "Validator1", + "meta": "{}" +} diff --git a/parity/parity/authorities/validator1.pwd b/parity/parity/authorities/validator1.pwd new file mode 100644 index 0000000..f50c4f2 --- /dev/null +++ b/parity/parity/authorities/validator1.pwd @@ -0,0 +1 @@ +node1 diff --git a/parity/parity/authorities/validator2.json b/parity/parity/authorities/validator2.json new file mode 100644 index 0000000..31dc1c2 --- /dev/null +++ b/parity/parity/authorities/validator2.json @@ -0,0 +1,22 @@ +{ + "id": "26ef5e07-4494-52b5-653f-a982ac907807", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "53addf73788522f6d5bf73abb0e0b8da" + }, + "ciphertext": "88c1013308cff929825e5da57ceaf15ae86e656165bcb2de3b06b24985358af6", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "ab8efcf7ee2c368eced8982b22328d862ea0c15307ce6ccd5994fae5a9b13244" + }, + "mac": "c93ca54145b4f21b62c422247609d0b891149f0d9752f6fe9ef60421f10bad6c" + }, + "address": "002e28950558fbede1a9675cb113f0bd20912019", + "name": "Validator2", + "meta": "{}" +} diff --git a/parity/parity/authorities/validator2.pwd b/parity/parity/authorities/validator2.pwd new file mode 100644 index 0000000..6810417 --- /dev/null +++ b/parity/parity/authorities/validator2.pwd @@ -0,0 +1 @@ +node2 diff --git a/parity/parity/config/chain.json b/parity/parity/config/chain.json new file mode 100644 index 0000000..e6bc064 --- /dev/null +++ b/parity/parity/config/chain.json @@ -0,0 +1,150 @@ +{ + "name": "ocean-protocol", + "engine": { + "authorityRound": { + "params": { + "stepDuration": "1", + "validators": { + "list": [ + "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e", + "0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2", + "0x002e28950558fbede1a9675cb113f0bd20912019" + ] + }, + "validateScoreTransition": 1000000000, + "validateStepTransition": 1500000000, + "maximumUncleCount": 1000000000 + } + } + }, + "params": { + "maximumExtraDataSize": "0x20", + "minGasLimit": "0x1388", + "networkID": "0x2323", + "gasLimitBoundDivisor": "0x400" + }, + "genesis": { + "seal": { + "authorityRound": { + "step": "0x0", + "signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + "difficulty": "0x20000", + "gasLimit": "0x165A0BC00" + }, + "accounts": { + "0x0000000000000000000000000000000000000001": { + "balance": "1", + "builtin": { + "name": "ecrecover", + "pricing": { + "linear": { + "base": 3000, + "word": 0 + } + } + } + }, + "0x0000000000000000000000000000000000000002": { + "balance": "1", + "builtin": { + "name": "sha256", + "pricing": { + "linear": { + "base": 60, + "word": 12 + } + } + } + }, + "0x0000000000000000000000000000000000000003": { + "balance": "1", + "builtin": { + "name": "ripemd160", + "pricing": { + "linear": { + "base": 600, + "word": 120 + } + } + } + }, + "0x0000000000000000000000000000000000000004": { + "balance": "1", + "builtin": { + "name": "identity", + "pricing": { + "linear": { + "base": 15, + "word": 3 + } + } + } + }, + "0x6B0c56d1Ad5144b4d37fa6e27DC9afd5C2435c3B": { + "balance": "10000000000000000000000000000" + }, + "0x0011598De1016A350ad719D23586273804076774": { + "balance": "10000000000000000000000000000" + }, + "0x00eBF1c449Cc448a14Ea5ba89C949a24Fa805a14": { + "balance": "10000000000000000000000000000" + }, + "0x006B8d5F5c8Ad11E5E6Cf9eE6624433891430965": { + "balance": "10000000000000000000000000000" + }, + + "0x009A1372f9E2D70014d7F31369F115FC921a87c8": { + "balance": "10000000000000000000000000000" + }, + "0x0076ed2DD9f7dc78e3f336141329F8784D8cd564": { + "balance": "10000000000000000000000000000" + }, + "0x006dB7698B897B842a42A1C3ce423b07C2656Ecd": { + "balance": "10000000000000000000000000000" + }, + "0x0012fc0db732dfd07a0cd8e4bedc6b160c9aedc5": { + "balance": "10000000000000000000000000000" + }, + "0x00f137e9bfe37cc015f11cec8339cc2f1a3ae3a6": { + "balance": "10000000000000000000000000000" + }, + "0x00c2bc2f078e1dbafa4a1fa46929e1f2ca207f00": { + "balance": "10000000000000000000000000000" + }, + "0x000a3702732843418d83a03e65a3d9f7add58864": { + "balance": "10000000000000000000000000000" + }, + "0x009c4c00de80cb8b0130906b09792aac6585078f": { + "balance": "10000000000000000000000000000" + }, + "0x0053017d2ef8119654bdc921a9078567a77e854d": { + "balance": "10000000000000000000000000000" + }, + "0x002491c91e81da1643de79582520ac4c77229e58": { + "balance": "10000000000000000000000000000" + }, + "0x00fd696f0c0660779379f6bff8ce58632886f9d2": { + "balance": "10000000000000000000000000000" + }, + "0x007f16bc32026e7cd5046590e4f5b711ef1a6d8b": { + "balance": "10000000000000000000000000000" + }, + "0x00fb81808899fd51c4a87a642084138be62189a0": { + "balance": "10000000000000000000000000000" + }, + "0x00a61dabf0324bc07ba5a82a97c5f15d38fa9bbc": { + "balance": "10000000000000000000000000000" + }, + "0x007a11ac48952a7e8e661833f4803bd7ffa58f77": { + "balance": "10000000000000000000000000000" + }, + "0x00e7ad5b906c829c71c2f6f6cec016866ed1c264": { + "balance": "10000000000000000000000000000" + }, + "0x0075f4f4d7324fef36371610d03e1195894bf420": { + "balance": "10000000000000000000000000000" + } + } +} diff --git a/parity/parity/config/member.toml b/parity/parity/config/member.toml new file mode 100644 index 0000000..0d5d34d --- /dev/null +++ b/parity/parity/config/member.toml @@ -0,0 +1,18 @@ +[parity] +chain = "/parity/config/chain.json" + +[rpc] +interface = "0.0.0.0" +cors = ["all"] +hosts = ["all"] +apis = ["web3", "eth", "net", "parity", "traces", "rpc", "personal", "parity_accounts", "signer", "parity_set"] + +[network] +bootnodes = [ + "enode://147573f46fe9f5cc38fbe070089a31390baec5dd2827c8f2ef168833e4d0254fbee3969a02c5b9910ea5d5b23d86a6ed5eabcda17cc12007b7d9178b6c697aa5@172.16.0.10:30303", + "enode://1412ee9b9e23700e4a67a8fe3d8d02e10376b6e1cb748eaaf8aa60d4652b27872a8e1ad65bb31046438a5d3c1b71b00ec3ce0b4b42ac71464b28026a3d0b53af@172.16.0.11:30303", + "enode://9076c143a487aa163437a86f7d009f257f405c50bb2316800b9c9cc40e5a38fef5b414a47636ec38fdabc8a1872b563effa8574a7f8f85dc6bde465c368f1bf5@172.16.0.12:30303" +] + +[ui] +interface = "0.0.0.0" diff --git a/parity/parity/config/validator.toml b/parity/parity/config/validator.toml new file mode 100644 index 0000000..6fd41d6 --- /dev/null +++ b/parity/parity/config/validator.toml @@ -0,0 +1,21 @@ +[parity] +chain = "/parity/config/chain.json" + +[rpc] +interface = "0.0.0.0" +cors = ["all"] +hosts = ["all"] +apis = ["web3", "eth", "net", "parity", "traces", "rpc", "personal", "parity_accounts", "signer", "parity_set"] + +[network] +bootnodes = [ + "enode://147573f46fe9f5cc38fbe070089a31390baec5dd2827c8f2ef168833e4d0254fbee3969a02c5b9910ea5d5b23d86a6ed5eabcda17cc12007b7d9178b6c697aa5@172.16.0.10:30303", + "enode://1412ee9b9e23700e4a67a8fe3d8d02e10376b6e1cb748eaaf8aa60d4652b27872a8e1ad65bb31046438a5d3c1b71b00ec3ce0b4b42ac71464b28026a3d0b53af@172.16.0.11:30303", + "enode://9076c143a487aa163437a86f7d009f257f405c50bb2316800b9c9cc40e5a38fef5b414a47636ec38fdabc8a1872b563effa8574a7f8f85dc6bde465c368f1bf5@172.16.0.12:30303" +] + +[account] +password = ["/parity/validator.pwd"] + +[mining] +reseal_on_txs = "none" diff --git a/parity/parity/keys/address_book.json b/parity/parity/keys/address_book.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/parity/parity/keys/address_book.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/parity/parity/keys/dapps_history.json b/parity/parity/keys/dapps_history.json new file mode 100644 index 0000000..dd739a7 --- /dev/null +++ b/parity/parity/keys/dapps_history.json @@ -0,0 +1 @@ +{"parity://1.ui.parity":{"last_accessed":1526652994}} \ No newline at end of file diff --git a/parity/parity/keys/master0.json b/parity/parity/keys/master0.json new file mode 100644 index 0000000..51c8c83 --- /dev/null +++ b/parity/parity/keys/master0.json @@ -0,0 +1,21 @@ +{ + "id": "0d1533e9-dd7a-a838-68dc-36ddc025c1ab", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "acbabbab8eab2b952ad3cf2bd1aab0ca" + }, + "ciphertext": "134b54d057c3c0a9ac08b5eae36c46ab8dd45774215ce860afaeb4e8e50c927d", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "6f9e3ebd99b24becad3e8f773f44df8397cad68694abf7651880528d9552bfe7" + }, + "mac": "f8939019ec29b46694b5ac07fdf971ec740ca4de23e7ae84a1239f54c617f7d9" + }, + "address": "6b0c56d1ad5144b4d37fa6e27dc9afd5c2435c3b", + "name": "master0" +} diff --git a/parity/parity/keys/master1.json b/parity/parity/keys/master1.json new file mode 100644 index 0000000..5c78953 --- /dev/null +++ b/parity/parity/keys/master1.json @@ -0,0 +1,21 @@ +{ + "id": "76d1dcd3-0c3b-24c8-0875-78e3cc151659", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "6cbc68e1c87f82cefc954217cec45d64" + }, + "ciphertext": "a0f97cd495dbe38dc6fa13c23a7cc15a6abc75b894827bd2729a72bc3a1ec92d", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "b7704b289ced489bf6da93f6d335537763d3cc68460509321a73e50b185685de" + }, + "mac": "881850b5ce7709a7fd5ea923d97f77f0bd8717f054c44d35104cafc78d21813c" + }, + "address": "0011598de1016a350ad719d23586273804076774", + "name": "master1" +} diff --git a/parity/parity/keys/master10.json b/parity/parity/keys/master10.json new file mode 100644 index 0000000..e4dd8de --- /dev/null +++ b/parity/parity/keys/master10.json @@ -0,0 +1,21 @@ +{ + "id": "07c6bfbc-d810-2595-4ce9-cfaac6b4efdc", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "367526e91c5f6513a8c60d233b2da745" + }, + "ciphertext": "d44fe02941b74416292bc103eecb15e6a72d36b5a28cc631db41c94bec1aa39d", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "51584e445beb9ac011513e7826cbc465c6ac39ec9dd48b335539b159f9979bb8" + }, + "mac": "8baee07e11270dfbcdc808037198cb43eb4376f5b005de39cc2dd94b3964df79" + }, + "address": "000a3702732843418d83a03e65a3d9f7add58864", + "name": "master10" +} diff --git a/parity/parity/keys/master11.json b/parity/parity/keys/master11.json new file mode 100644 index 0000000..eb482f4 --- /dev/null +++ b/parity/parity/keys/master11.json @@ -0,0 +1,21 @@ +{ + "id": "056a022f-6de4-2316-a76e-332d8eb11d98", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "2826421845cc7c1bb70a2179cc209db6" + }, + "ciphertext": "eafe4bc6051d8e41e20261352a5ce7ae91b414ad67e2c9b16ea690148f54be59", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "aa69e4d3b50922a23bb00382c56576bad1e9dd446415425c648cf23948834fc2" + }, + "mac": "2a405e7421815051eca9f6add384240d1d0f721d6b634ab3f2bbabc6516aca8a" + }, + "address": "009c4c00de80cb8b0130906b09792aac6585078f", + "name": "master11" +} diff --git a/parity/parity/keys/master12.json b/parity/parity/keys/master12.json new file mode 100644 index 0000000..1be9ff0 --- /dev/null +++ b/parity/parity/keys/master12.json @@ -0,0 +1,21 @@ +{ + "id": "3bafc74c-8467-fd7d-c87e-ae77e6075184", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "7975daacc07977103770d42d2a0f0a6d" + }, + "ciphertext": "46460f4a226f92146f4f2803d5d6213a5f277bda138a6b5f63df62b80575691b", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "ecec5c680b6aef181e0f892e19ae77a51275f9040f24f306f520f4279125c9c6" + }, + "mac": "54d45996e5fd673e74386b3f844956015db3235e4305d978fff4223c7fcb7e6e" + }, + "address": "0053017d2ef8119654bdc921a9078567a77e854d", + "name": "master12" +} diff --git a/parity/parity/keys/master13.json b/parity/parity/keys/master13.json new file mode 100644 index 0000000..b4f5aa0 --- /dev/null +++ b/parity/parity/keys/master13.json @@ -0,0 +1,21 @@ +{ + "id": "fbb9d140-d238-df01-9cc4-733a5feabb96", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "1dab23bc79f3e7743e751ba58d0c977f" + }, + "ciphertext": "df3aa14f4f2863cb3fe9fcb3290bbc0d9b5f4c1a1886d2bf53577e841ad38624", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "a1060fb24b72cf8f4be114b8d17428a0e4b74cd2d9c9427b579d9a7f959bf8d3" + }, + "mac": "7684db6c1f69e49d8371c7f5b118d2251a8e9ae48fb88b948586a6927a425a9c" + }, + "address": "002491c91e81da1643de79582520ac4c77229e58", + "name": "master13" +} diff --git a/parity/parity/keys/master14.json b/parity/parity/keys/master14.json new file mode 100644 index 0000000..189fb3f --- /dev/null +++ b/parity/parity/keys/master14.json @@ -0,0 +1,21 @@ +{ + "id": "09e2119b-3f32-55d0-fd06-20ba4514ca6d", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "06336e75625721b1332fe11faea057b1" + }, + "ciphertext": "342f4a9be87bf4b031a830bd31e8596fd63fcdeeca0c34dc051be1d26052b7bd", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "af330ab39784b75b8967240207574fe866039d4265a6ac49c307bb9476019025" + }, + "mac": "f58191280a4d4b0f446272d2a13100362111f76c3b04128ca678e19ae036e75a" + }, + "address": "00fd696f0c0660779379f6bff8ce58632886f9d2", + "name": "master14" +} diff --git a/parity/parity/keys/master15.json b/parity/parity/keys/master15.json new file mode 100644 index 0000000..d60c806 --- /dev/null +++ b/parity/parity/keys/master15.json @@ -0,0 +1,21 @@ +{ + "id": "df67c646-3a5d-7056-0e2b-91f81aebd2a7", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "5b9d339a1723fc0e057020a52acbf0b8" + }, + "ciphertext": "ef2613c8e44ddbd4bd1794edb2e5fba0983ac7271f028c416a0e953beb74a4d6", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "7e735f3ea802327f10fe8ae05b6fe91241de75c85ef2119f6d8701e583c8ae43" + }, + "mac": "aca829819b1e7575c1f4be9a1cf52ec3c132b5b48bd2b88cca12ff89eeab2c5e" + }, + "address": "007f16bc32026e7cd5046590e4f5b711ef1a6d8b", + "name": "master15" +} diff --git a/parity/parity/keys/master16.json b/parity/parity/keys/master16.json new file mode 100644 index 0000000..cfba8d8 --- /dev/null +++ b/parity/parity/keys/master16.json @@ -0,0 +1,21 @@ +{ + "id": "619787da-e622-8659-4b73-6a45a2e0a0eb", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "8fd9e4a6f309ae9cbb53d3c162345f46" + }, + "ciphertext": "0eda20c52ca5c47e9564e1b61415afcc0a0901b85ced1a921295f9eda48f84be", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "4ec8f7ff993a7e1d905b3a0747346120c3924b03b1976b6abff7708870415680" + }, + "mac": "523708777a04acb3f3cad32f28c32578fa822eadaa23da0fb639be9eb492106b" + }, + "address": "00fb81808899fd51c4a87a642084138be62189a0", + "name": "master16" +} diff --git a/parity/parity/keys/master17.json b/parity/parity/keys/master17.json new file mode 100644 index 0000000..1ce11ab --- /dev/null +++ b/parity/parity/keys/master17.json @@ -0,0 +1,21 @@ +{ + "id": "56ddc2fc-d5cd-8887-e80d-8af51f289049", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "266860ec3a679eb24eb12160d380b783" + }, + "ciphertext": "99eafe9f7f17c85add07cdf6f7e2e8239da96faa21455fca5bcb886461087b3f", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "a4d8141ac116dab72b2d210a3c1c9b403e0ae7930fe82743765ae4eb0b96dec5" + }, + "mac": "394971c1f52a8d75c9e8d7b9fe6d99b0e13b9507628cb0ebea0281e1513540ac" + }, + "address": "00a61dabf0324bc07ba5a82a97c5f15d38fa9bbc", + "name": "master17" +} diff --git a/parity/parity/keys/master18.json b/parity/parity/keys/master18.json new file mode 100644 index 0000000..ea11e54 --- /dev/null +++ b/parity/parity/keys/master18.json @@ -0,0 +1,21 @@ +{ + "id": "9eb5f14e-8893-7b87-54a3-768eb6170746", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "4692f33d3e8b5c174c4e7ec5a8909415" + }, + "ciphertext": "e6db22db1cb28195e3b8dfd7e461c3fe8bdfe9c720c595eecbf341f8a37035ae", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "cf6abdbc0439076adbac8b449e7cb64b99bc788681ad7ffa001ed3887882e5aa" + }, + "mac": "9da8acd3e75285af7cf065a03445a8e573ab73cb8e0d9734a09261b3c20f9743" + }, + "address": "007a11ac48952a7e8e661833f4803bd7ffa58f77", + "name": "master18" +} diff --git a/parity/parity/keys/master19.json b/parity/parity/keys/master19.json new file mode 100644 index 0000000..e2f34d8 --- /dev/null +++ b/parity/parity/keys/master19.json @@ -0,0 +1,21 @@ +{ + "id": "d42b9349-bcd1-3911-d2b9-43e1a709c628", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "7cc62f24c5f4b3548c0497c8b69f5b6b" + }, + "ciphertext": "f687745f91679ccadd37ab883b9e91c3ddaf3ed14f3ec8570f3636099a77d480", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "b97799e265d265d22faea87431bcfb41b052fdbb6351debebdbb5dc73beb8fb0" + }, + "mac": "180d90ddaf9f6987187beb7c6f935c62127aafa936a6f202d29bfec19adb7123" + }, + "address": "00e7ad5b906c829c71c2f6f6cec016866ed1c264", + "name": "master19" +} diff --git a/parity/parity/keys/master2.json b/parity/parity/keys/master2.json new file mode 100644 index 0000000..4fd9ce4 --- /dev/null +++ b/parity/parity/keys/master2.json @@ -0,0 +1,21 @@ +{ + "id": "28a8e3f5-d204-2e4e-c361-e45d9b02e3f9", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "973cffe25a47d21d5ef7000545d4b829" + }, + "ciphertext": "eee722ec3d0a794469d39d5fd352bb34423f3c8a3ed85bf21e76502144d97755", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "abd87a6776c7b22278a54bf0a98b3469041fa9ced152c467e78261185765b76b" + }, + "mac": "3953ad383045c567f653507641a0c6390b68f8885a093d32e2a445fa0828392e" + }, + "address": "006b8d5f5c8ad11e5e6cf9ee6624433891430965", + "name": "master2" +} diff --git a/parity/parity/keys/master20.json b/parity/parity/keys/master20.json new file mode 100644 index 0000000..a7de674 --- /dev/null +++ b/parity/parity/keys/master20.json @@ -0,0 +1,21 @@ +{ + "id": "9c47e600-3e7f-01ae-0250-ed136b086ebd", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "b68660821c79d4d0fcbdf2fa0361d090" + }, + "ciphertext": "60ce0fc570380541681584952c7211c409838eb3573eefc09e5399eba8a081a0", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "92201b5871812512006990ed3366cabedd854883e0dac08e39b23c22916321c5" + }, + "mac": "70f4484daa3d560fc9f3956f9b40d133de3bc0535f2367972790598df92dd49e" + }, + "address": "0075f4f4d7324fef36371610d03e1195894bf420", + "name": "master20" +} diff --git a/parity/parity/keys/master3.json b/parity/parity/keys/master3.json new file mode 100644 index 0000000..b23d17a --- /dev/null +++ b/parity/parity/keys/master3.json @@ -0,0 +1,21 @@ +{ + "id": "32ebbccd-a5f6-7438-e511-09250157027c", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "d8c73bf1519d18bf142a3b29524053ca" + }, + "ciphertext": "2e450b0cbe4293522c2e94d42cee98a8c10f2dbecabc9cda8bdc08b6de3edd12", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "f68d8e18795bda386397d0d7c9a9049459aa3e35127c9396c475ecc925042b08" + }, + "mac": "0af821e0046a9b8a2460912c4797a0a0cd7fe1b219188e65682dd87f6f37f114" + }, + "address": "00ebf1c449cc448a14ea5ba89c949a24fa805a14", + "name": "master3" +} diff --git a/parity/parity/keys/master4.json b/parity/parity/keys/master4.json new file mode 100644 index 0000000..450cf51 --- /dev/null +++ b/parity/parity/keys/master4.json @@ -0,0 +1,21 @@ +{ + "id": "55fb2385-239d-8f74-dd93-468150bd05d0", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "71a1a1d9b4e085a93360907341e5d5db" + }, + "ciphertext": "6795b73e6784258172f27bfbc5864cf62fbc5974318d5b59d2c57dbb000f9721", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "ff8e963be0ff7dbc4d1938b027fdef3c3ecd09abf7274eda19a178cce85146c2" + }, + "mac": "b4d9eef2672c82b59f2020ac8817f6714667f77f5cc6fb3fb78db36bdf157b0b" + }, + "address": "009a1372f9e2d70014d7f31369f115fc921a87c8", + "name": "master4" +} diff --git a/parity/parity/keys/master5.json b/parity/parity/keys/master5.json new file mode 100644 index 0000000..9e349d6 --- /dev/null +++ b/parity/parity/keys/master5.json @@ -0,0 +1,21 @@ +{ + "id": "c05cf5a4-6a5d-11de-bfa1-42989f3feb1d", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "73aa94b02ac7b79d01934b7dde88d63d" + }, + "ciphertext": "925f650fa0d560aa694298de1514f53e383833b0bc4838e44ed95bf5c5c84763", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "6ad7eb08aa9b7463d8dcf2bff45f95d608e3e55ca12ea9651c916c57b0f8acba" + }, + "mac": "0a648a4ea58f3b38252f8f094bea3f5e427658e2c9f5d8b22343a9b8bc1c5a23" + }, + "address": "0076ed2dd9f7dc78e3f336141329f8784d8cd564", + "name": "master5" +} diff --git a/parity/parity/keys/master6.json b/parity/parity/keys/master6.json new file mode 100644 index 0000000..676000b --- /dev/null +++ b/parity/parity/keys/master6.json @@ -0,0 +1,21 @@ +{ + "id": "93608206-ba27-a76a-93ae-255c0ab10d41", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "8bebab643352956d6fc3369475627f18" + }, + "ciphertext": "4f00c21bf5036fc263c88e5ffb2b3a1642f684da0e40ae9ca0d2132a21185716", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "749677afe391c5661295077956fcfb1774f6020bc2910a2a1629a40b94ac88b5" + }, + "mac": "001fecc049bd55da9956db036bbed25f57979943981cd252b40eeeda2ec9acf7" + }, + "address": "006db7698b897b842a42a1c3ce423b07c2656ecd", + "name": "master6" +} diff --git a/parity/parity/keys/master7.json b/parity/parity/keys/master7.json new file mode 100644 index 0000000..da52c45 --- /dev/null +++ b/parity/parity/keys/master7.json @@ -0,0 +1,21 @@ +{ + "id": "549d9dbe-23a1-84b0-7512-3061f6c3dfdd", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "1a142473139e05cbc426c71e2e0edb33" + }, + "ciphertext": "54f3d36f0165cd93ad7bf465bbd1c45babc281df5752791f9c0404238860f7d9", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "cfdef5054d78e1da96cb3d7e0972d92d4543455b2206e596824816f007d7c13b" + }, + "mac": "93848426d03140da11c69d24ffd4c94fb6ad9a6c0019722c916b118c4d911e35" + }, + "address": "0012fc0db732dfd07a0cd8e4bedc6b160c9aedc5", + "name": "master7" +} diff --git a/parity/parity/keys/master8.json b/parity/parity/keys/master8.json new file mode 100644 index 0000000..503dfa3 --- /dev/null +++ b/parity/parity/keys/master8.json @@ -0,0 +1,21 @@ +{ + "id": "1e9af9bb-babc-4c39-8316-1ddad0a79ea9", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "d5dc985faf57618d15e4425bdada04cd" + }, + "ciphertext": "55082c741fddcebee7306380ba5091046f511439fcdcb5e3a8b663ec17163757", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "af2bac19edb773fccd6372084e9fb62860f712a3e2e2b33b3fdfd6c7e3c06ef4" + }, + "mac": "e0c12d54410c9eae91a14df350eca4fe4f338090c742c585d0f3ef03cf5875d6" + }, + "address": "00f137e9bfe37cc015f11cec8339cc2f1a3ae3a6", + "name": "master8" +} diff --git a/parity/parity/keys/master9.json b/parity/parity/keys/master9.json new file mode 100644 index 0000000..d758adc --- /dev/null +++ b/parity/parity/keys/master9.json @@ -0,0 +1,21 @@ +{ + "id": "265b683b-720c-46ba-9662-ebd140ddc4f7", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "426fa92e448ccc5e8daa06369a021485" + }, + "ciphertext": "fa9cee82d674399748c60e549fa73cbed6a7729c8988b1497057599ddaca2f41", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "8c13a79efe5a52409d844e68a4a244681d0925a75abe7af53bb29bcfb4105933" + }, + "mac": "b3ca38e267a5f30072854b7e6caedf3b64f066461292adc9d77354d59a5de683" + }, + "address": "00c2bc2f078e1dbafa4a1fa46929e1f2ca207f00", + "name": "master9" +} diff --git a/parity/parity/keys/slave.json b/parity/parity/keys/slave.json new file mode 100644 index 0000000..e2e9d7f --- /dev/null +++ b/parity/parity/keys/slave.json @@ -0,0 +1,22 @@ +{ + "id": "e628edcc-7656-ae63-16b4-681829162ef4", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "60e33a6f2dd51b76789446a05bb6955e" + }, + "ciphertext": "cd9d1386c72b9a3b79ba83b12d62737197198c58eb976da892ad45e69d06a375", + "kdf": "pbkdf2", + "kdfparams": { + "c": 10240, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "91c370dd20a35536ee73554c2bc0758eaef56e9d778f92bdfc34cd068cc7cc50" + }, + "mac": "e73e3cb1f8ec1498b148fbe62819e8e19380ae70d21491cc2cc2d44a6c0a0a7b" + }, + "address": "00e3d1aa965aafd61217635e5f99f7c1e567978f", + "name": "SLAVE", + "meta": "{\"passwordHint\":\"\",\"timestamp\":1490892369465}" +} diff --git a/parity/parity/keys/validator.json b/parity/parity/keys/validator.json new file mode 100755 index 0000000..e69de29 diff --git a/parity/parity/node0.network.key b/parity/parity/node0.network.key new file mode 100644 index 0000000..4ca292b --- /dev/null +++ b/parity/parity/node0.network.key @@ -0,0 +1 @@ +b3244c104fb56d28d3979f6cd14a8b5cf5b109171d293f4454c97c173a9f9374 diff --git a/parity/parity/node1.network.key b/parity/parity/node1.network.key new file mode 100644 index 0000000..0eb7d3b --- /dev/null +++ b/parity/parity/node1.network.key @@ -0,0 +1 @@ +c07b4807e704dfff975d82fc807a3da7947838379007b49c51f6a04faf4cdea8 diff --git a/parity/parity/node2.network.key b/parity/parity/node2.network.key new file mode 100644 index 0000000..224e330 --- /dev/null +++ b/parity/parity/node2.network.key @@ -0,0 +1 @@ +d8bf44e2b69604bde8c84c4b403114f4410dc4f57d80e026b24b8f1af70d5633 From b28fe99f07b5efdb6ae979c797c54fec6708ea81 Mon Sep 17 00:00:00 2001 From: ssallam Date: Tue, 22 May 2018 16:29:54 +0200 Subject: [PATCH 04/28] Running proof of authority network. --- .idea/docker-images.iml | 12 +++ parity/.env | 1 + parity/README.md | 24 +++++ parity/dashboard/ws_secret.json | 1 + parity/docker-compose.yml | 141 ++++++++++++++++++++++++ parity/monitor/app.json | 149 ++++++++++++++++++++++++++ parity/parity/config/chain.json | 5 +- parity/parity/config/member.toml | 3 +- parity/parity/config/validator.toml | 3 +- parity/parity/keys/dapps_history.json | 2 +- parity/parity/keys/validator.json | 0 11 files changed, 336 insertions(+), 5 deletions(-) create mode 100644 .idea/docker-images.iml create mode 100755 parity/.env create mode 100755 parity/dashboard/ws_secret.json create mode 100644 parity/docker-compose.yml create mode 100755 parity/monitor/app.json mode change 100755 => 100644 parity/parity/keys/validator.json diff --git a/.idea/docker-images.iml b/.idea/docker-images.iml new file mode 100644 index 0000000..1de84ce --- /dev/null +++ b/.idea/docker-images.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/parity/.env b/parity/.env new file mode 100755 index 0000000..a02c5d0 --- /dev/null +++ b/parity/.env @@ -0,0 +1 @@ +NETWORK_NAME=ocean-protocol diff --git a/parity/README.md b/parity/README.md index 8650df4..2fc41f9 100644 --- a/parity/README.md +++ b/parity/README.md @@ -1 +1,25 @@ # Instructions to run a Parity dev node using Docker Compose +### Pre-requisites +* Docker +* Docker-compose + +### Run a private network based on this repository +* Download/clone the files in this repository +`git clone https://github.com/oceanprotocol/docker-images.git` +* cd into `parity` +* Run: `docker-compose up -d` +* This will run 3 validator/authority nodes and 3 user nodes + +### Add more authority nodes to the base network +* Run the private network as described above +* Create a new validator account: + `curl --data '{"jsonrpc":"2.0","method":"parity_newAccountFromPhrase","params":["nodeX", "nodeX"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8545` + * Returns something like this: `{"jsonrpc":"2.0","result":"0x00aa39d30f0d20ff03a22ccfc30b7efbfca597c2","id":0}` +* Copy the file `parity/keys/UTC--2018-05-22T13-53-28Z--ed4d9a7c-4206-bbf3-673c-fdd1d41b4dcb` to `parity/authorities` and rename it to `validatorX.json` (pick a better name) then modify the contents to indent properly +* Add a simple text file named `validatorX.pwd` in `parity/authorities` and add the password `nodeX` (or whatever was specified in the "params":["nodeX", "nodeX"]) +* Copy/paste one of the validator specs in the docker-compose.yml file and modify it to reflect the new node name and make sure to point to the new `validatorX.json` and `validayorX.pwd` files. + * Also specify the address in the --engine-signer option + * And add the name in the volumes section in the compose file +* Make a copy of `parity/node0.network.key` and modify the key inside this file (anything should do) + + \ No newline at end of file diff --git a/parity/dashboard/ws_secret.json b/parity/dashboard/ws_secret.json new file mode 100755 index 0000000..97ff85f --- /dev/null +++ b/parity/dashboard/ws_secret.json @@ -0,0 +1 @@ +["123"] \ No newline at end of file diff --git a/parity/docker-compose.yml b/parity/docker-compose.yml new file mode 100644 index 0000000..082b9c1 --- /dev/null +++ b/parity/docker-compose.yml @@ -0,0 +1,141 @@ +version: '2.1' +services: + validator0: + image: parity/parity:latest + command: + --config /parity/config/validator.toml + --engine-signer 0x00bd138abd70e2f00903268f3db08f2d25677c9e + --dapps-interface 0.0.0.0 + --ws-interface 0.0.0.0 + --ui-interface 0.0.0.0 + --unsafe-expose + --jsonrpc-cors all + volumes: + - ./parity/config:/parity/config:ro + - validator0:/root/.local/share/io.parity.ethereum/ + - ./parity/authorities/validator0.json:/root/.local/share/io.parity.ethereum/keys/${NETWORK_NAME}/validator.json:ro + - ./parity/keys:/root/.local/share/io.parity.ethereum/keys/${NETWORK_NAME} + - ./parity/authorities/validator0.pwd:/parity/validator.pwd:ro + - ./parity/node0.network.key:/root/.local/share/io.parity.ethereum/network/key:ro + ports: + - 8545:8545 + networks: + my_net: + ipv4_address: 172.16.0.10 + + validator1: + image: parity/parity:latest + command: + --config /parity/config/validator.toml + --engine-signer 0x00aa39d30f0d20ff03a22ccfc30b7efbfca597c2 + volumes: + - ./parity/config:/parity/config:ro + - validator1:/root/.local/share/io.parity.ethereum/ + - ./parity/authorities/validator1.json:/root/.local/share/io.parity.ethereum/keys/${NETWORK_NAME}/validator.json:ro + - ./parity/authorities/validator1.pwd:/parity/validator.pwd:ro + - ./parity/node1.network.key:/root/.local/share/io.parity.ethereum/network/key:ro + networks: + my_net: + ipv4_address: 172.16.0.11 + + validator2: + image: parity/parity:latest + command: + --config /parity/config/validator.toml + --engine-signer 0x002e28950558fbede1a9675cb113f0bd20912019 + volumes: + - ./parity/config:/parity/config:ro + - validator2:/root/.local/share/io.parity.ethereum/ + - ./parity/authorities/validator2.json:/root/.local/share/io.parity.ethereum/keys/${NETWORK_NAME}/validator.json:ro + - ./parity/authorities/validator2.pwd:/parity/validator.pwd:ro + - ./parity/node2.network.key:/root/.local/share/io.parity.ethereum/network/key:ro + networks: + my_net: + ipv4_address: 172.16.0.12 + + validator3: + image: parity/parity:latest + command: + --config /parity/config/validator.toml + --engine-signer 0x00050e34c6ce4edc8ba451aeef2ebb48d7688b8e + volumes: + - ./parity/config:/parity/config:ro + - validator3:/root/.local/share/io.parity.ethereum/ + - ./parity/authorities/validator3.json:/root/.local/share/io.parity.ethereum/keys/${NETWORK_NAME}/validator.json:ro + - ./parity/authorities/validator3.pwd:/parity/validator.pwd:ro + - ./parity/node3.network.key:/root/.local/share/io.parity.ethereum/network/key:ro + networks: + my_net: + ipv4_address: 172.16.0.13 + + user0: + image: parity/parity:latest + command: + --config /parity/config/member.toml + --dapps-interface 0.0.0.0 + --ws-interface 0.0.0.0 + --ui-interface 0.0.0.0 + --unsafe-expose + volumes: + - ./parity/config:/parity/config:ro + - ./parity/keys:/root/.local/share/io.parity.ethereum/keys/${NETWORK_NAME} + ports: + - 8180:8180 + - 8546:8546 + - 30303:30303 + networks: + my_net: + ipv4_address: 172.16.0.20 + + user1: + image: parity/parity:latest + command: + --config /parity/config/member.toml + volumes: + - ./parity/config:/parity/config:ro + networks: + my_net: + ipv4_address: 172.16.0.21 + + user2: + image: parity/parity:latest + command: + --config /parity/config/member.toml + volumes: + - ./parity/config:/parity/config:ro + networks: + my_net: + ipv4_address: 172.16.0.22 + + monitor: + image: buythewhale/ethstats_monitor + volumes: + - ./monitor/app.json:/home/ethnetintel/eth-net-intelligence-api/app.json:ro + networks: + my_net: + ipv4_address: 172.16.0.100 + + + dashboard: + image: buythewhale/ethstats + volumes: + - ./dashboard/ws_secret.json:/eth-netstats/ws_secret.json:ro + ports: + - 3001:3000 + networks: + my_net: + ipv4_address: 172.16.0.200 + +volumes: + validator0: + validator1: + validator2: + validator3: +networks: + my_net: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.16.0.1/24 + gateway: 172.16.0.1 diff --git a/parity/monitor/app.json b/parity/monitor/app.json new file mode 100755 index 0000000..91db950 --- /dev/null +++ b/parity/monitor/app.json @@ -0,0 +1,149 @@ +[ + { + "name" : "validator0", + "script" : "app.js", + "log_date_format" : "YYYY-MM-DD HH:mm Z", + "merge_logs" : false, + "watch" : true, + "max_restarts" : 10, + "exec_interpreter" : "node", + "exec_mode" : "fork_mode", + "env": + { + "NODE_ENV" : "production", + "RPC_HOST" : "validator0", + "RPC_PORT" : "8545", + "LISTENING_PORT" : "30303", + "INSTANCE_NAME" : "validator0", + "WS_SERVER" : "ws://dashboard:3000", + "WS_SECRET" : "123", + "VERBOSITY" : 3 + } + }, + { + "name" : "validator1", + "script" : "app.js", + "log_date_format" : "YYYY-MM-DD HH:mm Z", + "merge_logs" : false, + "watch" : true, + "max_restarts" : 10, + "exec_interpreter" : "node", + "exec_mode" : "fork_mode", + "env": + { + "NODE_ENV" : "production", + "RPC_HOST" : "validator1", + "RPC_PORT" : "8545", + "LISTENING_PORT" : "30303", + "INSTANCE_NAME" : "validator1", + "WS_SERVER" : "ws://dashboard:3000", + "WS_SECRET" : "123", + "VERBOSITY" : 3 + } + }, + { + "name" : "validator2", + "script" : "app.js", + "log_date_format" : "YYYY-MM-DD HH:mm Z", + "merge_logs" : false, + "watch" : true, + "max_restarts" : 10, + "exec_interpreter" : "node", + "exec_mode" : "fork_mode", + "env": + { + "NODE_ENV" : "production", + "RPC_HOST" : "validator2", + "RPC_PORT" : "8545", + "LISTENING_PORT" : "30303", + "INSTANCE_NAME" : "validator2", + "WS_SERVER" : "ws://dashboard:3000", + "WS_SECRET" : "123", + "VERBOSITY" : 3 + } + }, + { + "name" : "validator3", + "script" : "app.js", + "log_date_format" : "YYYY-MM-DD HH:mm Z", + "merge_logs" : false, + "watch" : true, + "max_restarts" : 10, + "exec_interpreter" : "node", + "exec_mode" : "fork_mode", + "env": + { + "NODE_ENV" : "production", + "RPC_HOST" : "validator3", + "RPC_PORT" : "8545", + "LISTENING_PORT" : "30303", + "INSTANCE_NAME" : "validator3", + "WS_SERVER" : "ws://dashboard:3000", + "WS_SECRET" : "123", + "VERBOSITY" : 3 + } + }, + { + "name" : "user0", + "script" : "app.js", + "log_date_format" : "YYYY-MM-DD HH:mm Z", + "merge_logs" : false, + "watch" : true, + "max_restarts" : 10, + "exec_interpreter" : "node", + "exec_mode" : "fork_mode", + "env": + { + "NODE_ENV" : "production", + "RPC_HOST" : "user0", + "RPC_PORT" : "8545", + "LISTENING_PORT" : "30303", + "INSTANCE_NAME" : "user0", + "WS_SERVER" : "ws://dashboard:3000", + "WS_SECRET" : "123", + "VERBOSITY" : 3 + } + }, + { + "name" : "user1", + "script" : "app.js", + "log_date_format" : "YYYY-MM-DD HH:mm Z", + "merge_logs" : false, + "watch" : true, + "max_restarts" : 10, + "exec_interpreter" : "node", + "exec_mode" : "fork_mode", + "env": + { + "NODE_ENV" : "production", + "RPC_HOST" : "user1", + "RPC_PORT" : "8545", + "LISTENING_PORT" : "30303", + "INSTANCE_NAME" : "user1", + "WS_SERVER" : "ws://dashboard:3000", + "WS_SECRET" : "123", + "VERBOSITY" : 3 + } + }, + { + "name" : "user2", + "script" : "app.js", + "log_date_format" : "YYYY-MM-DD HH:mm Z", + "merge_logs" : false, + "watch" : true, + "max_restarts" : 10, + "exec_interpreter" : "node", + "exec_mode" : "fork_mode", + "env": + { + "NODE_ENV" : "production", + "RPC_HOST" : "user2", + "RPC_PORT" : "8545", + "LISTENING_PORT" : "30303", + "INSTANCE_NAME" : "user2", + "WS_SERVER" : "ws://dashboard:3000", + "WS_SECRET" : "123", + "VERBOSITY" : 3 + } + } +] diff --git a/parity/parity/config/chain.json b/parity/parity/config/chain.json index e6bc064..ccd97d3 100644 --- a/parity/parity/config/chain.json +++ b/parity/parity/config/chain.json @@ -7,8 +7,9 @@ "validators": { "list": [ "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e", - "0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2", - "0x002e28950558fbede1a9675cb113f0bd20912019" + "0x00aa39d30f0d20ff03a22ccfc30b7efbfca597c2", + "0x002e28950558fbede1a9675cb113f0bd20912019", + "0x00050e34c6ce4edc8ba451aeef2ebb48d7688b8e" ] }, "validateScoreTransition": 1000000000, diff --git a/parity/parity/config/member.toml b/parity/parity/config/member.toml index 0d5d34d..6e6f644 100644 --- a/parity/parity/config/member.toml +++ b/parity/parity/config/member.toml @@ -11,7 +11,8 @@ apis = ["web3", "eth", "net", "parity", "traces", "rpc", "personal", "parity_acc bootnodes = [ "enode://147573f46fe9f5cc38fbe070089a31390baec5dd2827c8f2ef168833e4d0254fbee3969a02c5b9910ea5d5b23d86a6ed5eabcda17cc12007b7d9178b6c697aa5@172.16.0.10:30303", "enode://1412ee9b9e23700e4a67a8fe3d8d02e10376b6e1cb748eaaf8aa60d4652b27872a8e1ad65bb31046438a5d3c1b71b00ec3ce0b4b42ac71464b28026a3d0b53af@172.16.0.11:30303", - "enode://9076c143a487aa163437a86f7d009f257f405c50bb2316800b9c9cc40e5a38fef5b414a47636ec38fdabc8a1872b563effa8574a7f8f85dc6bde465c368f1bf5@172.16.0.12:30303" + "enode://9076c143a487aa163437a86f7d009f257f405c50bb2316800b9c9cc40e5a38fef5b414a47636ec38fdabc8a1872b563effa8574a7f8f85dc6bde465c368f1bf5@172.16.0.12:30303", + "enode://a9fa615b065e0ffe0e64f915126ed4154bc89a03003c5ad6188109a289cb5ccc970ae708d4b40d763f42770e0ebe7e8e6835a9d78db2972b5a90bf12ee392e3f@172.16.0.13:30303" ] [ui] diff --git a/parity/parity/config/validator.toml b/parity/parity/config/validator.toml index 6fd41d6..34d2748 100644 --- a/parity/parity/config/validator.toml +++ b/parity/parity/config/validator.toml @@ -11,7 +11,8 @@ apis = ["web3", "eth", "net", "parity", "traces", "rpc", "personal", "parity_acc bootnodes = [ "enode://147573f46fe9f5cc38fbe070089a31390baec5dd2827c8f2ef168833e4d0254fbee3969a02c5b9910ea5d5b23d86a6ed5eabcda17cc12007b7d9178b6c697aa5@172.16.0.10:30303", "enode://1412ee9b9e23700e4a67a8fe3d8d02e10376b6e1cb748eaaf8aa60d4652b27872a8e1ad65bb31046438a5d3c1b71b00ec3ce0b4b42ac71464b28026a3d0b53af@172.16.0.11:30303", - "enode://9076c143a487aa163437a86f7d009f257f405c50bb2316800b9c9cc40e5a38fef5b414a47636ec38fdabc8a1872b563effa8574a7f8f85dc6bde465c368f1bf5@172.16.0.12:30303" + "enode://9076c143a487aa163437a86f7d009f257f405c50bb2316800b9c9cc40e5a38fef5b414a47636ec38fdabc8a1872b563effa8574a7f8f85dc6bde465c368f1bf5@172.16.0.12:30303", + "enode://a9fa615b065e0ffe0e64f915126ed4154bc89a03003c5ad6188109a289cb5ccc970ae708d4b40d763f42770e0ebe7e8e6835a9d78db2972b5a90bf12ee392e3f@172.16.0.13:30303" ] [account] diff --git a/parity/parity/keys/dapps_history.json b/parity/parity/keys/dapps_history.json index dd739a7..20c1090 100644 --- a/parity/parity/keys/dapps_history.json +++ b/parity/parity/keys/dapps_history.json @@ -1 +1 @@ -{"parity://1.ui.parity":{"last_accessed":1526652994}} \ No newline at end of file +{"":{"last_accessed":1526999158},"parity://1.ui.parity":{"last_accessed":1526997474}} \ No newline at end of file diff --git a/parity/parity/keys/validator.json b/parity/parity/keys/validator.json old mode 100755 new mode 100644 From ce4136f86b35fe28361407ffb28ddf9ba76420d3 Mon Sep 17 00:00:00 2001 From: ssallam Date: Mon, 18 Jun 2018 17:11:02 +0200 Subject: [PATCH 05/28] Clean up and unlock account. --- parity/docker-compose.yml | 55 +--------------------- parity/parity/config/chain.json | 67 +++------------------------ parity/parity/config/member.toml | 3 +- parity/parity/config/validator.toml | 3 +- parity/parity/keys/dapps_history.json | 2 +- parity/parity/keys/master10.json | 21 --------- parity/parity/keys/master11.json | 21 --------- parity/parity/keys/master12.json | 21 --------- parity/parity/keys/master13.json | 21 --------- parity/parity/keys/master14.json | 21 --------- parity/parity/keys/master15.json | 21 --------- parity/parity/keys/master16.json | 21 --------- parity/parity/keys/master17.json | 21 --------- parity/parity/keys/master18.json | 21 --------- parity/parity/keys/master19.json | 21 --------- parity/parity/keys/master2.json | 21 --------- parity/parity/keys/master20.json | 21 --------- parity/parity/keys/master3.json | 21 --------- parity/parity/keys/master4.json | 21 --------- parity/parity/keys/master5.json | 21 --------- parity/parity/keys/master6.json | 21 --------- parity/parity/keys/master7.json | 21 --------- parity/parity/keys/master8.json | 21 --------- parity/parity/keys/master9.json | 21 --------- parity/parity/keys/slave.json | 22 --------- parity/parity/keys/validator.json | 0 26 files changed, 11 insertions(+), 540 deletions(-) delete mode 100644 parity/parity/keys/master10.json delete mode 100644 parity/parity/keys/master11.json delete mode 100644 parity/parity/keys/master12.json delete mode 100644 parity/parity/keys/master13.json delete mode 100644 parity/parity/keys/master14.json delete mode 100644 parity/parity/keys/master15.json delete mode 100644 parity/parity/keys/master16.json delete mode 100644 parity/parity/keys/master17.json delete mode 100644 parity/parity/keys/master18.json delete mode 100644 parity/parity/keys/master19.json delete mode 100644 parity/parity/keys/master2.json delete mode 100644 parity/parity/keys/master20.json delete mode 100644 parity/parity/keys/master3.json delete mode 100644 parity/parity/keys/master4.json delete mode 100644 parity/parity/keys/master5.json delete mode 100644 parity/parity/keys/master6.json delete mode 100644 parity/parity/keys/master7.json delete mode 100644 parity/parity/keys/master8.json delete mode 100644 parity/parity/keys/master9.json delete mode 100644 parity/parity/keys/slave.json mode change 100644 => 100755 parity/parity/keys/validator.json diff --git a/parity/docker-compose.yml b/parity/docker-compose.yml index 082b9c1..a06eea6 100644 --- a/parity/docker-compose.yml +++ b/parity/docker-compose.yml @@ -10,6 +10,7 @@ services: --ui-interface 0.0.0.0 --unsafe-expose --jsonrpc-cors all + --unlock 0x00bd138abd70e2f00903268f3db08f2d25677c9e volumes: - ./parity/config:/parity/config:ro - validator0:/root/.local/share/io.parity.ethereum/ @@ -53,21 +54,6 @@ services: my_net: ipv4_address: 172.16.0.12 - validator3: - image: parity/parity:latest - command: - --config /parity/config/validator.toml - --engine-signer 0x00050e34c6ce4edc8ba451aeef2ebb48d7688b8e - volumes: - - ./parity/config:/parity/config:ro - - validator3:/root/.local/share/io.parity.ethereum/ - - ./parity/authorities/validator3.json:/root/.local/share/io.parity.ethereum/keys/${NETWORK_NAME}/validator.json:ro - - ./parity/authorities/validator3.pwd:/parity/validator.pwd:ro - - ./parity/node3.network.key:/root/.local/share/io.parity.ethereum/network/key:ro - networks: - my_net: - ipv4_address: 172.16.0.13 - user0: image: parity/parity:latest command: @@ -87,50 +73,11 @@ services: my_net: ipv4_address: 172.16.0.20 - user1: - image: parity/parity:latest - command: - --config /parity/config/member.toml - volumes: - - ./parity/config:/parity/config:ro - networks: - my_net: - ipv4_address: 172.16.0.21 - - user2: - image: parity/parity:latest - command: - --config /parity/config/member.toml - volumes: - - ./parity/config:/parity/config:ro - networks: - my_net: - ipv4_address: 172.16.0.22 - - monitor: - image: buythewhale/ethstats_monitor - volumes: - - ./monitor/app.json:/home/ethnetintel/eth-net-intelligence-api/app.json:ro - networks: - my_net: - ipv4_address: 172.16.0.100 - - - dashboard: - image: buythewhale/ethstats - volumes: - - ./dashboard/ws_secret.json:/eth-netstats/ws_secret.json:ro - ports: - - 3001:3000 - networks: - my_net: - ipv4_address: 172.16.0.200 volumes: validator0: validator1: validator2: - validator3: networks: my_net: driver: bridge diff --git a/parity/parity/config/chain.json b/parity/parity/config/chain.json index ccd97d3..52d24bc 100644 --- a/parity/parity/config/chain.json +++ b/parity/parity/config/chain.json @@ -8,8 +8,7 @@ "list": [ "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e", "0x00aa39d30f0d20ff03a22ccfc30b7efbfca597c2", - "0x002e28950558fbede1a9675cb113f0bd20912019", - "0x00050e34c6ce4edc8ba451aeef2ebb48d7688b8e" + "0x002e28950558fbede1a9675cb113f0bd20912019" ] }, "validateScoreTransition": 1000000000, @@ -84,68 +83,16 @@ } }, "0x6B0c56d1Ad5144b4d37fa6e27DC9afd5C2435c3B": { - "balance": "10000000000000000000000000000" + "balance": "10" }, "0x0011598De1016A350ad719D23586273804076774": { - "balance": "10000000000000000000000000000" - }, - "0x00eBF1c449Cc448a14Ea5ba89C949a24Fa805a14": { - "balance": "10000000000000000000000000000" - }, - "0x006B8d5F5c8Ad11E5E6Cf9eE6624433891430965": { - "balance": "10000000000000000000000000000" + "balance": "10" }, - "0x009A1372f9E2D70014d7F31369F115FC921a87c8": { - "balance": "10000000000000000000000000000" - }, - "0x0076ed2DD9f7dc78e3f336141329F8784D8cd564": { - "balance": "10000000000000000000000000000" - }, - "0x006dB7698B897B842a42A1C3ce423b07C2656Ecd": { - "balance": "10000000000000000000000000000" - }, - "0x0012fc0db732dfd07a0cd8e4bedc6b160c9aedc5": { - "balance": "10000000000000000000000000000" - }, - "0x00f137e9bfe37cc015f11cec8339cc2f1a3ae3a6": { - "balance": "10000000000000000000000000000" - }, - "0x00c2bc2f078e1dbafa4a1fa46929e1f2ca207f00": { - "balance": "10000000000000000000000000000" - }, - "0x000a3702732843418d83a03e65a3d9f7add58864": { - "balance": "10000000000000000000000000000" - }, - "0x009c4c00de80cb8b0130906b09792aac6585078f": { - "balance": "10000000000000000000000000000" - }, - "0x0053017d2ef8119654bdc921a9078567a77e854d": { - "balance": "10000000000000000000000000000" - }, - "0x002491c91e81da1643de79582520ac4c77229e58": { - "balance": "10000000000000000000000000000" - }, - "0x00fd696f0c0660779379f6bff8ce58632886f9d2": { - "balance": "10000000000000000000000000000" - }, - "0x007f16bc32026e7cd5046590e4f5b711ef1a6d8b": { - "balance": "10000000000000000000000000000" - }, - "0x00fb81808899fd51c4a87a642084138be62189a0": { - "balance": "10000000000000000000000000000" - }, - "0x00a61dabf0324bc07ba5a82a97c5f15d38fa9bbc": { - "balance": "10000000000000000000000000000" - }, - "0x007a11ac48952a7e8e661833f4803bd7ffa58f77": { - "balance": "10000000000000000000000000000" - }, - "0x00e7ad5b906c829c71c2f6f6cec016866ed1c264": { - "balance": "10000000000000000000000000000" - }, - "0x0075f4f4d7324fef36371610d03e1195894bf420": { - "balance": "10000000000000000000000000000" + + "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e": { + "balance": "10000000111000111000111000" } + } } diff --git a/parity/parity/config/member.toml b/parity/parity/config/member.toml index 6e6f644..0d5d34d 100644 --- a/parity/parity/config/member.toml +++ b/parity/parity/config/member.toml @@ -11,8 +11,7 @@ apis = ["web3", "eth", "net", "parity", "traces", "rpc", "personal", "parity_acc bootnodes = [ "enode://147573f46fe9f5cc38fbe070089a31390baec5dd2827c8f2ef168833e4d0254fbee3969a02c5b9910ea5d5b23d86a6ed5eabcda17cc12007b7d9178b6c697aa5@172.16.0.10:30303", "enode://1412ee9b9e23700e4a67a8fe3d8d02e10376b6e1cb748eaaf8aa60d4652b27872a8e1ad65bb31046438a5d3c1b71b00ec3ce0b4b42ac71464b28026a3d0b53af@172.16.0.11:30303", - "enode://9076c143a487aa163437a86f7d009f257f405c50bb2316800b9c9cc40e5a38fef5b414a47636ec38fdabc8a1872b563effa8574a7f8f85dc6bde465c368f1bf5@172.16.0.12:30303", - "enode://a9fa615b065e0ffe0e64f915126ed4154bc89a03003c5ad6188109a289cb5ccc970ae708d4b40d763f42770e0ebe7e8e6835a9d78db2972b5a90bf12ee392e3f@172.16.0.13:30303" + "enode://9076c143a487aa163437a86f7d009f257f405c50bb2316800b9c9cc40e5a38fef5b414a47636ec38fdabc8a1872b563effa8574a7f8f85dc6bde465c368f1bf5@172.16.0.12:30303" ] [ui] diff --git a/parity/parity/config/validator.toml b/parity/parity/config/validator.toml index 34d2748..6fd41d6 100644 --- a/parity/parity/config/validator.toml +++ b/parity/parity/config/validator.toml @@ -11,8 +11,7 @@ apis = ["web3", "eth", "net", "parity", "traces", "rpc", "personal", "parity_acc bootnodes = [ "enode://147573f46fe9f5cc38fbe070089a31390baec5dd2827c8f2ef168833e4d0254fbee3969a02c5b9910ea5d5b23d86a6ed5eabcda17cc12007b7d9178b6c697aa5@172.16.0.10:30303", "enode://1412ee9b9e23700e4a67a8fe3d8d02e10376b6e1cb748eaaf8aa60d4652b27872a8e1ad65bb31046438a5d3c1b71b00ec3ce0b4b42ac71464b28026a3d0b53af@172.16.0.11:30303", - "enode://9076c143a487aa163437a86f7d009f257f405c50bb2316800b9c9cc40e5a38fef5b414a47636ec38fdabc8a1872b563effa8574a7f8f85dc6bde465c368f1bf5@172.16.0.12:30303", - "enode://a9fa615b065e0ffe0e64f915126ed4154bc89a03003c5ad6188109a289cb5ccc970ae708d4b40d763f42770e0ebe7e8e6835a9d78db2972b5a90bf12ee392e3f@172.16.0.13:30303" + "enode://9076c143a487aa163437a86f7d009f257f405c50bb2316800b9c9cc40e5a38fef5b414a47636ec38fdabc8a1872b563effa8574a7f8f85dc6bde465c368f1bf5@172.16.0.12:30303" ] [account] diff --git a/parity/parity/keys/dapps_history.json b/parity/parity/keys/dapps_history.json index 20c1090..61e5b61 100644 --- a/parity/parity/keys/dapps_history.json +++ b/parity/parity/keys/dapps_history.json @@ -1 +1 @@ -{"":{"last_accessed":1526999158},"parity://1.ui.parity":{"last_accessed":1526997474}} \ No newline at end of file +{"parity://1.ui.parity":{"last_accessed":1529334413},"":{"last_accessed":1529074407}} \ No newline at end of file diff --git a/parity/parity/keys/master10.json b/parity/parity/keys/master10.json deleted file mode 100644 index e4dd8de..0000000 --- a/parity/parity/keys/master10.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "07c6bfbc-d810-2595-4ce9-cfaac6b4efdc", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "367526e91c5f6513a8c60d233b2da745" - }, - "ciphertext": "d44fe02941b74416292bc103eecb15e6a72d36b5a28cc631db41c94bec1aa39d", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "51584e445beb9ac011513e7826cbc465c6ac39ec9dd48b335539b159f9979bb8" - }, - "mac": "8baee07e11270dfbcdc808037198cb43eb4376f5b005de39cc2dd94b3964df79" - }, - "address": "000a3702732843418d83a03e65a3d9f7add58864", - "name": "master10" -} diff --git a/parity/parity/keys/master11.json b/parity/parity/keys/master11.json deleted file mode 100644 index eb482f4..0000000 --- a/parity/parity/keys/master11.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "056a022f-6de4-2316-a76e-332d8eb11d98", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "2826421845cc7c1bb70a2179cc209db6" - }, - "ciphertext": "eafe4bc6051d8e41e20261352a5ce7ae91b414ad67e2c9b16ea690148f54be59", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "aa69e4d3b50922a23bb00382c56576bad1e9dd446415425c648cf23948834fc2" - }, - "mac": "2a405e7421815051eca9f6add384240d1d0f721d6b634ab3f2bbabc6516aca8a" - }, - "address": "009c4c00de80cb8b0130906b09792aac6585078f", - "name": "master11" -} diff --git a/parity/parity/keys/master12.json b/parity/parity/keys/master12.json deleted file mode 100644 index 1be9ff0..0000000 --- a/parity/parity/keys/master12.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "3bafc74c-8467-fd7d-c87e-ae77e6075184", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "7975daacc07977103770d42d2a0f0a6d" - }, - "ciphertext": "46460f4a226f92146f4f2803d5d6213a5f277bda138a6b5f63df62b80575691b", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "ecec5c680b6aef181e0f892e19ae77a51275f9040f24f306f520f4279125c9c6" - }, - "mac": "54d45996e5fd673e74386b3f844956015db3235e4305d978fff4223c7fcb7e6e" - }, - "address": "0053017d2ef8119654bdc921a9078567a77e854d", - "name": "master12" -} diff --git a/parity/parity/keys/master13.json b/parity/parity/keys/master13.json deleted file mode 100644 index b4f5aa0..0000000 --- a/parity/parity/keys/master13.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "fbb9d140-d238-df01-9cc4-733a5feabb96", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "1dab23bc79f3e7743e751ba58d0c977f" - }, - "ciphertext": "df3aa14f4f2863cb3fe9fcb3290bbc0d9b5f4c1a1886d2bf53577e841ad38624", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "a1060fb24b72cf8f4be114b8d17428a0e4b74cd2d9c9427b579d9a7f959bf8d3" - }, - "mac": "7684db6c1f69e49d8371c7f5b118d2251a8e9ae48fb88b948586a6927a425a9c" - }, - "address": "002491c91e81da1643de79582520ac4c77229e58", - "name": "master13" -} diff --git a/parity/parity/keys/master14.json b/parity/parity/keys/master14.json deleted file mode 100644 index 189fb3f..0000000 --- a/parity/parity/keys/master14.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "09e2119b-3f32-55d0-fd06-20ba4514ca6d", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "06336e75625721b1332fe11faea057b1" - }, - "ciphertext": "342f4a9be87bf4b031a830bd31e8596fd63fcdeeca0c34dc051be1d26052b7bd", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "af330ab39784b75b8967240207574fe866039d4265a6ac49c307bb9476019025" - }, - "mac": "f58191280a4d4b0f446272d2a13100362111f76c3b04128ca678e19ae036e75a" - }, - "address": "00fd696f0c0660779379f6bff8ce58632886f9d2", - "name": "master14" -} diff --git a/parity/parity/keys/master15.json b/parity/parity/keys/master15.json deleted file mode 100644 index d60c806..0000000 --- a/parity/parity/keys/master15.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "df67c646-3a5d-7056-0e2b-91f81aebd2a7", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "5b9d339a1723fc0e057020a52acbf0b8" - }, - "ciphertext": "ef2613c8e44ddbd4bd1794edb2e5fba0983ac7271f028c416a0e953beb74a4d6", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "7e735f3ea802327f10fe8ae05b6fe91241de75c85ef2119f6d8701e583c8ae43" - }, - "mac": "aca829819b1e7575c1f4be9a1cf52ec3c132b5b48bd2b88cca12ff89eeab2c5e" - }, - "address": "007f16bc32026e7cd5046590e4f5b711ef1a6d8b", - "name": "master15" -} diff --git a/parity/parity/keys/master16.json b/parity/parity/keys/master16.json deleted file mode 100644 index cfba8d8..0000000 --- a/parity/parity/keys/master16.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "619787da-e622-8659-4b73-6a45a2e0a0eb", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "8fd9e4a6f309ae9cbb53d3c162345f46" - }, - "ciphertext": "0eda20c52ca5c47e9564e1b61415afcc0a0901b85ced1a921295f9eda48f84be", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "4ec8f7ff993a7e1d905b3a0747346120c3924b03b1976b6abff7708870415680" - }, - "mac": "523708777a04acb3f3cad32f28c32578fa822eadaa23da0fb639be9eb492106b" - }, - "address": "00fb81808899fd51c4a87a642084138be62189a0", - "name": "master16" -} diff --git a/parity/parity/keys/master17.json b/parity/parity/keys/master17.json deleted file mode 100644 index 1ce11ab..0000000 --- a/parity/parity/keys/master17.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "56ddc2fc-d5cd-8887-e80d-8af51f289049", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "266860ec3a679eb24eb12160d380b783" - }, - "ciphertext": "99eafe9f7f17c85add07cdf6f7e2e8239da96faa21455fca5bcb886461087b3f", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "a4d8141ac116dab72b2d210a3c1c9b403e0ae7930fe82743765ae4eb0b96dec5" - }, - "mac": "394971c1f52a8d75c9e8d7b9fe6d99b0e13b9507628cb0ebea0281e1513540ac" - }, - "address": "00a61dabf0324bc07ba5a82a97c5f15d38fa9bbc", - "name": "master17" -} diff --git a/parity/parity/keys/master18.json b/parity/parity/keys/master18.json deleted file mode 100644 index ea11e54..0000000 --- a/parity/parity/keys/master18.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "9eb5f14e-8893-7b87-54a3-768eb6170746", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "4692f33d3e8b5c174c4e7ec5a8909415" - }, - "ciphertext": "e6db22db1cb28195e3b8dfd7e461c3fe8bdfe9c720c595eecbf341f8a37035ae", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "cf6abdbc0439076adbac8b449e7cb64b99bc788681ad7ffa001ed3887882e5aa" - }, - "mac": "9da8acd3e75285af7cf065a03445a8e573ab73cb8e0d9734a09261b3c20f9743" - }, - "address": "007a11ac48952a7e8e661833f4803bd7ffa58f77", - "name": "master18" -} diff --git a/parity/parity/keys/master19.json b/parity/parity/keys/master19.json deleted file mode 100644 index e2f34d8..0000000 --- a/parity/parity/keys/master19.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "d42b9349-bcd1-3911-d2b9-43e1a709c628", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "7cc62f24c5f4b3548c0497c8b69f5b6b" - }, - "ciphertext": "f687745f91679ccadd37ab883b9e91c3ddaf3ed14f3ec8570f3636099a77d480", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "b97799e265d265d22faea87431bcfb41b052fdbb6351debebdbb5dc73beb8fb0" - }, - "mac": "180d90ddaf9f6987187beb7c6f935c62127aafa936a6f202d29bfec19adb7123" - }, - "address": "00e7ad5b906c829c71c2f6f6cec016866ed1c264", - "name": "master19" -} diff --git a/parity/parity/keys/master2.json b/parity/parity/keys/master2.json deleted file mode 100644 index 4fd9ce4..0000000 --- a/parity/parity/keys/master2.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "28a8e3f5-d204-2e4e-c361-e45d9b02e3f9", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "973cffe25a47d21d5ef7000545d4b829" - }, - "ciphertext": "eee722ec3d0a794469d39d5fd352bb34423f3c8a3ed85bf21e76502144d97755", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "abd87a6776c7b22278a54bf0a98b3469041fa9ced152c467e78261185765b76b" - }, - "mac": "3953ad383045c567f653507641a0c6390b68f8885a093d32e2a445fa0828392e" - }, - "address": "006b8d5f5c8ad11e5e6cf9ee6624433891430965", - "name": "master2" -} diff --git a/parity/parity/keys/master20.json b/parity/parity/keys/master20.json deleted file mode 100644 index a7de674..0000000 --- a/parity/parity/keys/master20.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "9c47e600-3e7f-01ae-0250-ed136b086ebd", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "b68660821c79d4d0fcbdf2fa0361d090" - }, - "ciphertext": "60ce0fc570380541681584952c7211c409838eb3573eefc09e5399eba8a081a0", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "92201b5871812512006990ed3366cabedd854883e0dac08e39b23c22916321c5" - }, - "mac": "70f4484daa3d560fc9f3956f9b40d133de3bc0535f2367972790598df92dd49e" - }, - "address": "0075f4f4d7324fef36371610d03e1195894bf420", - "name": "master20" -} diff --git a/parity/parity/keys/master3.json b/parity/parity/keys/master3.json deleted file mode 100644 index b23d17a..0000000 --- a/parity/parity/keys/master3.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "32ebbccd-a5f6-7438-e511-09250157027c", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "d8c73bf1519d18bf142a3b29524053ca" - }, - "ciphertext": "2e450b0cbe4293522c2e94d42cee98a8c10f2dbecabc9cda8bdc08b6de3edd12", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "f68d8e18795bda386397d0d7c9a9049459aa3e35127c9396c475ecc925042b08" - }, - "mac": "0af821e0046a9b8a2460912c4797a0a0cd7fe1b219188e65682dd87f6f37f114" - }, - "address": "00ebf1c449cc448a14ea5ba89c949a24fa805a14", - "name": "master3" -} diff --git a/parity/parity/keys/master4.json b/parity/parity/keys/master4.json deleted file mode 100644 index 450cf51..0000000 --- a/parity/parity/keys/master4.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "55fb2385-239d-8f74-dd93-468150bd05d0", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "71a1a1d9b4e085a93360907341e5d5db" - }, - "ciphertext": "6795b73e6784258172f27bfbc5864cf62fbc5974318d5b59d2c57dbb000f9721", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "ff8e963be0ff7dbc4d1938b027fdef3c3ecd09abf7274eda19a178cce85146c2" - }, - "mac": "b4d9eef2672c82b59f2020ac8817f6714667f77f5cc6fb3fb78db36bdf157b0b" - }, - "address": "009a1372f9e2d70014d7f31369f115fc921a87c8", - "name": "master4" -} diff --git a/parity/parity/keys/master5.json b/parity/parity/keys/master5.json deleted file mode 100644 index 9e349d6..0000000 --- a/parity/parity/keys/master5.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "c05cf5a4-6a5d-11de-bfa1-42989f3feb1d", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "73aa94b02ac7b79d01934b7dde88d63d" - }, - "ciphertext": "925f650fa0d560aa694298de1514f53e383833b0bc4838e44ed95bf5c5c84763", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "6ad7eb08aa9b7463d8dcf2bff45f95d608e3e55ca12ea9651c916c57b0f8acba" - }, - "mac": "0a648a4ea58f3b38252f8f094bea3f5e427658e2c9f5d8b22343a9b8bc1c5a23" - }, - "address": "0076ed2dd9f7dc78e3f336141329f8784d8cd564", - "name": "master5" -} diff --git a/parity/parity/keys/master6.json b/parity/parity/keys/master6.json deleted file mode 100644 index 676000b..0000000 --- a/parity/parity/keys/master6.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "93608206-ba27-a76a-93ae-255c0ab10d41", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "8bebab643352956d6fc3369475627f18" - }, - "ciphertext": "4f00c21bf5036fc263c88e5ffb2b3a1642f684da0e40ae9ca0d2132a21185716", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "749677afe391c5661295077956fcfb1774f6020bc2910a2a1629a40b94ac88b5" - }, - "mac": "001fecc049bd55da9956db036bbed25f57979943981cd252b40eeeda2ec9acf7" - }, - "address": "006db7698b897b842a42a1c3ce423b07c2656ecd", - "name": "master6" -} diff --git a/parity/parity/keys/master7.json b/parity/parity/keys/master7.json deleted file mode 100644 index da52c45..0000000 --- a/parity/parity/keys/master7.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "549d9dbe-23a1-84b0-7512-3061f6c3dfdd", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "1a142473139e05cbc426c71e2e0edb33" - }, - "ciphertext": "54f3d36f0165cd93ad7bf465bbd1c45babc281df5752791f9c0404238860f7d9", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "cfdef5054d78e1da96cb3d7e0972d92d4543455b2206e596824816f007d7c13b" - }, - "mac": "93848426d03140da11c69d24ffd4c94fb6ad9a6c0019722c916b118c4d911e35" - }, - "address": "0012fc0db732dfd07a0cd8e4bedc6b160c9aedc5", - "name": "master7" -} diff --git a/parity/parity/keys/master8.json b/parity/parity/keys/master8.json deleted file mode 100644 index 503dfa3..0000000 --- a/parity/parity/keys/master8.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "1e9af9bb-babc-4c39-8316-1ddad0a79ea9", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "d5dc985faf57618d15e4425bdada04cd" - }, - "ciphertext": "55082c741fddcebee7306380ba5091046f511439fcdcb5e3a8b663ec17163757", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "af2bac19edb773fccd6372084e9fb62860f712a3e2e2b33b3fdfd6c7e3c06ef4" - }, - "mac": "e0c12d54410c9eae91a14df350eca4fe4f338090c742c585d0f3ef03cf5875d6" - }, - "address": "00f137e9bfe37cc015f11cec8339cc2f1a3ae3a6", - "name": "master8" -} diff --git a/parity/parity/keys/master9.json b/parity/parity/keys/master9.json deleted file mode 100644 index d758adc..0000000 --- a/parity/parity/keys/master9.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "265b683b-720c-46ba-9662-ebd140ddc4f7", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "426fa92e448ccc5e8daa06369a021485" - }, - "ciphertext": "fa9cee82d674399748c60e549fa73cbed6a7729c8988b1497057599ddaca2f41", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "8c13a79efe5a52409d844e68a4a244681d0925a75abe7af53bb29bcfb4105933" - }, - "mac": "b3ca38e267a5f30072854b7e6caedf3b64f066461292adc9d77354d59a5de683" - }, - "address": "00c2bc2f078e1dbafa4a1fa46929e1f2ca207f00", - "name": "master9" -} diff --git a/parity/parity/keys/slave.json b/parity/parity/keys/slave.json deleted file mode 100644 index e2e9d7f..0000000 --- a/parity/parity/keys/slave.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "e628edcc-7656-ae63-16b4-681829162ef4", - "version": 3, - "crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { - "iv": "60e33a6f2dd51b76789446a05bb6955e" - }, - "ciphertext": "cd9d1386c72b9a3b79ba83b12d62737197198c58eb976da892ad45e69d06a375", - "kdf": "pbkdf2", - "kdfparams": { - "c": 10240, - "dklen": 32, - "prf": "hmac-sha256", - "salt": "91c370dd20a35536ee73554c2bc0758eaef56e9d778f92bdfc34cd068cc7cc50" - }, - "mac": "e73e3cb1f8ec1498b148fbe62819e8e19380ae70d21491cc2cc2d44a6c0a0a7b" - }, - "address": "00e3d1aa965aafd61217635e5f99f7c1e567978f", - "name": "SLAVE", - "meta": "{\"passwordHint\":\"\",\"timestamp\":1490892369465}" -} diff --git a/parity/parity/keys/validator.json b/parity/parity/keys/validator.json old mode 100644 new mode 100755 From 56f7e024df18d4fe5a4e2f093c4ea0f02b346408 Mon Sep 17 00:00:00 2001 From: ssallam Date: Wed, 27 Jun 2018 15:51:32 +0200 Subject: [PATCH 06/28] Fix smart contract issue, update documentation. --- parity/.env | 2 +- parity/README.md | 107 ++++++++++++++---- parity/dashboard/ws_secret.json | 1 - parity/docker-compose.yml | 12 +-- parity/monitor/app.json | 149 -------------------------- parity/parity/config/chain.json | 19 ++-- parity/parity/keys/dapps_history.json | 1 - 7 files changed, 108 insertions(+), 183 deletions(-) delete mode 100755 parity/dashboard/ws_secret.json delete mode 100755 parity/monitor/app.json delete mode 100644 parity/parity/keys/dapps_history.json diff --git a/parity/.env b/parity/.env index a02c5d0..c94bcb8 100755 --- a/parity/.env +++ b/parity/.env @@ -1 +1 @@ -NETWORK_NAME=ocean-protocol +NETWORK_NAME=ocean-network diff --git a/parity/README.md b/parity/README.md index 2fc41f9..1213169 100644 --- a/parity/README.md +++ b/parity/README.md @@ -1,25 +1,96 @@ -# Instructions to run a Parity dev node using Docker Compose -### Pre-requisites -* Docker -* Docker-compose +# Ocean private test net using Proof Of Authority consensus +### Setup -### Run a private network based on this repository -* Download/clone the files in this repository -`git clone https://github.com/oceanprotocol/docker-images.git` -* cd into `parity` -* Run: `docker-compose up -d` -* This will run 3 validator/authority nodes and 3 user nodes +0. Install [docker](https://docs.docker.com/engine/installation/) and [docker-compose](https://docs.docker.com/compose/install/) +1. Run `git clone https://github.com/oceanprotocol/docker-images.git` +2. Run `cd docker-images/parity` +3. Run `docker-compose up ` (add `-d` to run in daemon mode) +4. This will run 3 validator/authority nodes and 1 user node -### Add more authority nodes to the base network +### Access JSON RPC +Access JSON RPC at [http://127.0.0.1:8545](http://127.0.0.1:8545). + +### Some handy curl commands + +### Send transaction +``` +curl --data '{"jsonrpc":"2.0","method":"personal_sendTransaction","params":[{"from":"0x
","to":"0x
","value":"0x"}, ""],"id":0}' -H "Content-Type: application/json" -X POST localhost:8545 +``` + +#### Unlock account +replace `null` with number of seconds to indicate how long account will be unlocked +Account address goes in the first param (here is's just "0x") +``` +curl --data '{"method":"personal_unlockAccount","params":["0x","hunter2",null],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST localhost:8545 + +``` + +### New account +Using just a password +``` +curl --data '{"method":"personal_newAccount","params":["password-hunter2"],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST localhost:8545 +``` + +Using a recovery phrase and password +``` +curl --data '{"method":"parity_newAccountFromPhrase","params":["stylus outing overhand dime radial seducing harmless uselessly evasive tastiness eradicate imperfect","hunter2"],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST localhost:8545 +``` + +Refer to these sources for more goodies: +* https://github.com/paritytech/wiki +* https://github.com/paritytech/wiki/blob/master/JSONRPC-personal-module.md +* https://github.com/paritytech/wiki/blob/master/JSONRPC-parity_accounts-module.md + +### Instructions to add a validator node using Docker Compose * Run the private network as described above * Create a new validator account: - `curl --data '{"jsonrpc":"2.0","method":"parity_newAccountFromPhrase","params":["nodeX", "nodeX"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8545` + `curl --data '{"jsonrpc":"2.0","method":"parity_newAccountFromPhrase","params":["nodeX-phrase", "nodeX-password"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8545` * Returns something like this: `{"jsonrpc":"2.0","result":"0x00aa39d30f0d20ff03a22ccfc30b7efbfca597c2","id":0}` -* Copy the file `parity/keys/UTC--2018-05-22T13-53-28Z--ed4d9a7c-4206-bbf3-673c-fdd1d41b4dcb` to `parity/authorities` and rename it to `validatorX.json` (pick a better name) then modify the contents to indent properly -* Add a simple text file named `validatorX.pwd` in `parity/authorities` and add the password `nodeX` (or whatever was specified in the "params":["nodeX", "nodeX"]) -* Copy/paste one of the validator specs in the docker-compose.yml file and modify it to reflect the new node name and make sure to point to the new `validatorX.json` and `validayorX.pwd` files. - * Also specify the address in the --engine-signer option - * And add the name in the volumes section in the compose file -* Make a copy of `parity/node0.network.key` and modify the key inside this file (anything should do) +* Copy the file `parity/keys/UTC--2018-05-22T13-53-28Z--ed4d9a7c-4206-bbf3-673c-fdd1d41b4dcb` to `parity/authorities` and rename it to `validatorX.json` (pick a better name) then modify the contents to improve indentation (optional) +* Add a simple text file named `validatorX.pwd` in `parity/authorities` and add the password `nodeX-password` (or whatever was specified in the "params":["nodeX-phrase", "nodeX-password"]) +* Copy/paste a validator image definition section in the docker-compose.yml file and modify it to reflect the new node name and make sure to point to the new `validatorX.json` and `validayorX.pwd` files. + * This is what will be added to the docker-compose.yml file: +``` + validatorX: + image: parity/parity:stable + command: + --config /parity/config/validator.toml + --engine-signer 0x00aa39d30f0d20ff03a22ccfc30b7efbfca597c2 + volumes: + - ./parity/config:/parity/config:ro + - validatorX:/root/.local/share/io.parity.ethereum/ + - ./parity/authorities/validatorX.json:/root/.local/share/io.parity.ethereum/keys/${NETWORK_NAME}/validator.json:ro + - ./parity/authorities/validatorX.pwd:/parity/validator.pwd:ro + - ./parity/nodeX.network.key:/root/.local/share/io.parity.ethereum/network/key:ro + networks: + my_net: + ipv4_address: 172.16.0.13 +``` + * Make sure to assign a new `ipv4_address` address + * Specify the new account address in the --engine-signer option + * And add the name in the volumes section in the compose file: +``` +volumes: + validator0: + validator1: + validator2: + validatorX: + +``` +* Generate a new bootnode key and add it here `docker-images/parity/parity/nodeX.network.key` +* Get an enode address and add it in both `member.toml` and `validator.toml` files in the bootnodes list under `[network]` +* Update the validators list in `chain.json` by adding the new account to the existing list + + +## Notes +* We ran into an issue with running smart contracts where a function in one contract fails if it calls a function of another contract + * This problem is fixed by adding the following lines to the `chain.json` file to enable byzantium mode in the EVM: +``` + "eip140Transition": 0, + "eip211Transition": 0, + "eip214Transition": 0, + "eip658Transition": 0 +``` + * The problem is reported in `https://github.com/paritytech/parity/issues/8503` and `https://github.com/ethereum/solidity/issues/3969` \ No newline at end of file diff --git a/parity/dashboard/ws_secret.json b/parity/dashboard/ws_secret.json deleted file mode 100755 index 97ff85f..0000000 --- a/parity/dashboard/ws_secret.json +++ /dev/null @@ -1 +0,0 @@ -["123"] \ No newline at end of file diff --git a/parity/docker-compose.yml b/parity/docker-compose.yml index a06eea6..1c658cc 100644 --- a/parity/docker-compose.yml +++ b/parity/docker-compose.yml @@ -1,11 +1,11 @@ version: '2.1' services: validator0: - image: parity/parity:latest + image: parity/parity:stable command: --config /parity/config/validator.toml --engine-signer 0x00bd138abd70e2f00903268f3db08f2d25677c9e - --dapps-interface 0.0.0.0 + --jsonrpc-interface 0.0.0.0 --ws-interface 0.0.0.0 --ui-interface 0.0.0.0 --unsafe-expose @@ -25,7 +25,7 @@ services: ipv4_address: 172.16.0.10 validator1: - image: parity/parity:latest + image: parity/parity:stable command: --config /parity/config/validator.toml --engine-signer 0x00aa39d30f0d20ff03a22ccfc30b7efbfca597c2 @@ -40,7 +40,7 @@ services: ipv4_address: 172.16.0.11 validator2: - image: parity/parity:latest + image: parity/parity:stable command: --config /parity/config/validator.toml --engine-signer 0x002e28950558fbede1a9675cb113f0bd20912019 @@ -55,10 +55,10 @@ services: ipv4_address: 172.16.0.12 user0: - image: parity/parity:latest + image: parity/parity:stable command: --config /parity/config/member.toml - --dapps-interface 0.0.0.0 + --jsonrpc-interface 0.0.0.0 --ws-interface 0.0.0.0 --ui-interface 0.0.0.0 --unsafe-expose diff --git a/parity/monitor/app.json b/parity/monitor/app.json deleted file mode 100755 index 91db950..0000000 --- a/parity/monitor/app.json +++ /dev/null @@ -1,149 +0,0 @@ -[ - { - "name" : "validator0", - "script" : "app.js", - "log_date_format" : "YYYY-MM-DD HH:mm Z", - "merge_logs" : false, - "watch" : true, - "max_restarts" : 10, - "exec_interpreter" : "node", - "exec_mode" : "fork_mode", - "env": - { - "NODE_ENV" : "production", - "RPC_HOST" : "validator0", - "RPC_PORT" : "8545", - "LISTENING_PORT" : "30303", - "INSTANCE_NAME" : "validator0", - "WS_SERVER" : "ws://dashboard:3000", - "WS_SECRET" : "123", - "VERBOSITY" : 3 - } - }, - { - "name" : "validator1", - "script" : "app.js", - "log_date_format" : "YYYY-MM-DD HH:mm Z", - "merge_logs" : false, - "watch" : true, - "max_restarts" : 10, - "exec_interpreter" : "node", - "exec_mode" : "fork_mode", - "env": - { - "NODE_ENV" : "production", - "RPC_HOST" : "validator1", - "RPC_PORT" : "8545", - "LISTENING_PORT" : "30303", - "INSTANCE_NAME" : "validator1", - "WS_SERVER" : "ws://dashboard:3000", - "WS_SECRET" : "123", - "VERBOSITY" : 3 - } - }, - { - "name" : "validator2", - "script" : "app.js", - "log_date_format" : "YYYY-MM-DD HH:mm Z", - "merge_logs" : false, - "watch" : true, - "max_restarts" : 10, - "exec_interpreter" : "node", - "exec_mode" : "fork_mode", - "env": - { - "NODE_ENV" : "production", - "RPC_HOST" : "validator2", - "RPC_PORT" : "8545", - "LISTENING_PORT" : "30303", - "INSTANCE_NAME" : "validator2", - "WS_SERVER" : "ws://dashboard:3000", - "WS_SECRET" : "123", - "VERBOSITY" : 3 - } - }, - { - "name" : "validator3", - "script" : "app.js", - "log_date_format" : "YYYY-MM-DD HH:mm Z", - "merge_logs" : false, - "watch" : true, - "max_restarts" : 10, - "exec_interpreter" : "node", - "exec_mode" : "fork_mode", - "env": - { - "NODE_ENV" : "production", - "RPC_HOST" : "validator3", - "RPC_PORT" : "8545", - "LISTENING_PORT" : "30303", - "INSTANCE_NAME" : "validator3", - "WS_SERVER" : "ws://dashboard:3000", - "WS_SECRET" : "123", - "VERBOSITY" : 3 - } - }, - { - "name" : "user0", - "script" : "app.js", - "log_date_format" : "YYYY-MM-DD HH:mm Z", - "merge_logs" : false, - "watch" : true, - "max_restarts" : 10, - "exec_interpreter" : "node", - "exec_mode" : "fork_mode", - "env": - { - "NODE_ENV" : "production", - "RPC_HOST" : "user0", - "RPC_PORT" : "8545", - "LISTENING_PORT" : "30303", - "INSTANCE_NAME" : "user0", - "WS_SERVER" : "ws://dashboard:3000", - "WS_SECRET" : "123", - "VERBOSITY" : 3 - } - }, - { - "name" : "user1", - "script" : "app.js", - "log_date_format" : "YYYY-MM-DD HH:mm Z", - "merge_logs" : false, - "watch" : true, - "max_restarts" : 10, - "exec_interpreter" : "node", - "exec_mode" : "fork_mode", - "env": - { - "NODE_ENV" : "production", - "RPC_HOST" : "user1", - "RPC_PORT" : "8545", - "LISTENING_PORT" : "30303", - "INSTANCE_NAME" : "user1", - "WS_SERVER" : "ws://dashboard:3000", - "WS_SECRET" : "123", - "VERBOSITY" : 3 - } - }, - { - "name" : "user2", - "script" : "app.js", - "log_date_format" : "YYYY-MM-DD HH:mm Z", - "merge_logs" : false, - "watch" : true, - "max_restarts" : 10, - "exec_interpreter" : "node", - "exec_mode" : "fork_mode", - "env": - { - "NODE_ENV" : "production", - "RPC_HOST" : "user2", - "RPC_PORT" : "8545", - "LISTENING_PORT" : "30303", - "INSTANCE_NAME" : "user2", - "WS_SERVER" : "ws://dashboard:3000", - "WS_SECRET" : "123", - "VERBOSITY" : 3 - } - } -] diff --git a/parity/parity/config/chain.json b/parity/parity/config/chain.json index 52d24bc..5d266e4 100644 --- a/parity/parity/config/chain.json +++ b/parity/parity/config/chain.json @@ -1,5 +1,5 @@ { - "name": "ocean-protocol", + "name": "ocean-network", "engine": { "authorityRound": { "params": { @@ -7,7 +7,7 @@ "validators": { "list": [ "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e", - "0x00aa39d30f0d20ff03a22ccfc30b7efbfca597c2", + "0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2", "0x002e28950558fbede1a9675cb113f0bd20912019" ] }, @@ -20,8 +20,13 @@ "params": { "maximumExtraDataSize": "0x20", "minGasLimit": "0x1388", - "networkID": "0x2323", - "gasLimitBoundDivisor": "0x400" + "networkID": "0x2323", + "gasLimitBoundDivisor": "0x400", + "eip140Transition": 0, + "eip211Transition": 0, + "eip214Transition": 0, + "eip658Transition": 0 + }, "genesis": { "seal": { @@ -83,10 +88,10 @@ } }, "0x6B0c56d1Ad5144b4d37fa6e27DC9afd5C2435c3B": { - "balance": "10" + "balance": "1000" }, "0x0011598De1016A350ad719D23586273804076774": { - "balance": "10" + "balance": "100500" }, @@ -95,4 +100,4 @@ } } -} +} \ No newline at end of file diff --git a/parity/parity/keys/dapps_history.json b/parity/parity/keys/dapps_history.json deleted file mode 100644 index 61e5b61..0000000 --- a/parity/parity/keys/dapps_history.json +++ /dev/null @@ -1 +0,0 @@ -{"parity://1.ui.parity":{"last_accessed":1529334413},"":{"last_accessed":1529074407}} \ No newline at end of file From db3a3f5934164b67a65850f38776981a38659b66 Mon Sep 17 00:00:00 2001 From: ssallam Date: Thu, 28 Jun 2018 16:40:14 +0200 Subject: [PATCH 07/28] Update documentation --- parity/README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/parity/README.md b/parity/README.md index 1213169..d553e18 100644 --- a/parity/README.md +++ b/parity/README.md @@ -93,4 +93,19 @@ volumes: "eip658Transition": 0 ``` * The problem is reported in `https://github.com/paritytech/parity/issues/8503` and `https://github.com/ethereum/solidity/issues/3969` - \ No newline at end of file + +## The ocean test net +The private test net is running on Azure VM `ocn-hackaton` with ip address `40.115.16.244` + +To connect to the network, provide the ip address and use port `8545` + +To deploy keeper-contracts, use the following in your truffle.js file: +``` +ocean_poa_net: { + host: 'http://40.115.16.244', + port: 8545, + network_id: '*', + gas: 6000000, + from: "0x00bd138abd70e2f00903268f3db08f2d25677c9e" +}, +``` \ No newline at end of file From e685a8bbda27258c51e7cf213eeaf54a9de8140f Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Fri, 10 Aug 2018 11:52:29 +0200 Subject: [PATCH 08/28] added docker-compose for a full ocean --- ocean/README.md | 5 +++ ocean/docker-compose.yml | 74 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 ocean/README.md create mode 100644 ocean/docker-compose.yml diff --git a/ocean/README.md b/ocean/README.md new file mode 100644 index 0000000..1ed0ddf --- /dev/null +++ b/ocean/README.md @@ -0,0 +1,5 @@ +# Instructions to the full Ocean using Docker compose + +```bash +docker-compose up +``` \ No newline at end of file diff --git a/ocean/docker-compose.yml b/ocean/docker-compose.yml new file mode 100644 index 0000000..65e29de --- /dev/null +++ b/ocean/docker-compose.yml @@ -0,0 +1,74 @@ +version: '2.1' + +services: + # Build: docker-compose build -d bigchaindb + # Run: docker-compose run -d bdb + mongodb: + image: mongo:3.6 + ports: + - "27017:27017" + command: mongod + bigchaindb: + depends_on: + - mongodb + - tendermint + image: bigchaindb/bigchaindb:2.0.0-beta1 + environment: + BIGCHAINDB_DATABASE_BACKEND: localmongodb + BIGCHAINDB_DATABASE_HOST: mongodb + BIGCHAINDB_DATABASE_PORT: 27017 + BIGCHAINDB_SERVER_BIND: 0.0.0.0:9984 + BIGCHAINDB_WSSERVER_HOST: 0.0.0.0 + BIGCHAINDB_WSSERVER_ADVERTISED_HOST: bigchaindb + BIGCHAINDB_TENDERMINT_HOST: tendermint + BIGCHAINDB_TENDERMINT_PORT: 46657 + ports: + - "9984:9984" + - "9985:9985" + - "46658" + healthcheck: + test: ["CMD", "bash", "-c", "curl http://bigchaindb:9984 && curl http://tendermint:46657/abci_query"] + interval: 3s + timeout: 5s + retries: 3 + tendermint: + image: tendermint/tendermint:0.19.9 + # volumes: + # - ./tmdata:/tendermint + entrypoint: '' + ports: + - "46656:46656" + - "46657:46657" + command: sh -c "tendermint init && tendermint node --consensus.create_empty_blocks=false --proxy_app=tcp://bigchaindb:46658" + #bdb: + # image: busybox + # depends_on: + # bigchaindb: + # condition: service_healthy + # curl client to check the health of development env + curl-client: + image: appropriate/curl + command: /bin/sh -c "curl -s http://bigchaindb:9984/ > /dev/null && curl -s http://tendermint:46657/ > /dev/null" + vdocs: + image: nginx + ports: + - '33333:80' + volumes: + - ../docs/server/build/html:/usr/share/nginx/html + provider-backend: + image: oceanprotocol/provider-backend + ports: + - 5000:5000 + networks: + - backend + depends_on: + - keeper-contracts + keeper-contracts: + image: oceanprotocol/keeper-contracts + ports: + - 8545:8545 + networks: + - backend + +networks: + backend: From 50299049aee7d50942418aaf43cd190b583a0e02 Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Fri, 10 Aug 2018 12:34:16 +0200 Subject: [PATCH 09/28] deleted old stuff --- ocean-agent/README.md | 1 - ocean-db/README.md | 18 ------------------ ocean-db/bdb-install.sh | 9 --------- 3 files changed, 28 deletions(-) delete mode 100644 ocean-agent/README.md delete mode 100644 ocean-db/README.md delete mode 100755 ocean-db/bdb-install.sh diff --git a/ocean-agent/README.md b/ocean-agent/README.md deleted file mode 100644 index 37e8007..0000000 --- a/ocean-agent/README.md +++ /dev/null @@ -1 +0,0 @@ -# Instructions to run an Ocean-Agent node using Docker compose diff --git a/ocean-db/README.md b/ocean-db/README.md deleted file mode 100644 index f304a25..0000000 --- a/ocean-db/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Instructions for running BDB using Docker Compose - -* Install last versions of [Docker](https://docs.docker.com/install/) and [Docker Compose](https://github.com/docker/compose/releases) -* Install BDB and all the components -```bash -sh bdb-install.sh -``` - -* Start BDB compose -```bash -docker-compose up -d bdb -``` - - - - - - diff --git a/ocean-db/bdb-install.sh b/ocean-db/bdb-install.sh deleted file mode 100755 index 010f43d..0000000 --- a/ocean-db/bdb-install.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -x - -curl -L https://github.com/bigchaindb/bigchaindb/archive/master.zip -o bigchaindb.zip -#unzip bigchaindb.zip -d . && mv bigchaindb-master/* . && rm -rf bigchaindb-master bigchaindb.zip -unzip bigchaindb.zip -d . && cd bigchaindb-master -docker-compose build bigchaindb -cd .. -rm -rf bigchaindb-master bigchaindb.zip - From b69f4d48bd81b04205766e66ebbf6ba32c7c4b01 Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Fri, 10 Aug 2018 12:38:42 +0200 Subject: [PATCH 10/28] remoed .idea --- .idea/docker-images.iml | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 .idea/docker-images.iml diff --git a/.idea/docker-images.iml b/.idea/docker-images.iml deleted file mode 100644 index 1de84ce..0000000 --- a/.idea/docker-images.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - \ No newline at end of file From c8045ce75ed431c20d39cdb493971d8a13a2dc9c Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Fri, 10 Aug 2018 12:39:07 +0200 Subject: [PATCH 11/28] added gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file From 5f5bcf201e91363d4622ddcd35691bd750e49278 Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Fri, 10 Aug 2018 13:20:16 +0200 Subject: [PATCH 12/28] added pleuston --- ocean/docker-compose.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ocean/docker-compose.yml b/ocean/docker-compose.yml index 65e29de..3aee03d 100644 --- a/ocean/docker-compose.yml +++ b/ocean/docker-compose.yml @@ -69,6 +69,10 @@ services: - 8545:8545 networks: - backend + pleuston: + image: oceanprotocol/pleuston + ports: + - 3000:3000 networks: backend: From 95b95cd59ac96c8722065dc2ff45cbeee15d693b Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Fri, 10 Aug 2018 14:15:07 +0200 Subject: [PATCH 13/28] added export of artifacts to docker compose --- .gitignore | 3 ++- ocean/docker-compose.yml | 26 ++++++++++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 723ef36..dbd8bae 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.idea \ No newline at end of file +.idea +ocean/artifacts/ \ No newline at end of file diff --git a/ocean/docker-compose.yml b/ocean/docker-compose.yml index 3aee03d..e325e97 100644 --- a/ocean/docker-compose.yml +++ b/ocean/docker-compose.yml @@ -8,6 +8,7 @@ services: ports: - "27017:27017" command: mongod + bigchaindb: depends_on: - mongodb @@ -31,6 +32,7 @@ services: interval: 3s timeout: 5s retries: 3 + tendermint: image: tendermint/tendermint:0.19.9 # volumes: @@ -40,21 +42,34 @@ services: - "46656:46656" - "46657:46657" command: sh -c "tendermint init && tendermint node --consensus.create_empty_blocks=false --proxy_app=tcp://bigchaindb:46658" + #bdb: # image: busybox # depends_on: # bigchaindb: # condition: service_healthy # curl client to check the health of development env + curl-client: image: appropriate/curl command: /bin/sh -c "curl -s http://bigchaindb:9984/ > /dev/null && curl -s http://tendermint:46657/ > /dev/null" + vdocs: image: nginx ports: - '33333:80' volumes: - ../docs/server/build/html:/usr/share/nginx/html + + keeper-contracts: + image: oceanprotocol/keeper-contracts + ports: + - 8545:8545 + networks: + - backend + volumes: + - ./artifacts/:/keeper-contracts/build/contracts/ + provider-backend: image: oceanprotocol/provider-backend ports: @@ -63,16 +78,15 @@ services: - backend depends_on: - keeper-contracts - keeper-contracts: - image: oceanprotocol/keeper-contracts - ports: - - 8545:8545 - networks: - - backend + pleuston: image: oceanprotocol/pleuston ports: - 3000:3000 + depends_on: + - keeper-contracts + volumes: + - ./artifacts/:/pleuston/node_modules/@oceanprotocol/keeper-contracts/build/contracts/ networks: backend: From 080335ba72884cb0f8b1a3ddccef42fd6214520b Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Fri, 10 Aug 2018 14:30:17 +0200 Subject: [PATCH 14/28] moved main docker-compose to main folder --- .gitignore | 2 +- ocean/docker-compose.yml => docker-compose.yml | 0 ocean/README.md | 5 ----- 3 files changed, 1 insertion(+), 6 deletions(-) rename ocean/docker-compose.yml => docker-compose.yml (100%) delete mode 100644 ocean/README.md diff --git a/.gitignore b/.gitignore index dbd8bae..aab5881 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ .idea -ocean/artifacts/ \ No newline at end of file +artifacts/ \ No newline at end of file diff --git a/ocean/docker-compose.yml b/docker-compose.yml similarity index 100% rename from ocean/docker-compose.yml rename to docker-compose.yml diff --git a/ocean/README.md b/ocean/README.md deleted file mode 100644 index 1ed0ddf..0000000 --- a/ocean/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Instructions to the full Ocean using Docker compose - -```bash -docker-compose up -``` \ No newline at end of file From 71e8b0dc3de0bb10d00c08a5a062817ff9308059 Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Fri, 10 Aug 2018 14:30:25 +0200 Subject: [PATCH 15/28] updated readme --- README.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c138e31..26022a4 100644 --- a/README.md +++ b/README.md @@ -1 +1,64 @@ -# docker-images \ No newline at end of file +[![banner](doc/img/repo-banner@2x.png)](https://oceanprotocol.com) + +

docker-images

+ +> 💧 Integration of TCRs, CPM and Ocean Tokens in Solidity +> [oceanprotocol.com](https://oceanprotocol.com) + +[![Build Status](https://travis-ci.com/oceanprotocol/keeper-contracts.svg?token=soMi2nNfCZq19zS1Rx4i&branch=master)](https://travis-ci.com/oceanprotocol/keeper-contracts) +[![js ascribe](https://img.shields.io/badge/js-ascribe-39BA91.svg)](https://github.com/ascribe/javascript) + +Ocean Keeper implementation where we put the following modules together: + +* **TCRs**: users create challenges and resolve them through voting to maintain registries; +* **Ocean Tokens**: the intrinsic tokens circulated inside Ocean network, which is used in the voting of TCRs; +* **Marketplace**: the core marketplace where people can transact with each other with Ocean tokens. + +## Table of Contents + + - [Get Started](#get-started) + - [Docker](#docker) + - [Contributing](#contributing) + - [License](#license) + +--- + +## Get Started + +For local development you can use Docker. + +### Docker + +The most simple way to get started is with Docker compose: + +```bash +docker-compose up +``` + +This will give you a local instance of ocean protocol. + +## Contributing + +We use GitHub as a means for maintaining and tracking issues and source code development. + +If you would like to contribute, please fork this repository, do work in a feature branch, and finally open a pull request for maintainers to review your changes. + +Ocean Protocol uses [C4 Standard process](https://github.com/unprotocols/rfc/blob/master/1/README.md) to manage changes in the source code. Find here more details about [Ocean C4 OEP](https://github.com/oceanprotocol/OEPs/tree/master/1). + +## License + +``` +Copyright 2018 Ocean Protocol Foundation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` From 061d896e7f08a087a724d79279cc4a9730a8f926 Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Fri, 10 Aug 2018 14:44:12 +0200 Subject: [PATCH 16/28] added repo banner --- doc/img/repo-banner@2x.png | Bin 0 -> 81427 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/img/repo-banner@2x.png diff --git a/doc/img/repo-banner@2x.png b/doc/img/repo-banner@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce2ddfbbefe233a7c2ff4800b72bfed725f4025 GIT binary patch literal 81427 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 literal 0 HcmV?d00001 From c0e8f969360cb31d59ccbcd430464e39dff5fb2e Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Fri, 10 Aug 2018 16:11:35 +0200 Subject: [PATCH 17/28] added contract artifacts to docker compose for provider-backend --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index e325e97..11057a4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -78,6 +78,8 @@ services: - backend depends_on: - keeper-contracts + volumes: + - ./artifacts/:/usr/local/lib/python3.6/site-packages/contracts/ pleuston: image: oceanprotocol/pleuston From 0f72b472c99a658db8e0913919d09439e463a393 Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Mon, 13 Aug 2018 11:08:40 +0200 Subject: [PATCH 18/28] added project name to doc --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 26022a4..f324538 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ For local development you can use Docker. The most simple way to get started is with Docker compose: ```bash -docker-compose up +docker-compose up --project-name=ocean ``` This will give you a local instance of ocean protocol. From 5e7494ca7fd43ed0022dff151c434782da8d3bad Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Mon, 13 Aug 2018 11:22:36 +0200 Subject: [PATCH 19/28] fixed readme, my fault sorry --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f324538..7eebce0 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ For local development you can use Docker. The most simple way to get started is with Docker compose: ```bash -docker-compose up --project-name=ocean +docker-compose --project-name=ocean up ``` This will give you a local instance of ocean protocol. From 0aed86523271e97e8ec1f041515efe1ec2478ff6 Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Mon, 13 Aug 2018 12:10:17 +0200 Subject: [PATCH 20/28] cleanup, networks, putting it all together --- docker-compose.yml | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 11057a4..ce7b92a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,6 +8,8 @@ services: ports: - "27017:27017" command: mongod + networks: + - backend bigchaindb: depends_on: @@ -32,6 +34,8 @@ services: interval: 3s timeout: 5s retries: 3 + networks: + - backend tendermint: image: tendermint/tendermint:0.19.9 @@ -42,24 +46,8 @@ services: - "46656:46656" - "46657:46657" command: sh -c "tendermint init && tendermint node --consensus.create_empty_blocks=false --proxy_app=tcp://bigchaindb:46658" - - #bdb: - # image: busybox - # depends_on: - # bigchaindb: - # condition: service_healthy - # curl client to check the health of development env - - curl-client: - image: appropriate/curl - command: /bin/sh -c "curl -s http://bigchaindb:9984/ > /dev/null && curl -s http://tendermint:46657/ > /dev/null" - - vdocs: - image: nginx - ports: - - '33333:80' - volumes: - - ../docs/server/build/html:/usr/share/nginx/html + networks: + - backend keeper-contracts: image: oceanprotocol/keeper-contracts From 0761c8879161b0d1cfbb881ced93bc496928eb5e Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Mon, 13 Aug 2018 13:48:08 +0200 Subject: [PATCH 21/28] fixed contracts path for provider-backend --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index ce7b92a..6e865cf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -67,7 +67,7 @@ services: depends_on: - keeper-contracts volumes: - - ./artifacts/:/usr/local/lib/python3.6/site-packages/contracts/ + - ./artifacts/:/usr/local/contracts/ pleuston: image: oceanprotocol/pleuston From 04d7b03d373a0788556121ab36488deb4b039243 Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Mon, 13 Aug 2018 14:16:15 +0200 Subject: [PATCH 22/28] fixed deps on tendermint and bigchaindb --- docker-compose.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 6e865cf..f0d4b27 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,8 @@ version: '2.1' +# Run: docker-compose --project-name=ocean up + services: - # Build: docker-compose build -d bigchaindb - # Run: docker-compose run -d bdb mongodb: image: mongo:3.6 ports: @@ -14,7 +14,6 @@ services: bigchaindb: depends_on: - mongodb - - tendermint image: bigchaindb/bigchaindb:2.0.0-beta1 environment: BIGCHAINDB_DATABASE_BACKEND: localmongodb @@ -38,6 +37,8 @@ services: - backend tendermint: + depends_on: + - bigchaindb image: tendermint/tendermint:0.19.9 # volumes: # - ./tmdata:/tendermint From c718fa7bcb7bb94fb191576dc36161aea0a54414 Mon Sep 17 00:00:00 2001 From: "aitor@oceanprotocol.com" Date: Mon, 13 Aug 2018 15:12:21 +0200 Subject: [PATCH 23/28] adding details --- README.md | 24 ++++++++++++++++++++++-- doc/img/docker-images.jpg | Bin 0 -> 23528 bytes 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 doc/img/docker-images.jpg diff --git a/README.md b/README.md index 7eebce0..7322855 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,10 @@ Ocean Keeper implementation where we put the following modules together: ## Get Started -For local development you can use Docker. +For local development you can use Docker & Docker Compose. To do that you need to have the newest versions available of both: + +* [Docker](https://www.docker.com/get-started) +* [Docker Compose](https://docs.docker.com/compose/) ### Docker @@ -35,7 +38,24 @@ The most simple way to get started is with Docker compose: docker-compose --project-name=ocean up ``` -This will give you a local instance of ocean protocol. +This will give you a local instance of Ocean Protocol. + +After having everything running, you could open the browser and access to the **pleuston frontend** application: + +``` +http://localhost:3000 +``` + +## Ocean components + +The Ocean Docker compose starts the following components: + +* **Pleuston** frontend application. Listening the **3000** port. +* **Provider backend**. Listening the **5000** port. +* **Keeper contracts**. Listening the **8545** port. +* **BigchainDB**. Listening the **9984** port. + +![Ocean Docker Images](doc/img/docker-images.jpg) ## Contributing diff --git a/doc/img/docker-images.jpg b/doc/img/docker-images.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5acc8875d33bc134047dbe824f30d97de6fd9cdc GIT binary patch literal 23528 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 literal 0 HcmV?d00001 From 3500e4136e7c53ac7ec6fd00fff62d33e7ca524f Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Mon, 13 Aug 2018 15:32:59 +0200 Subject: [PATCH 24/28] updated artifacts folder for provider backend --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index f0d4b27..af1211e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -57,7 +57,7 @@ services: networks: - backend volumes: - - ./artifacts/:/keeper-contracts/build/contracts/ + - ./artifacts/:/keeper-contracts/artifacts/ provider-backend: image: oceanprotocol/provider-backend From a2bc91be8c0227fb873bff6f1788c5e47fd21a75 Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Tue, 14 Aug 2018 08:26:02 +0200 Subject: [PATCH 25/28] adapted path to artifacts --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index af1211e..a5fcd07 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -77,7 +77,7 @@ services: depends_on: - keeper-contracts volumes: - - ./artifacts/:/pleuston/node_modules/@oceanprotocol/keeper-contracts/build/contracts/ + - ./artifacts/:/pleuston/node_modules/@oceanprotocol/artifacts/contracts/ networks: backend: From 36b057976ec3bc410702359b53eb11d36c2eaef9 Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Tue, 14 Aug 2018 16:00:23 +0200 Subject: [PATCH 26/28] better version of volumes --- docker-compose.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index a5fcd07..a19d375 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -54,10 +54,10 @@ services: image: oceanprotocol/keeper-contracts ports: - 8545:8545 - networks: + networkso: - backend volumes: - - ./artifacts/:/keeper-contracts/artifacts/ + - artifacts:/keeper-contracts/artifacts/ provider-backend: image: oceanprotocol/provider-backend @@ -68,7 +68,7 @@ services: depends_on: - keeper-contracts volumes: - - ./artifacts/:/usr/local/contracts/ + - artifacts:/usr/local/contracts/ pleuston: image: oceanprotocol/pleuston @@ -77,7 +77,10 @@ services: depends_on: - keeper-contracts volumes: - - ./artifacts/:/pleuston/node_modules/@oceanprotocol/artifacts/contracts/ + - artifacts:/pleuston/node_modules/@oceanprotocol/keeper-contracts/artifacts/:ro networks: backend: + +volumes: + artifacts: From d3cf6ded7af8cd314d53e64bb8e9b347a715c8ec Mon Sep 17 00:00:00 2001 From: eruizgar91 Date: Tue, 14 Aug 2018 16:30:17 +0200 Subject: [PATCH 27/28] Fix typo in network --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index a19d375..501f0e9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -54,7 +54,7 @@ services: image: oceanprotocol/keeper-contracts ports: - 8545:8545 - networkso: + networks: - backend volumes: - artifacts:/keeper-contracts/artifacts/ From 14b2343ba425f5383a7deb2c9abf826367f3983b Mon Sep 17 00:00:00 2001 From: Sebastian Gerske Date: Wed, 15 Aug 2018 11:25:01 +0200 Subject: [PATCH 28/28] updated docker compose to use read only volumes for provider-backend --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 501f0e9..2d32098 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -68,7 +68,7 @@ services: depends_on: - keeper-contracts volumes: - - artifacts:/usr/local/contracts/ + - artifacts:/usr/local/contracts/:ro pleuston: image: oceanprotocol/pleuston