From 02ee6459eea275890ad1dd86b4437dcfc02d1d7e Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Tue, 25 Jun 2024 14:30:44 +0200 Subject: [PATCH] feat: add peerdas-devnet-1 --- README.md | 3 +- ansible/ansible.cfg | 4 +- .../devnet-1/group_vars/all/00-defaults.yaml | 62 + .../devnet-1/group_vars/all/all.sops.yaml | 148 + .../devnet-1/group_vars/all/all.yaml | 182 + .../devnet-1/group_vars/all/images.yaml | 37 + .../inventories/devnet-1/group_vars/besu.yaml | 33 + .../devnet-1/group_vars/blobber.yaml | 56 + .../devnet-1/group_vars/bootnode.sops.yaml | 127 + .../devnet-1/group_vars/bootnode.yaml | 103 + .../devnet-1/group_vars/erigon.yaml | 83 + .../devnet-1/group_vars/ethereum_node.yaml | 60 + .../devnet-1/group_vars/ethereumjs.yaml | 84 + .../inventories/devnet-1/group_vars/geth.yaml | 88 + .../devnet-1/group_vars/grandine.yaml | 40 + .../devnet-1/group_vars/lighthouse.yaml | 55 + .../devnet-1/group_vars/lodestar.yaml | 53 + .../devnet-1/group_vars/mev_boost.yaml | 9 + .../devnet-1/group_vars/mev_flood.yaml | 9 + .../devnet-1/group_vars/nethermind.yaml | 100 + .../devnet-1/group_vars/nimbus.yaml | 53 + .../devnet-1/group_vars/prysm.yaml | 64 + .../inventories/devnet-1/group_vars/reth.yaml | 75 + .../inventories/devnet-1/group_vars/teku.yaml | 52 + .../devnet-1/group_vars/tx_fuzz_blobs.yaml | 12 + .../devnet-1/group_vars/tx_fuzz_txs.yaml | 11 + .../inventories/devnet-1/group_vars/xatu.yaml | 85 + .../devnet-1/host_vars/lighthouse-geth-3.yaml | 4 + .../inventories/devnet-1/host_vars/localhost | 2 + .../devnet-1/host_vars/mev-relay-1.yaml | 179 + .../devnet-1/host_vars/prysm-geth-1.yaml | 11 + .../devnet-1/host_vars/prysm-geth-2.yaml | 11 + .../devnet-1/host_vars/prysm-geth-3.yaml | 10 + .../devnet-1/host_vars/teku-geth-3.yaml | 12 + ansible/inventories/devnet-1/inventory.ini | 61 + ansible/requirements.yaml | 2 +- kubernetes/devnet-1/config/.helmignore | 23 + kubernetes/devnet-1/config/Chart.yaml | 7 + network-configs/devnet-1/metadata/besu.json | 927 + .../devnet-1/metadata/bootstrap_nodes.txt | 1 + .../devnet-1/metadata/chainspec.json | 973 + network-configs/devnet-1/metadata/config.yaml | 149 + .../devnet-1/metadata/deposit_contract.txt | 1 + .../metadata/deposit_contract_block.txt | 1 + .../metadata/deposit_contract_block_hash.txt | 1 + .../devnet-1/metadata/genesis.json | 926 + network-configs/devnet-1/metadata/genesis.ssz | Bin 0 -> 2862337 bytes .../metadata/genesis_validators_root.txt | 1 + .../metadata/tranches/tranche_0000.txt | 900 + .../parsed/parsedConsensusGenesis.json | 103824 +++++++++++++++ terraform/devnet-1/ansible_inventory.tmpl | 54 + terraform/devnet-1/digitalocean.tf | 323 + terraform/devnet-1/hetzner/firewall.tf | 87 + terraform/devnet-1/hetzner/hetzner.tf | 263 + terraform/devnet-1/hetzner/main.tf | 106 + terraform/devnet-1/hetzner/nodes.tf | 339 + terraform/devnet-1/main.tf | 102 + terraform/devnet-1/nodes.tf | 338 + 58 files changed, 111322 insertions(+), 4 deletions(-) create mode 100644 ansible/inventories/devnet-1/group_vars/all/00-defaults.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/all/all.sops.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/all/all.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/all/images.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/besu.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/blobber.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/bootnode.sops.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/bootnode.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/erigon.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/ethereum_node.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/ethereumjs.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/geth.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/grandine.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/lighthouse.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/lodestar.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/mev_boost.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/mev_flood.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/nethermind.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/nimbus.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/prysm.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/reth.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/teku.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/tx_fuzz_blobs.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/tx_fuzz_txs.yaml create mode 100644 ansible/inventories/devnet-1/group_vars/xatu.yaml create mode 100644 ansible/inventories/devnet-1/host_vars/lighthouse-geth-3.yaml create mode 100644 ansible/inventories/devnet-1/host_vars/localhost create mode 100644 ansible/inventories/devnet-1/host_vars/mev-relay-1.yaml create mode 100644 ansible/inventories/devnet-1/host_vars/prysm-geth-1.yaml create mode 100644 ansible/inventories/devnet-1/host_vars/prysm-geth-2.yaml create mode 100644 ansible/inventories/devnet-1/host_vars/prysm-geth-3.yaml create mode 100644 ansible/inventories/devnet-1/host_vars/teku-geth-3.yaml create mode 100755 ansible/inventories/devnet-1/inventory.ini create mode 100644 kubernetes/devnet-1/config/.helmignore create mode 100644 kubernetes/devnet-1/config/Chart.yaml create mode 100644 network-configs/devnet-1/metadata/besu.json create mode 100644 network-configs/devnet-1/metadata/bootstrap_nodes.txt create mode 100644 network-configs/devnet-1/metadata/chainspec.json create mode 100644 network-configs/devnet-1/metadata/config.yaml create mode 100644 network-configs/devnet-1/metadata/deposit_contract.txt create mode 100644 network-configs/devnet-1/metadata/deposit_contract_block.txt create mode 100644 network-configs/devnet-1/metadata/deposit_contract_block_hash.txt create mode 100644 network-configs/devnet-1/metadata/genesis.json create mode 100755 network-configs/devnet-1/metadata/genesis.ssz create mode 100644 network-configs/devnet-1/metadata/genesis_validators_root.txt create mode 100755 network-configs/devnet-1/metadata/tranches/tranche_0000.txt create mode 100644 network-configs/devnet-1/parsed/parsedConsensusGenesis.json create mode 100644 terraform/devnet-1/ansible_inventory.tmpl create mode 100644 terraform/devnet-1/digitalocean.tf create mode 100644 terraform/devnet-1/hetzner/firewall.tf create mode 100644 terraform/devnet-1/hetzner/hetzner.tf create mode 100644 terraform/devnet-1/hetzner/main.tf create mode 100644 terraform/devnet-1/hetzner/nodes.tf create mode 100644 terraform/devnet-1/main.tf create mode 100644 terraform/devnet-1/nodes.tf diff --git a/README.md b/README.md index 9dd46be..948abb9 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,8 @@ This repository contains the infrastructure code used to setup ~all~ dev/testnet Status | Network | Links | Ansible | Terraform | Kubernetes ------ | -------- | ---- | ----- | ------- | ------ - OffπŸ”΄ | [devnet-0](https://peerdas-devnet-0.ethpandaops.io) | [Network config](network-configs/devnet-0) / [Inventory](https://bootnode-1.srv.devnet-0.ethpandaops.io/meta/api/v1/inventory.json) / [Validator ranges](https://bootnode-1.srv.devnet-0.ethpandaops.io/meta/api/v1/validator-ranges.json) | [πŸ”—](ansible/inventories/devnet-0) | [πŸ”—](terraform/devnet-0) | [πŸ”—](kubernetes/devnet-0) +On🟒 | [devnet-1](https://peerdas-devnet-1.ethpandaops.io) | [Network config](network-configs/devnet-1) / [Inventory](https://bootnode-1.srv.devnet-1.ethpandaops.io/meta/api/v1/inventory.json) / [Validator ranges](https://bootnode-1.srv.devnet-1.ethpandaops.io/meta/api/v1/validator-ranges.json) | [πŸ”—](ansible/inventories/devnet-1) | [πŸ”—](terraform/devnet-1) | [πŸ”—](kubernetes/devnet-1) +OffπŸ”΄ | [devnet-0](https://peerdas-devnet-0.ethpandaops.io) | [Network config](network-configs/devnet-0) / [Inventory](https://bootnode-1.srv.devnet-0.ethpandaops.io/meta/api/v1/inventory.json) / [Validator ranges](https://bootnode-1.srv.devnet-0.ethpandaops.io/meta/api/v1/validator-ranges.json) | [πŸ”—](ansible/inventories/devnet-0) | [πŸ”—](terraform/devnet-0) | [πŸ”—](kubernetes/devnet-0) # Development ## Version management for tools diff --git a/ansible/ansible.cfg b/ansible/ansible.cfg index 22ab85d..f9bf60c 100644 --- a/ansible/ansible.cfg +++ b/ansible/ansible.cfg @@ -1,7 +1,7 @@ [defaults] ansible_managed = Ansible managed. Don't change this file manually. Template info: {{{{ (template_fullpath | replace(playbook_dir,'')) }}}} stdout_callback = yaml -inventory = inventories/devnet-0/inventory.ini, inventories/devnet-0/hetzner_inventory.ini +inventory = inventories/devnet-1/inventory.ini, inventories/devnet-1/hetzner_inventory.ini roles_path = vendor/roles/:roles collections_path = vendor/collections forks = 50 @@ -16,7 +16,7 @@ fact_caching = jsonfile # Keep facts forever fact_caching_timeout = 0 # Where to store the fact cache -fact_caching_connection = tmp/devnet-0/ +fact_caching_connection = tmp/devnet-1/ [inventory] enable_plugins = script, yaml, ini diff --git a/ansible/inventories/devnet-1/group_vars/all/00-defaults.yaml b/ansible/inventories/devnet-1/group_vars/all/00-defaults.yaml new file mode 100644 index 0000000..27f1a48 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/all/00-defaults.yaml @@ -0,0 +1,62 @@ +ansible_user: devops +ansible_python_interpreter: /usr/bin/python3 +devnet_name: peerdas + +# IPv6 Specific configuration +global_ipv6_enabled: true +global_ipv6_subnet_ranges: + hetzner: "64" + digitalocean: "124" + +###################################################### +## +## Role specific overwrites +## +###################################################### + +# role: ethpandaops.general.bootstrap +bootstrap_user: root +bootstrap_default_user_authorized_keys_github: + - barnabasbusa + - parithosh + - samcm + - savid + - skylenet + - pk910 + +# role: robertdebock.fail2ban +fail2ban_loglevel: INFO +fail2ban_logtarget: /var/log/fail2ban.log +fail2ban_maxretry: 10 +fail2ban_bantime: 600 +fail2ban_ignoreips: + - "127.0.0.1/8 ::1" + - "{{ lookup('ansible.builtin.url', 'http://ifconfig.me/ip', split_lines=False) }}/32" # Avoid banning ourself + + +# role: ethpandaops.general.docker_network +docker_network_name: shared +docker_network_enable_ipv6: "{{ global_ipv6_enabled }}" +docker_network_ipam_config: >- + {{ global_ipv6_enabled | ternary( + [ { 'subnet': ansible_default_ipv6.address | ansible.utils.ipsubnet(global_ipv6_subnet_ranges[hostvars[inventory_hostname]['cloud']]) } ] + , []) + }} + +docker_networks_shared: + - name: "{{ docker_network_name }}" + +# role: geerlingguy.docker +docker_users: + - devops +docker_daemon_options: + "log-driver": "json-file" + "log-opts": + "max-size": "250m" + "max-file": "2" + +# role: ethpandaops.general.prometheus +prometheus_container_networks: "{{ docker_networks_shared }}" + +# role: ethpandaops.general.ethereum_node +ethereum_node_images_always_pull: true diff --git a/ansible/inventories/devnet-1/group_vars/all/all.sops.yaml b/ansible/inventories/devnet-1/group_vars/all/all.sops.yaml new file mode 100644 index 0000000..538b9a4 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/all/all.sops.yaml @@ -0,0 +1,148 @@ +secret_zerossl: + ACME_EAB_KID: ENC[AES256_GCM,data:MaFunLQX31XPGGuAdmXJEb+2jMVN5g==,iv:QjZR7VKAYrue+i0jcld/tmQi3Qwfw6HogpLVzDRFpaM=,tag:kuc2r54Osz41eMzWou9wIQ==,type:str] + ACME_EAB_HMAC_KEY: ENC[AES256_GCM,data:VrtHU5kn3P7yG9ek6x5+k7YhvIS50q+0T1+ryJ+D0tZeQcp+tuPUXDYk9PFjVdCy9gr1MJF4OiKU+ynsd3jhSDOlyJGuZqyLfqSSMER6dntXdyhqSKU=,iv:tbxaCn7+aJUh8JsiAQ1gnMLyqm1aAnPSECjI//NLqLc=,tag:UyJvxuVHYIrjFjXF36R2Cg==,type:str] +secret_prometheus_remote_write: + username: ENC[AES256_GCM,data:QCPE1nQF7IH3ewZps79JtA==,iv:70Q1VD0AHk5In5rWPq6gWC6OUOjQbSdNg+1Dghy+5js=,tag:ds/LX/nFF6XC6rzSGeMvtg==,type:str] + password: ENC[AES256_GCM,data:S29UyYV1ySAmsA7JkjWeRXDRhyjQH9iR6TbUI7aPZkU+Za8L,iv:6eT9fH3LFdgjk5JVrk/KvHYbOsxdO3d8whk8bj7GzV4=,tag:PhsAUbbOqYp4TOi35VFCkg==,type:str] +secret_nginx_shared_basic_auth: + name: ENC[AES256_GCM,data:bjlM,iv:DiOGlqfOfrDlt7X4OGY27OYlkDDEHguv+kg1zRhBek0=,tag:ZPlucwl2PNXeXcOc8PmCBQ==,type:str] + password: ENC[AES256_GCM,data:CeX1jyv0KDK151kGStjh,iv:aXD2auKPfUAHolr2ucFNPr95ZrtfD6ucwJhGeGTwUF8=,tag:wVfTl+zuf5IqynDdvxNRNQ==,type:str] +secret_ethstats: ENC[AES256_GCM,data:HIwmSTRE8lJq903D0Vig1PldLPJ6QVh9ZQ==,iv:XQ3L/Jn+1qeF6Qqmizu4iUsJXKGvoLovNtxlns2FIoI=,tag:JM98o3sPU2ZIDOif+y6rlg==,type:str] +secret_genesis_mnemonic: ENC[AES256_GCM,data:ZgfN0UKNL1/1LfDuurC7vT36tYtf5pIqdVH4KDmh8m2qJjaSjLZN7WHIRCLH0F+6EdTP/BnqwDrVEJInOL447JqqWRuAqPgaAOE0wP9c6WtTFCE7zQShTc1gmWskBDHAX8EEEqxLn0gBqQu+NGlqx/kcTsr5VcihG3dX6vuXAIH4VNMywkscPNX3HLaNhrJxMPdR3rUECe3VTZE7cHpdOBt89TZb,iv:hUwVngpfwfoQS47+XEOF1/KnPvkWulvp5fvBMHxYzkI=,tag:Dd8dvLDqbr+WwotFPic8bA==,type:str] +secret_mev_signingkey: ENC[AES256_GCM,data:7xug6L4MXETqWb7cmZS6BpAxBercs4mnJEg1NKp+LwZjCWl5pPAlTbfZASwXVBMo24Xoqi9/FbjeJML6WtaJ2Q==,iv:UGcVz81+wBNdb4cmkg9t4tSamqOaBUfWk6glh/6jUA8=,tag:W5Y00+vamA2tq2tEpAEhQA==,type:str] +secret_mev_flood_private_key: ENC[AES256_GCM,data:2vVJ+N0XLer202Dc5J2HVjTEW6XUa+LpmhS/mo2brt+qzabraTSaD7d4P5rVqbovW+W5Je5FdDr4s7rScyn/RA==,iv:1qNfUVqJ9eebRmA4Ly59KFR9WmaQ8eelSvNLJAWCJ10=,tag:knDhqt3zak1OEsHi2nQ3oA==,type:str] +secret_mev_flood_user_key: ENC[AES256_GCM,data:+XXSXUZdEKClV09Pfy/YWULlRl+5njMWcKOvPwuF6YUWHP2spLbJa8BnOimxxi6v7ioGMXEZW7XROVqqQiY4Aw==,iv:efkOBcrGeGJwT91SR+2wFI/fpnWASQeqjH3MJSIQBAA=,tag:KjJMfc7VgZkc8cy/IHrNNA==,type:str] +secret_xatu_sentry: + server_address: ENC[AES256_GCM,data:U3A2QJfVr5/cj7sMbf1C8ztynZc9MS5K9tstLiNYRzhGtC9ZU6npoGL/xsV8y5Z8yg+Z,iv:fuAuq7J/ksqoOiUKMmL96DB5Qbx6HJs4qHVYMoAziOE=,tag:LhQAkrXq9QsWrUneltJXig==,type:str] + user: ENC[AES256_GCM,data:6Rl/PXMHqw==,iv:gHXmk6tie0m6usKO6v9kwBI3BW0Kjj04wuMiijQYVbg=,tag:qjLt4uzXQ2s3j+xvEGlYFQ==,type:str] + password: ENC[AES256_GCM,data:Qs3nM2MRodo/iUNB+w6ezZo5jIBpWp/vjuZmzDly55IYMobc,iv:qdGn0xmCaDu8W+y2cOh4tDaXz9eifsMc186OqaPFcAk=,tag:kiSkV9uWDoAtzSSWkHiZ/g==,type:str] +tx_fuzz_blobs_privkey: ENC[AES256_GCM,data:XUiDF6puTOcP0veM5k2x9PmPSA2vP1FeoxSY7rn0bxLMB0b/DsB7y7bfsjBlgPIiL9f2AOSfsol8WWxd3zT6IA==,iv:qTk22/lpJyWFycayBupQp0sBaw2E2oq7peWypQh+0Ic=,tag:Eeqpv2JCfrsQd5ovOcpdVg==,type:str] +tx_fuzz_txs_privkey: ENC[AES256_GCM,data:c52KtPzcxyZPj3vQ6tx0Di5uLFy5JoRUSZ5ZH/WEj7nqC7JTwRw3+bNPk8Y43wjE7caqRZ7eq0la0Bc42ydpew==,iv:gHO+ttqzJCbRBCUvmlsTVNQK6vpnGXamIag63HS/fas=,tag:1Qultc6tndFGDuSKjm/TVg==,type:str] +goomy_private_key: ENC[AES256_GCM,data:+AwqAcOobrvR5gXxdABQki0rH41Ns8H3sJvVtQb5sh/596u1oDPq2bEh6Tpkfx8B+x4rSp+MRQi5wHwk9/Nqcw==,iv:Ibm4sLvU+tNk7EqaSPs/2CRLU1yLlNDgSWjR+uNPrvQ=,tag:oWbWW/jt9pPTWFcRoVTBsg==,type:str] +nethermind_seq_api_key: ENC[AES256_GCM,data:Zg0SODORD54P9n85F/2cp3MiQvQ=,iv:tNCA6W6hJm1PybTE2piAhfUjDKCqQWeN2FQfgiayJC0=,tag:Vo+R3gcYDAAGRPq3cMcvvA==,type:str] +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: [] + lastmodified: "2024-06-25T11:09:07Z" + mac: ENC[AES256_GCM,data:spcuAw0uhoUUGKD1ucfyZqQdlAGIgT5iSaghfHsi36sh/00v+aps5UEnp3/w6LXs1e2yK7GK4CQbU6HX0td5Mm+mZVW4X7s2vybLduf4NQjnaXjvLPCdf6uxcd+j+pChdk5MHTB7reCmeCd87PgFBqjks0XE0OSBTfvl5niwJY0=,iv:lPnE7w78vfwdaV3c7cefKV7PNDq5qtxbTlML/i8E2QQ=,tag:kLJFaqmzADzK0XMIl3Anrw==,type:str] + pgp: + - created_at: "2023-09-28T11:48:21Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + wcFMA32GcoRiZf6pAQ/+K0pHUTKocKocuNwu8d4rWDcVWqzYk2GaOynxQHmNlyhi + TWEb6YUuE6aLoXL8/Wwx0qtBTESS7g3UnjnukLukOW+GphZZuDVeEre1il03JaiD + rUpQFkBiWQZAZbzVHsg9OLQUhgrAN03WfCQW6eL/IP61q+S08OSHC4Yn39EJWSXp + QIAwRFBCROF21IYeMAOZVjnfVykVn3sybaUuYqaSP/LhKsc3q1lF3RFM7MP/zv8q + dSwOCsw+uprIUU8z1j4CJDjzitlKxfsAGHVCipG63WfuqhmtBoNMl2tCIMYcw668 + fDoECYOs4jlNuMxa7bGoAHLXfezqS1siy3T/YHYic8maf8PkDEjUKWX2orR5LTWb + MetbUwaylRpJ9VWlBFaXa/nqMlair1SHz3XkARnnR6blVh1AlxIEYyXsCNk7x3cV + 7wDRkyc/Vmf1MzoVDHSCwjgaAS/FpTbPM6iysG1bDUktUENwDoZ4eS4KQ6D3tvFh + huWCRnwCvNsLdvC/imlWxSYr3SF2WDGR+mEbmSJcxaKW/KkhP5EG3qGQa48txmH5 + hi/AnYXKMgOyFOtjrDJJfCVW/bRd/GmO/6fbu2twpKlbx3k3Rrr5Jwa5hiYAMKr9 + h0KUp6s6jF+hyNioXIdlPD+jXkf8QoO6zWpKoy4oItr5D4GDRTCebmfxkk60pCnS + UQHNPsBsQGPD6059xZQ05BvHk8OISNohfeYSgnRwFeC1PGO8jMj0FyBbfm2RkX1Q + zZ1X96Q4FI2bAb0aimqiZGHG8gq+DfhrrfaPSvSscfEyhg== + =5jV7 + -----END PGP MESSAGE----- + fp: 80DB2B4EF6CA4D9829C280605636BC0E08138A24 + - created_at: "2023-09-28T11:48:21Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + wcFMA87Wber4r4dGARAAo+HyY/BCDL7QhVgD+tfeMYikHg5n0zbqduXIGchgG+gk + o9UKK3O6F8V8mWoyf5Tat8cQOZpizTY2nGDRde/6CGLgOak1FRHDb8nhCuiiy6mC + ChuzerSmpYsx6UpqRhTS7IXtmdg0p3pe5o6JCZEUKrvP9ijWLQTUpy3K2u1H7qRp + SWmrvOiAQ5LjbYMl3lU71U0oykc3T/7q9fiZptZTFhzzDrBLnomp1ZdUmRzYtbhx + 3Zk3QLhEJGRdQUwHEIDKGVT6AXS73R2xBZlp8elmwM8T5ze7GzOo16RRfw19sV/p + jmBZqhNZD7vb88jtoMa30FFj8kp5rMq1AvFeO+7PcnKvW6sMDX7iaaLPZ2Vzg3Tx + /AtqShFImJr9j0Oa3B2THfGk2hsSJLuwpWIuJhyADrgijxavS3I//K5taJXgNsTY + ER7junq3kZzfBIpWQB7e4DokvbE87pBF9cKdNRoPGr+iy1tvh9eex+eThuqCpuy0 + Ot6HR+R3M0GAnqXZ+dihBMxFGpfadYX7dcNMXc0Uqpv/rgq+fUgz1i/JwjwuMoEW + kcnqjGDNsYGmG3/l0RfpmvkLFPt2Niji8DXl5Zt8ti8fW7HON6ddd57uYQ1o+O9m + yGetEZOF5obJeQPNWXXbYsmEZwN7EcRBMhivVamouLAe/HNYgJdQHOcCSW45ZDPS + UQHXFVtY2va6BfLgzZDKx6bGGUWAZZb54nB+5Rrx16tEFJekOHTmIBBxD0zWiMKJ + IRJh1DtPleiv7M87SBAWVBqLSY5ZBfiElQs9MiO7oIGkxw== + =6fxS + -----END PGP MESSAGE----- + fp: 69F66EEA7AE36CCB77DDB8CA1BC39532FB4A2DBD + - created_at: "2023-09-28T11:48:21Z" + enc: | + -----BEGIN PGP MESSAGE----- + + hQIMA4hw3nPn82LyAQ//TAEBuAoCaspDCZMSloKrzEN64GIv2QJNy4PdTcx/3yZ9 + JmYaxNG4Fu6f1xGrpwoUIOIJQ4Oi2osU3xP04d4gi7hEUPbEBH0V1QhHbB2ci8Ry + Ylf3sRDGGs8OZnDNHSRMc1UxYRqoK4nQEalYqTeiQGOvSBNMN9vJZHyAvx8hMHnM + Zn+OPuJ8rdsuXQ2AnAevz5pC0Qo143JDmdUl7rTenKT05yfEfF9aKSIrpjg24fgZ + nl1KMCZzudfp3wZvvR7HIy2LYG/dLd4SBvQVsLPpDRhPR2ieg520aiKTfWT1i5zR + fBPCzpgVzm9ex2QPBVpbt7XrCwmoU5ltWRg730gGxzIl8tWU7xR7CZtVtP4qMVuv + v6dFwIJeLLmPAKq0WOo2eNOmDdOIcX6WkTMocZh2q7N5VlAZZFj4/o0Pp/mhaG2m + DNtZuxLuNXhXdFvuP2bCwNID/4tEJya3jcQFIby+zaOGp/mfxUmuK83In9WzPTfU + rNlBe9i6g5nwfNmVyl7/ZclNpVFy/95KCjFv1ZqzE04DoYMyDLqSJ0IgjiGc1x40 + X6Fm7uIVDNrNqZeOyda7CDxsiNjyFNwle8ChqEoohuK50wvZonL+5iJtYnEdfdZT + q8gMtiqAlYMoPu4USxtVS8tbzjJwSw536jSHcS+QWmi0h3htQB81X6Fmokyw8SbS + UQEci/lnKwM0fmilDWHn85sspZN9h47NFAJ7sgXiSrEUDxLUfj4mZpUWOn5U61eL + 3pbepyoDhznykX+sQIeFvpSJ5AFjoBetSewP4OGgZ/YmZw== + =1Tcn + -----END PGP MESSAGE----- + fp: D1002590180DE371BCB455EAEFCD4ACD0B4D3F6E + - created_at: "2023-09-28T11:48:21Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + wcFMAw01qfIBwY0JARAAv2FxRfh+MMFJFdnTGWOS/i/SSOYqlw0Fcr72OYPHPRSQ + XXPkM065g117CT0aUhTwfs/DD8aukT4mwgxmXwM8/yI+hjZ0uT6Unmwr1PCo5JN1 + tIvPDh9ZoVxi0Wq67cIu96eKzlOLU6bWfz2HayxiSNIAQjUvHNZe8GJ5WxXj7W57 + Zx6YsDTm0Fsd3ndyhC61wGdqFleRAerturQAmgVdbJ9JeNpgSHQXUBtlZtLEHWRK + d3te8AbkkN3HOKJ4OKhQv2htmHM2L1tEM++l+1tr2r2ekGetzZvLm+5bksAwdwkS + GxCnyTU9sC2CLmdE2QTGrhlZd3YDZ/3WcDZhKn+xHsOBFp33Qy+yVSGUh/XDYUDJ + xR2HDfdrS1ehmiuQR56YpDM6VtlGAlFkw9sQst5v5j6U1dbnjgouX6WxhAzOoMYK + uR6x0KY4EEj0DugrSPMFTCSiwqONWVmh5UnW/R2tDfS7w+78NZmIlL2rEG47LDo7 + +bbMHP1PDxoNsTq6kpl9vEY4tREkaXGZvTP4HXfd+01GZORQ7ybPqmEMC6AuetdC + NRUYoh1BDP6oTpZOS0qm5IihGJRIzSDl40zAVdDQXkDdgPoGov0XWJYTmXcNSCaj + sUdOHj8LZkVHCKG7jHKymR2uHkJ9DDNj07zdCEUwIPJq0IvazgdFebWcCky6MbDS + UQHyt+BqP1M8ICtXlaBrREkZPSzZvLTJLgqrs43EVOpNH1BP2U3X4T8LgdWVYHGy + oBCC3fzJ/F+gHQgUgZeb78FHBppXtZzWN91gQyGso0z0VA== + =l9+P + -----END PGP MESSAGE----- + fp: B9F81F327CF5346860E85269D7AF98F214C59E4E + - created_at: "2023-09-28T11:48:21Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + wcBMAwDFOgk9tOQ+AQgAq2I9Xdaf7oNR3GNtgnpBeLMlm9i6NKqmLWCWZpa6AK5Z + yGYFRAya9/FEzdA3IWTLPtK54PExD22Ltj36YgpXLTzAVex+eCtvIq0ADsLa9dwm + 2wB6ZcNQFBP6XlovHO3dP1cAf1z0KMWhdZ3TaS+6Su775t74t+eqyAY80AO8HhFJ + +mx2ryYTau2eugQ97ijGFCrb4e+3C/uDjLkPSFN8EA021VcyPJQ+3wN517LcSw7k + OgQ6dGCq1eRcHjlu0SkiMBf1G7l5H3kzPQqX7Mbd45QUxnIUScS8UEO5p6XLm2jL + 54AR2iw/ztVm1mQD4hKw6xC7zO5nbNpgvKvEqGLVQ9JRAabGwRVVuTGLyIV+BYc5 + y/dFrT7+apeV9oTpjV2dxJ3ShxgO8QaEDrsFsoRmSjrTTa+3yY3q5rcJv97hTeXw + iuC1i7RZ8drFqIbzMVIVIz0E + =4RwK + -----END PGP MESSAGE----- + fp: 0600D41E1313E31016F7C55BF597BC0C5F22D1A2 + - created_at: "2023-09-28T11:48:21Z" + enc: | + -----BEGIN PGP MESSAGE----- + + hQIMAz4a8AV36xppAQ//T+sI4myUCRgzDzLGbILleBgOo5kxtWsqUvqyg4QZNsS4 + +t6oJKgO/qOc8u/O+FzWsTRLzHYolsqgJx+wmwTQEQi6yvrikwxHG5GLBbsX5hn4 + KohjQankBEN+GCmGH+R4fXnXUhERuobqByosbX2qZY16gaaToYbhFqBh1zBvFkCn + MSZBjvgVQmHEwYtR5/bbUg5UwlTnROcNhpQndkwPt3b7B5+N+H4Dw4aJUWs0SX/A + QGkeXmCNCWUQQ/wpK7doTQ2VcX6jRb9Ocrl+JFMRGWentgfF74l7Y98T9brv1r0k + m4+wstSPIJnNKSaBDKjmkVDb8GvsIs6M9+DCzJdgTNWAc1ww1WtLnK/7Mf2Um+jb + ntc2IMXFwy7sblopQzz3z5H+rbYVZGhA4oyOnBznyW1P3BzkWQ//DmgAAp3/QV1j + pCkqAa3dNOadErbn8fbmK5Z/fIh1KMS+DqjGqARkd5v/oLqzCxx2Hz7Mj1qAT9UX + 6lhTpJtwXVYKvkjHwYIEOYWdYm4Ft/AqdNJ0S1s0nM1Iiz044HT2s3/pi3Kh0I58 + RmL8M0P/4Mldn33jPyTqUNwuJVtdedEW1/MtiRuQrMMKMlj2wjws9mmrDHAu7ejC + ooIK+URuYAiA+tDcJjzOQsNpn4NN6CpUr62qeGCDh6JScIvLdCVHMZ3I+L6XY57S + XAECAgszZJCCewO77rvSwggDv7BsU9vt3SOmSKsju8qIuu2bzEapmsRsrkzzZBHJ + p2QAB/4TUXzujNighZ9KnRIjrewFTJyQG6JVG9a0Ig3uz5yxb5bdewbvzRYx + =ixtV + -----END PGP MESSAGE----- + fp: 29C50D01122FDE78E257482DAA497EB2610A8435 + unencrypted_suffix: _unencrypted + version: 3.7.3 diff --git a/ansible/inventories/devnet-1/group_vars/all/all.yaml b/ansible/inventories/devnet-1/group_vars/all/all.yaml new file mode 100644 index 0000000..d5eccff --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/all/all.yaml @@ -0,0 +1,182 @@ +# β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ•—β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ•—β–‘β–‘β–‘β–‘β–‘β€ƒβ€ƒβ–ˆβ–ˆβ•—β–‘β–‘β–‘β–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— +# β–ˆβ–ˆβ•”β•β•β•β•β•β–‘β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘β€ƒβ€ƒβ–ˆβ–ˆβ•‘β–‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β• +# β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•¦β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘β€ƒβ€ƒβ•šβ–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘ +# β–ˆβ–ˆβ•‘β–‘β–‘β•šβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘β€ƒβ€ƒβ–‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–‘β•šβ•β•β•β–ˆβ–ˆβ•— +# β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•¦β•β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β€ƒβ€ƒβ–‘β–‘β•šβ–ˆβ–ˆβ•”β•β–‘β–‘β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β• +# β–‘β•šβ•β•β•β•β•β•β–‘β•šβ•β•β•β•β•β•β•β–‘β•šβ•β•β•β•β•β–‘β•šβ•β•β•β•β•β•β–‘β•šβ•β•β–‘β–‘β•šβ•β•β•šβ•β•β•β•β•β•β•β€ƒβ€ƒβ–‘β–‘β–‘β•šβ•β•β–‘β–‘β–‘β•šβ•β•β–‘β–‘β•šβ•β•β•šβ•β•β–‘β–‘β•šβ•β•β•šβ•β•β•β•β•β•β–‘ + +domain: ethpandaops.io +network_subdomain: "{{ ethereum_network_name }}.{{ domain }}" +server_fqdn: "{{ inventory_hostname }}.{{ network_subdomain }}" + +ethereum_network_id: >- + {{ (lookup('file', eth_testnet_config_local_dir_src + '/genesis.json') | from_json).config.chainId }} +ethereum_network_deposit_contract: >- + {{ lookup('file', eth_testnet_config_local_dir_src + '/deposit_contract.txt') }} +ethereum_network_deposit_contract_block: >- + {{ lookup('file', eth_testnet_config_local_dir_src + '/deposit_contract_block.txt') }} + +ethereum_node_rcp_hostname: "rpc.{{ server_fqdn }}" +ethereum_node_beacon_hostname: "bn.{{ server_fqdn }}" + +ethstats_url: "ethstats.{{ ethereum_network_name }}.{{ domain }}" +ethstats_secret: "{{ secret_ethstats }}" + +### Checkpoint sync specific for Ansible & Kubernetes +checkpoint_sync_node: bootnode-1 +ethereum_node_cl_checkpoint_sync_enabled: false +checkpoint_sync_url: https://{{ secret_nginx_shared_basic_auth.name }}:{{ secret_nginx_shared_basic_auth.password }}@bn.{{ checkpoint_sync_node }}.srv.{{ ethereum_network_name }}.{{ domain }} +checkpoint_sync_url_kube: https://@bn.{{ checkpoint_sync_node }}.srv.{{ ethereum_network_name }}.{{ domain }} +# β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ•—β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β€ƒβ€ƒβ–ˆβ–ˆβ•—β–‘β–‘β–‘β–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— +# β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ•”β•β•β•β•β•β€ƒβ€ƒβ–ˆβ–ˆβ•‘β–‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β• +# β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–‘β€ƒβ€ƒβ•šβ–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘ +# β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ•”β•β•β•β–‘β–‘β€ƒβ€ƒβ–‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–‘β•šβ•β•β•β–ˆβ–ˆβ•— +# β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β€ƒβ€ƒβ–‘β–‘β•šβ–ˆβ–ˆβ•”β•β–‘β–‘β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β• +# β•šβ•β•β–‘β–‘β•šβ•β•β–‘β•šβ•β•β•β•β•β–‘β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β€ƒβ€ƒβ–‘β–‘β–‘β•šβ•β•β–‘β–‘β–‘β•šβ•β•β–‘β–‘β•šβ•β•β•šβ•β•β–‘β–‘β•šβ•β•β•šβ•β•β•β•β•β•β–‘ + +# role: ethpandaops.general.ethereum_genesis +ethereum_genesis_generator_container_image: "{{ default_tooling_images.ethereum_genesis_generator }}" +ethereum_genesis_generator_version: "{{ ethereum_genesis_generator_container_image.split(':')[-1] }}" +ethereum_genesis_network_seed: "{{ ansible_inventory_sources[0] }}" +ethereum_genesis_chain_id: "70{{ 99999999 | random(start=10000000, seed=ethereum_genesis_network_seed) }}" +ethereum_genesis_generator_output_dir: "../network-configs/{{ ethereum_network_name | replace('peerdas-', '') }}" +ethereum_genesis_timestamp: "{{ lookup('ansible.builtin.pipe', '{{ ethereum_genesis_timestamp_relative_cmd[ansible_system] }}') }}" +ethereum_genesis_timedelay: 60 +ethereum_genesis_timestamp_relative_cmd: + Linux: "date +%s -d '+45 minutes'" + Darwin: "date -v +45M +%s" +ethereum_node_skip_cleanup: true +ethereum_genesis_mnemonic: "{{ secret_genesis_mnemonic }}" +ethereum_genesis_generator_config_files: + cl/config.yaml: "{{ lookup('ansible.builtin.url', 'https://raw.githubusercontent.com/ethpandaops/ethereum-genesis-generator/v{{ethereum_genesis_generator_version}}/config-example/cl/config.yaml', split_lines=false) }}" # noqa yaml[line-length] + cl/mnemonics.yaml: "{{ lookup('ansible.builtin.url', 'https://raw.githubusercontent.com/ethpandaops/ethereum-genesis-generator/v{{ethereum_genesis_generator_version}}/config-example/cl/mnemonics.yaml', split_lines=false) }}" # noqa yaml[line-length] + el/genesis-config.yaml: "{{ lookup('ansible.builtin.url', 'https://raw.githubusercontent.com/ethpandaops/ethereum-genesis-generator/v{{ethereum_genesis_generator_version}}/config-example/el/genesis-config.yaml', split_lines=false) }}" # noqa yaml[line-length] + values.env: |- + export PRESET_BASE="mainnet" + export CHAIN_ID="{{ ethereum_genesis_chain_id }}" + export DEPOSIT_CONTRACT_ADDRESS="0x6f22fFbC56eFF051aECF839396DD1eD9aD6BBA9D" + export EL_AND_CL_MNEMONIC="{{ ethereum_genesis_mnemonic }}" + export CL_EXEC_BLOCK="0" + export DEPOSIT_CONTRACT_BLOCK="0x0000000000000000000000000000000000000000000000000000000000000000" + export NUMBER_OF_VALIDATORS=900 + export GENESIS_FORK_VERSION="0x10{{ ethereum_genesis_fork_version_suffix }}" + export ALTAIR_FORK_VERSION="0x20{{ ethereum_genesis_fork_version_suffix }}" + export BELLATRIX_FORK_VERSION="0x30{{ ethereum_genesis_fork_version_suffix }}" + export CAPELLA_FORK_VERSION="0x40{{ ethereum_genesis_fork_version_suffix }}" + export DENEB_FORK_VERSION="0x50{{ ethereum_genesis_fork_version_suffix }}" + export ELECTRA_FORK_VERSION="0x60{{ ethereum_genesis_fork_version_suffix }}" + export EIP7594_FORK_VERSION="0x50{{ ethereum_genesis_fork_version_suffix }}" + export ELECTRA_FORK_EPOCH="50000000000" + export EIP7594_FORK_EPOCH=0 + export WITHDRAWAL_TYPE="0x00" + export WITHDRAWAL_ADDRESS={{ ethereum_genesis_validator_bls_change_execution_address }} + export BEACON_STATIC_ENR="" + export GENESIS_TIMESTAMP={{ ethereum_genesis_timestamp }} + export GENESIS_DELAY={{ ethereum_genesis_timedelay }} + export SLOT_DURATION_IN_SECONDS=12 + export MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT=8 + export CHURN_LIMIT_QUOTIENT=65536 + export EJECTION_BALANCE=16000000000 + export ETH1_FOLLOW_DISTANCE=2048 + export MIN_VALIDATOR_WITHDRAWABILITY_DELAY=256 + export SHARD_COMMITTEE_PERIOD=256 + export DATA_COLUMN_SIDECAR_SUBNET_COUNT=64 + export SAMPLES_PER_SLOT=16 + export CUSTODY_REQUIREMENT=4 + export TARGET_NUMBER_OF_PEERS=70 +ethereum_genesis_validator_keys_output_dir: "{{ ansible_inventory_sources[0] | dirname }}/files/validator_keys" +ethereum_genesis_validator_bls_change_execution_address: "{{ ethereum_node_cl_validator_fee_recipient }}" +ethereum_genesis_validator_keyranges: >- + {%- set ns = namespace() -%} + {%- set ns.ethereum_genesis_validator_keyranges = {} -%} + {%- for host in groups['all'] -%} + {%- if hostvars[host].validator_start is defined and hostvars[host].validator_end is defined -%} + {%- set v = {'start':hostvars[host].validator_start, 'end': hostvars[host].validator_end } -%} + {%- set _ = ns.ethereum_genesis_validator_keyranges.update({host: v}) -%} + {%- endif -%} + {%- endfor -%} + {{ ns.ethereum_genesis_validator_keyranges }} + +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_plain: + - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDbboxOo0jyL3DNxqZ6UTEnZPEzPDPnujEYaClqNWSLWkphczHKAnJPkrwbAWB4JbJKjsAJ5kn53f10KPnUyZvJ5Jn8Rpf7RM7+56MYaBg84gVoA2KeIYxUa7h8neY7J61Galp0c6cOK+hp1lPsoiBSdCW/Rtbv6ALCcVe+4+uCW5FRoJcNRJfGRLRnjh1pw57HQw9O55mf319s4rVUq4umznQ0CciEx3rVMtXf4xjIZDZAhNpGaBh8AtHauaMZCOGociAIquYYqoSQnnmnOBiduRa5OkvGZomgybNQivlYboDeF6sQ71KVzRXSI+mxCYbSp246lqSdQtQsjFA54NYl/qWgAql0uqCqsZidW+XBjquyItRl2Rfzzy5Fk/gMOAJXHQYp4POfgFbqtxjWpfnuOKqW/1IGWcIt2g016effUqGgj/oePX0g+duFdszSKK773rJBySgafFF6XWNqagrLmE4LUGC+6P3oxzYTSFGeUVA21OayL+K40XPpJti5zns= # devops-eth2-shared" + - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDWh9NW66VD4BPKETNyZeZrGN1f7G6dkihW3eAc7cbJPFQGIpnWc2tGq5o13vWW+SoCh16nkYM2oak+PJQxXYTiQnrMJSmSFd7E0DmdcoKadGJEnfosrH++aOZf/eVLe5q3E9NQFVSdOPo1MCRRTuZxPkuMxS6QikW3otWrA3F2vFgmYyki3Cy8huQzHKUZGicividYcUSFTydR2L0oWUNve3FyqMQQQPnfaJ1RvrkeGtdhRSAxa6L0jzgRK7fjpUyhKOofr7kCKARGELRRiB9QikRAoHU2/D/2jtJjKlTCJxArzXyDF2IcQCco+5Oe9x4c7Xch32dbscJSmjaAvsxRnu7GEFCS7b6kKGvwcoq5vJzvp3RBBR7Mosxv6pcM/q7Z4RhXOFVFFiPVl1dqkqSPkUrHwg8LtWOxC+GAl36vxhHLdDEV/RhbSAzO6SfYEWYGH1w7u4oiy2XAT2cNCO0j0tSHS5chX+d7TzwAbBE2HuPL84GVGHZG875hmiE+Dok= # github-actions-ci" +bootstrap_default_user_authorized_keys_github_all: + - barnabasbusa + - parithosh + - samcm + - savid + - skylenet + - pk910 +bootstrap_default_user_authorized_keys_github: > + {{ + (bootstrap_default_user_authorized_keys_github_all | default([])) + + (bootstrap_default_user_authorized_keys_github_team_el | default([])) + + (bootstrap_default_user_authorized_keys_github_team_cl | default([])) + }} + +# role: ethpandaops.general.ethereum_node +ethereum_node_images_always_pull: true +ethereum_node_metrics_exporter_enabled: true +ethereum_node_xatu_sentry_enabled: false +ethereum_node_cl_validator_enabled: "{{ validator_start is defined and validator_end is defined }}" +ethereum_node_cl_validator_fee_recipient: "0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134" +ethereum_node_cl_ports_p2p_tcp: 9000 +ethereum_node_cl_ports_p2p_udp: 9000 +ethereum_node_cl_ports_http_beacon: 5052 +ethereum_node_cl_ports_metrics: 5054 +ethereum_node_el_ports_p2p_tcp: 30303 +ethereum_node_el_ports_p2p_udp: 30303 +ethereum_node_el_ports_http_rpc: 8545 +ethereum_node_el_ports_ws_rpc: 8546 +ethereum_node_el_ports_engine: 8551 +ethereum_node_el_ports_metrics: 6060 + +ethereum_node_json_rpc_snooper_engine_enabled: true +ethereum_node_json_rpc_snooper_engine_port: 8561 +ethereum_node_json_rpc_snooper_engine_name: "snooper-engine" + +# role: ethpandaops.general.xatu_sentry +xatu_sentry_container_image: "{{ default_tooling_images.xatu_sentry }}" +xatu_sentry_config_name: "{{ ethereum_network_name }}-{{ inventory_hostname }}" +xatu_sentry_config_server_address: "{{ secret_xatu_sentry.server_address }}" +xatu_sentry_config_server_auth_user: "{{ secret_xatu_sentry.user }}" +xatu_sentry_config_server_auth_password: "{{ secret_xatu_sentry.password }}" +xatu_sentry_config_network_name_override: "{{ ethereum_network_name }}" + +# role: ethpandaops.general.ethereum_metrics_exporter +ethereum_metrics_exporter_container_image: "{{ default_tooling_images.ethereum_metrics_exporter }}" + +# role: eth_testnet_config +eth_testnet_config_dir: /data/ethereum-network-config/metadata +eth_testnet_config_local_dir_enabled: true +eth_testnet_config_local_dir_src: "{{ ethereum_genesis_generator_output_dir }}/metadata/" + +# role: gen_basic_auth_nginx +gen_basic_auth_nginx_name: "{{ secret_nginx_shared_basic_auth.name }}" +gen_basic_auth_nginx_password: "{{ secret_nginx_shared_basic_auth.password }}" + +# role: ethpandaops.general.docker_nginx_proxy +docker_nginx_proxy_container_name: nginx-proxy +docker_nginx_proxy_default_email: "certs@{{ domain }}" +docker_nginx_proxy_docker_gen_container_name: nginx-proxy-gen +docker_nginx_proxy_docker_gen_container_env: + RESOLVERS: "1.1.1.1" +docker_nginx_proxy_acme_companion_container_name: nginx-proxy-acme +docker_nginx_proxy_acme_companion_container_env: + DEFAULT_EMAIL: "{{ docker_nginx_proxy_default_email }}" + NGINX_PROXY_CONTAINER: "{{ docker_nginx_proxy_container_name }}" + NGINX_DOCKER_GEN_CONTAINER: "{{ docker_nginx_proxy_docker_gen_container_name }}" + ACME_CA_URI: https://acme.zerossl.com/v2/DV90 + ACME_EAB_KID: "{{ secret_zerossl.ACME_EAB_KID }}" + ACME_EAB_HMAC_KEY: "{{ secret_zerossl.ACME_EAB_HMAC_KEY }}" +docker_nginx_proxy_container_networks: "{{ docker_networks_shared }}" +docker_nginx_proxy_docker_gen_container_networks: "{{ docker_networks_shared }}" +docker_nginx_proxy_acme_companion_container_networks: "{{ docker_networks_shared }}" +docker_nginx_proxy_datadir: /opt/nginx-proxy +docker_nginx_proxy_container_volumes: + - "{{ docker_nginx_proxy_datadir }}/conf:/etc/nginx/conf.d" + - "{{ docker_nginx_proxy_datadir }}/vhost:/etc/nginx/vhost.d" + - "{{ docker_nginx_proxy_datadir }}/certs:/etc/nginx/certs:ro" + - html:/usr/share/nginx/html + - "{{ docker_nginx_proxy_datadir }}/htpasswd:/etc/nginx/htpasswd:ro" diff --git a/ansible/inventories/devnet-1/group_vars/all/images.yaml b/ansible/inventories/devnet-1/group_vars/all/images.yaml new file mode 100644 index 0000000..c15921a --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/all/images.yaml @@ -0,0 +1,37 @@ +default_ethereum_client_images: +### Consensus layer clients + lighthouse: ethpandaops/lighthouse:das-6ff9480 + lodestar: chainsafe/lodestar:latest + nimbus: ethpandaops/nimbus-eth2:kzgpeerdas-6b0223b + prysm: ethpandaops/prysm-beacon-chain:peerDAS-913e84d + prysm_validator: gcr.io/prysmaticlabs/prysm/validator:latest + teku: ethpandaops/teku:nashatyrev-das-3768eca + grandine: ethpandaops/grandine:das-16e416e +### Execution layer clients + besu: hyperledger/besu:latest + geth: ethereum/client-go:stable + erigon: thorax/erigon:devel + ethereumjs: ethpandaops/ethereumjs:master + nethermind: nethermindeth/nethermind:master + reth: ethpandaops/reth:main + + +default_tooling_images: + xatu_sentry: ethpandaops/xatu:latest + ethereum_metrics_exporter: ethpandaops/ethereum-metrics-exporter:latest + tx_fuzz: ethpandaops/tx-fuzz:latest + forkmon: skylenet/nodemonitor:darkmode + forky: ethpandaops/forky:latest + fauceth: skylenet/fauceth:fix_fee_estimation + powfaucet: pk910/powfaucet:v2-stable + ethstats: skylenet/ethstats-server:poa-no-geoip + homepage: ethpandaops/ethereum-testnet-homepage:latest + checkpointz: ethpandaops/checkpointz:latest + blockscout: blockscout/blockscout:master + beacon_metrics_gazer: dapplion/beacon-metrics-gazer:latest + eth_fauceth: chainflag/eth-faucet:latest + blobscan: blossomlabs/blobscan:latest + blobscan_indexer: blossomlabs/blobscan-indexer:latest + dora: ethpandaops/dora:peer-das-latest + dugtrio: ethpandaops/dugtrio:latest + ethereum_genesis_generator: ethpandaops/ethereum-genesis-generator:3.3.5 diff --git a/ansible/inventories/devnet-1/group_vars/besu.yaml b/ansible/inventories/devnet-1/group_vars/besu.yaml new file mode 100644 index 0000000..317c45a --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/besu.yaml @@ -0,0 +1,33 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_el: + - garyschulte + - jflo + - fab-10 + - matkt + - gezero + - siladu + - pinges + - jframe + +# role: ethpandaops.general.ethereum_node +ethereum_node_el: besu +# role: ethpandaops.general.besu +besu_container_name: execution +besu_container_image: "{{ default_ethereum_client_images.besu }}" +besu_container_env: + VIRTUAL_HOST: "{{ ethereum_node_rcp_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_el_ports_http_rpc | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_rcp_hostname }}" +besu_container_volumes: + - "{{ besu_datadir }}:/data" + - "{{ besu_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +besu_container_command_extra_args: + - --genesis-file=/network-config/besu.json + - --bootnodes={{ ethereum_el_bootnodes | join(',') }} + - --rpc-http-api=ADMIN,DEBUG,ETH,MINER,NET,TRACE,TXPOOL,WEB3 + - --sync-mode=FULL + - --data-storage-format=BONSAI + - --bonsai-limit-trie-logs-enabled=false + - --ethstats={{ inventory_hostname }}:{{ ethstats_secret }}@{{ ethstats_url }}:443 +besu_container_pull: true diff --git a/ansible/inventories/devnet-1/group_vars/blobber.yaml b/ansible/inventories/devnet-1/group_vars/blobber.yaml new file mode 100644 index 0000000..efb7325 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/blobber.yaml @@ -0,0 +1,56 @@ +blobber_container_image: "{{ default_tooling_images.blobber }}" + +blobber_log_level: trace + +ethereum_node_blobber_enabled: true + +# Storage configs +blobber_datadir: /data/blobber +blobber_validator_local_key_folder: "{{ ansible_inventory_sources[0] | dirname }}/files/validator_keys/{{ inventory_hostname }}" +blobber_validator_remote_key_folder: "{{ blobber_datadir }}/validators" + +blobber_container_volumes: + - "{{ blobber_datadir }}:/data" + +# Blobber specific configs +blobber_beacon_api: "beacon:5052" +#blobber_slot_actions: {"name": "equivocating_blob_sidecars", "broadcast_blobs_first": true} +#blobber_slot_actions: {"name": "conflicting_blobs"} +blobber_slot_actions: {"name": "blob_gossip_delay", "delay_milliseconds": 1500} +blobber_slot_action_frequency: 1 + +blobber_container_ports: + - "{{ blobber_p2p_port }}:{{ blobber_p2p_port }}" + - "{{ blobber_p2p_port }}:{{ blobber_p2p_port }}/udp" + - "{{ blobber_p2p_port + 1 }}:{{ blobber_p2p_port }}" + - "{{ blobber_p2p_port + 1 }}:{{ blobber_p2p_port }}/udp" + - "{{ blobber_p2p_port + 2 }}:{{ blobber_p2p_port }}" + - "{{ blobber_p2p_port + 2 }}:{{ blobber_p2p_port }}/udp" + - "{{ blobber_p2p_port + 3 }}:{{ blobber_p2p_port }}" + - "{{ blobber_p2p_port + 3 }}:{{ blobber_p2p_port }}/udp" + - "{{ blobber_p2p_port + 4 }}:{{ blobber_p2p_port }}" + - "{{ blobber_p2p_port + 4 }}:{{ blobber_p2p_port }}/udp" + - "{{ blobber_p2p_port + 5 }}:{{ blobber_p2p_port }}" + - "{{ blobber_p2p_port + 5 }}:{{ blobber_p2p_port }}/udp" + - "127.0.0.1:{{ blobber_api_listen_port }}:{{ blobber_api_listen_port }}" + +# - "--cl=https://{{ secret_nginx_shared_basic_auth.name }}:{{ secret_nginx_shared_basic_auth.password }}@bn.lighthouse-geth-1.{{ network_subdomain }}" +# - "--cl=https://{{ secret_nginx_shared_basic_auth.name }}:{{ secret_nginx_shared_basic_auth.password }}@bn.lighthouse-besu-1.{{ network_subdomain }}" +# - "--cl=https://{{ secret_nginx_shared_basic_auth.name }}:{{ secret_nginx_shared_basic_auth.password }}@bn.lighthouse-erigon-1.{{ network_subdomain }}" +# - "--cl=https://{{ secret_nginx_shared_basic_auth.name }}:{{ secret_nginx_shared_basic_auth.password }}@bn.lighthouse-nethermind-1.{{ network_subdomain }}" +# - "--cl=https://{{ secret_nginx_shared_basic_auth.name }}:{{ secret_nginx_shared_basic_auth.password }}@bn.lighthouse-reth-1.{{ network_subdomain }}" +blobber_container_command: + - "--cl={{ blobber_beacon_api }}" + - "--beacon-port-start={{ blobber_p2p_port }}" + - "--log-level={{ blobber_log_level }}" + - "--external-ip=0.0.0.0" + - "--slot-action={{ blobber_slot_actions | to_json }}" + - "--slot-action-frequency={{ blobber_slot_action_frequency }}" + - "--validator-key-folder=/data/validators" + - "--validator-proxy-port-start={{ blobber_api_listen_port }}" + - "--enable-unsafe-mode" + +blobber_container_command_extra_args: [] + +# Default image pull policy +blobber_container_pull: false diff --git a/ansible/inventories/devnet-1/group_vars/bootnode.sops.yaml b/ansible/inventories/devnet-1/group_vars/bootnode.sops.yaml new file mode 100644 index 0000000..e88c676 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/bootnode.sops.yaml @@ -0,0 +1,127 @@ +cl_bootnode_privkey: ENC[AES256_GCM,data:YWNv97QCL5pCy8lowEb5jJtFJ6fXjamE5bB+takjWNbQhwxxHkprENN0jcuUtNfuSfQFRYymR+fI0lgtnQq4zw==,iv:iEHtpLwDBPbJ3Ny/ZZLf+jX2nWunP21VhgU5D6fiSyQ=,tag:yEqNeQKvgkgC8oCH/4schg==,type:str] +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: [] + lastmodified: "2023-09-01T10:51:26Z" + mac: ENC[AES256_GCM,data:KfZGx1QfBJiqKl2FSNvtPvoeHkV167h8K3WaZ/H+9Q9WlwLVPBMwzGasbM/0GI+HPcLd5u11r6szAaKKeYquImP/XGihTP8vwwinzXr7mtp2zwEJb4AQqKy8yklY7uSMHkIjNB6kRRcy0QYjrzUeoKlS8U5LQJ/qgN1yqJJJp4s=,iv:YhQU1f+xjL3OCWe8FRjQI56wzEgkk5yFEb0sOQa05IM=,tag:5Yn5FU99kFRrhiIg+iT13Q==,type:str] + pgp: + - created_at: "2023-09-28T11:48:21Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + wcFMA32GcoRiZf6pARAAgsVcJIAiqcFhszY/OsMF7OxfaRJ1+CvNOBDPNyvdYJKS + AzP5ENZZnPRhXsZmWhi3wfOGoq70JQcUnpYQ1LUJIeWmdfbvX3zsxLJ3HlSElHPz + PQcg5kQWBmNHHxXcx/4NmKDZ+0YOAcoYrOMHiY5+slgKHAS3ZpwqaZfS27F1FTtd + dxCEtzlNJRFaN0nTiQL2dIFQH3bERpYxZqrZm2fYP1rxXEXN2FtnsWUhtxmrT7Cu + uN1ixBE3jxoPiwmwNPil5pbC34VymD5Ora0WR+066Ygmj0rd2LeA1fNAsjsYnTNE + eAwOmAb9Pso3O58299hGchTvamd2LdG7R8zq/u6d2v1ZwDLf76FjeJVVqDH64ikU + gklRdPOHY3xCXpLM7kwcaTRjVdbS+FXF8BVvXfuBqalrxUUjab+8q/T9+OVAMsTw + l2Rt6gOTsmu8G8g1jkstFNup1YbfY5vK42XfpiUQCyKJvMCHkDZZYft1tTXr/mWQ + KVsdH5Ip/D/BmPpX2T3vfAVEZdy4tWZyz9tj4deftGHcsDUgs+rkbTg5MdW5wpfQ + V4YMngrHIQ8FVPuRn+j63o14FjJKE1Q7xraIhnbwkginvStzNZ3Dfq/bj0vRYYhX + Xpi970JlTTMv2dJUYTSUJluIZEgmPfLhDuXoI1rt12RN/NA4snGjynHLly9zCuvS + UQHSMrWw0N4rJrSh4H0mFYUWuyPCiX9yVBRPck2h9GbvoLA50CmB+rM3e8AUHdJz + vuUUP2ttZ1MxroTxMiBhOxjvZMGiL+PrxjZVHfKa7ISPJA== + =SATG + -----END PGP MESSAGE----- + fp: 80DB2B4EF6CA4D9829C280605636BC0E08138A24 + - created_at: "2023-09-28T11:48:21Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + wcFMA87Wber4r4dGAQ/+NrVGC9DtyttcgEfdWQ/5NSAGkS3FmweSlq5n7v4OPg11 + 3s3yduPzs9PAllkdGTQBi4OHjmI4OZJrDVWHAYbw0FUYljPfTzn1KJAQ18FAJd0r + kSNeuXtqHp33Q0pyca2eOZUZLcS0rsU/Gt8mxtVSVkWcuNnj9BlgVPSjrciNC+Pu + a/ZnDn2DBa6PMdY1FAHobeh//7mRwwhYyZKVfemp+p4QNRpbFYA4X92ztoHL6zcp + nkvRNrFxE5BAfuUfR1di0YrUOLnIbwXkvX3nnq7bdManAIs5j93rivI9uBTlW2+C + IGhciOyI4IRo3FhZ93glytan+u5KaU1fvGpEc15VLmhTm3HespkFeOOAs98YdM4R + az6AH4fqIa0CpTi/DYRjc0aSXT2YfcN7S1dO8YiYWNDQzl/fBgukCeWcwD+ao5RN + NenOWaqoXCLgOwlA9XVqjkayoxaU9LKiFWu/5VoLIfkzsn2piCJHaYTMLBPZG9h/ + VCHRAL5o4eh+Xqq1X+whTC7m+26mrnM6CXTK/MHr1+ndJTqnutC2D3L0aa5tUOBH + 57HT2O2TbI1uJZOscBurFws5iE9yxN1oxLCjmHDy9nECKWc+KYuCZP2wzCef8Hpx + lxDewioqyTLyUo1ISNDYcn818wQ8MZihqf/ay6V165dB4PbR/gkqAKFxly7peV3S + UQER228ct6oH6GyPR9x69BQtWpx4g5dKD1+9p29AIOkjvEHDMchmTK/HU0FBvFos + 3UtX8eARoIL/pf5IpaQJMr0ueRIgSTB+Rhf8GM00tSyg5g== + =lx0W + -----END PGP MESSAGE----- + fp: 69F66EEA7AE36CCB77DDB8CA1BC39532FB4A2DBD + - created_at: "2023-09-28T11:48:21Z" + enc: | + -----BEGIN PGP MESSAGE----- + + hQIMA4hw3nPn82LyARAAm0Ix52az8AnOQ337mtTOSxK5erN7w888sxK0WR/Qv9Zn + bvPkX7Mjr4OT7XugX3HhFF3VlaUNILVPN+jM877eADeTtqD5TmziPlC20jQL91Ng + q6hzj/SS3Ytc4rl1TrXwz36hfA9KirZ+qlrj33lg9+kb23TZ5uIQ2TT2YdpzcSKb + 9h2VagWs3FQiN9Nih5I/OBUEP+X5fI/IDGuy3hmi7lg/+E9IFyn22EBoeOkJfweA + 6TmwLBigO6KMELFs9UoZ+m7z/HsCNglem3UUnRrsDM1c2+Ezaod4WaOmTT/B7KYT + GrA+Q8QyC7BTYzws6W38VN32zEtl600ORj8rOQYOF5uZHCDhIMlYvgNKmi2IOaju + XNVQx2uemYUCw2+bzwx5mRHUqaQEZXzjftZmJH+HvNBoFfT7SzIaW1cszC9U1/hV + 7JEpf5AoI8rw5jOl6QVnqUzy6DqCuYLRgCVUzg3jhq7VDbqcB2eTkF8MmIyttoL3 + N+S2jOxLyGcKjvxKY5t9VsSJKvYqK0UDbRU0StdSLOPtgJkCAgM8SSZfRQFLgbKR + KLoulYDwMUdyF4gVDDksnzytjESR2AJtGRwJtje2QPtJIpLtVNq3fczwRQZPW6tN + fXM3g8F+vaUUjIK383D9RuQV+3S4L3gEuzq3yRK+OsQQTcuHGxUjDCgfmRRPjJvS + UQH9wECSB/qckvO8ZB5e/42x6KxlFZDvRp+NWB1AdqisXDTNeFuQbkpFMBK6+0zT + shAV4OQsnRIpURviKvsGGDBB7N5U4HBI1Ibxw+fH5hhJmg== + =HAY1 + -----END PGP MESSAGE----- + fp: D1002590180DE371BCB455EAEFCD4ACD0B4D3F6E + - created_at: "2023-09-28T11:48:21Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + wcFMAw01qfIBwY0JAQ/+IuIBACFzYKS+FxBFo0xEVRNivvCaC7O1GD9qmxWXtutf + atdYKCclSfq3sO+eMunXG1B8jL3AUTJPYVG37CVksuLCpAbhw+3oNAxydFsjPCYw + h7NeQYWzbq7W3+ULtAnurlIimI8vfcFp0OQwl4U8zMuPiXF3ZTj2D6QCKSsduDlr + lSL/7T0yzJtHLkW+bLacqWpVwBuPOCoeohkdR9sRRr4KVgisaJSIOeoY6MS+njh/ + iEKwlnjBW134aPx1xSgBGFhgmcd7Z5qXcyN/Fo1kAe95g8S+8WA0EV9z4+CZ5MLu + MP28+Wb8UBPwDRLfZa8/easEn6zsQLwsCrv34c0PJAfTsNfjCmUQRNc8sQcvyvxv + Cfu572BbW1MbO5LvsAJc4Q2amxdF5S6UAbGL6eKz10xOnJbRgnzIT92iZefjM8uv + KMbjlL+GzYRi/zkqxxHqKYpRjdTgFQ5TN00RIlOEvsFvHTvwG6oElJ8cvCQ5H5e6 + tbK3GyJ/r3yh21TPl40zJr6mORMPQhOJmkepQitIfwoIvLzL2PiRvZ5E3dXfi1Do + exa4rjKMAh8fm0ftvcu/s6smTBotL6goVWVTQ/kus6G7T0XYrbcpzwLoko+3IvEF + MRDiq262QBDeW6/EZrxtYcHIXHICLNxcwzmC2F3E6/VXUin9s1JFi6ZpFGpc2qfS + UQFHghKmdL90d0iGaZYmTK6Kh0TmJCcc9RPp8eQkYOkDr3h48oiU+yjsatbnIasq + jVGxNz7iyOmeHfelEWjhEdA6g1PHsC75gx6UUzUKjB7zVA== + =u97e + -----END PGP MESSAGE----- + fp: B9F81F327CF5346860E85269D7AF98F214C59E4E + - created_at: "2023-09-28T11:48:21Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + wcBMAwDFOgk9tOQ+AQgAgzfRJrI+jISm6Dm473pmYqVsXzQupY+/4WopZh8y9EBg + j8GzPAlP2QHYJ5j65Cg9WvF8JwpfFAWkrqbWWTuVvhnW/G8TRUEcl9GeuxsE+jko + Gv8Iw/IN0XrtuiLQLRi2unPNr9aWMfUc9kalDwWs92XOkJ5rvnoL8PrMg06giv2L + lLqileUVZVmUccpjhOdZmQ22DYU8d/ubWQKiFxpLjp/o8QjZ1Q2Xxrnhg9OZw3qF + +W9mX/phjCQV1OqwejJ8VXxbL0jKX1rPYTAJmha9yJ13l7Kaj3sjgf6KWdoD1pbN + N8j7ETDqeZyoXHLWi82JiVEhuE+AKL4AwRjLOYMKNdJRAVEVEXK6v5436FmUVUHU + wUyzWiz3IPjJm5o0mdyny9uuzgENWUnd9OIrEfhFsCZeEk4cYcnfgeqka1rSeXEf + N7R1yaiR+v2C7oWpqJ7XhHhe + =PmZA + -----END PGP MESSAGE----- + fp: 0600D41E1313E31016F7C55BF597BC0C5F22D1A2 + - created_at: "2023-09-28T11:48:21Z" + enc: | + -----BEGIN PGP MESSAGE----- + + hQIMAz4a8AV36xppAQ/5AduGaLiW6kVTFIuKUDe4Z5VO7J2RrIL3QparCb/ogDVo + 0fQ4KEAsMty7FP0IlBvpw3uh/ZsYsxX/HYMX01uLqf03z1RGdgGF76diicBS7Id0 + I42O7Umg1M4JgQsJuaEcLI91VCtwVYUQqnl3dJytO3T1e8YJ9rCe4d4Xp4qyGniq + zCmkJv180b50qT1qC/xNP9komU9OC0er8ZGyqIabEzT79oW6JA5RwI7pRI37JobV + OdnsL6xdAkDmYeFuuwPrsfXB9rCAx1y/863s56F3OEI+SL4A0CAPpG09l/E3FkP2 + 7AwHpxfBSrDiSBPL2QJoGdSshcdggfGiT8lO5ZrCMEN3+n0KkKeqGZdbKHfofYUk + 2ypRpaILQ+7oDgOLxIdXefVrc7kKOacontURM84Um7Dx0yH7qMiZ9nv2H9ywIrdR + FfHbaFXTzVMZyulb8KVX7jkMvpj9m+QZYEUaWnnI9Mhtk90hCH9r5NIZHpLAw7Sx + 4AdCMcGaz1LnEYeajGVQNlXgmgP518MnhiWAmBX+feIghE3e8IVRvw0BLbbiXdEI + SvJbdS8oUTNzCnU1unpdepqOwT4S1MfTOhc7Mv2VwYXt/LN93oSf/hps5SoJpvcW + 400s5j4s6HY6t2lJifdS5X5NoXQB674RD/8v4uW+wXVBdLpUs2TlWuzwfKOpRXnS + XAFm3A/9P2Ru0jJAzokwXBynsCz2XTFAWtWJ6/xRT0YB9XR72L0e17naxhPnaABI + eykk4sVTShzLMKl7nozbLg0cVGUtUmBELMwAsUB4vB6FXMs+N2Ik3seTZtEw + =Wgxv + -----END PGP MESSAGE----- + fp: 29C50D01122FDE78E257482DAA497EB2610A8435 + unencrypted_suffix: _unencrypted + version: 3.7.3 diff --git a/ansible/inventories/devnet-1/group_vars/bootnode.yaml b/ansible/inventories/devnet-1/group_vars/bootnode.yaml new file mode 100644 index 0000000..cb517d0 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/bootnode.yaml @@ -0,0 +1,103 @@ +ethereum_cl_bootnode: "{{ hostvars['bootnode-1']['cl_bootnode_fact_enr'] }}" + +# role: eth_inventory_web +eth_inventory_web_container_networks: "{{ docker_networks_shared }}" +eth_inventory_web_container_env: + VIRTUAL_HOST: "{{ server_fqdn }}" + VIRTUAL_PORT: "80" + VIRTUAL_PATH: "/meta/api" + VIRTUAL_DEST: "/" + LETSENCRYPT_HOST: "{{ server_fqdn }}" + +# role: ethpandaops.general.ethereum_node +ethereum_node_el: geth +ethereum_node_cl: lighthouse +ethereum_node_cl_validator_enabled: false + +# role: ethpandaops.general.lighthouse +lighthouse_container_name: beacon +lighthouse_validator_container_name: validator +lighthouse_container_image: "{{ default_ethereum_client_images.lighthouse }}" +lighthouse_container_env: + VIRTUAL_HOST: "{{ ethereum_node_beacon_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_cl_ports_http_beacon | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_beacon_hostname }}" +lighthouse_container_volumes: + - "{{ lighthouse_datadir }}:/data" + - "{{ lighthouse_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +lighthouse_container_command_extra_args: + - --testnet-dir=/network-config + - --allow-insecure-genesis-sync + - --subscribe-all-data-column-subnets + +# role: ethpandaops.general.geth +geth_container_name: execution +geth_container_image: "{{ default_ethereum_client_images.geth }}" +geth_container_env: + VIRTUAL_HOST: "{{ ethereum_node_rcp_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_el_ports_http_rpc | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_rcp_hostname }}" +geth_container_command_extra_args: + - --http.api=eth,net,web3,debug,admin + - --http.vhosts=* + - --networkid={{ ethereum_network_id }} + - --syncmode=full + - --ethstats={{ inventory_hostname }}:{{ ethstats_secret }}@{{ ethstats_url }} +geth_init_custom_network: true +geth_init_custom_network_genesis_file: "{{ eth_testnet_config_dir }}/genesis.json" +geth_container_pull: true + +# role: ethpandaops.general.prometheus +prometheus_remote_push_url: https://victoriametrics.ethdevops.io/insert/0/prometheus/api/v1/write +prometheus_remote_write_username: "{{ secret_prometheus_remote_write.username }}" +prometheus_remote_write_password: "{{ secret_prometheus_remote_write.password }}" +prometheus_config: | + global: + scrape_interval: 30s + evaluation_interval: 30s + scrape_timeout: 10s + external_labels: + instance: "{{ inventory_hostname }}" + ip_address: "{{ ansible_host }}" + network: "{{ ethereum_network_name }}" + testnet: "{{ ethereum_network_name }}" + execution_client: "{{ ethereum_node_el }}" + consensus_client: "{{ ethereum_node_cl }}" + remote_write: + - queue_config: + batch_send_deadline: 5s + max_backoff: 500ms + max_samples_per_send: 500 + min_backoff: 50ms + max_shards: 100 + url: {{ prometheus_remote_push_url }} + remote_timeout: 10s + basic_auth: + username: {{ prometheus_remote_write_username }} + password: {{ prometheus_remote_write_password }} + scrape_configs: + - job_name: "prometheus" + metrics_path: "/metrics" + static_configs: + - targets: ["localhost:9090"] + labels: + instance: "{{ inventory_hostname }}" + - job_name: "node" + metrics_path: "/metrics" + static_configs: + - targets: ["172.17.0.1:9100"] + labels: + instance: "{{ inventory_hostname }}" + - job_name: "exporter" + metrics_path: "/metrics" + static_configs: + - targets: ["ethereum-metrics-exporter:9090"] + labels: + instance: "{{ inventory_hostname }}" + - job_name: "consensus_node" + metrics_path: "/metrics" + static_configs: + - targets: ["{{ vars[ethereum_node_cl + '_container_name'] }}:{{ ethereum_node_cl_ports_metrics }}"] + labels: + instance: "{{ inventory_hostname }}" diff --git a/ansible/inventories/devnet-1/group_vars/erigon.yaml b/ansible/inventories/devnet-1/group_vars/erigon.yaml new file mode 100644 index 0000000..cd2a1a9 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/erigon.yaml @@ -0,0 +1,83 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_el: + - Giulio2002 + - yperbasis + +# role: ethpandaops.general.ethereum_node +ethereum_node_el: erigon + +# role: ethpandaops.general.erigon +erigon_container_name: execution +erigon_container_image: "{{ default_ethereum_client_images.erigon }}" +erigon_container_env: + VIRTUAL_HOST: "{{ ethereum_node_rcp_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_el_ports_http_rpc | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_rcp_hostname }}" +erigon_container_command_extra_args: + - --chain=dev + - --http.api=eth,erigon,engine,web3,net,debug,trace,txpool + - --http.vhosts=* + - --ws + - --prune=htc + - --networkid={{ ethereum_network_id }} + - --db.size.limit=500GB + - --bootnodes={{ ethereum_el_bootnodes | join(',') }} + - --ethstats={{ inventory_hostname }}:{{ ethstats_secret }}@{{ ethstats_url }} +erigon_init_custom_network: true +erigon_init_custom_network_genesis_file: "{{ eth_testnet_config_dir }}/genesis.json" + +prometheus_config: | + global: + scrape_interval: 30s + evaluation_interval: 30s + scrape_timeout: 10s + external_labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + ip_address: "{{ ansible_host }}" + network: "{{ ethereum_network_name }}" + testnet: "{{ ethereum_network_name }}" + execution_client: "{{ ethereum_node_el }}" + consensus_client: "{{ ethereum_node_cl }}" + remote_write: + - queue_config: + batch_send_deadline: 5s + max_backoff: 500ms + max_samples_per_send: 500 + min_backoff: 50ms + max_shards: 100 + url: {{ prometheus_remote_push_url }} + remote_timeout: 10s + basic_auth: + username: {{ prometheus_remote_write_username }} + password: {{ prometheus_remote_write_password }} + scrape_configs: + - job_name: "prometheus" + metrics_path: "/metrics" + static_configs: + - targets: ["localhost:9090"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "node" + metrics_path: "/metrics" + static_configs: + - targets: ["172.17.0.1:9100"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "exporter" + metrics_path: "/metrics" + static_configs: + - targets: ["ethereum-metrics-exporter:9090"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "consensus_node" + metrics_path: "/metrics" + static_configs: + - targets: ["{{ vars[ethereum_node_cl + '_container_name'] }}:{{ ethereum_node_cl_ports_metrics }}"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "execution" + metrics_path: "/debug/metrics/prometheus" + static_configs: + - targets: ["execution:{{ ethereum_node_el_ports_metrics }}"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" diff --git a/ansible/inventories/devnet-1/group_vars/ethereum_node.yaml b/ansible/inventories/devnet-1/group_vars/ethereum_node.yaml new file mode 100644 index 0000000..1264e0d --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/ethereum_node.yaml @@ -0,0 +1,60 @@ +ethereum_cl_bootnodes: + - "{{ hostvars['bootnode-1']['cl_bootnode_fact_enr'] }}" + - "{{ hostvars['bootnode-1']['ethereum_node_fact_cl_enr'] }}" + +ethereum_el_bootnodes: + - "{{ hostvars['bootnode-1']['ethereum_node_fact_el_enode'] }}" + +# role: ethpandaops.general.prometheus +prometheus_remote_push_url: https://victoriametrics-public.analytics.production.platform.ethpandaops.io/insert/1/prometheus +prometheus_remote_write_username: "{{ secret_prometheus_remote_write.username }}" +prometheus_remote_write_password: "{{ secret_prometheus_remote_write.password }}" +prometheus_config: | + global: + scrape_interval: 30s + evaluation_interval: 30s + scrape_timeout: 10s + external_labels: + instance: "{{ inventory_hostname }}" + ip_address: "{{ ansible_host }}" + network: "{{ ethereum_network_name }}" + testnet: "{{ ethereum_network_name }}" + execution_client: "{{ ethereum_node_el }}" + consensus_client: "{{ ethereum_node_cl }}" + remote_write: + - queue_config: + batch_send_deadline: 5s + max_backoff: 500ms + max_samples_per_send: 500 + min_backoff: 50ms + max_shards: 100 + url: {{ prometheus_remote_push_url }} + remote_timeout: 10s + basic_auth: + username: {{ prometheus_remote_write_username }} + password: {{ prometheus_remote_write_password }} + scrape_configs: + - job_name: "prometheus" + metrics_path: "/metrics" + static_configs: + - targets: ["localhost:9090"] + labels: + instance: "{{ inventory_hostname }}" + - job_name: "node" + metrics_path: "/metrics" + static_configs: + - targets: ["172.17.0.1:9100"] + labels: + instance: "{{ inventory_hostname }}" + - job_name: "exporter" + metrics_path: "/metrics" + static_configs: + - targets: ["ethereum-metrics-exporter:9090"] + labels: + instance: "{{ inventory_hostname }}" + - job_name: "consensus_node" + metrics_path: "/metrics" + static_configs: + - targets: ["{{ vars[ethereum_node_cl + '_container_name'] }}:{{ ethereum_node_cl_ports_metrics }}"] + labels: + instance: "{{ inventory_hostname }}" diff --git a/ansible/inventories/devnet-1/group_vars/ethereumjs.yaml b/ansible/inventories/devnet-1/group_vars/ethereumjs.yaml new file mode 100644 index 0000000..85f3ac5 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/ethereumjs.yaml @@ -0,0 +1,84 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_el: + - g11tech + - acolytec3 + - holgerd77 + - jochem-brouwer + +# role: ethpandaops.general.ethereum_node +ethereum_node_el: ethereumjs + +ethereum_node_fact_discovery_el_enode_cmd: + ethereumjs: cat /data/ethereumjs/genesis/rlpx + +# role: ethpandaops.general.ethereumjs +ethereumjs_container_name: execution +ethereumjs_container_image: "{{ default_ethereum_client_images.ethereumjs }}" +ethereumjs_container_env: + VIRTUAL_HOST: "{{ ethereum_node_rcp_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_el_ports_http_rpc | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_rcp_hostname }}" +ethereumjs_container_volumes: + - "{{ ethereumjs_datadir }}:/data" + - "{{ ethereumjs_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +ethereumjs_container_command_extra_args: + - --gethGenesis=/network-config/genesis.json + - --bootnodes={{ ethereum_el_bootnodes | join(',') }} + - --maxPeers=75 + - --isSingleNode=true +prometheus_config: | + global: + scrape_interval: 30s + evaluation_interval: 30s + scrape_timeout: 10s + external_labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + ip_address: "{{ ansible_host }}" + network: "{{ ethereum_network_name }}" + testnet: "{{ ethereum_network_name }}" + execution_client: "{{ ethereum_node_el }}" + consensus_client: "{{ ethereum_node_cl }}" + remote_write: + - queue_config: + batch_send_deadline: 5s + max_backoff: 500ms + max_samples_per_send: 500 + min_backoff: 50ms + max_shards: 100 + url: {{ prometheus_remote_push_url }} + remote_timeout: 10s + basic_auth: + username: {{ prometheus_remote_write_username }} + password: {{ prometheus_remote_write_password }} + scrape_configs: + - job_name: "prometheus" + metrics_path: "/metrics" + static_configs: + - targets: ["localhost:9090"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "node" + metrics_path: "/metrics" + static_configs: + - targets: ["172.17.0.1:9100"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "exporter" + metrics_path: "/metrics" + static_configs: + - targets: ["ethereum-metrics-exporter:9090"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "consensus_node" + metrics_path: "/metrics" + static_configs: + - targets: ["{{ vars[ethereum_node_cl + '_container_name'] }}:{{ ethereum_node_cl_ports_metrics }}"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "execution" + metrics_path: "/metrics" + static_configs: + - targets: ["execution:{{ ethereum_node_el_ports_metrics }}"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" diff --git a/ansible/inventories/devnet-1/group_vars/geth.yaml b/ansible/inventories/devnet-1/group_vars/geth.yaml new file mode 100644 index 0000000..74ea1e4 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/geth.yaml @@ -0,0 +1,88 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_el: + - mariusVanDerWijden + - holiman + - karalabe + +# role: ethpandaops.general.ethereum_node +ethereum_node_el: geth + +# role: ethpandaops.general.geth +geth_container_name: execution +geth_container_image: "{{ default_ethereum_client_images.geth }}" +geth_container_env: + VIRTUAL_HOST: "{{ ethereum_node_rcp_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_el_ports_http_rpc | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_rcp_hostname }}" +geth_container_command_extra_args: + - --http.api=eth,net,web3,debug,admin + - --http.vhosts=* + - --state.scheme=path + - --networkid={{ ethereum_network_id }} + - --syncmode=full + - --bootnodes={{ ethereum_el_bootnodes | join(',') }} + - --ethstats={{ inventory_hostname }}:{{ ethstats_secret }}@{{ ethstats_url }} +geth_init_custom_network: true +geth_init_custom_network_genesis_file: "{{ eth_testnet_config_dir }}/genesis.json" +geth_init_custom_network_container_command: + - --datadir=/data + - init + - --state.scheme=path + - /genesis.json +geth_container_pull: true + +prometheus_config: | + global: + scrape_interval: 30s + evaluation_interval: 30s + scrape_timeout: 10s + external_labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + ip_address: "{{ ansible_host }}" + network: "{{ ethereum_network_name }}" + testnet: "{{ ethereum_network_name }}" + execution_client: "{{ ethereum_node_el }}" + consensus_client: "{{ ethereum_node_cl }}" + remote_write: + - queue_config: + batch_send_deadline: 5s + max_backoff: 500ms + max_samples_per_send: 500 + min_backoff: 50ms + max_shards: 100 + url: {{ prometheus_remote_push_url }} + remote_timeout: 10s + basic_auth: + username: {{ prometheus_remote_write_username }} + password: {{ prometheus_remote_write_password }} + scrape_configs: + - job_name: "prometheus" + metrics_path: "/metrics" + static_configs: + - targets: ["localhost:9090"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "node" + metrics_path: "/metrics" + static_configs: + - targets: ["172.17.0.1:9100"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "exporter" + metrics_path: "/metrics" + static_configs: + - targets: ["ethereum-metrics-exporter:9090"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "consensus_node" + metrics_path: "/metrics" + static_configs: + - targets: ["{{ vars[ethereum_node_cl + '_container_name'] }}:{{ ethereum_node_cl_ports_metrics }}"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "execution" + metrics_path: "/debug/metrics/prometheus" + static_configs: + - targets: ["execution:{{ ethereum_node_el_ports_metrics }}"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" diff --git a/ansible/inventories/devnet-1/group_vars/grandine.yaml b/ansible/inventories/devnet-1/group_vars/grandine.yaml new file mode 100644 index 0000000..6815b0c --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/grandine.yaml @@ -0,0 +1,40 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_cl: + - sauliusgrigaitis + - povi + +# role: validator_keys +validator_keys_sync_files: + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/teku-keys/" + dest: "{{ grandine_validator_datadir }}/keys/" + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/teku-secrets/" + dest: "{{ grandine_validator_datadir }}/secrets/" + +validator_bls_sync_files: + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/change_operations.json" + dest: "{{ grandine_validator_datadir }}/change_operations.json" + owner: grandine + group: grandine +# role: ethpandaops.general.ethereum_node +ethereum_node_cl: grandine + +# role: ethpandaops.general.grandine +grandine_container_name: beacon +grandine_container_image: "{{ default_ethereum_client_images.grandine }}" +grandine_container_env: + VIRTUAL_HOST: "{{ ethereum_node_beacon_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_cl_ports_http_beacon | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_beacon_hostname }}" +grandine_container_volumes: + - "{{ grandine_datadir }}:/data" + - "{{ grandine_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +grandine_container_command_extra_args: + - --configuration-directory=/network-config/ + - --boot-nodes={{ ethereum_cl_bootnodes | join(',') }} + - --graffiti={{ ansible_hostname }} + +grandine_validator_container_volumes: + - "{{ grandine_validator_datadir }}:/validator-data" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +grandine_validator_datadir: /data/grandine-validator diff --git a/ansible/inventories/devnet-1/group_vars/lighthouse.yaml b/ansible/inventories/devnet-1/group_vars/lighthouse.yaml new file mode 100644 index 0000000..09cc60a --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/lighthouse.yaml @@ -0,0 +1,55 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_cl: + - ethdreamer + - paulhauner + - pawanjay176 + - michaelsproul + - potuz + - nisdas + - antondlr + - realbigsean + - dapplion + - jimmygchen + +# role: validator_keys +validator_keys_sync_files: + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/keys/" + dest: "{{ lighthouse_validator_datadir }}/keys/" + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/secrets/" + dest: "{{ lighthouse_validator_datadir }}/secrets/" + +validator_bls_sync_files: + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/change_operations.json" + dest: "{{ lighthouse_validator_datadir }}/change_operations.json" + owner: lighthouse + group: lighthouse + +# role: ethpandaops.general.ethereum_node +ethereum_node_cl: lighthouse + +# role: ethpandaops.general.lighthouse +lighthouse_container_name: beacon +lighthouse_validator_container_name: validator +lighthouse_container_image: "{{ default_ethereum_client_images.lighthouse }}" +lighthouse_container_env: + VIRTUAL_HOST: "{{ ethereum_node_beacon_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_cl_ports_http_beacon | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_beacon_hostname }}" +lighthouse_container_volumes: + - "{{ lighthouse_datadir }}:/data" + - "{{ lighthouse_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +lighthouse_container_command_extra_args: + - --testnet-dir=/network-config + - --boot-nodes={{ ethereum_cl_bootnodes | join(',') }} + - --allow-insecure-genesis-sync + - --subscribe-all-data-column-subnets +lighthouse_validator_container_volumes: + - "{{ lighthouse_validator_datadir }}:/validator-data" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +lighthouse_validator_container_command_extra_args: + - --testnet-dir=/network-config + - --graffiti={{ ansible_hostname }} + - --produce-block-v3 +lighthouse_validator_datadir: /data/lighthouse-validator +lighthouse_container_pull: true diff --git a/ansible/inventories/devnet-1/group_vars/lodestar.yaml b/ansible/inventories/devnet-1/group_vars/lodestar.yaml new file mode 100644 index 0000000..ae92716 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/lodestar.yaml @@ -0,0 +1,53 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_cl: + - dapplion + - wemeetagain + - tuyennhv + - g11tech + - philknows + - nazarhussain + +# role: validator_keys +validator_keys_sync_files: + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/keys/" + dest: "{{ lodestar_validator_datadir }}/keys/" + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/secrets/" + dest: "{{ lodestar_validator_datadir }}/secrets/" + +validator_bls_sync_files: + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/change_operations.json" + dest: "{{ lodestar_validator_datadir }}/change_operations.json" + owner: lodestar + group: lodestar + +# role: ethpandaops.general.ethereum_node +ethereum_node_cl: lodestar + +# role: ethpandaops.general.lodestar +lodestar_container_name: beacon +lodestar_validator_container_name: validator +lodestar_container_image: "{{ default_ethereum_client_images.lodestar }}" +lodestar_container_env: + VIRTUAL_HOST: "{{ ethereum_node_beacon_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_cl_ports_http_beacon | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_beacon_hostname }}" +lodestar_container_volumes: + - "{{ lodestar_datadir }}:/data" + - "{{ lodestar_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +lodestar_container_command_extra_args: + - --paramsFile=/network-config/config.yaml + - --genesisStateFile=/network-config/genesis.ssz + - --bootnodes={{ ethereum_cl_bootnodes | join(',') }} + - --rest.namespace="*" + - --network.connectToDiscv5Bootnodes + - --nat=true +lodestar_validator_container_volumes: + - "{{ lodestar_validator_datadir }}:/validator-data" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +lodestar_validator_container_command_extra_args: + - --paramsFile=/network-config/config.yaml + - --graffiti={{ ansible_hostname }} + - --useProduceBlockV3 +lodestar_validator_datadir: /data/lodestar-validator +lodestar_container_pull: true diff --git a/ansible/inventories/devnet-1/group_vars/mev_boost.yaml b/ansible/inventories/devnet-1/group_vars/mev_boost.yaml new file mode 100644 index 0000000..72cdf62 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/mev_boost.yaml @@ -0,0 +1,9 @@ +mev_boost_container_image: flashbots/mev-boost:1.6.4844.dev5 + +mev_boost_container_env: + GENESIS_FORK_VERSION: "0x10{{ ethereum_genesis_fork_version_suffix }}" + SKIP_RELAY_SIGNATURE_CHECK: "1" + BOOST_LISTEN_ADDR: 0.0.0.0:{{ mev_boost_server_port }} + RELAYS: http://0xa55c1285d84ba83a5ad26420cd5ad3091e49c55a813eee651cd467db38a8c8e63192f47955e9376f6b42f6d190571cb5@mev-api.{{ network_subdomain }}:9062 + +ethereum_node_mev_boost_enabled: true diff --git a/ansible/inventories/devnet-1/group_vars/mev_flood.yaml b/ansible/inventories/devnet-1/group_vars/mev_flood.yaml new file mode 100644 index 0000000..bce8229 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/mev_flood.yaml @@ -0,0 +1,9 @@ +mev_flood_container_command_extra_args: + - --rpcUrl=http://execution:8545 + - --privateKey=0x{{ secret_mev_flood_private_key }} + - --userKey=0x{{ secret_mev_flood_user_key }} + +mev_flood_spam_container_command_extra_args: + - --rpcUrl=http://execution:8545 + - --privateKey=0x{{ secret_mev_flood_private_key }} + - --userKey=0x{{ secret_mev_flood_user_key }} diff --git a/ansible/inventories/devnet-1/group_vars/nethermind.yaml b/ansible/inventories/devnet-1/group_vars/nethermind.yaml new file mode 100644 index 0000000..49da4c7 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/nethermind.yaml @@ -0,0 +1,100 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_el: + - MarekM25 + - kamilchodola + - LukaszRozmej + - marcindsobczak + - asdacap + - rubo + - smartprogrammer93 + - g11tech + - cbermudez97 + - flcl42 + +# role: ethpandaops.general.ethereum_node +ethereum_node_el: nethermind +# role: ethpandaops.general.nethermind +nethermind_container_name: execution +nethermind_container_image: "{{ default_ethereum_client_images.nethermind }}" +nethermind_container_env: + VIRTUAL_HOST: "{{ ethereum_node_rcp_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_el_ports_http_rpc | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_rcp_hostname }}" +nethermind_container_entrypoint: + - /nethermind/nethermind +nethermind_container_volumes: + - "{{ nethermind_datadir }}:/data" + - "{{ nethermind_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +nethermind_container_command_extra_args: + - --Init.ChainSpecPath=/network-config/chainspec.json + - --JsonRpc.EnabledModules=Eth,Subscribe,Trace,TxPool,Web3,Personal,Proof,Net,Parity,Health,Rpc,Debug,Admin + - --Discovery.Bootnodes={{ ethereum_el_bootnodes | join(',') }} + - --Init.IsMining=false + - --Pruning.Mode=None + - --config=none.cfg + - --EthStats.Enabled=true + - --EthStats.Name={{ inventory_hostname }} + - --EthStats.Secret={{ ethstats_secret }} + - --EthStats.Server=wss://{{ ethstats_url }}/api/ + - --log=DEBUG + - --Seq.MinLevel=Info + - --Seq.ServerUrl=https://seq.nethermind.io + - --Seq.ApiKey={{ nethermind_seq_api_key }} +nethermind_container_pull: true + +prometheus_config: | + global: + scrape_interval: 30s + evaluation_interval: 30s + scrape_timeout: 10s + external_labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + ip_address: "{{ ansible_host }}" + network: "{{ ethereum_network_name }}" + testnet: "{{ ethereum_network_name }}" + execution_client: "{{ ethereum_node_el }}" + consensus_client: "{{ ethereum_node_cl }}" + remote_write: + - queue_config: + batch_send_deadline: 5s + max_backoff: 500ms + max_samples_per_send: 500 + min_backoff: 50ms + max_shards: 100 + url: {{ prometheus_remote_push_url }} + remote_timeout: 10s + basic_auth: + username: {{ prometheus_remote_write_username }} + password: {{ prometheus_remote_write_password }} + scrape_configs: + - job_name: "prometheus" + metrics_path: "/metrics" + static_configs: + - targets: ["localhost:9090"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "node" + metrics_path: "/metrics" + static_configs: + - targets: ["172.17.0.1:9100"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "exporter" + metrics_path: "/metrics" + static_configs: + - targets: ["ethereum-metrics-exporter:9090"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "consensus_node" + metrics_path: "/metrics" + static_configs: + - targets: ["{{ vars[ethereum_node_cl + '_container_name'] }}:{{ ethereum_node_cl_ports_metrics }}"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "execution" + metrics_path: "/metrics" + static_configs: + - targets: ["execution:{{ ethereum_node_el_ports_metrics }}"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" diff --git a/ansible/inventories/devnet-1/group_vars/nimbus.yaml b/ansible/inventories/devnet-1/group_vars/nimbus.yaml new file mode 100644 index 0000000..7775ee3 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/nimbus.yaml @@ -0,0 +1,53 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_cl: + - zah + - tersec + - etan-status + - arnetheduck + +# role: validator_keys +validator_keys_sync_files: + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/nimbus-keys/" + dest: "{{ nimbus_validator_datadir }}/keys/" + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/secrets/" + dest: "{{ nimbus_validator_datadir }}/secrets/" + +validator_bls_sync_files: + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/change_operations.json" + dest: "{{ nimbus_validator_datadir }}/change_operations.json" + owner: nimbus + group: nimbus + +# role: ethpandaops.general.ethereum_node +ethereum_node_cl: nimbus + +# Checkpointsync +nimbus_checkpoint_autoremove_enabled: true + +# role: ethpandaops.general.nimbus +nimbus_container_name: beacon +nimbus_container_image: "{{ default_ethereum_client_images.nimbus }}" +nimbus_container_env: + VIRTUAL_HOST: "{{ ethereum_node_beacon_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_cl_ports_http_beacon | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_beacon_hostname }}" +nimbus_container_volumes: + - "{{ nimbus_datadir }}:/data" + - "{{ nimbus_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +nimbus_container_command_extra_args: >- + {{ nimbus_container_command_extra_simple_args + nimbus_container_command_extra_bootnode_args }} +nimbus_container_command_extra_simple_args: + - --network=/network-config + - --validator-monitor-auto=false + - --doppelganger-detection=off + - --log-level=INFO + - --light-client-data-serve=false + - --graffiti={{ ansible_hostname }} +nimbus_container_command_extra_bootnode_args: >- + {{ ethereum_cl_bootnodes | map('regex_replace', '^', '--bootstrap-node=') | list }} + +nimbus_validator_datadir: /data/nimbus-validator +nimbus_container_validator_volumes: + - "{{ nimbus_validator_datadir }}:/validator-data" +nimbus_container_pull: true diff --git a/ansible/inventories/devnet-1/group_vars/prysm.yaml b/ansible/inventories/devnet-1/group_vars/prysm.yaml new file mode 100644 index 0000000..73b9fe5 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/prysm.yaml @@ -0,0 +1,64 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_cl: + - kasey + - terencechain + - potuz + - nisdas + - nalepae +# role: validator_keys +validator_keys_sync_files: + - src: "{{ inventory_dir }}/files/validator_keys/prysm_wallet_pass.txt" + dest: "{{ prysm_validator_datadir }}/wallet_pass.txt" + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/prysm/direct/accounts/all-accounts.keystore.json" + dest: "{{ prysm_validator_datadir }}/wallet/direct/accounts/all-accounts.keystore.json" + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/prysm/keymanageropts.json" + dest: "{{ prysm_validator_datadir }}/wallet/direct/keymanageropts.json" + +validator_bls_sync_files: + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/change_operations.json" + dest: "{{ prysm_validator_datadir }}/change_operations.json" + owner: prysm + group: prysm + +# role: ethpandaops.general.ethereum_node +ethereum_node_cl: prysm + +# role: ethpandaops.general.prysm +prysm_container_name: beacon +prysm_validator_container_name: validator +prysm_container_image: "{{ default_ethereum_client_images.prysm }}" +prysm_container_env: + VIRTUAL_HOST: "{{ ethereum_node_beacon_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_cl_ports_http_beacon | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_beacon_hostname }}" +prysm_container_volumes: + - "{{ prysm_datadir }}:/data" + - "{{ prysm_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +prysm_container_entrypoint: + - /app/cmd/beacon-chain/beacon-chain +prysm_container_command_extra_args: >- + {{ prysm_container_command_extra_simple_args + prysm_container_command_extra_bootnode_args }} +prysm_container_command_extra_simple_args: + - --grpc-gateway-corsdomain=* + - --chain-config-file=/network-config/config.yaml + - --genesis-state=/network-config/genesis.ssz + - --contract-deployment-block={{ ethereum_network_deposit_contract_block }} + - --min-sync-peers=1 + - --pprof + - --enable-debug-rpc-endpoints + - --verbosity=debug + - --subscribe-all-subnets +prysm_container_command_extra_bootnode_args: >- + {{ ethereum_cl_bootnodes | map('regex_replace', '^', '--bootstrap-node=') | list }} + +prysm_validator_container_image: "{{ default_ethereum_client_images.prysm_validator }}" +prysm_validator_container_volumes: + - "{{ prysm_validator_datadir }}:/validator-data" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +prysm_validator_container_entrypoint: + - /app/cmd/validator/validator +prysm_validator_container_command_extra_args: + - --chain-config-file=/network-config/config.yaml + - --graffiti={{ ansible_hostname }} +prysm_validator_datadir: /data/prysm-validator diff --git a/ansible/inventories/devnet-1/group_vars/reth.yaml b/ansible/inventories/devnet-1/group_vars/reth.yaml new file mode 100644 index 0000000..71d0939 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/reth.yaml @@ -0,0 +1,75 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_el: + - gakonst + +# role: ethpandaops.general.ethereum_node +ethereum_node_el: reth +# role: ethpandaops.general.reth +reth_container_name: execution +reth_container_image: "{{ default_ethereum_client_images.reth }}" +reth_container_env: + VIRTUAL_HOST: "{{ ethereum_node_rcp_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_el_ports_http_rpc | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_rcp_hostname }}" +reth_container_volumes: + - "{{ reth_datadir }}:/data" + - "{{ reth_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +reth_container_command_extra_args: + - --chain=/network-config/genesis.json + - --bootnodes={{ ethereum_el_bootnodes | join(',') }} +prometheus_config: | + global: + scrape_interval: 30s + evaluation_interval: 30s + scrape_timeout: 10s + external_labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + ip_address: "{{ ansible_host }}" + network: "{{ ethereum_network_name }}" + testnet: "{{ ethereum_network_name }}" + execution_client: "{{ ethereum_node_el }}" + consensus_client: "{{ ethereum_node_cl }}" + remote_write: + - queue_config: + batch_send_deadline: 5s + max_backoff: 500ms + max_samples_per_send: 500 + min_backoff: 50ms + max_shards: 100 + url: {{ prometheus_remote_push_url }} + remote_timeout: 10s + basic_auth: + username: {{ prometheus_remote_write_username }} + password: {{ prometheus_remote_write_password }} + scrape_configs: + - job_name: "prometheus" + metrics_path: "/metrics" + static_configs: + - targets: ["localhost:9090"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "node" + metrics_path: "/metrics" + static_configs: + - targets: ["172.17.0.1:9100"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "exporter" + metrics_path: "/metrics" + static_configs: + - targets: ["ethereum-metrics-exporter:9090"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "consensus_node" + metrics_path: "/metrics" + static_configs: + - targets: ["{{ vars[ethereum_node_cl + '_container_name'] }}:{{ ethereum_node_cl_ports_metrics }}"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "execution" + metrics_path: "/metrics" + static_configs: + - targets: ["execution:{{ ethereum_node_el_ports_metrics }}"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" diff --git a/ansible/inventories/devnet-1/group_vars/teku.yaml b/ansible/inventories/devnet-1/group_vars/teku.yaml new file mode 100644 index 0000000..0110e1b --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/teku.yaml @@ -0,0 +1,52 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_cl: + - tbenr + - rolfyone + - siladu + - lucassaldanha + - StefanBratanov + - zilm13 + - mehdi-aouadi +# role: validator_keys +validator_keys_sync_files: + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/teku-keys/" + dest: "{{ teku_validator_datadir }}/keys/" + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/teku-secrets/" + dest: "{{ teku_validator_datadir }}/secrets/" + +validator_bls_sync_files: + - src: "{{ inventory_dir }}/files/validator_keys/{{ inventory_hostname }}/change_operations.json" + dest: "{{ teku_validator_datadir }}/change_operations.json" + owner: teku + group: teku +# role: ethpandaops.general.ethereum_node +ethereum_node_cl: teku + +# role: ethpandaops.general.teku +teku_container_name: beacon +teku_container_image: "{{ default_ethereum_client_images.teku }}" +teku_container_env: + VIRTUAL_HOST: "{{ ethereum_node_beacon_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_cl_ports_http_beacon | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_beacon_hostname }}" +teku_container_volumes: + - "{{ teku_datadir }}:/data" + - "{{ teku_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +teku_container_command_extra_args: + - --network=/network-config/config.yaml + - --genesis-state=/network-config/genesis.ssz + - --p2p-discovery-bootnodes={{ ethereum_cl_bootnodes | join(',') }} + - --p2p-peer-upper-bound=100 + - --data-storage-non-canonical-blocks-enabled=true + - --data-storage-mode=PRUNE + - --validators-graffiti={{ ansible_hostname }} + - --logging=info + - --Xlog-include-p2p-warnings-enabled + - --metrics-block-timing-tracking-enabled + - --ignore-weak-subjectivity-period-enabled + - --p2p-subscribe-all-custody-subnets-enabled +teku_validator_container_volumes: + - "{{ teku_validator_datadir }}:/validator-data" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +teku_validator_datadir: /data/teku-validator diff --git a/ansible/inventories/devnet-1/group_vars/tx_fuzz_blobs.yaml b/ansible/inventories/devnet-1/group_vars/tx_fuzz_blobs.yaml new file mode 100644 index 0000000..215949d --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/tx_fuzz_blobs.yaml @@ -0,0 +1,12 @@ +tx_fuzz_blobs_container_image: "{{ default_tooling_images.tx_fuzz }}" +tx_fuzz_blobs_container_name: tx_fuzz_blobs + + +tx_fuzz_blobs_container_command: + - blobs + - --no-al + - --rpc=https://{{ secret_nginx_shared_basic_auth.name }}:{{ secret_nginx_shared_basic_auth.password }}@rpc.bootnode-1.{{ network_subdomain }} + - --sk={{ tx_fuzz_blobs_privkey }} + - --txcount=10 + +tx_fuzz_container_networks: "{{ docker_networks_shared }}" diff --git a/ansible/inventories/devnet-1/group_vars/tx_fuzz_txs.yaml b/ansible/inventories/devnet-1/group_vars/tx_fuzz_txs.yaml new file mode 100644 index 0000000..91a405c --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/tx_fuzz_txs.yaml @@ -0,0 +1,11 @@ +tx_fuzz_txs_container_image: "{{ default_tooling_images.tx_fuzz }}" +tx_fuzz_txs_container_name: tx_fuzz_txs + +tx_fuzz_txs_container_command: + - spam + - --no-al + - --rpc=https://{{ secret_nginx_shared_basic_auth.name }}:{{ secret_nginx_shared_basic_auth.password }}@rpc.bootnode-1.{{ network_subdomain }} + - --sk={{ tx_fuzz_txs_privkey }} + + +tx_fuzz_container_networks: "{{ docker_networks_shared }}" diff --git a/ansible/inventories/devnet-1/group_vars/xatu.yaml b/ansible/inventories/devnet-1/group_vars/xatu.yaml new file mode 100644 index 0000000..903d0e1 --- /dev/null +++ b/ansible/inventories/devnet-1/group_vars/xatu.yaml @@ -0,0 +1,85 @@ +# role: ethpandaops.general.xatu_sentry +xatu_sentry_config_name: "{{ ethereum_network_name }}-{{ inventory_hostname }}" +xatu_sentry_config_server_address: "{{ secret_xatu_sentry.server_address }}" +xatu_sentry_config_server_auth_user: "{{ secret_xatu_sentry.user }}" +xatu_sentry_config_server_auth_password: "{{ secret_xatu_sentry.password }}" +xatu_sentry_config_network_name_override: "{{ ethereum_network_name }}" +xatu_sentry_container_networks: "{{ docker_networks_shared }}" +xatu_sentry_container_image: "{{ default_tooling_images.xatu_sentry }}" + +ethereum_node_xatu_sentry_enabled: true + +xatu_sentry_container_command: + - sentry + - --config=/config.yaml + +xatu_sentry_config: + logging: "info" + metricsAddr: ":9090" + name: "{{ xatu_sentry_config_name }}" + ntpServer: time.google.com + ethereum: + beaconNodeAddress: "{{ vars[ethereum_node_cl + '_container_name'] }}:{{ethereum_node_cl_ports_http_beacon}}" + overrideNetworkName: "{{ xatu_sentry_config_network_name_override }}" + beaconSubscriptions: + - attestation + - block + - chain_reorg + - finalized_checkpoint + - head + - voluntary_exit + - contribution_and_proof + - blob_sidecar + attestationData: + enabled: false + beaconCommittees: + enabled: false + forkChoice: + enabled: false + outputs: + - config: + address: "{{ xatu_sentry_config_server_address }}" + headers: + authorization: "Basic {{ (xatu_sentry_config_server_auth_user + ':' + xatu_sentry_config_server_auth_password) | b64encode }}" + maxExportBatchSize: 32 + maxQueueSize: 1000000 + workers: 5 + tls: true + filter: + eventNames: + - BEACON_API_ETH_V1_EVENTS_UNKNOWN + - BEACON_API_ETH_V1_BEACON_COMMITTEE + - BEACON_API_ETH_V1_EVENTS_BLOB_SIDECAR + - BEACON_API_ETH_V1_EVENTS_BLOCK + - BEACON_API_ETH_V1_EVENTS_BLOCK_V2 + - BEACON_API_ETH_V1_EVENTS_CHAIN_REORG + - BEACON_API_ETH_V1_EVENTS_CHAIN_REORG_V2 + - BEACON_API_ETH_V1_EVENTS_FINALIZED_CHECKPOINT + - BEACON_API_ETH_V1_EVENTS_FINALIZED_CHECKPOINT_V2 + - BEACON_API_ETH_V1_EVENTS_HEAD + - BEACON_API_ETH_V1_EVENTS_HEAD_V2 + - BEACON_API_ETH_V1_EVENTS_VOLUNTARY_EXIT + - BEACON_API_ETH_V1_EVENTS_VOLUNTARY_EXIT_V2 + - BEACON_API_ETH_V1_EVENTS_CONTRIBUTION_AND_PROOF + - BEACON_API_ETH_V1_EVENTS_CONTRIBUTION_AND_PROOF_V2 + - BEACON_API_ETH_V1_VALIDATOR_ATTESTATION_DATA + - MEMPOOL_TRANSACTION + - MEMPOOL_TRANSACTION_V2 + - BEACON_API_ETH_V2_BEACON_BLOCK + - BEACON_API_ETH_V2_BEACON_BLOCK_V2 + name: grpc-general + type: xatu + - config: + address: "{{ xatu_sentry_config_server_address }}" + headers: + authorization: "Basic {{ (xatu_sentry_config_server_auth_user + ':' + xatu_sentry_config_server_auth_password) | b64encode }}" + maxExportBatchSize: 128 + maxQueueSize: 1000000 + workers: 10 + tls: true + filter: + eventNames: + - BEACON_API_ETH_V1_EVENTS_ATTESTATION + - BEACON_API_ETH_V1_EVENTS_ATTESTATION_V2 + name: grpc-attestation + type: xatu diff --git a/ansible/inventories/devnet-1/host_vars/lighthouse-geth-3.yaml b/ansible/inventories/devnet-1/host_vars/lighthouse-geth-3.yaml new file mode 100644 index 0000000..d369642 --- /dev/null +++ b/ansible/inventories/devnet-1/host_vars/lighthouse-geth-3.yaml @@ -0,0 +1,4 @@ +lighthouse_container_command_extra_args: + - --testnet-dir=/network-config + - --boot-nodes={{ ethereum_cl_bootnodes | join(',') }} + - --allow-insecure-genesis-sync diff --git a/ansible/inventories/devnet-1/host_vars/localhost b/ansible/inventories/devnet-1/host_vars/localhost new file mode 100644 index 0000000..e187c8f --- /dev/null +++ b/ansible/inventories/devnet-1/host_vars/localhost @@ -0,0 +1,2 @@ +ansible_connection: local +ansible_python_interpreter: "{{ ansible_playbook_python }}" diff --git a/ansible/inventories/devnet-1/host_vars/mev-relay-1.yaml b/ansible/inventories/devnet-1/host_vars/mev-relay-1.yaml new file mode 100644 index 0000000..802ad23 --- /dev/null +++ b/ansible/inventories/devnet-1/host_vars/mev-relay-1.yaml @@ -0,0 +1,179 @@ +--- +bootstrap_default_user_authorized_keys_github_team_el: + - avalonche + - Wazzymandias + +mev_relay_cleanup_all: false + +mev_relay_user: mev_relay +mev_relay_datadir: "/data/mev_relay" +mev_relay_docker_network_name: shared +mev_relay_docker_networks: + - name: "{{ mev_relay_docker_network_name }}" + +beacon_endpoint: http://beacon:5052 +mev_img: flashbots/mev-boost-relay:0.29.1a2 + +gen_validators_root: "0x31c7fb3b0dc46ad79c8117cbeafe6060a973f662823b08618d915b644472449d" + +# ------------------------------------------------------------------ +# mev-relay-housekeeper +mev_relay_housekeeper_enabled: true +mev_relay_housekeeper_datadir: "{{ mev_relay_datadir }}/mev-relay-housekeeper" +mev_relay_housekeeper_container_name: mev-relay-housekeeper +mev_relay_housekeeper_container_image: "{{ mev_img }}" +mev_relay_housekeeper_container_env: + GENESIS_FORK_VERSION=0x10{{ ethereum_genesis_fork_version_suffix }} + GENESIS_VALIDATORS_ROOT={{ gen_validators_root }} + BELLATRIX_FORK_VERSION=0x30{{ ethereum_genesis_fork_version_suffix }} + CAPELLA_FORK_VERSION=0x40{{ ethereum_genesis_fork_version_suffix }} + DENEB_FORK_VERSION=0x50{{ ethereum_genesis_fork_version_suffix }} + DB_TABLE_PREFIX=custom + LOG_LEVEL=debug + +mev_relay_housekeeper_container_pull: true +mev_relay_housekeeper_container_command_extra_args: + - --network=custom + - --beacon-uris={{ beacon_endpoint }} + - --redis-uri=mev-relay-redis:6379 + - --db=postgres://postgres:postgres@mev-relay-database:5432/boostrelay?sslmode=disable + +# ------------------------------------------------------------------ +# mev-relay-api +mev_relay_api_enabled: true +mev_relay_api_datadir: "{{ mev_relay_datadir }}/mev-relay-api" +mev_relay_api_container_name: mev-relay-api +mev_relay_api_container_image: "{{ mev_img }}" +mev_relay_api_container_env: + GENESIS_FORK_VERSION=0x10{{ ethereum_genesis_fork_version_suffix }} + GENESIS_VALIDATORS_ROOT={{ gen_validators_root }} + BELLATRIX_FORK_VERSION=0x30{{ ethereum_genesis_fork_version_suffix }} + CAPELLA_FORK_VERSION=0x40{{ ethereum_genesis_fork_version_suffix }} + DENEB_FORK_VERSION=0x50{{ ethereum_genesis_fork_version_suffix }} + DB_TABLE_PREFIX=custom + LOG_LEVEL=debug + DISABLE_PAYLOAD_DATABASE_STORAGE=1 +mev_relay_api_container_pull: true +mev_relay_api_container_networks: "{{ mev_relay_docker_networks }}" +mev_relay_api_container_ports: + - "{{ mev_relay_api_listening_port }}:{{ mev_relay_api_listening_port }}" +mev_relay_api_container_command_extra_args: + - --network=custom + - --beacon-uris={{ beacon_endpoint }} + - --pprof + - --debug + - --redis-uri=mev-relay-redis:6379 + - --db=postgres://postgres:postgres@mev-relay-database:5432/boostrelay?sslmode=disable + - --secret-key=0x607a11b45a7219cc61a3d9c5fd08c7eebd602a6a19a977f8d3771d5711a550f2 + - --listen-addr=0.0.0.0:9062 + - --blocksim=http://execution:8545 +# ------------------------------------------------------------------ +# mev-relay-website +mev_relay_website_enabled: true +mev_relay_website_datadir: "{{ mev_relay_datadir }}/mev-relay-website" +mev_relay_website_container_name: mev-relay-website +mev_relay_website_container_image: "{{ mev_img }}" +mev_relay_website_container_env: + GENESIS_FORK_VERSION=0x10{{ ethereum_genesis_fork_version_suffix }} + GENESIS_VALIDATORS_ROOT={{ gen_validators_root }} + BELLATRIX_FORK_VERSION=0x30{{ ethereum_genesis_fork_version_suffix }} + CAPELLA_FORK_VERSION=0x40{{ ethereum_genesis_fork_version_suffix }} + DENEB_FORK_VERSION=0x50{{ ethereum_genesis_fork_version_suffix }} + DB_TABLE_PREFIX=custom + LOG_LEVEL=debug + LINK_DATA_API=http://mev-api.{{ network_subdomain }}:9062 + RELAY_URL=http://0xa55c1285d84ba83a5ad26420cd5ad3091e49c55a813eee651cd467db38a8c8e63192f47955e9376f6b42f6d190571cb5@mev-api.{{ network_subdomain }}:9062 +mev_relay_website_container_ports: + - "9060:9060" +mev_relay_website_container_pull: true +mev_relay_website_container_networks: "{{ mev_relay_docker_networks }}" +mev_relay_website_container_command_extra_args: + - --network=custom + - --redis-uri=mev-relay-redis:6379 + - --db=postgres://postgres:postgres@mev-relay-database:5432/boostrelay?sslmode=disable + - --show-config-details + - --listen-addr=0.0.0.0:9060 + - https://0xa55c1285d84ba83a5ad26420cd5ad3091e49c55a813eee651cd467db38a8c8e63192f47955e9376f6b42f6d190571cb5@mev-relay-api.{{ network_subdomain }}:9062 + + + +# role: ethpandaops.general.ethereum_node +ethereum_node_cl: lighthouse + +lighthouse_checkpoint_sync_enabled: false + +# role: ethpandaops.general.lighthouse +lighthouse_container_name: beacon +lighthouse_container_image: "{{ default_ethereum_client_images.lighthouse }}" +lighthouse_container_env: + VIRTUAL_HOST: "{{ ethereum_node_beacon_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_cl_ports_http_beacon | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_beacon_hostname }}" +lighthouse_container_volumes: + - "{{ lighthouse_datadir }}:/data" + - "{{ lighthouse_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +lighthouse_container_command_extra_args: + - --testnet-dir=/network-config + - --boot-nodes={{ ethereum_cl_bootnodes | join(',') }} + - --self-limiter=blob_sidecars_by_range:256/10 + - --debug-level=debug + - --always-prepare-payload + - --prepare-payload-lookahead=12000 + - --disable-peer-scoring + - --checkpoint-sync-url={{ checkpoint_sync_url }} + +lighthouse_validator_container_volumes: validator +lighthouse_validator_container_volumes: + - "{{ lighthouse_validator_datadir }}:/validator-data" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +lighthouse_validator_container_command_extra_args: + - --testnet-dir=/network-config + - --graffiti={{ ethereum_node_cl }}/{{ ethereum_node_el }} +lighthouse_validator_datadir: /data/lighthouse-validator +lighthouse_container_pull: true + + +ethereum_el_bootnodes: + - "{{ hostvars['bootnode-1']['ethereum_node_fact_el_enode'] }}" + +ethereum_cl_bootnodes: + - "{{ hostvars['bootnode-1']['cl_bootnode_fact_enr'] }}" + + +# role: ethpandaops.general.ethereum_node +ethereum_node_el: geth + +# role: ethpandaops.general.geth +geth_container_name: execution +geth_container_env: + VIRTUAL_HOST: "{{ ethereum_node_rcp_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_el_ports_http_rpc | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_rcp_hostname }}" + BUILDER_TX_SIGNING_KEY: 0x{{ secret_mev_signingkey }} +geth_container_command_extra_args: + - --http.api=admin,engine,net,eth,web3,debug,flashbots,mev + - --http.vhosts=* + - --ws + - --ws.api=admin,engine,net,eth,web3,debug,flashbots,mev + - --ws.addr=0.0.0.0 + - --ws.port=8545 + - --ws.origins=* + - --networkid={{ ethereum_network_id }} + - --bootnodes={{ ethereum_el_bootnodes | join(',') }} + - --ethstats={{ inventory_hostname }}:{{ ethstats_secret }}@{{ ethstats_url }} + - --builder + - --builder.remote_relay_endpoint=http://mev-api.{{ network_subdomain }}:9062 + - --builder.beacon_endpoints=http://beacon:5052 + - --builder.bellatrix_fork_version=0x30{{ ethereum_genesis_fork_version_suffix }} + - --builder.genesis_fork_version=0x10{{ ethereum_genesis_fork_version_suffix }} + - --builder.genesis_validators_root={{ gen_validators_root }}s + - --builder.algotype=greedy +geth_init_custom_network: true +geth_init_custom_network_genesis_file: "{{ eth_testnet_config_dir }}/genesis.json" +geth_container_pull: true + +geth_container_image: flashbots/builder:1.13.12.4844.dev1 + +ethereum_node_json_rpc_snooper_engine_enabled: false + diff --git a/ansible/inventories/devnet-1/host_vars/prysm-geth-1.yaml b/ansible/inventories/devnet-1/host_vars/prysm-geth-1.yaml new file mode 100644 index 0000000..77d4173 --- /dev/null +++ b/ansible/inventories/devnet-1/host_vars/prysm-geth-1.yaml @@ -0,0 +1,11 @@ +prysm_container_command_extra_simple_args: + - --grpc-gateway-corsdomain=* + - --chain-config-file=/network-config/config.yaml + - --genesis-state=/network-config/genesis.ssz + - --contract-deployment-block={{ ethereum_network_deposit_contract_block }} + - --min-sync-peers=1 + - --pprof + - --enable-debug-rpc-endpoints + - --verbosity=debug + - --subscribe-all-subnets + - --data-columns-withhold-count=16 \ No newline at end of file diff --git a/ansible/inventories/devnet-1/host_vars/prysm-geth-2.yaml b/ansible/inventories/devnet-1/host_vars/prysm-geth-2.yaml new file mode 100644 index 0000000..fb6b524 --- /dev/null +++ b/ansible/inventories/devnet-1/host_vars/prysm-geth-2.yaml @@ -0,0 +1,11 @@ +prysm_container_command_extra_simple_args: + - --grpc-gateway-corsdomain=* + - --chain-config-file=/network-config/config.yaml + - --genesis-state=/network-config/genesis.ssz + - --contract-deployment-block={{ ethereum_network_deposit_contract_block }} + - --min-sync-peers=1 + - --pprof + - --enable-debug-rpc-endpoints + - --verbosity=debug + - --subscribe-all-subnets + - --data-columns-withhold-count=32 \ No newline at end of file diff --git a/ansible/inventories/devnet-1/host_vars/prysm-geth-3.yaml b/ansible/inventories/devnet-1/host_vars/prysm-geth-3.yaml new file mode 100644 index 0000000..5db1838 --- /dev/null +++ b/ansible/inventories/devnet-1/host_vars/prysm-geth-3.yaml @@ -0,0 +1,10 @@ +prysm_container_command_extra_simple_args: + - --grpc-gateway-corsdomain=* + - --chain-config-file=/network-config/config.yaml + - --genesis-state=/network-config/genesis.ssz + - --contract-deployment-block={{ ethereum_network_deposit_contract_block }} + - --min-sync-peers=1 + - --pprof + - --enable-debug-rpc-endpoints + - --verbosity=debug + - --data-columns-withhold-count=48 \ No newline at end of file diff --git a/ansible/inventories/devnet-1/host_vars/teku-geth-3.yaml b/ansible/inventories/devnet-1/host_vars/teku-geth-3.yaml new file mode 100644 index 0000000..d3fef23 --- /dev/null +++ b/ansible/inventories/devnet-1/host_vars/teku-geth-3.yaml @@ -0,0 +1,12 @@ +teku_container_command_extra_args: + - --network=/network-config/config.yaml + - --genesis-state=/network-config/genesis.ssz + - --p2p-discovery-bootnodes={{ ethereum_cl_bootnodes | join(',') }} + - --p2p-peer-upper-bound=100 + - --data-storage-non-canonical-blocks-enabled=true + - --data-storage-mode=PRUNE + - --validators-graffiti={{ ansible_hostname }} + - --logging=info + - --Xlog-include-p2p-warnings-enabled + - --metrics-block-timing-tracking-enabled + - --ignore-weak-subjectivity-period-enabled \ No newline at end of file diff --git a/ansible/inventories/devnet-1/inventory.ini b/ansible/inventories/devnet-1/inventory.ini new file mode 100755 index 0000000..b4ec450 --- /dev/null +++ b/ansible/inventories/devnet-1/inventory.ini @@ -0,0 +1,61 @@ +localhost + +[all:vars] +ethereum_network_name=peerdas-devnet-1 + +[bootnode] +bootnode-1 ansible_host=167.99.5.231 ipv6=2604:a880:400:d0::20e4:9001 cloud=digitalocean cloud_region=nyc1 + +[lighthouse_geth] +lighthouse-geth-1 ansible_host=104.248.49.178 ipv6=2604:a880:400:d0::22b4:6001 cloud=digitalocean cloud_region=nyc1 validator_start=0 validator_end=100 +lighthouse-geth-2 ansible_host=152.42.251.195 ipv6=2400:6180:0:d0::fda:9001 cloud=digitalocean cloud_region=sgp1 validator_start=100 validator_end=200 +lighthouse-geth-3 ansible_host=159.65.50.55 ipv6=2a03:b0c0:1:d0::fbc:2001 cloud=digitalocean cloud_region=lon1 validator_start=200 validator_end=300 + +[prysm_geth] +prysm-geth-1 ansible_host=67.205.153.29 ipv6=2604:a880:400:d0::225a:d001 cloud=digitalocean cloud_region=nyc1 validator_start=300 validator_end=400 +prysm-geth-2 ansible_host=165.22.50.16 ipv6=2400:6180:0:d0::1388:3001 cloud=digitalocean cloud_region=sgp1 validator_start=400 validator_end=500 +prysm-geth-3 ansible_host=165.232.41.147 ipv6=2a03:b0c0:1:d0::110e:e001 cloud=digitalocean cloud_region=lon1 validator_start=500 validator_end=600 + +[teku_geth] +teku-geth-1 ansible_host=162.243.164.29 ipv6=2604:a880:400:d0::22b3:1001 cloud=digitalocean cloud_region=nyc1 validator_start=600 validator_end=700 +teku-geth-2 ansible_host=206.189.158.234 ipv6=2400:6180:0:d0::1523:c001 cloud=digitalocean cloud_region=sgp1 validator_start=700 validator_end=800 +teku-geth-3 ansible_host=159.65.54.12 ipv6=2a03:b0c0:1:d0::110e:d001 cloud=digitalocean cloud_region=lon1 validator_start=800 validator_end=900 + + +# Consensus client groups + +[lighthouse:children] +lighthouse_geth +[lodestar:children] +[nimbus:children] +[teku:children] +teku_geth +[prysm:children] +prysm_geth +[grandine:children] + +# Execution client groups + +[besu:children] +[ethereumjs:children] +[geth:children] +lighthouse_geth +prysm_geth +teku_geth +[nethermind:children] +[erigon:children] +[reth:children] + +# Global groups + +[consensus_node:children] +lighthouse +prysm +teku + +[execution_node:children] +geth + +[ethereum_node:children] +consensus_node +execution_node diff --git a/ansible/requirements.yaml b/ansible/requirements.yaml index 8c6b33c..b9e7dce 100644 --- a/ansible/requirements.yaml +++ b/ansible/requirements.yaml @@ -1,6 +1,6 @@ roles: - name: gantsign.oh-my-zsh - version: "2.4.0" + version: "2.7.0" - name: geerlingguy.docker version: "6.0.3" - name: geerlingguy.firewall diff --git a/kubernetes/devnet-1/config/.helmignore b/kubernetes/devnet-1/config/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/kubernetes/devnet-1/config/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/kubernetes/devnet-1/config/Chart.yaml b/kubernetes/devnet-1/config/Chart.yaml new file mode 100644 index 0000000..5ef4f06 --- /dev/null +++ b/kubernetes/devnet-1/config/Chart.yaml @@ -0,0 +1,7 @@ +# Ansible managed. Don't change this file manually. Template info: /vendor/collections/ansible_collections/ethpandaops/general/roles/generate_kubernetes_config/templates/Chart.yaml.j2 + +apiVersion: v2 +name: config +description: A Helm chart for Kubernetes +type: application +version: 0.1.0 diff --git a/network-configs/devnet-1/metadata/besu.json b/network-configs/devnet-1/metadata/besu.json new file mode 100644 index 0000000..ed07bdf --- /dev/null +++ b/network-configs/devnet-1/metadata/besu.json @@ -0,0 +1,927 @@ +{ + "config": { + "chainId": 7068553372, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "preMergeForkBlock": 0, + "terminalTotalDifficulty": 0, + "shanghaiTime": 0, + "cancunTime": 0, + "depositContractAddress": "0x6f22fFbC56eFF051aECF839396DD1eD9aD6BBA9D", + "pragueTime": 19201719321098, + "ethash": {} + }, + "alloc": { + "0x0000000000000000000000000000000000000000": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000001": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000005": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000006": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000007": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000008": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000009": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000010": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000011": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000012": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000013": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000014": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000015": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000016": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000017": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000018": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000019": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000020": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000021": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000022": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000023": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000024": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000025": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000026": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000027": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000028": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000029": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000030": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000031": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000032": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000033": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000034": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000035": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000036": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000037": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000038": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000039": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000040": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000041": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000042": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000043": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000044": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000045": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000046": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000047": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000048": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000049": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000050": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000051": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000052": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000053": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000054": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000055": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000056": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000057": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000058": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000059": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000060": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000061": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000062": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000063": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000064": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000065": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000066": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000067": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000068": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000069": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000070": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000071": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000072": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000073": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000074": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000075": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000076": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000077": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000078": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000079": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000080": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000081": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000082": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000083": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000084": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000085": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000086": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000087": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000088": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000089": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000090": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000091": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000092": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000093": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000094": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000095": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000096": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000097": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000098": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000099": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009f": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000aa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ab": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ac": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ad": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ae": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000af": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ba": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000be": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ca": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ce": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000da": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000db": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000de": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000df": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ea": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000eb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ec": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ed": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ee": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ef": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fe": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ff": { + "balance": "1" + }, + "0x6f22fFbC56eFF051aECF839396DD1eD9aD6BBA9D": { + "balance": "0", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500" + }, + "0x0aae40965e6800cd9b1f4b05ff21581047e3f91e": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460575767ffffffffffffffff5f3511605357600143035f3511604b575f35612000014311604b57611fff5f3516545f5260205ff35b5f5f5260205ff35b5f5ffd5b5f35611fff60014303165500" + }, + "0x00A3ca265EBcb825B45F985A16CEFB49958cE017": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b366038141561012e5760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061012e57600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460dd5780604c02838201600302600401805490600101805490600101549160601b83528260140152906034015260010160a6565b910180921460ed579060025560f8565b90505f6002555f6003555b5f548061049d141561010757505f5b60015460028282011161011c5750505f610122565b01600290035b5f555f600155604c025ff35b5f5ffd", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000000000000000000000000000000000000000049d" + } + }, + "0x00b42dbF2194e931E80326D950320f7d9Dbeac02": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146098573615156028575f545f5260205ff35b36606014156101445760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061014457600154600101600155600354806004026004013381556001015f35815560010160203581556001016040359055600101600355005b6003546002548082038060011160ac575060015b5f5b81811460f15780607402838201600402600401805490600101805490600101805490600101549260601b84529083601401528260340152906054015260010160ae565b9101809214610103579060025561010e565b90505f6002555f6003555b5f548061049d141561011d57505f5b6001546001828201116101325750505f610138565b01600190035b5f555f6001556074025ff35b5f5ffd", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000000000000000000000000000000000000000049d" + } + }, + "0x454b0EA7d8aD3C56D0CF2e44Ed97b2Feab4D7AF2": { + "balance": "1000000000000000000000000000" + }, + "0xd3248BA3E5492D767F8e427Cb9C7B9D5C3972D7B": { + "balance": "1000000000000000000000000000" + }, + "0xAD01b55d7c3448B8899862eb335FBb17075d8DE2": { + "balance": "1000000000000000000000000000" + }, + "0x7e454a14B8e7528465eeF86f0DC1da4f235d9D79": { + "balance": "1000000000000000000000000000" + }, + "0x7a40026A3b9A41754a95EeC8c92C6B99886f440C": { + "balance": "1000000000000000000000000000" + }, + "0x8c4D8CDD1f474510Dd70D66F2785a3a38a29AC1A": { + "balance": "1000000000000000000000000000" + }, + "0xfC7360b3b28cf4204268A8354dbEc60720d155D2": { + "balance": "1000000000000000000000000000" + }, + "0x2F7626bBDb8c0f9071bC98046Ef6fDed2167F97F": { + "balance": "1000000000000000000000000000" + }, + "0x752CE31Dec0dde7D1563CdF6438d892De2D4FBee": { + "balance": "1000000000000000000000000000" + }, + "0x455f42d91096c4Aa708D7Cbcb2DC499dE89C402c": { + "balance": "1000000000000000000000000000" + }, + "0x85154341488732D57a97F54AB9706Bc4B71B8636": { + "balance": "1000000000000000000000000000" + }, + "0x6a9CcA73d4Ff3a249fa778C7651f4Df8B9fFa0Df": { + "balance": "1000000000000000000000000000" + }, + "0xee2d0567AAe8080CA269b7908F4aF8BBb59A6804": { + "balance": "1000000000000000000000000000" + }, + "0xDd8D4027078a471816e4Ef7F69aFc0A5d2947dDc": { + "balance": "1000000000000000000000000000" + }, + "0x20466E9A67f299F6056bE52A50ea324FA6Bd05D5": { + "balance": "1000000000000000000000000000" + }, + "0x03F24BB0C9cfb30217Ff992A36ae9230F2A1697f": { + "balance": "1000000000000000000000000000" + }, + "0x032d8372C519c3927b87BDe4479E846a81EF2d10": { + "balance": "1000000000000000000000000000" + }, + "0xF863DF14954df73804b3150F3754a8F98CBB1D0d": { + "balance": "1000000000000000000000000000" + }, + "0xbe918A6aef1920F3706E23d153146aA6C5982620": { + "balance": "1000000000000000000000000000" + }, + "0xA0c7edA3CE474BC670A11EA9537cBEfd36331123": { + "balance": "1000000000000000000000000000" + }, + "0xF03b43BeB861044492Eb43E247bEE2AC6C80c651": { + "balance": "1000000000000000000000000000" + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "baseFeePerGas": "0x3B9ACA00", + "difficulty": "0x01", + "extraData": "", + "gasLimit": "0x17d7840", + "nonce": "0x1234", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "1719321038" +} diff --git a/network-configs/devnet-1/metadata/bootstrap_nodes.txt b/network-configs/devnet-1/metadata/bootstrap_nodes.txt new file mode 100644 index 0000000..69bd6d7 --- /dev/null +++ b/network-configs/devnet-1/metadata/bootstrap_nodes.txt @@ -0,0 +1 @@ +enr:-Iq4QJk4WqRkjsX5c2CXtOra6HnxN-BMXnWhmhEQO9Bn9iABTJGdjUOurM7Btj1ouKaFkvTRoju5vz2GPmVON2dffQKGAX53x8JigmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk diff --git a/network-configs/devnet-1/metadata/chainspec.json b/network-configs/devnet-1/metadata/chainspec.json new file mode 100644 index 0000000..ab33088 --- /dev/null +++ b/network-configs/devnet-1/metadata/chainspec.json @@ -0,0 +1,973 @@ +{ + "name": "Testnet", + "engine": { + "Ethash": {} + }, + "params": { + "gasLimitBoundDivisor": "0x400", + "registrar": "0x0000000000000000000000000000000000000000", + "accountStartNonce": "0x0", + "maximumExtraDataSize": "0xffff", + "minGasLimit": "0x1388", + "networkID": "0x1a551909c", + "MergeForkIdTransition": "0x0", + "maxCodeSize": "0x6000", + "maxCodeSizeTransition": "0x0", + "eip150Transition": "0x0", + "eip158Transition": "0x0", + "eip160Transition": "0x0", + "eip161abcTransition": "0x0", + "eip161dTransition": "0x0", + "eip155Transition": "0x0", + "eip140Transition": "0x0", + "eip211Transition": "0x0", + "eip214Transition": "0x0", + "eip658Transition": "0x0", + "eip145Transition": "0x0", + "eip1014Transition": "0x0", + "eip1052Transition": "0x0", + "eip1283Transition": "0x0", + "eip1283DisableTransition": "0x0", + "eip152Transition": "0x0", + "eip1108Transition": "0x0", + "eip1344Transition": "0x0", + "eip1884Transition": "0x0", + "eip2028Transition": "0x0", + "eip2200Transition": "0x0", + "eip2565Transition": "0x0", + "eip2929Transition": "0x0", + "eip2930Transition": "0x0", + "eip1559Transition": "0x0", + "eip3198Transition": "0x0", + "eip3529Transition": "0x0", + "eip3541Transition": "0x0", + "eip4895TransitionTimestamp": "0x0", + "eip3855TransitionTimestamp": "0x0", + "eip3651TransitionTimestamp": "0x0", + "eip3860TransitionTimestamp": "0x0", + "terminalTotalDifficulty": "0x0", + "eip4844TransitionTimestamp": "0x0", + "eip4788TransitionTimestamp": "0x0", + "eip1153TransitionTimestamp": "0x0", + "eip5656TransitionTimestamp": "0x0", + "eip6780TransitionTimestamp": "0x0", + "depositContractAddress": "0x6f22fFbC56eFF051aECF839396DD1eD9aD6BBA9D", + "eip2537TransitionTimestamp": "0x1176bfa8c20a", + "eip2935TransitionTimestamp": "0x1176bfa8c20a", + "eip6110TransitionTimestamp": "0x1176bfa8c20a", + "eip7002TransitionTimestamp": "0x1176bfa8c20a", + "eip7251TransitionTimestamp": "0x1176bfa8c20a", + "eip7702TransitionTimestamp": "0x1176bfa8c20a" + }, + "genesis": { + "seal": { + "ethereum": { + "nonce": "0x1234", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "difficulty": "0x01", + "author": "0x0000000000000000000000000000000000000000", + "timestamp": "0x667ac1ce", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData": "", + "gasLimit": "0x17d7840" + }, + "accounts": { + "0x0000000000000000000000000000000000000000": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000001": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000005": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000006": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000007": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000008": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000009": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000010": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000011": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000012": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000013": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000014": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000015": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000016": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000017": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000018": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000019": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000020": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000021": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000022": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000023": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000024": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000025": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000026": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000027": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000028": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000029": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000030": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000031": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000032": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000033": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000034": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000035": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000036": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000037": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000038": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000039": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000040": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000041": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000042": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000043": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000044": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000045": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000046": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000047": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000048": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000049": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000050": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000051": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000052": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000053": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000054": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000055": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000056": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000057": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000058": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000059": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000060": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000061": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000062": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000063": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000064": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000065": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000066": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000067": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000068": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000069": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000070": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000071": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000072": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000073": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000074": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000075": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000076": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000077": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000078": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000079": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000080": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000081": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000082": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000083": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000084": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000085": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000086": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000087": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000088": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000089": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000090": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000091": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000092": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000093": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000094": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000095": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000096": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000097": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000098": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000099": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009f": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000aa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ab": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ac": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ad": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ae": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000af": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ba": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000be": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ca": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ce": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000da": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000db": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000de": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000df": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ea": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000eb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ec": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ed": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ee": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ef": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fe": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ff": { + "balance": "1" + }, + "0x6f22fFbC56eFF051aECF839396DD1eD9aD6BBA9D": { + "balance": "0", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500" + }, + "0x0aae40965e6800cd9b1f4b05ff21581047e3f91e": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460575767ffffffffffffffff5f3511605357600143035f3511604b575f35612000014311604b57611fff5f3516545f5260205ff35b5f5f5260205ff35b5f5ffd5b5f35611fff60014303165500" + }, + "0x00A3ca265EBcb825B45F985A16CEFB49958cE017": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b366038141561012e5760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061012e57600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460dd5780604c02838201600302600401805490600101805490600101549160601b83528260140152906034015260010160a6565b910180921460ed579060025560f8565b90505f6002555f6003555b5f548061049d141561010757505f5b60015460028282011161011c5750505f610122565b01600290035b5f555f600155604c025ff35b5f5ffd", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000000000000000000000000000000000000000049d" + } + }, + "0x00b42dbF2194e931E80326D950320f7d9Dbeac02": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146098573615156028575f545f5260205ff35b36606014156101445760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061014457600154600101600155600354806004026004013381556001015f35815560010160203581556001016040359055600101600355005b6003546002548082038060011160ac575060015b5f5b81811460f15780607402838201600402600401805490600101805490600101805490600101549260601b84529083601401528260340152906054015260010160ae565b9101809214610103579060025561010e565b90505f6002555f6003555b5f548061049d141561011d57505f5b6001546001828201116101325750505f610138565b01600190035b5f555f6001556074025ff35b5f5ffd", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000000000000000000000000000000000000000049d" + } + }, + "0x454b0EA7d8aD3C56D0CF2e44Ed97b2Feab4D7AF2": { + "balance": "1000000000000000000000000000" + }, + "0xd3248BA3E5492D767F8e427Cb9C7B9D5C3972D7B": { + "balance": "1000000000000000000000000000" + }, + "0xAD01b55d7c3448B8899862eb335FBb17075d8DE2": { + "balance": "1000000000000000000000000000" + }, + "0x7e454a14B8e7528465eeF86f0DC1da4f235d9D79": { + "balance": "1000000000000000000000000000" + }, + "0x7a40026A3b9A41754a95EeC8c92C6B99886f440C": { + "balance": "1000000000000000000000000000" + }, + "0x8c4D8CDD1f474510Dd70D66F2785a3a38a29AC1A": { + "balance": "1000000000000000000000000000" + }, + "0xfC7360b3b28cf4204268A8354dbEc60720d155D2": { + "balance": "1000000000000000000000000000" + }, + "0x2F7626bBDb8c0f9071bC98046Ef6fDed2167F97F": { + "balance": "1000000000000000000000000000" + }, + "0x752CE31Dec0dde7D1563CdF6438d892De2D4FBee": { + "balance": "1000000000000000000000000000" + }, + "0x455f42d91096c4Aa708D7Cbcb2DC499dE89C402c": { + "balance": "1000000000000000000000000000" + }, + "0x85154341488732D57a97F54AB9706Bc4B71B8636": { + "balance": "1000000000000000000000000000" + }, + "0x6a9CcA73d4Ff3a249fa778C7651f4Df8B9fFa0Df": { + "balance": "1000000000000000000000000000" + }, + "0xee2d0567AAe8080CA269b7908F4aF8BBb59A6804": { + "balance": "1000000000000000000000000000" + }, + "0xDd8D4027078a471816e4Ef7F69aFc0A5d2947dDc": { + "balance": "1000000000000000000000000000" + }, + "0x20466E9A67f299F6056bE52A50ea324FA6Bd05D5": { + "balance": "1000000000000000000000000000" + }, + "0x03F24BB0C9cfb30217Ff992A36ae9230F2A1697f": { + "balance": "1000000000000000000000000000" + }, + "0x032d8372C519c3927b87BDe4479E846a81EF2d10": { + "balance": "1000000000000000000000000000" + }, + "0xF863DF14954df73804b3150F3754a8F98CBB1D0d": { + "balance": "1000000000000000000000000000" + }, + "0xbe918A6aef1920F3706E23d153146aA6C5982620": { + "balance": "1000000000000000000000000000" + }, + "0xA0c7edA3CE474BC670A11EA9537cBEfd36331123": { + "balance": "1000000000000000000000000000" + }, + "0xF03b43BeB861044492Eb43E247bEE2AC6C80c651": { + "balance": "1000000000000000000000000000" + } + }, + "nodes": [] +} diff --git a/network-configs/devnet-1/metadata/config.yaml b/network-configs/devnet-1/metadata/config.yaml new file mode 100644 index 0000000..cfe994a --- /dev/null +++ b/network-configs/devnet-1/metadata/config.yaml @@ -0,0 +1,149 @@ +# Extends the mainnet preset +PRESET_BASE: mainnet +CONFIG_NAME: testnet # needs to exist because of Prysm. Otherwise it conflicts with mainnet genesis + +# Genesis +# --------------------------------------------------------------- +# `2**14` (= 16,384) +MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 900 +# Mar-01-2021 08:53:32 AM +UTC +# This is an invalid valid and should be updated when you create the genesis +MIN_GENESIS_TIME: 1719321038 +GENESIS_FORK_VERSION: 0x10832687 +GENESIS_DELAY: 60 + + +# Forking +# --------------------------------------------------------------- +# Some forks are disabled for now: +# - These may be re-assigned to another fork-version later +# - Temporarily set to max uint64 value: 2**64 - 1 + +# Altair +ALTAIR_FORK_VERSION: 0x20832687 +ALTAIR_FORK_EPOCH: 0 +# Merge +BELLATRIX_FORK_VERSION: 0x30832687 +BELLATRIX_FORK_EPOCH: 0 +TERMINAL_TOTAL_DIFFICULTY: 0 +TERMINAL_BLOCK_HASH: 0x0000000000000000000000000000000000000000000000000000000000000000 +TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH: 18446744073709551615 + +# Capella +CAPELLA_FORK_VERSION: 0x40832687 +CAPELLA_FORK_EPOCH: 0 + +# DENEB +DENEB_FORK_VERSION: 0x50832687 +DENEB_FORK_EPOCH: 0 + +# Electra +ELECTRA_FORK_VERSION: 0x60832687 +ELECTRA_FORK_EPOCH: 50000000000 + +# EIP7594 - Peerdas +EIP7594_FORK_VERSION: 0x50832687 +EIP7594_FORK_EPOCH: 0 + +# Time parameters +# --------------------------------------------------------------- +# 12 seconds +SECONDS_PER_SLOT: 12 +# 14 (estimate from Eth1 mainnet) +SECONDS_PER_ETH1_BLOCK: 12 +# 2**8 (= 256) epochs ~27 hours +MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256 +# 2**8 (= 256) epochs ~27 hours +SHARD_COMMITTEE_PERIOD: 256 +# 2**11 (= 2,048) Eth1 blocks ~8 hours +ETH1_FOLLOW_DISTANCE: 2048 + +# Validator cycle +# --------------------------------------------------------------- +# 2**2 (= 4) +INACTIVITY_SCORE_BIAS: 4 +# 2**4 (= 16) +INACTIVITY_SCORE_RECOVERY_RATE: 16 +# 2**4 * 10**9 (= 16,000,000,000) Gwei +EJECTION_BALANCE: 16000000000 +# 2**2 (= 4) +MIN_PER_EPOCH_CHURN_LIMIT: 4 +# 2**16 (= 65,536) +CHURN_LIMIT_QUOTIENT: 65536 +# [New in Deneb:EIP7514] 2**3 (= 8) +MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT: 8 + +# Fork choice +# --------------------------------------------------------------- +# 40% +PROPOSER_SCORE_BOOST: 40 +# 20% +REORG_HEAD_WEIGHT_THRESHOLD: 20 +# 160% +REORG_PARENT_WEIGHT_THRESHOLD: 160 +# `2` epochs +REORG_MAX_EPOCHS_SINCE_FINALIZATION: 2 + +# Deposit contract +# --------------------------------------------------------------- +DEPOSIT_CHAIN_ID: 7068553372 +DEPOSIT_NETWORK_ID: 7068553372 +DEPOSIT_CONTRACT_ADDRESS: 0x6f22fFbC56eFF051aECF839396DD1eD9aD6BBA9D + +# Networking +# --------------------------------------------------------------- +# `10 * 2**20` (= 10485760, 10 MiB) +GOSSIP_MAX_SIZE: 10485760 +# `2**10` (= 1024) +MAX_REQUEST_BLOCKS: 1024 +# `2**8` (= 256) +EPOCHS_PER_SUBNET_SUBSCRIPTION: 256 +# `MIN_VALIDATOR_WITHDRAWABILITY_DELAY + CHURN_LIMIT_QUOTIENT // 2` (= 33024, ~5 months) +MIN_EPOCHS_FOR_BLOCK_REQUESTS: 33024 +# `10 * 2**20` (=10485760, 10 MiB) +MAX_CHUNK_SIZE: 10485760 +# 5s +TTFB_TIMEOUT: 5 +# 10s +RESP_TIMEOUT: 10 +ATTESTATION_PROPAGATION_SLOT_RANGE: 32 +# 500ms +MAXIMUM_GOSSIP_CLOCK_DISPARITY: 500 +MESSAGE_DOMAIN_INVALID_SNAPPY: 0x00000000 +MESSAGE_DOMAIN_VALID_SNAPPY: 0x01000000 +# 2 subnets per node +SUBNETS_PER_NODE: 2 +# 2**8 (= 64) +ATTESTATION_SUBNET_COUNT: 64 +ATTESTATION_SUBNET_EXTRA_BITS: 0 +# ceillog2(ATTESTATION_SUBNET_COUNT) + ATTESTATION_SUBNET_EXTRA_BITS +ATTESTATION_SUBNET_PREFIX_BITS: 6 + +# Deneb +# `2**7` (=128) +MAX_REQUEST_BLOCKS_DENEB: 128 +# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK +MAX_REQUEST_BLOB_SIDECARS: 768 +# `2**12` (= 4096 epochs, ~18 days) +MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS: 4096 +# `6` +BLOB_SIDECAR_SUBNET_COUNT: 6 + +# Whisk +# `Epoch(2**8)` +WHISK_EPOCHS_PER_SHUFFLING_PHASE: 256 +# `Epoch(2)` +WHISK_PROPOSER_SELECTION_GAP: 2 + +# EIP7594 +NUMBER_OF_COLUMNS: 128 +MAX_CELLS_IN_EXTENDED_MATRIX: 768 +DATA_COLUMN_SIDECAR_SUBNET_COUNT: 64 +MAX_REQUEST_DATA_COLUMN_SIDECARS: 16384 +SAMPLES_PER_SLOT: 16 +CUSTODY_REQUIREMENT: 4 +TARGET_NUMBER_OF_PEERS: 70 + +# [New in Electra:EIP7251] +MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: 128000000000 # 2**7 * 10**9 (= 128,000,000,000) +MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: 256000000000 # 2**8 * 10**9 (= 256,000,000,000) \ No newline at end of file diff --git a/network-configs/devnet-1/metadata/deposit_contract.txt b/network-configs/devnet-1/metadata/deposit_contract.txt new file mode 100644 index 0000000..268534a --- /dev/null +++ b/network-configs/devnet-1/metadata/deposit_contract.txt @@ -0,0 +1 @@ +0x6f22fFbC56eFF051aECF839396DD1eD9aD6BBA9D diff --git a/network-configs/devnet-1/metadata/deposit_contract_block.txt b/network-configs/devnet-1/metadata/deposit_contract_block.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/network-configs/devnet-1/metadata/deposit_contract_block.txt @@ -0,0 +1 @@ +0 diff --git a/network-configs/devnet-1/metadata/deposit_contract_block_hash.txt b/network-configs/devnet-1/metadata/deposit_contract_block_hash.txt new file mode 100644 index 0000000..c7644ff --- /dev/null +++ b/network-configs/devnet-1/metadata/deposit_contract_block_hash.txt @@ -0,0 +1 @@ +0x3cd5b53d6b7c65c212cd4701a2c3b8d115d7ffc5eef5572d913b78f7722fd926 \ No newline at end of file diff --git a/network-configs/devnet-1/metadata/genesis.json b/network-configs/devnet-1/metadata/genesis.json new file mode 100644 index 0000000..5e49ebb --- /dev/null +++ b/network-configs/devnet-1/metadata/genesis.json @@ -0,0 +1,926 @@ +{ + "config": { + "chainId": 7068553372, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "mergeNetsplitBlock": 0, + "terminalTotalDifficulty": 0, + "terminalTotalDifficultyPassed": true, + "shanghaiTime": 0, + "cancunTime": 0, + "depositContractAddress": "0x6f22fFbC56eFF051aECF839396DD1eD9aD6BBA9D", + "pragueTime": 19201719321098 + }, + "alloc": { + "0x0000000000000000000000000000000000000000": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000001": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000005": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000006": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000007": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000008": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000009": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000010": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000011": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000012": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000013": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000014": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000015": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000016": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000017": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000018": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000019": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000020": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000021": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000022": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000023": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000024": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000025": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000026": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000027": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000028": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000029": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000030": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000031": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000032": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000033": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000034": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000035": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000036": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000037": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000038": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000039": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000040": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000041": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000042": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000043": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000044": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000045": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000046": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000047": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000048": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000049": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000050": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000051": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000052": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000053": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000054": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000055": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000056": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000057": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000058": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000059": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000060": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000061": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000062": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000063": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000064": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000065": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000066": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000067": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000068": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000069": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000070": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000071": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000072": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000073": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000074": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000075": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000076": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000077": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000078": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000079": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000080": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000081": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000082": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000083": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000084": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000085": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000086": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000087": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000088": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000089": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000090": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000091": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000092": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000093": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000094": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000095": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000096": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000097": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000098": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000099": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009f": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000aa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ab": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ac": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ad": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ae": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000af": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ba": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000be": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ca": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ce": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000da": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000db": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000de": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000df": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ea": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000eb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ec": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ed": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ee": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ef": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fe": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ff": { + "balance": "1" + }, + "0x6f22fFbC56eFF051aECF839396DD1eD9aD6BBA9D": { + "balance": "0", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500" + }, + "0x0aae40965e6800cd9b1f4b05ff21581047e3f91e": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460575767ffffffffffffffff5f3511605357600143035f3511604b575f35612000014311604b57611fff5f3516545f5260205ff35b5f5f5260205ff35b5f5ffd5b5f35611fff60014303165500" + }, + "0x00A3ca265EBcb825B45F985A16CEFB49958cE017": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b366038141561012e5760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061012e57600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460dd5780604c02838201600302600401805490600101805490600101549160601b83528260140152906034015260010160a6565b910180921460ed579060025560f8565b90505f6002555f6003555b5f548061049d141561010757505f5b60015460028282011161011c5750505f610122565b01600290035b5f555f600155604c025ff35b5f5ffd", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000000000000000000000000000000000000000049d" + } + }, + "0x00b42dbF2194e931E80326D950320f7d9Dbeac02": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146098573615156028575f545f5260205ff35b36606014156101445760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061014457600154600101600155600354806004026004013381556001015f35815560010160203581556001016040359055600101600355005b6003546002548082038060011160ac575060015b5f5b81811460f15780607402838201600402600401805490600101805490600101805490600101549260601b84529083601401528260340152906054015260010160ae565b9101809214610103579060025561010e565b90505f6002555f6003555b5f548061049d141561011d57505f5b6001546001828201116101325750505f610138565b01600190035b5f555f6001556074025ff35b5f5ffd", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000000000000000000000000000000000000000049d" + } + }, + "0x454b0EA7d8aD3C56D0CF2e44Ed97b2Feab4D7AF2": { + "balance": "1000000000000000000000000000" + }, + "0xd3248BA3E5492D767F8e427Cb9C7B9D5C3972D7B": { + "balance": "1000000000000000000000000000" + }, + "0xAD01b55d7c3448B8899862eb335FBb17075d8DE2": { + "balance": "1000000000000000000000000000" + }, + "0x7e454a14B8e7528465eeF86f0DC1da4f235d9D79": { + "balance": "1000000000000000000000000000" + }, + "0x7a40026A3b9A41754a95EeC8c92C6B99886f440C": { + "balance": "1000000000000000000000000000" + }, + "0x8c4D8CDD1f474510Dd70D66F2785a3a38a29AC1A": { + "balance": "1000000000000000000000000000" + }, + "0xfC7360b3b28cf4204268A8354dbEc60720d155D2": { + "balance": "1000000000000000000000000000" + }, + "0x2F7626bBDb8c0f9071bC98046Ef6fDed2167F97F": { + "balance": "1000000000000000000000000000" + }, + "0x752CE31Dec0dde7D1563CdF6438d892De2D4FBee": { + "balance": "1000000000000000000000000000" + }, + "0x455f42d91096c4Aa708D7Cbcb2DC499dE89C402c": { + "balance": "1000000000000000000000000000" + }, + "0x85154341488732D57a97F54AB9706Bc4B71B8636": { + "balance": "1000000000000000000000000000" + }, + "0x6a9CcA73d4Ff3a249fa778C7651f4Df8B9fFa0Df": { + "balance": "1000000000000000000000000000" + }, + "0xee2d0567AAe8080CA269b7908F4aF8BBb59A6804": { + "balance": "1000000000000000000000000000" + }, + "0xDd8D4027078a471816e4Ef7F69aFc0A5d2947dDc": { + "balance": "1000000000000000000000000000" + }, + "0x20466E9A67f299F6056bE52A50ea324FA6Bd05D5": { + "balance": "1000000000000000000000000000" + }, + "0x03F24BB0C9cfb30217Ff992A36ae9230F2A1697f": { + "balance": "1000000000000000000000000000" + }, + "0x032d8372C519c3927b87BDe4479E846a81EF2d10": { + "balance": "1000000000000000000000000000" + }, + "0xF863DF14954df73804b3150F3754a8F98CBB1D0d": { + "balance": "1000000000000000000000000000" + }, + "0xbe918A6aef1920F3706E23d153146aA6C5982620": { + "balance": "1000000000000000000000000000" + }, + "0xA0c7edA3CE474BC670A11EA9537cBEfd36331123": { + "balance": "1000000000000000000000000000" + }, + "0xF03b43BeB861044492Eb43E247bEE2AC6C80c651": { + "balance": "1000000000000000000000000000" + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x01", + "extraData": "", + "gasLimit": "0x17d7840", + "nonce": "0x1234", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "1719321038" +} diff --git a/network-configs/devnet-1/metadata/genesis.ssz b/network-configs/devnet-1/metadata/genesis.ssz new file mode 100755 index 0000000000000000000000000000000000000000..4ca7505a58e9d4d769baccf9523c7f1d050eab13 GIT binary patch literal 2862337 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�V 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 true... if split("-", gid)[0] != "bootnode" } ) ~} +${x} +%{ endfor ~} + +[execution_node:children] +%{ for x,y in merge( { for gid, group in groups : split("-", gid)[1] => true... if split("-", gid)[0] != "bootnode" } ) ~} +${x} +%{ endfor ~} + +[ethereum_node:children] +consensus_node +execution_node diff --git a/terraform/devnet-1/digitalocean.tf b/terraform/devnet-1/digitalocean.tf new file mode 100644 index 0000000..66230ef --- /dev/null +++ b/terraform/devnet-1/digitalocean.tf @@ -0,0 +1,323 @@ +//////////////////////////////////////////////////////////////////////////////////////// +// VARIABLES +//////////////////////////////////////////////////////////////////////////////////////// +variable "digitalocean_project_name" { + type = string + default = "Peerdas-devnets" +} + +variable "digitalocean_ssh_key_name" { + type = string + default = "shared-devops-eth2" +} + +variable "digitalocean_regions" { + default = [ + "nyc1", + "sgp1", + "lon1", + "nyc3", + "ams3", + "fra1", + "tor1", + "blr1", + "sfo3", + "syd1" + ] +} + +//////////////////////////////////////////////////////////////////////////////////////// +// LOCALS +//////////////////////////////////////////////////////////////////////////////////////// +locals { + base_cidr_block = var.base_cidr_block + digitalocean_vpcs = { + for region in var.digitalocean_regions : region => { + name = "${var.ethereum_network}-${region}" + region = region + ip_range = cidrsubnet(local.base_cidr_block, 8, index(var.digitalocean_regions, region)) + } + } +} + +locals { + digitalocean_vm_groups = flatten([ + for vm_group in local.vm_groups : + [ + for i in range(0, vm_group.count) : { + group_name = "${vm_group.name}" + id = "${vm_group.name}-${i + 1}" + vms = { + "${i + 1}" = { + tags = "group_name:${vm_group.name},val_start:${vm_group.validator_start + (i * (vm_group.validator_end - vm_group.validator_start) / vm_group.count)},val_end:${min(vm_group.validator_start + ((i + 1) * (vm_group.validator_end - vm_group.validator_start) / vm_group.count), vm_group.validator_end)}" + region = element(var.digitalocean_regions, i % length(var.digitalocean_regions)) + size = try(vm_group.size, local.digitalocean_default_size) + ipv6 = try(vm_group.ipv6, true) + } + } + } + ] + ]) +} + +locals { + digitalocean_default_region = "ams3" + digitalocean_default_size = "s-4vcpu-8gb-amd" + digitalocean_default_image = "debian-12-x64" + digitalocean_global_tags = [ + "Owner:Devops", + "EthNetwork:${var.ethereum_network}" + ] + + # flatten vm_groups so that we can use it with for_each() + digitalocean_vms = flatten([ + for group in local.digitalocean_vm_groups : [ + for vm_key, vm in group.vms : { + id = "${group.id}" + group_key = "${group.group_name}" + vm_key = vm_key + + name = try(vm.name, "${group.id}") + ssh_keys = try(vm.ssh_keys, [data.digitalocean_ssh_key.main.fingerprint]) + region = try(vm.region, try(group.region, local.digitalocean_default_region)) + image = try(vm.image, local.digitalocean_default_image) + size = try(vm.size, local.digitalocean_default_size) + resize_disk = try(vm.resize_disk, true) + monitoring = try(vm.monitoring, true) + backups = try(vm.backups, false) + ipv6 = try(vm.ipv6, true) + ansible_vars = try(vm.ansible_vars, null) + vpc_uuid = try(vm.vpc_uuid, try( + digitalocean_vpc.main[vm.region].id, + digitalocean_vpc.main[try(group.region, local.digitalocean_default_region)].id + )) + + tags = concat(local.digitalocean_global_tags, try(split(",", group.tags), []), try(split(",", vm.tags), [])) + } + ] + ]) +} + +//////////////////////////////////////////////////////////////////////////////////////// +// DIGITALOCEAN RESOURCES +//////////////////////////////////////////////////////////////////////////////////////// +data "digitalocean_project" "main" { + name = var.digitalocean_project_name +} + +data "digitalocean_ssh_key" "main" { + name = var.digitalocean_ssh_key_name +} + +resource "digitalocean_vpc" "main" { + for_each = local.digitalocean_vpcs + + name = each.value["name"] + region = each.value["region"] + ip_range = each.value["ip_range"] +} + +resource "digitalocean_droplet" "main" { + for_each = { + for vm in local.digitalocean_vms : "${vm.id}" => vm + } + name = "${var.ethereum_network}-${each.value.name}" + region = each.value.region + ssh_keys = each.value.ssh_keys + image = each.value.image + size = each.value.size + resize_disk = each.value.resize_disk + monitoring = each.value.monitoring + backups = each.value.backups + ipv6 = each.value.ipv6 + vpc_uuid = each.value.vpc_uuid + tags = each.value.tags +} + +resource "digitalocean_project_resources" "droplets" { + for_each = digitalocean_droplet.main + project = data.digitalocean_project.main.id + resources = [each.value.urn] +} + +resource "digitalocean_firewall" "main" { + name = "${var.ethereum_network}-nodes" + // Tags are used to select which droplets should + // be assigned to this firewall. + tags = [ + "EthNetwork:${var.ethereum_network}" + ] + + // SSH + inbound_rule { + protocol = "tcp" + port_range = "22" + source_addresses = ["0.0.0.0/0", "::/0"] + } + + // Nginx / Web + inbound_rule { + protocol = "tcp" + port_range = "80" + source_addresses = ["0.0.0.0/0", "::/0"] + } + + inbound_rule { + protocol = "tcp" + port_range = "443" + source_addresses = ["0.0.0.0/0", "::/0"] + } + + // Consensus layer p2p port + inbound_rule { + protocol = "tcp" + port_range = "9000-9001" + source_addresses = ["0.0.0.0/0", "::/0"] + } + inbound_rule { + protocol = "udp" + port_range = "9000-9001" + source_addresses = ["0.0.0.0/0", "::/0"] + } + + // Execution layer p2p Port + inbound_rule { + protocol = "tcp" + port_range = "30303" + source_addresses = ["0.0.0.0/0", "::/0"] + } + inbound_rule { + protocol = "udp" + port_range = "30303" + source_addresses = ["0.0.0.0/0", "::/0"] + } + + // Allow all outbound traffic + outbound_rule { + protocol = "tcp" + port_range = "1-65535" + destination_addresses = ["0.0.0.0/0", "::/0"] + } + outbound_rule { + protocol = "udp" + port_range = "1-65535" + destination_addresses = ["0.0.0.0/0", "::/0"] + } + outbound_rule { + protocol = "icmp" + destination_addresses = ["0.0.0.0/0", "::/0"] + } + depends_on = [digitalocean_project_resources.droplets] +} + +//////////////////////////////////////////////////////////////////////////////////////// +// DNS NAMES +//////////////////////////////////////////////////////////////////////////////////////// + +data "cloudflare_zone" "default" { + name = "ethpandaops.io" +} + +resource "cloudflare_record" "server_record_v4" { + for_each = { + for vm in local.digitalocean_vms : "${vm.id}" => vm + } + zone_id = data.cloudflare_zone.default.id + name = "${each.value.name}.${var.ethereum_network}" + type = "A" + value = digitalocean_droplet.main[each.value.id].ipv4_address + proxied = false + ttl = 120 +} + +resource "cloudflare_record" "server_record_v6" { + for_each = { + for vm in local.digitalocean_vms : "${vm.id}" => vm if vm.ipv6 + } + zone_id = data.cloudflare_zone.default.id + name = "${each.value.name}.${var.ethereum_network}" + type = "AAAA" + value = digitalocean_droplet.main[each.value.id].ipv6_address + proxied = false + ttl = 120 +} + +resource "cloudflare_record" "server_record_rpc_v4" { + for_each = { + for vm in local.digitalocean_vms : "${vm.id}" => vm + } + zone_id = data.cloudflare_zone.default.id + name = "rpc.${each.value.name}.${var.ethereum_network}" + type = "A" + value = digitalocean_droplet.main[each.value.id].ipv4_address + proxied = false + ttl = 120 +} + +resource "cloudflare_record" "server_record_rpc_v6" { + for_each = { + for vm in local.digitalocean_vms : "${vm.id}" => vm if vm.ipv6 + } + zone_id = data.cloudflare_zone.default.id + name = "rpc.${each.value.name}.${var.ethereum_network}" + type = "AAAA" + value = digitalocean_droplet.main[each.value.id].ipv6_address + proxied = false + ttl = 120 +} + +resource "cloudflare_record" "server_record_beacon_v4" { + for_each = { + for vm in local.digitalocean_vms : "${vm.id}" => vm + } + zone_id = data.cloudflare_zone.default.id + name = "bn.${each.value.name}.${var.ethereum_network}" + type = "A" + value = digitalocean_droplet.main[each.value.id].ipv4_address + proxied = false + ttl = 120 +} + +resource "cloudflare_record" "server_record_beacon_v6" { + for_each = { + for vm in local.digitalocean_vms : "${vm.id}" => vm if vm.ipv6 + } + zone_id = data.cloudflare_zone.default.id + name = "bn.${each.value.name}.${var.ethereum_network}" + type = "AAAA" + value = digitalocean_droplet.main[each.value.id].ipv6_address + proxied = false + ttl = 120 +} + + +//////////////////////////////////////////////////////////////////////////////////////// +// GENERATED FILES AND OUTPUTS +//////////////////////////////////////////////////////////////////////////////////////// + +resource "local_file" "ansible_inventory" { + content = templatefile("ansible_inventory.tmpl", + { + ethereum_network_name = "${var.ethereum_network}" + groups = merge( + { for group in local.digitalocean_vm_groups : "${group.group_name}" => true... }, + ) + hosts = merge( + { + for key, server in digitalocean_droplet.main : "do.${key}" => { + ip = "${server.ipv4_address}" + ipv6 = try(server.ipv6_address, "none") + group = try(split(":", tolist(server.tags)[2])[1], "unknown") + validator_start = try(split(":", tolist(server.tags)[4])[1], 0) + validator_end = try(split(":", tolist(server.tags)[3])[1], 0) # if the tag is not a number it will be 0 - e.g no validator keys + tags = "${server.tags}" + hostname = "${split(".", key)[0]}" + cloud = "digitalocean" + region = "${server.region}" + } + } + ) + } + ) + filename = "../../ansible/inventories/devnet-1/inventory.ini" +} diff --git a/terraform/devnet-1/hetzner/firewall.tf b/terraform/devnet-1/hetzner/firewall.tf new file mode 100644 index 0000000..4ef6d0b --- /dev/null +++ b/terraform/devnet-1/hetzner/firewall.tf @@ -0,0 +1,87 @@ +resource "hcloud_firewall" "machine_firewall" { + name = "${var.ethereum_network}-firewall" + + # SSH + rule { + description = "Allow SSH" + direction = "in" + protocol = "tcp" + port = "22" + source_ips = ["0.0.0.0/0", "::/0"] + } + # Nginx / Web + rule { + description = "Allow HTTP" + direction = "in" + protocol = "tcp" + port = "80" + source_ips = ["0.0.0.0/0", "::/0"] + } + + rule { + description = "Allow HTTPS" + direction = "in" + protocol = "tcp" + port = "443" + source_ips = ["0.0.0.0/0", "::/0"] + } + + # Consensus layer p2p port + rule { + description = "Allow consensus p2p port TCP" + direction = "in" + protocol = "tcp" + port = "9000-9001" + source_ips = ["0.0.0.0/0", "::/0"] + } + + rule { + description = "Allow consensus p2p port UDP" + direction = "in" + protocol = "udp" + port = "9000-9001" + source_ips = ["0.0.0.0/0", "::/0"] + } + + # Execution layer p2p Port + rule { + description = "Allow execution p2p port TCP" + direction = "in" + protocol = "tcp" + port = "30303" + source_ips = ["0.0.0.0/0", "::/0"] + } + + rule { + description = "Allow execution p2p port UDP" + direction = "in" + protocol = "udp" + port = "30303" + source_ips = ["0.0.0.0/0", "::/0"] + } + + # Allow all outbound traffic + rule { + description = "Allow all outbound traffic TCP" + direction = "out" + protocol = "tcp" + port = "1-65535" + destination_ips = ["0.0.0.0/0", "::/0"] + } + + rule { + description = "Allow all outbound traffic UDP" + direction = "out" + protocol = "udp" + port = "1-65535" + destination_ips = ["0.0.0.0/0", "::/0"] + } + + rule { + description = "Allow all outbound traffic ICMP" + direction = "out" + protocol = "icmp" + destination_ips = ["0.0.0.0/0", "::/0"] + } +} + diff --git a/terraform/devnet-1/hetzner/hetzner.tf b/terraform/devnet-1/hetzner/hetzner.tf new file mode 100644 index 0000000..817c34a --- /dev/null +++ b/terraform/devnet-1/hetzner/hetzner.tf @@ -0,0 +1,263 @@ +//////////////////////////////////////////////////////////////////////////////////////// +// TERRAFORM PROVIDERS & BACKEND +//////////////////////////////////////////////////////////////////////////////////////// +provider "hcloud" { + token = var.devnet_hcloud_token +} +//////////////////////////////////////////////////////////////////////////////////////// +// VARIABLES +//////////////////////////////////////////////////////////////////////////////////////// +variable "devnet_hcloud_token" { + type = string + description = "Hetzner Cloud API Token" + sensitive = true +} + +variable "hcloud_ssh_key_fingerprint" { + type = string + default = "d6:76:2d:9c:5b:33:80:ff:0f:09:a2:10:9b:58:7e:dc" +} + +variable "hetzner_regions" { + default = [ + "nbg1", + "fsn1", + "hel1" + ] +} + +//////////////////////////////////////////////////////////////////////////////////////// +// LOCALS +//////////////////////////////////////////////////////////////////////////////////////// +locals { + hetzner_network = { + for region in var.hetzner_regions : region => { + name = "${var.ethereum_network}-${region}" + ip_range = cidrsubnet(var.base_cidr_block, 8, index(var.hetzner_regions, region)) + } + } + hetzner_network_subnets = { + for region in var.hetzner_regions : region => { + zone = "eu-central" + ip_range = cidrsubnet(var.base_cidr_block, 8, index(var.hetzner_regions, region)) + } + } +} + +locals { + hetzner_vm_groups = flatten([ + for vm_group in local.vm_groups : + [ + for i in range(0, vm_group.count) : { + group_name = "${vm_group.name}" + id = "${vm_group.name}-${i + 1}-arm" + vms = { + "${i + 1}" = { + labels = "group_name:${vm_group.name},val_start:${vm_group.validator_start + (i * (vm_group.validator_end - + vm_group.validator_start) / vm_group.count)},val_end:${min(vm_group.validator_start + ((i + 1) * (vm_group.validator_end - + vm_group.validator_start) / vm_group.count), vm_group.validator_end)}" + location = try(vm_group.location, local.hcloud_default_location) + size = try(vm_group.size, local.hcloud_default_server_type) + ansible_vars = try(vm_group.ansible_vars, null) + ipv4_enabled = try(vm_group.ipv4_enabled, true) + ipv6_enabled = try(vm_group.ipv6_enabled, true) + } + } + } + ] + ]) +} + +locals { + hcloud_default_location = "nbg1" + hcloud_default_image = "debian-12" + hcloud_default_server_type = "cax31" + hcloud_global_labels = [ + "Owner:Devops", + "EthNetwork:${var.ethereum_network}" + ] + # hcloud_global_labels_list = [for k, v in local.hcloud_global_labels : "${k}=${v}"] + + # flatten vm_groups so that we can use it with for_each() + hcloud_vms = flatten([ + for group in local.hetzner_vm_groups : [ + for vm_key, vm in group.vms : { + id = "${group.id}" + group_key = "${group.group_name}" + vm_key = vm_key + + name = try(vm.name, "${group.id}") + ipv4_enabled = try(vm.ipv4_enabled, true) + ipv6_enabled = try(vm.ipv6_enabled, true) + ssh_keys = try(vm.ssh_keys, [data.hcloud_ssh_key.main.id]) + location = try(vm.location, try(group.location, local.hcloud_default_location)) + image = try(vm.image, local.hcloud_default_image) + server_type = try(vm.size, local.hcloud_default_server_type) + backups = try(vm.backups, false) + ansible_vars = try(vm.ansible_vars, null) + + labels = concat(local.hcloud_global_labels, try(split(",", group.labels), []), try(split(",", vm.labels), [])) + } + ] + ]) +} +//////////////////////////////////////////////////////////////////////////////////////// +// HETZNER RESOURCES +//////////////////////////////////////////////////////////////////////////////////////// +resource "hcloud_network" "main" { + for_each = local.hetzner_network + name = try(each.value.name, "${var.ethereum_network}-${each.key}") + ip_range = each.value.ip_range +} + +resource "hcloud_network_subnet" "main" { + for_each = local.hetzner_network_subnets + network_id = hcloud_network.main[each.key].id + type = "cloud" + network_zone = each.value.zone + ip_range = each.value.ip_range +} + +data "hcloud_ssh_key" "main" { + fingerprint = var.hcloud_ssh_key_fingerprint +} + +resource "hcloud_server" "main" { + for_each = { + for vm in local.hcloud_vms : "${vm.id}" => vm + } + name = "${var.ethereum_network}-${each.value.name}" + image = each.value.image + server_type = each.value.server_type + location = each.value.location + ssh_keys = each.value.ssh_keys + backups = each.value.backups + labels = { for label in each.value.labels : split(":", label)[0] => split(":", label)[1] } + public_net { + ipv4_enabled = try(each.value.ipv4_enabled, true) + ipv6_enabled = try(each.value.ipv6_enabled, true) + } + firewall_ids = [hcloud_firewall.machine_firewall.id] +} + +resource "hcloud_server_network" "main" { + for_each = { + for vm in local.hcloud_vms : "${vm.id}" => vm + } + server_id = hcloud_server.main[each.key].id + network_id = hcloud_network.main[each.value.location].id + +} + +//////////////////////////////////////////////////////////////////////////////////////// +// DNS NAMES +//////////////////////////////////////////////////////////////////////////////////////// + +data "cloudflare_zone" "default" { + name = "ethpandaops.io" +} + +resource "cloudflare_record" "server_record" { + for_each = { + for vm in local.hcloud_vms : "${vm.id}" => vm if coalesce(vm.ipv4_enabled, true) == true + } + zone_id = data.cloudflare_zone.default.id + name = "${each.value.name}.${var.ethereum_network}" + type = "A" + value = hcloud_server.main[each.value.id].ipv4_address + proxied = false + ttl = 120 +} + +resource "cloudflare_record" "server_record6" { + for_each = { + for vm in local.hcloud_vms : "${vm.id}" => vm if coalesce(vm.ipv6_enabled, true) == true + } + zone_id = data.cloudflare_zone.default.id + name = "${each.value.name}.${var.ethereum_network}" + type = "AAAA" + value = hcloud_server.main[each.value.id].ipv6_address + proxied = false + ttl = 120 +} + +resource "cloudflare_record" "server_record_rpc" { + for_each = { + for vm in local.hcloud_vms : "${vm.id}" => vm if coalesce(vm.ipv4_enabled, true) == true + } + zone_id = data.cloudflare_zone.default.id + name = "rpc.${each.value.name}.${var.ethereum_network}" + type = "A" + value = hcloud_server.main[each.value.id].ipv4_address + proxied = false + ttl = 120 +} + +resource "cloudflare_record" "server_record_rpc6" { + for_each = { + for vm in local.hcloud_vms : "${vm.id}" => vm if coalesce(vm.ipv6_enabled, true) == true + } + zone_id = data.cloudflare_zone.default.id + name = "rpc.${each.value.name}.${var.ethereum_network}" + type = "AAAA" + value = hcloud_server.main[each.value.id].ipv6_address + proxied = false + ttl = 120 +} + +resource "cloudflare_record" "server_record_beacon" { + for_each = { + for vm in local.hcloud_vms : "${vm.id}" => vm if coalesce(vm.ipv4_enabled, true) == true + } + zone_id = data.cloudflare_zone.default.id + name = "bn.${each.value.name}.${var.ethereum_network}" + type = "A" + value = hcloud_server.main[each.value.id].ipv4_address + proxied = false + ttl = 120 +} + +resource "cloudflare_record" "server_record_beacon6" { + for_each = { + for vm in local.hcloud_vms : "${vm.id}" => vm if coalesce(vm.ipv6_enabled, true) == true + } + zone_id = data.cloudflare_zone.default.id + name = "bn.${each.value.name}.${var.ethereum_network}" + type = "AAAA" + value = hcloud_server.main[each.value.id].ipv6_address + proxied = false + ttl = 120 +} + + +//////////////////////////////////////////////////////////////////////////////////////// +// GENERATED FILES AND OUTPUTS +//////////////////////////////////////////////////////////////////////////////////////// + +resource "local_file" "ansible_inventory" { + depends_on = [hcloud_server.main] + content = templatefile("../ansible_inventory.tmpl", + { + ethereum_network_name = "${var.ethereum_network}" + groups = merge( + { for group in local.hetzner_vm_groups : "${group.group_name}" => true... }, + ) + hosts = merge( + { + for key, server in hcloud_server.main : "${key}" => { + ip = coalesce(server.ipv4_address, (try(server.ipv6_address, ""))) + ipv6 = coalesce(server.ipv6_address, "") + group = server.labels.group_name + validator_start = server.labels.val_start + validator_end = server.labels.val_end + tags = server.labels + hostname = split(".", key)[0] + cloud = "hetzner" + region = server.datacenter + } + } + ) + } + ) + filename = "../../../ansible/inventories/devnet-0/hetzner_inventory.ini" +} diff --git a/terraform/devnet-1/hetzner/main.tf b/terraform/devnet-1/hetzner/main.tf new file mode 100644 index 0000000..3365cae --- /dev/null +++ b/terraform/devnet-1/hetzner/main.tf @@ -0,0 +1,106 @@ +//////////////////////////////////////////////////////////////////////////////////////// +// TERRAFORM PROVIDERS & BACKEND +//////////////////////////////////////////////////////////////////////////////////////// +terraform { + required_providers { + digitalocean = { + source = "digitalocean/digitalocean" + version = "~> 2.28" + } + cloudflare = { + source = "cloudflare/cloudflare" + version = "~> 3.0" + } + hcloud = { + source = "hetznercloud/hcloud" + version = "~> 1.42.1" + } + random = { + source = "hashicorp/random" + version = "3.5.1" + } + } +} + +terraform { + backend "s3" { + skip_credentials_validation = true + skip_metadata_api_check = true + endpoints = { s3 = "https://fra1.digitaloceanspaces.com" } + skip_requesting_account_id = true + skip_s3_checksum = true + region = "us-east-1" + bucket = "merge-testnets" + key = "infrastructure/devnet-0/hetzner-terraform.tfstate" + } +} + +provider "digitalocean" { + http_retry_max = 20 +} + +provider "cloudflare" { + api_token = var.cloudflare_api_token +} + +//////////////////////////////////////////////////////////////////////////////////////// +// VARIABLES +//////////////////////////////////////////////////////////////////////////////////////// +variable "cloudflare_api_token" { + type = string + sensitive = true + description = "Cloudflare API Token" +} + +variable "ethereum_network" { + type = string + default = "template-devnet-0" +} + +variable "base_cidr_block" { + default = "10.76.0.0/16" +} +//////////////////////////////////////////////////////////////////////////////////////// +// LOCALS +//////////////////////////////////////////////////////////////////////////////////////// +locals { + vm_groups = [ + var.bootnode, + var.lighthouse_geth, + var.lighthouse_nethermind, + var.lighthouse_erigon, + var.lighthouse_besu, + var.lighthouse_ethereumjs, + var.lighthouse_reth, + var.prysm_geth, + var.prysm_nethermind, + var.prysm_erigon, + var.prysm_besu, + var.prysm_ethereumjs, + var.prysm_reth, + var.lodestar_geth, + var.lodestar_nethermind, + var.lodestar_erigon, + var.lodestar_besu, + var.lodestar_ethereumjs, + var.lodestar_reth, + var.nimbus_geth, + var.nimbus_nethermind, + var.nimbus_erigon, + var.nimbus_besu, + var.nimbus_ethereumjs, + var.nimbus_reth, + var.teku_geth, + var.teku_nethermind, + var.teku_erigon, + var.teku_besu, + var.teku_ethereumjs, + var.teku_reth, + var.grandine_geth, + var.grandine_nethermind, + var.grandine_erigon, + var.grandine_besu, + var.grandine_ethereumjs, + var.grandine_reth, + ] +} diff --git a/terraform/devnet-1/hetzner/nodes.tf b/terraform/devnet-1/hetzner/nodes.tf new file mode 100644 index 0000000..a37778b --- /dev/null +++ b/terraform/devnet-1/hetzner/nodes.tf @@ -0,0 +1,339 @@ +# Bootnode +variable "bootnode" { + default = { + name = "bootnode" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +# Lighthouse +variable "lighthouse_geth" { + default = { + name = "lighthouse-geth" + count = 1 + validator_start = 100 + validator_end = 200 + location = "hel1" + } +} + +variable "lighthouse_besu" { + default = { + name = "lighthouse-besu" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lighthouse_nethermind" { + default = { + name = "lighthouse-nethermind" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lighthouse_ethereumjs" { + default = { + name = "lighthouse-ethereumjs" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lighthouse_erigon" { + default = { + name = "lighthouse-erigon" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lighthouse_reth" { + default = { + name = "lighthouse-reth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +# Prysm +variable "prysm_geth" { + default = { + name = "prysm-geth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "prysm_besu" { + default = { + name = "prysm-besu" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "prysm_nethermind" { + default = { + name = "prysm-nethermind" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "prysm_ethereumjs" { + default = { + name = "prysm-ethereumjs" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "prysm_erigon" { + default = { + name = "prysm-erigon" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "prysm_reth" { + default = { + name = "prysm-reth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +# Lodestar +variable "lodestar_geth" { + default = { + name = "lodestar-geth" + count = 1 + validator_start = 0 + validator_end = 0 + } +} + +variable "lodestar_nethermind" { + default = { + name = "lodestar-nethermind" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lodestar_besu" { + default = { + name = "lodestar-besu" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lodestar_ethereumjs" { + default = { + name = "lodestar-ethereumjs" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lodestar_erigon" { + default = { + name = "lodestar-erigon" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lodestar_reth" { + default = { + name = "lodestar-reth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +# Nimbus +variable "nimbus_geth" { + default = { + name = "nimbus-geth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "nimbus_besu" { + default = { + name = "nimbus-besu" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "nimbus_nethermind" { + default = { + name = "nimbus-nethermind" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "nimbus_ethereumjs" { + default = { + name = "nimbus-ethereumjs" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "nimbus_erigon" { + default = { + name = "nimbus-erigon" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "nimbus_reth" { + default = { + name = "nimbus-reth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +# Teku +variable "teku_geth" { + default = { + name = "teku-geth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "teku_besu" { + default = { + name = "teku-besu" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "teku_nethermind" { + default = { + name = "teku-nethermind" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "teku_ethereumjs" { + default = { + name = "teku-ethereumjs" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "teku_erigon" { + default = { + name = "teku-erigon" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "teku_reth" { + default = { + name = "teku-reth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "grandine_geth" { + default = { + name = "grandine-geth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "grandine_besu" { + default = { + name = "grandine-besu" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "grandine_nethermind" { + default = { + name = "grandine-nethermind" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "grandine_ethereumjs" { + default = { + name = "grandine-ethereumjs" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "grandine_erigon" { + default = { + name = "grandine-erigon" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "grandine_reth" { + default = { + name = "grandine-reth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} diff --git a/terraform/devnet-1/main.tf b/terraform/devnet-1/main.tf new file mode 100644 index 0000000..4305608 --- /dev/null +++ b/terraform/devnet-1/main.tf @@ -0,0 +1,102 @@ +//////////////////////////////////////////////////////////////////////////////////////// +// TERRAFORM PROVIDERS & BACKEND +//////////////////////////////////////////////////////////////////////////////////////// +terraform { + required_providers { + digitalocean = { + source = "digitalocean/digitalocean" + version = "~> 2.28" + } + cloudflare = { + source = "cloudflare/cloudflare" + version = "~> 3.0" + } + hcloud = { + source = "hetznercloud/hcloud" + version = "~> 1.42.1" + } + } +} + +terraform { + backend "s3" { + skip_credentials_validation = true + skip_metadata_api_check = true + endpoints = { s3 = "https://fra1.digitaloceanspaces.com" } + skip_requesting_account_id = true + skip_s3_checksum = true + region = "us-east-1" + bucket = "peerdas-devnets" + key = "infrastructure/devnet-1/terraform.tfstate" + } +} + +provider "digitalocean" { + http_retry_max = 20 +} + +provider "cloudflare" { + api_token = var.cloudflare_api_token +} + +//////////////////////////////////////////////////////////////////////////////////////// +// VARIABLES +//////////////////////////////////////////////////////////////////////////////////////// +variable "cloudflare_api_token" { + type = string + sensitive = true + description = "Cloudflare API Token" +} + +variable "ethereum_network" { + type = string + default = "peerdas-devnet-1" +} + +variable "base_cidr_block" { + default = "10.76.0.0/16" +} +//////////////////////////////////////////////////////////////////////////////////////// +// LOCALS +//////////////////////////////////////////////////////////////////////////////////////// +locals { + vm_groups = [ + var.bootnode, + var.lighthouse_geth, + var.lighthouse_nethermind, + var.lighthouse_erigon, + var.lighthouse_besu, + var.lighthouse_ethereumjs, + var.lighthouse_reth, + var.prysm_geth, + var.prysm_nethermind, + var.prysm_erigon, + var.prysm_besu, + var.prysm_ethereumjs, + var.prysm_reth, + var.lodestar_geth, + var.lodestar_nethermind, + var.lodestar_erigon, + var.lodestar_besu, + var.lodestar_ethereumjs, + var.lodestar_reth, + var.nimbus_geth, + var.nimbus_nethermind, + var.nimbus_erigon, + var.nimbus_besu, + var.nimbus_ethereumjs, + var.nimbus_reth, + var.teku_geth, + var.teku_nethermind, + var.teku_erigon, + var.teku_besu, + var.teku_ethereumjs, + var.teku_reth, + var.grandine_geth, + var.grandine_nethermind, + var.grandine_erigon, + var.grandine_besu, + var.grandine_ethereumjs, + var.grandine_reth, + ] +} diff --git a/terraform/devnet-1/nodes.tf b/terraform/devnet-1/nodes.tf new file mode 100644 index 0000000..4b0d100 --- /dev/null +++ b/terraform/devnet-1/nodes.tf @@ -0,0 +1,338 @@ +# Bootnode +variable "bootnode" { + default = { + name = "bootnode" + count = 1 + validator_start = 0 + validator_end = 0 + } +} + +# Lighthouse +variable "lighthouse_geth" { + default = { + name = "lighthouse-geth" + count = 3 + validator_start = 0 + validator_end = 300 + } +} + +variable "lighthouse_besu" { + default = { + name = "lighthouse-besu" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lighthouse_nethermind" { + default = { + name = "lighthouse-nethermind" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lighthouse_ethereumjs" { + default = { + name = "lighthouse-ethereumjs" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lighthouse_erigon" { + default = { + name = "lighthouse-erigon" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lighthouse_reth" { + default = { + name = "lighthouse-reth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +# Prysm +variable "prysm_geth" { + default = { + name = "prysm-geth" + count = 3 + validator_start = 300 + validator_end = 600 + } +} + +variable "prysm_besu" { + default = { + name = "prysm-besu" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "prysm_nethermind" { + default = { + name = "prysm-nethermind" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "prysm_ethereumjs" { + default = { + name = "prysm-ethereumjs" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "prysm_erigon" { + default = { + name = "prysm-erigon" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "prysm_reth" { + default = { + name = "prysm-reth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +# Lodestar +variable "lodestar_geth" { + default = { + name = "lodestar-geth" + count = 0 + validator_start = 1000 + validator_end = 1100 + } +} + +variable "lodestar_nethermind" { + default = { + name = "lodestar-nethermind" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lodestar_besu" { + default = { + name = "lodestar-besu" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lodestar_ethereumjs" { + default = { + name = "lodestar-ethereumjs" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lodestar_erigon" { + default = { + name = "lodestar-erigon" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "lodestar_reth" { + default = { + name = "lodestar-reth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +# Nimbus +variable "nimbus_geth" { + default = { + name = "nimbus-geth" + count = 0 + validator_start = 1100 + validator_end = 1200 + } +} + +variable "nimbus_besu" { + default = { + name = "nimbus-besu" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "nimbus_nethermind" { + default = { + name = "nimbus-nethermind" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "nimbus_ethereumjs" { + default = { + name = "nimbus-ethereumjs" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "nimbus_erigon" { + default = { + name = "nimbus-erigon" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "nimbus_reth" { + default = { + name = "nimbus-reth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +# Teku +variable "teku_geth" { + default = { + name = "teku-geth" + count = 3 + validator_start = 600 + validator_end = 900 + } +} + +variable "teku_besu" { + default = { + name = "teku-besu" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "teku_nethermind" { + default = { + name = "teku-nethermind" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "teku_ethereumjs" { + default = { + name = "teku-ethereumjs" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "teku_erigon" { + default = { + name = "teku-erigon" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "teku_reth" { + default = { + name = "teku-reth" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "grandine_geth" { + default = { + name = "grandine-geth" + count = 0 + validator_start = 900 + validator_end = 1000 + } +} + +variable "grandine_besu" { + default = { + name = "grandine-besu" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "grandine_nethermind" { + default = { + name = "grandine-nethermind" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "grandine_ethereumjs" { + default = { + name = "grandine-ethereumjs" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "grandine_erigon" { + default = { + name = "grandine-erigon" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + +variable "grandine_reth" { + default = { + name = "grandine-reth" + count = 0 + validator_start = 0 + validator_end = 0 + } +}