AmbireTech/adex-validator-stack-rust
The Ambire AdEx Validator Stack implemented in Rust: sentry, validator worker, adapter, adview manager
Ambire AdEx Validator Stack 
Components:
- Sentry
- Validator worker
- Adapter - Ethereum & Dummy (for testing) Adapters
- AdView manager
Local & Testing setup
Requirements:
- Rust
- We target the
stableversion of the Rust compiler. cargo-make
- We target the
- Docker & Docker-compose
Linux
build-essentialsis required to build the project (error:linker ``cc`` not found)- The crate
openssl-sysrequireslibssl-devandpkg-configfor Ubuntu.
Sentry
Sentry is the REST API that the Validator worker
uses for storing and retrieving information.
Two services are needed to run Sentry: Postgres and Redis.
The easiest way to run these services locally is by using the provided docker-compose file:
docker-compose -f docker-compose.yml up -d adex-redis adex-postgres
If you want to run them manually without docker-compose:
Running Postgres
docker run --rm --name adex-validator-postgres -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data postgres
$HOME/docker/volumes/postgres- your local storage for postgres (persist the data when we remove the container)POSTGRES_PASSWORD=postgres- the password of the defaultpostgresuser
NOTE: Additionally you must setup 2 databases - sentry_leader & sentry_follower in order for the provided examples below to work. Postgres comes with an environment variable POSTGRES_DB that you can use to change the default postgres database, but there is currently no way to create multiple using the official postgres image.
Running Redis
docker run --rm -p 6379:6379 --name adex-validator-redis -d redis
Running Sentry Rest API
For a full list of all available CLI options on Sentry run --help:
cargo run -p sentry -- --helpStarting the Sentry API in will always run migrations, this will make sure the database is always up to date with the latest migrations, before starting and exposing the web server.
By default, we use the development environment ( ENV environment variable ) as it will also seed the database (seeding is disabled, see #514).
To enable TLS for the sentry server you need to pass both --privateKeys and
--certificates cli options (paths to .pem files) otherwise the cli will
exit with an error.
For full list of available addresses see primitives/src/test_util.rs#L39-L118
Using the Ethereum adapter
The password for the keystore file can be set using the KEYSTORE_PWD environment variable.
These examples use the Leader and Follower addresses for testing locally with
ganache and the production configuration of the validator.
Leader (0x80690751969B234697e9059e04ed72195c3507fa)
Sentry API will be accessible at localhost:8005
IP_ADDR=127.0.0.1 SEED_DB=true REDIS_URL="redis://127.0.0.1:6379/1" \
POSTGRES_DB="sentry_leader" PORT=8005 KEYSTORE_PWD=ganache0 \
cargo run -p sentry -- \
--adapter ethereum \
--keystoreFile ./adapter/tests/resources/0x80690751969B234697e9059e04ed72195c3507fa_keystore.json \
./docs/config/ganache.tomlFollower (0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7)
Sentry API will be accessible at localhost:8006
IP_ADDR=127.0.0.1 SEED_DB=true REDIS_URL="redis://127.0.0.1:6379/2" \
POSTGRES_DB="sentry_follower" PORT=8006 KEYSTORE_PWD=ganache1 cargo run -p sentry -- \
--adapter ethereum \
--keystoreFile ./adapter/tests/resources/0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7_keystore.json \
./docs/config/ganache.tomlUsing the Dummy adapter
Using the dummy adapter you get access to additional route
for adding deposits to the dummy adapter. The authenticated address
is used to set the deposit in the adapter for the given Chain id.
POST /v5/channel/dummy-deposit (auth required)
Request body (JSON):
{
"channel": { "leader": "0x000..", ...},
"deposit": { "total": "10000000" }
}Dummy identities:
Leader (0x80690751969B234697e9059e04ed72195c3507fa)
IP_ADDR=127.0.0.1 SEED_DB=true REDIS_URL="redis://127.0.0.1:6379/1" \
POSTGRES_DB="sentry_leader" PORT=8005 cargo run -p sentry -- \
--adapter dummy \
--dummyIdentity 0x80690751969B234697e9059e04ed72195c3507fa \
./docs/config/ganache.tomlFollower (0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7)
IP_ADDR=127.0.0.1 SEED_DB=true REDIS_URL="redis://127.0.0.1:6379/2" \
POSTGRES_DB="sentry_follower" PORT=8006 cargo run -p sentry -- \
--adapter dummy \
--dummyIdentity 0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7 \
./docs/config/ganache.tomlEnvironment variables
ENV-productionordevelopment; default:development- passing this env. variable will use the default configuration paths -docs/config/ganache.toml(fordevelopment) ordocs/config/prod.toml(forproduction). Otherwise you can pass your own configuration file path to the binary (checkcargo run -p sentry --helpfor more information).In(seeding is disabled, see #514).developmentit will make sure Sentry to seed the databasePORT- default:8005- The local port that Sentry API will be accessible atIP_ADDR- default:0.0.0.0- the IP address that the API should be listening toSEED_DB- default:false- Flag telling us whether we should seed the database, it can only be turned on fordevelopment
Adapter
KEYSTORE_PWD- Password for theKeystore file, only available when usingEthereumadapter (--adapter ethereum)
Redis
REDIS_URL- default:redis://127.0.0.1:6379
Postgres
POSTGRES_HOST- default:localhostPOSTGRES_USER- default:postgresPOSTGRES_PASSWORD- default:postgresPOSTGRES_DB- default:username - Database name in Postgres to be used for this instancePOSTGRES_PORT- default:5432
Validator worker
For a full list of all available CLI options on the Validator worker run --help:
cargo run -p validator_worker -- --helpUsing the Ethereum adapter
The password for the Keystore file can be set using the environment variable KEYSTORE_PWD.
Validator Leader (0x80690751969B234697e9059e04ed72195c3507fa)
Assuming you have Sentry API running for the Leader on port 8005:
KEYSTORE_PWD=ganache0 cargo run -p validator_worker -- \
--adapter ethereum \
--keystoreFile ./adapter/tests/resources/0x80690751969B234697e9059e04ed72195c3507fa_keystore.json \
--sentryUrl http://127.0.0.1:8005 \
./docs/config/ganache.tomlValidator Follower
Assuming you have Sentry API running for the Follower on port 8006:
KEYSTORE_PWD=ganache1 cargo run -p validator_worker -- \
--adapter ethereum \
--keystoreFile ./adapter/tests/resources/0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7_keystore.json \
--sentryUrl http://127.0.0.1:8006 \
./docs/config/ganache.tomlUsing the Dummy adapter
Validator Leader (0x80690751969B234697e9059e04ed72195c3507fa)
Assuming you have Sentry API running for the Leader on port 8005:
cargo run -p validator_worker -- \
--adapter dummy \
--dummyIdentity 0x80690751969B234697e9059e04ed72195c3507fa \
--sentryUrl http://127.0.0.1:8005 \
./docs/config/ganache.tomlFollower: 0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7
Assuming you have Sentry API running for the Follower on port 8006:
cargo run -p validator_worker -- \
--adapter dummy \
--dummyIdentity 0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7 \
--sentryUrl http://127.0.0.1:8006 \
./docs/config/ganache.tomlEnvironment variables
ENV-productionordevelopment; default:development- passing this env. variable will use the default configuration paths -docs/config/ganache.toml(fordevelopment) ordocs/config/prod.toml(forproduction). Otherwise you can pass your own configuration file path to the binary (checkcargo run -p sentry --helpfor more information).
Adapter
KEYSTORE_PWD- Password for theKeystore file, only available when usingEthereum Adapter(--adapter ethereum)
Development environment
We use cargo-make for running automated checks
(tests, builds, formatting, code linting, etc.) and building the project locally
as well as on our Continuous Integration (CI).
For a complete list of out-of-the-box commands you can check out the Predefined Makefiles
while locally defined commands can be found in the Makefiles.toml in each crate directory.
Local development
It's enough to ensure that the default development command is executing successfully:
cargo makeIt will format your code using rustfmt and will perform clippy checks (it will fail on warnings).
Thanks to cargo it will run all the tests (doc tests, unit tests, integration tests, etc.).
Using the provided docker-compose.yml setup cargo-make will run
all the required services for the specific crate/application before executing the tests.
License
This project is licensed under the AGPL-3.0 license
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in AdEx Validator by you, shall be licensed as AGPL-3.0, without any additional terms or conditions.
Sign the CLA
When you contribute to a AdEx Validator open source project on GitHub with a new pull request, a bot will evaluate whether you have signed the CLA. If required, the bot will comment on the pull request, including a link to this system to accept the agreement.