diff --git a/docker/.env b/docker/.env index f18da9d92..0e2d980c8 100644 --- a/docker/.env +++ b/docker/.env @@ -1 +1,3 @@ COMPOSE_PROJECT_NAME=snapshutter +# This is the default key for `geth --dev` +DEPLOY_KEY=0x44ea0c624dbec53682a11482f732dcd4e8581ed181fbfe2ad69e88523dc0a312 diff --git a/docker/02-init-chain.sh b/docker/02-init-chain.sh index 4b2c4d1d6..8b3840fe2 100755 --- a/docker/02-init-chain.sh +++ b/docker/02-init-chain.sh @@ -4,71 +4,65 @@ source ./common.sh $DC stop geth $DC rm -f geth -$DC stop chain-{0..3}-{validator,sentry} chain-seed -$DC rm -f chain-{0..3}-{validator,sentry} chain-seed +$DC stop chain-{0..3}-validator chain-seed +$DC rm -f chain-{0..3}-validator chain-seed ${BB} rm -rf data/geth -${BB} rm -rf data/chain-{0..3}-{validator,sentry} data/chain-seed -${BB} mkdir -p data/chain-{0..3}-{validator,sentry}/config data/chain-seed/config -${BB} chmod -R a+rwX data/chain-{0..3}-{validator,sentry}/config data/chain-seed/config +${BB} rm -rf data/chain-{0..3}-validator data/chain-seed +${BB} mkdir -p data/chain-{0..3}-validator/config data/chain-seed/config +${BB} chmod -R a+rwX data/chain-{0..3}-validator/config data/chain-seed/config ${BB} rm -rf data/deployments # has geth as dependency +$DC up -d geth +sleep 5 +sh tools.sh $DC up deploy-contracts +bash get-contracts.sh +# setup chain-seed $DC run --rm --no-deps chain-seed init \ --root /chain \ --blocktime 1 \ - --listen-address tcp://127.0.0.1:${TM_RPC_PORT} \ + --listen-address tcp://0.0.0.0:${TM_RPC_PORT} \ --role seed -for num in 0 1 2 3; do - validator_cmd=chain-$num-validator - sentry_cmd=chain-$num-sentry +seed_node=$(cat data/chain-seed/config/node_key.json.id)@chain-seed:${TM_P2P_PORT} - $DC run --rm --no-deps ${sentry_cmd} init \ - --root /chain \ - --blocktime 1 \ - --listen-address tcp://0.0.0.0:${TM_RPC_PORT} \ - --role sentry +${BB} sed -i "/^moniker/c\moniker = \"chain-seed\"" data/chain-seed/config/config.toml + +# configure validators and keypers 0-3 +for num in {0..3}; do + validator_cmd=chain-$num-validator - # TODO: check if validator can have listen-address tcp://127.0.0.1... $DC run --rm --no-deps ${validator_cmd} init \ --root /chain \ - --genesis-keyper 0x440Dc6F164e9241F04d282215ceF2780cd0B755e \ + --genesis-keyper 0x346a9357D8EB6F0FbC4894ed6DBb1eCCA1051c09 \ --blocktime 1 \ - --listen-address tcp://127.0.0.1:${TM_RPC_PORT} \ + --listen-address tcp://0.0.0.0:${TM_RPC_PORT} \ --role validator - ${BB} sed -i "/ValidatorPublicKey/c\ValidatorPublicKey = \"$(cat data/${validator_cmd}/config/priv_validator_pubkey.hex)\"" /config/keyper-${num}.toml + validator_id=$(cat data/${validator_cmd}/config/node_key.json.id) + validator_node=${validator_id}@${validator_cmd}:${TM_P2P_PORT} + validator_config_path=data/${validator_cmd}/config/config.toml + # share genesis if [ $num -eq 0 ]; then - for destination in data/chain-seed/config/ data/chain-{1..3}-validator/config/ data/chain-{0..3}-sentry/config/; do + for destination in data/chain-seed/config/ data/chain-{1..3}-validator/config/; do ${BB} cp -v data/chain-0-validator/config/genesis.json "${destination}" done fi -done -seed_node=$(cat data/chain-seed/config/node_key.json.id)@chain-seed:${TM_P2P_PORT} - -for num in 0 1 2 3; do - sentry_cmd=chain-$num-sentry - validator_cmd=chain-$num-validator - - validator_id=$(cat data/${validator_cmd}/config/node_key.json.id) - validator_node=${validator_id}@${validator_cmd}:${TM_P2P_PORT} - sentry_node=$(cat data/${sentry_cmd}/config/node_key.json.id)@${sentry_cmd}:${TM_P2P_PORT} + # set validator publickey for keyper + ${BB} sed -i "/ValidatorPublicKey/c\ValidatorPublicKey = \"$(cat data/${validator_cmd}/config/priv_validator_pubkey.hex)\"" /config/keyper-${num}.toml - # set seed node for sentry - ${BB} sed -i "/^persistent_peers =/c\persistent_peers = \"${seed_node}\"" data/${sentry_cmd}/config/config.toml - # set validator node for sentry - ${BB} sed -i "/^private_peer_ids =/c\private_peer_ids = \"${validator_id}\"" data/${sentry_cmd}/config/config.toml - ${BB} sed -i "/^unconditional_peer_ids =/c\unconditional_peer_ids = \"${validator_id}\"" data/${sentry_cmd}/config/config.toml - ${BB} sed -i "/^external_address =/c\external_address = \"${sentry_cmd}:${TM_P2P_PORT}\"" data/${sentry_cmd}/config/config.toml + # set seed node for chain bootstrap + ${BB} sed -i "/^seeds =/c\seeds = \"${seed_node}\"" "${validator_config_path}" + # fix external address for docker internal communication + ${BB} sed -i "/^external_address =/c\external_address = \"${validator_cmd}:${TM_P2P_PORT}\"" "${validator_config_path}" + # give a nice name + ${BB} sed -i "/^moniker/c\moniker = \"${validator_cmd}\"" "${validator_config_path}" - # set sentry node for validator - ${BB} sed -i "/^persistent_peers =/c\persistent_peers = \"${sentry_node}\"" data/${validator_cmd}/config/config.toml - ${BB} sed -i "/^external_address =/c\external_address = \"${validator_cmd}:${TM_P2P_PORT}\"" data/${validator_cmd}/config/config.toml done $DC stop -t 30 diff --git a/docker/04-bootstrap.sh b/docker/04-bootstrap.sh index 59ab9788f..eee8c042e 100755 --- a/docker/04-bootstrap.sh +++ b/docker/04-bootstrap.sh @@ -4,8 +4,4 @@ source ./common.sh echo "Submitting bootstrap transaction" -$DC run --rm --no-deps --entrypoint /rolling-shutter chain-0-validator bootstrap \ - --deployment-dir /deployments/dockerGeth \ - --ethereum-url http://geth:8545 \ - --shuttermint-url http://chain-0-sentry:${TM_RPC_PORT} \ - --signing-key 479968ffa5ee4c84514a477a8f15f3db0413964fd4c20b08a55fed9fed790fad +docker run --rm -it --network snapshutter_default -v /root/rolling-shutter/docker/config:/config -v /root/rolling-shutter/docker/data/bootstrap:/data rolling-shutter op-bootstrap --config /config/bootstrap.toml diff --git a/docker/05-test.sh b/docker/05-test.sh index 90ef592c0..72e00a737 100755 --- a/docker/05-test.sh +++ b/docker/05-test.sh @@ -3,9 +3,14 @@ source ./common.sh set +ex -echo "Testing decryption key generation" EPOCH_ID=$(LC_ALL=C tr -dc 'a-f0-9' --datadir /data --dev - --dev.period 1 --ipcdisable + --dev.period 1 --http --http.addr 0.0.0.0 --http.vhosts geth + --ws + --ws.addr 0.0.0.0 # No idea why this is suddenly needed - the HEALTHCHECK is defined in the dockerfile but doesn't get picked up anymore... healthcheck: test: > @@ -48,13 +50,21 @@ services: logging: *logging deploy-contracts: + image: footest build: dockerfile: docker/build-src/deploy_contracts/Dockerfile context: .. + command: + - "script/Deploy.gnosh.s.sol" + - "--rpc-url" + - "http://geth:8545" + - "--broadcast" volumes: - - ./data/deployments:/contracts/deployments + - ./data/deployments:/contracts/broadcast - ./config:/config environment: + DEPLOY_KEY: ${DEPLOY_KEY} + PRIVATE_KEY: ${DEPLOY_KEY} DEPLOY_CONF: /config/node-deploy.json KEYPER_SET_INDEX: 0 depends_on: @@ -75,23 +85,6 @@ services: depends_on: geth: condition: service_healthy - chain-0-sentry: - condition: service_started - logging: *logging - - chain-0-sentry: - image: rolling-shutter - restart: always - entrypoint: - - /rolling-shutter - - chain - volumes: - - ./data/chain-0-sentry:/chain - - ./data/deployments:/deployments - command: "--config /chain/config/config.toml" - depends_on: - chain-seed: - condition: service_started logging: *logging chain-1-validator: @@ -107,23 +100,6 @@ services: depends_on: geth: condition: service_healthy - chain-1-sentry: - condition: service_started - logging: *logging - - chain-1-sentry: - image: rolling-shutter - restart: always - entrypoint: - - /rolling-shutter - - chain - volumes: - - ./data/chain-1-sentry:/chain - - ./data/deployments:/deployments - command: "--config /chain/config/config.toml" - depends_on: - chain-seed: - condition: service_started logging: *logging chain-2-validator: @@ -139,23 +115,6 @@ services: depends_on: geth: condition: service_healthy - chain-2-sentry: - condition: service_started - logging: *logging - - chain-2-sentry: - image: rolling-shutter - restart: always - entrypoint: - - /rolling-shutter - - chain - volumes: - - ./data/chain-2-sentry:/chain - - ./data/deployments:/deployments - command: "--config /chain/config/config.toml" - depends_on: - chain-seed: - condition: service_started logging: *logging chain-3-validator: @@ -171,23 +130,6 @@ services: depends_on: geth: condition: service_healthy - chain-3-sentry: - condition: service_started - logging: *logging - - chain-3-sentry: - image: rolling-shutter - restart: always - entrypoint: - - /rolling-shutter - - chain - volumes: - - ./data/chain-3-sentry:/chain - - ./data/deployments:/deployments - command: "--config /chain/config/config.toml" - depends_on: - chain-seed: - condition: service_started logging: *logging chain-seed: @@ -242,13 +184,13 @@ services: depends_on: db: condition: service_healthy - chain-0-sentry: + chain-0-validator: condition: service_started - chain-1-sentry: + chain-1-validator: condition: service_started - chain-2-sentry: + chain-2-validator: condition: service_started - chain-3-sentry: + chain-3-validator: condition: service_started geth: condition: service_healthy @@ -267,13 +209,13 @@ services: depends_on: db: condition: service_healthy - chain-0-sentry: + chain-0-validator: condition: service_started - chain-1-sentry: + chain-1-validator: condition: service_started - chain-2-sentry: + chain-2-validator: condition: service_started - chain-3-sentry: + chain-3-validator: condition: service_started geth: condition: service_healthy @@ -285,7 +227,7 @@ services: entrypoint: - /rolling-shutter - "--loglevel=:debug,basichost:info,swarm:info,swarm2:info,net/identify:info,pubsub:info,p2p-config:info,upgrader:info" - - snapshotkeyper + - gnosiskeyper command: "--config /config/keyper-0.toml" volumes: - ./config:/config @@ -295,7 +237,7 @@ services: depends_on: db: condition: service_healthy - chain-0-sentry: + chain-0-validator: condition: service_started bootnode-0: condition: service_started @@ -311,7 +253,7 @@ services: entrypoint: - /rolling-shutter - "--loglevel=:debug,basichost:info,swarm:info,swarm2:info,net/identify:info,pubsub:info,p2p-config:info,upgrader:info" - - snapshotkeyper + - gnosiskeyper command: "--config /config/keyper-1.toml" volumes: - ./config:/config @@ -321,7 +263,7 @@ services: depends_on: db: condition: service_healthy - chain-1-sentry: + chain-1-validator: condition: service_started bootnode-0: condition: service_started @@ -337,7 +279,7 @@ services: entrypoint: - /rolling-shutter - "--loglevel=:debug,basichost:info,swarm:info,swarm2:info,net/identify:info,pubsub:info,p2p-config:info,upgrader:info" - - snapshotkeyper + - gnosiskeyper command: "--config /config/keyper-2.toml" volumes: - ./config:/config @@ -347,7 +289,7 @@ services: depends_on: db: condition: service_healthy - chain-2-sentry: + chain-2-validator: condition: service_started bootnode-0: condition: service_started @@ -363,7 +305,7 @@ services: entrypoint: - /rolling-shutter - "--loglevel=:debug,basichost:info,swarm:info,swarm2:info,net/identify:info,pubsub:info,p2p-config:info,upgrader:info" - - snapshotkeyper + - gnosiskeyper command: "--config /config/keyper-3.toml" volumes: - ./config:/config @@ -371,7 +313,7 @@ services: depends_on: db: condition: service_healthy - chain-3-sentry: + chain-3-validator: condition: service_started bootnode-0: condition: service_started diff --git a/docker/env.template b/docker/env.template new file mode 100644 index 000000000..0e2d980c8 --- /dev/null +++ b/docker/env.template @@ -0,0 +1,3 @@ +COMPOSE_PROJECT_NAME=snapshutter +# This is the default key for `geth --dev` +DEPLOY_KEY=0x44ea0c624dbec53682a11482f732dcd4e8581ed181fbfe2ad69e88523dc0a312 diff --git a/docker/get-contracts.sh b/docker/get-contracts.sh new file mode 100755 index 000000000..f26d95c0b --- /dev/null +++ b/docker/get-contracts.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +## Needs to be bash, for the variable expansion to work! +source ./common.sh +source .env +set -e + +CONTRACTS_JSON=$(jq '.transactions[]|(select(.function==null))|{(.contractName|tostring): .contractAddress}' data/deployments/Deploy.gnosh.s.sol/1337/run-latest.json) +#echo ${CONTRACTS_JSON} | jq -r ".[]|to_entries" + + +for s in $(echo ${CONTRACTS_JSON} | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")| .[] " ); do + export $s +done + +for cfg in keyper-{0..3}.toml; +do + config_path=config/${cfg}; + echo $config_path + + for name in KeyperSetManager KeyperSet KeyBroadcastContract Sequencer ValidatorRegistry; + do + key=$name + value="${!name}" + ${BB} sed -i "/^$key =/c$key = \"$value\"" "${config_path}" + done +done + +echo "Setting up bootstrap.toml" +${BB} sed -i "/^KeyperSetManager =/cKeyperSetManager = \"${KeyperSetManager}\"" "config/bootstrap.toml" +${BB} sed -i "/^SigningKey =/cSigningKey = \"$(echo $DEPLOY_KEY|cut -b3-)\"" "config/bootstrap.toml" diff --git a/docker/tools.sh b/docker/tools.sh new file mode 100644 index 000000000..54f05300e --- /dev/null +++ b/docker/tools.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -e + +## Fund account + +# DEPLOY PRIVATE KEY=44ea0c624dbec53682a11482f732dcd4e8581ed181fbfe2ad69e88523dc0a312 +DEPLOY_ACCOUNT="0x346a9357D8EB6F0FbC4894ed6DBb1eCCA1051c09" + +DEV_ACCOUNT=$(docker run --rm -it --network snapshutter_default curlimages/curl -Ss -H "Content-Type: application/json" -XPOST http://geth:8545 -d '{ + "jsonrpc":"2.0", + "method":"eth_accounts", + "params":[], + "id":1 +}'|jq -r ".result[0]") + + +DATA=$(jq -nc --arg dev "$DEV_ACCOUNT" --arg deploy "$DEPLOY_ACCOUNT" '{ jsonrpc:"2.0", method:"eth_sendTransaction", params:[{ from: $dev, to: $deploy, value: "0xc097ce7bc90715b34b9f1000000000" }], id:1}') + +docker run --rm -it --network snapshutter_default curlimages/curl -H "Content-Type: application/json" -XPOST http://geth:8545 -d $DATA diff --git a/rolling-shutter/cmd/chain/init.go b/rolling-shutter/cmd/chain/init.go index a8ab70326..dffd457e1 100644 --- a/rolling-shutter/cmd/chain/init.go +++ b/rolling-shutter/cmd/chain/init.go @@ -144,7 +144,7 @@ func initFiles(_ *cobra.Command, config *Config, _ []string) error { case ISOLATEDVALIDATOR: // validator mode behind a sentry node tendermintCfg.P2P.PexReactor = false tendermintCfg.P2P.AddrBookStrict = false - case SENTRY: + case SENTRY: // even though "sentry" nodes are documented, there is no special mode tendermintCfg.P2P.PexReactor = true tendermintCfg.P2P.AddrBookStrict = false case SEED: diff --git a/rolling-shutter/cmd/snapshotkeyper/snapshotkeyper.go b/rolling-shutter/cmd/snapshotkeyper/snapshotkeyper.go index a6ed5e42b..7cb5cda73 100644 --- a/rolling-shutter/cmd/snapshotkeyper/snapshotkeyper.go +++ b/rolling-shutter/cmd/snapshotkeyper/snapshotkeyper.go @@ -9,8 +9,8 @@ import ( "github.com/spf13/cobra" "github.com/shutter-network/rolling-shutter/rolling-shutter/cmd/shversion" - "github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/database" keyper "github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/snapshot" + "github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/snapshot/database" "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/configuration/command" "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/db" "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/service" diff --git a/rolling-shutter/keyper/keyper.go b/rolling-shutter/keyper/keyper.go index f417ae4c1..b49f35061 100644 --- a/rolling-shutter/keyper/keyper.go +++ b/rolling-shutter/keyper/keyper.go @@ -103,6 +103,7 @@ func (kpr *KeyperCore) initOptions(ctx context.Context, runner service.Runner) e return err } if kpr.opts.dbpool == nil { + log.Info().Str("name", database.Definition.Name()).Msg("FOO: initOptions Connect") // connect, but don't validate any database version. // If that is desired, it should be done in the keyper-implementation kpr.dbpool, err = db.Connect(ctx, runner, kpr.config.DatabaseURL, database.Definition.Name()) @@ -127,15 +128,18 @@ func (kpr *KeyperCore) initOptions(ctx context.Context, runner service.Runner) e func (kpr *KeyperCore) Start(ctx context.Context, runner service.Runner) error { config := kpr.config + log.Info().Str("name", database.Definition.Name()).Msg("FOO: Core Start called") err := kpr.initOptions(ctx, runner) if err != nil { return err } + log.Info().Str("name", database.Definition.Name()).Msg("FOO: calling beginFunc") err = kpr.dbpool.BeginFunc(db.WrapContext(ctx, database.Definition.Validate)) if err != nil { return err } + log.Info().Str("name", database.Definition.Name()).Msg("FOO: calling LinkConfigToDB") err = LinkConfigToDB(ctx, config, kpr.dbpool) if err != nil { return err @@ -164,6 +168,7 @@ func (kpr *KeyperCore) Start(ctx context.Context, runner service.Runner) error { epochkghandler.NewEonPublicKeyHandler(kpr.config, kpr.dbpool), ) kpr.messaging.AddMessageHandler(kpr.opts.messageHandler...) + log.Info().Str("name", database.Definition.Name()).Msg("FOO: calling StartService") return runner.StartService(kpr.getServices()...) } diff --git a/rolling-shutter/keyperimpl/snapshot/config.go b/rolling-shutter/keyperimpl/snapshot/config.go index ac395c3d3..f7f2d20fd 100644 --- a/rolling-shutter/keyperimpl/snapshot/config.go +++ b/rolling-shutter/keyperimpl/snapshot/config.go @@ -46,7 +46,7 @@ func (c *Config) Validate() error { } func (c *Config) Name() string { - return "keyper" + return "snapshotkeyper" } func (c *Config) SetDefaultValues() error { diff --git a/rolling-shutter/keyperimpl/snapshot/database/definition.go b/rolling-shutter/keyperimpl/snapshot/database/definition.go index b67bae819..4f184142c 100644 --- a/rolling-shutter/keyperimpl/snapshot/database/definition.go +++ b/rolling-shutter/keyperimpl/snapshot/database/definition.go @@ -7,7 +7,7 @@ import ( ) var Definition = db.NewAggregateDefinition( - "snapshot", + "snapshotkeyper", database.Definition, chainobsdb.CollatorDefinition, ) diff --git a/rolling-shutter/medley/db/connect.go b/rolling-shutter/medley/db/connect.go index 22ab75b66..9ff1d6998 100644 --- a/rolling-shutter/medley/db/connect.go +++ b/rolling-shutter/medley/db/connect.go @@ -13,6 +13,7 @@ import ( ) func ValidateDBVersion(ctx context.Context, dbpool *pgxpool.Pool, role string) error { + log.Info().Str("role", role).Msg("FOO: ValidateDBVersion called") err := dbpool.BeginFunc( ctx, func(tx pgx.Tx) error { @@ -28,16 +29,19 @@ func ValidateDBVersion(ctx context.Context, dbpool *pgxpool.Pool, role string) e // Connect to the database `url` from within a runner.Start() method // and create the pgxpool.Pool. func Connect(ctx context.Context, runner service.Runner, url, version string) (*pgxpool.Pool, error) { + log.Info().Str("version", version).Msg("FOO: initiating connection") dbpool, err := pgxpool.Connect(ctx, url) if err != nil { return nil, err } runner.Defer(dbpool.Close) - + log.Info().Str("version", version).Msg("FOO: validating db version") err = ValidateDBVersion(ctx, dbpool, version) + log.Info().Str("version", version).Msg("FOO: validation complete") if err != nil { return nil, err } + log.Info().Str("version", version).Msg("creating connection info") shdb.AddConnectionInfo(log.Info(), dbpool).Msg("connected to database") return dbpool, nil }