diff --git a/starship/charts/devnet/defaults.yaml b/starship/charts/devnet/defaults.yaml index e08a8e26..ab1ad658 100644 --- a/starship/charts/devnet/defaults.yaml +++ b/starship/charts/devnet/defaults.yaml @@ -793,6 +793,47 @@ defaultChains: exponent: 6 coingecko_id: stake keywords: [ "stake" ] + ethereum: + image: ghcr.io/hyperweb-io/starship/ethereum/client-go:latest + home: /ethereum + binary: geth + prefix: eth + denom: wei + prettyName: Ethereum Execution Chain + coins: 100000000000000wei + hdPath: m/44'/60'/0'/0/0 + coinType: 60 + repo: https://github.com/ethereum/go-ethereum + assets: + - base: wei + name: "Ether" + description: "The native token of Ethereum" + display: "eth" + symbol: "ETH" + logo_URIs: + png: "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/eth-white.png" + svg: "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/eth-white.svg" + denom_units: + - denom: wei + exponent: 0 + - denom: gwei + exponent: 9 + - denom: ether + exponent: 18 + aliases: + - "ether" + coingecko_id: "ethereum" + config: + beacon: + enabled: true + image: "ghcr.io/hyperweb-io/starship/prysm/beacon-chain:v5.2.0" + numValidator: 1 + validator: + enabled: true + image: "ghcr.io/hyperweb-io/starship/prysm/validator:v5.2.0" + numValidator: 1 + prysmctl: + image: "ghcr.io/hyperweb-io/starship/prysm/cmd/prysmctl:v5.2.0" eth: storageClassName: hostpath genesisStateUrl: https://github.com/eth-clients/merge-testnets/blob/main/sepolia/genesis.ssz diff --git a/starship/charts/devnet/templates/chains/cosmos/cometmock.yaml b/starship/charts/devnet/templates/chains/cosmos/cometmock.yaml index 80b4a38d..5f98b128 100644 --- a/starship/charts/devnet/templates/chains/cosmos/cometmock.yaml +++ b/starship/charts/devnet/templates/chains/cosmos/cometmock.yaml @@ -1,5 +1,5 @@ {{- range $chain := .Values.chains }} -{{- if ne $chain.name "virtual" }} +{{- if not (hasPrefix "ethereum" $chain.name) }} {{ $dataExposer := dict "chain" $chain.id "port" ($.Values.exposer.ports.rest | quote | default "8081") }} {{ $defaultFile := $.Files.Get "defaults.yaml" | fromYaml }} diff --git a/starship/charts/devnet/templates/chains/cosmos/configmap.yaml b/starship/charts/devnet/templates/chains/cosmos/configmap.yaml index 13b7f144..ac7df34e 100644 --- a/starship/charts/devnet/templates/chains/cosmos/configmap.yaml +++ b/starship/charts/devnet/templates/chains/cosmos/configmap.yaml @@ -1,5 +1,5 @@ {{- range $chain := .Values.chains }} -{{- if ne $chain.name "virtual" }} +{{- if not (hasPrefix "ethereum" $chain.name) }} {{ $defaultFile := $.Files.Get "defaults.yaml" | fromYaml }} {{ $chain := include "devnet.fullchain" (dict "name" $chain.id "file" $defaultFile "context" $) | fromJson }} --- diff --git a/starship/charts/devnet/templates/chains/cosmos/genesis.yaml b/starship/charts/devnet/templates/chains/cosmos/genesis.yaml index 2e89a24d..fd3eb8e1 100644 --- a/starship/charts/devnet/templates/chains/cosmos/genesis.yaml +++ b/starship/charts/devnet/templates/chains/cosmos/genesis.yaml @@ -1,5 +1,5 @@ {{- range $chain := .Values.chains }} -{{- if ne $chain.name "virtual" }} +{{- if not (hasPrefix "ethereum" $chain.name) }} {{ $dataExposer := dict "chain" $chain.id "port" ($.Values.exposer.ports.rest | quote | default "8081") }} {{ $defaultFile := $.Files.Get "defaults.yaml" | fromYaml }} diff --git a/starship/charts/devnet/templates/chains/cosmos/service.yaml b/starship/charts/devnet/templates/chains/cosmos/service.yaml index be0e4883..75234cae 100644 --- a/starship/charts/devnet/templates/chains/cosmos/service.yaml +++ b/starship/charts/devnet/templates/chains/cosmos/service.yaml @@ -1,6 +1,6 @@ {{ $portMap := dict "p2p" 26656 "address" 26658 "grpc" 9090 "grpc-web" 9091 "rest" 1317 }} {{- range $chain := .Values.chains }} -{{- if ne $chain.name "virtual" }} +{{- if not (hasPrefix "ethereum" $chain.name) }} {{ $defaultFile := $.Files.Get "defaults.yaml" | fromYaml }} {{ $chain := include "devnet.fullchain" (dict "name" $chain.id "file" $defaultFile "context" $) | fromJson }} diff --git a/starship/charts/devnet/templates/chains/cosmos/validator.yaml b/starship/charts/devnet/templates/chains/cosmos/validator.yaml index 3e9438e1..0012b008 100644 --- a/starship/charts/devnet/templates/chains/cosmos/validator.yaml +++ b/starship/charts/devnet/templates/chains/cosmos/validator.yaml @@ -1,5 +1,5 @@ {{- range $chain := .Values.chains }} -{{- if ne $chain.name "virtual" }} +{{- if not (hasPrefix "ethereum" $chain.name) }} {{- if gt $chain.numValidators 1.0 }} {{ $dataExposer := dict "chain" $chain.id "port" ($.Values.exposer.ports.rest | quote | default "8081") }} {{ $defaultFile := $.Files.Get "defaults.yaml" | fromYaml }} diff --git a/starship/charts/devnet/templates/chains/eth/beacon.yaml b/starship/charts/devnet/templates/chains/eth/beacon.yaml new file mode 100644 index 00000000..193749fb --- /dev/null +++ b/starship/charts/devnet/templates/chains/eth/beacon.yaml @@ -0,0 +1,188 @@ +{{- range $chain := .Values.chains }} +{{- if hasPrefix "ethereum-beacon" $chain.name }} +{{ $defaultFile := $.Files.Get "defaults.yaml" | fromYaml }} + +{{ $chain := include "devnet.fullchain" (dict "name" $chain.id "file" $defaultFile "context" $) | fromJson }} +{{ $initParams := dict "chains" (list $chain.id) "port" $.Values.exposer.ports.rest "context" $ }} + +{{ $executionChain := include "devnet.fullchain" (dict "name" $chain.config.execution.id "file" $defaultFile "context" $) | fromJson }} +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ $chain.name }}-{{ $chain.id }} + namespace: {{ $.Release.Namespace }} + labels: + app: {{ $chain.name }}-{{ $chain.id }} +spec: + serviceName: {{ $chain.name }}-{{ $chain.id }} + replicas: {{ $chain.replicas }} + selector: + matchLabels: + app.kubernetes.io/instance: {{ $chain.name }}-{{ $chain.id }} + app.kubernetes.io/name: {{ $chain.name }}-{{ $chain.id }} + template: + metadata: + annotations: + quality: release + role: api-gateway + sla: high + tier: gateway + labels: + app.kubernetes.io/instance: {{ $chain.name }}-{{ $chain.id }} + app.kubernetes.io/type: {{ $chain.name }}-{{ $chain.id }} + app.kubernetes.io/name: {{ $chain.name }}-{{ $chain.id }} + app.kubernetes.io/rawname: "{{ $chain.id }}" + app.kubernetes.io/version: {{ $.Chart.AppVersion }} + spec: + {{- include "imagePullSecrets" $chain | indent 6 }} + initContainers: + - name: init-genesis + image: {{ $chain.config.prysmctl.image }} + imagePullPolicy: Always + command: + - bash + - "-c" + - | + mkdir -p /ethereum/consensus /ethereum/execution + cp /config-execution/genesis.json /ethereum/execution/genesis.json + cp /config-beacon/config.yaml /ethereum/consensus/config.yaml + + echo "Initializing genesis" + prysmctl testnet generate-genesis \ + --fork=capella \ + --num-validators={{ $chain.config.validator.numValidator }} \ + --genesis-time-delay=15 \ + --output-ssz=/ethereum/consensus/genesis.ssz \ + --chain-config-file=/ethereum/consensus/config.yaml \ + --geth-genesis-json-in=/ethereum/execution/genesis.json \ + --geth-genesis-json-out=/ethereum/execution/genesis.json + + echo "Copy secrets over" + cp /config-execution/jwt.hex /etc/secrets/jwt.hex + resources: {{- include "devnet.node.resources" ( dict "node" $chain "context" $ ) | trim | nindent 12 }} + volumeMounts: + - name: secrets + mountPath: /etc/secrets + - name: config-beacon + mountPath: /config-beacon + - name: config-execution + mountPath: /config-execution + - name: ethereum + mountPath: /ethereum + containers: + - name: node + image: {{ $chain.image }} + imagePullPolicy: Always + env: + - name: HTTP_PORT + value: "8545" + - name: WS_PORT + value: "8546" + - name: RPC_PORT + value: "8551" + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + command: + - bash + - "-c" + - | + echo "Waiting 15 seconds for execution client to be ready..." + sleep 15 + + echo "Starting consensus chain" + beacon-chain \ + --execution-endpoint=http://{{ $executionChain.name }}-{{ $executionChain.id }}-0.{{ $executionChain.name }}-{{ $executionChain.id }}.default.svc.cluster.local:8551 \ + --jwt-secret=/etc/secrets/jwt.hex \ + --accept-terms-of-use \ + --http-host 0.0.0.0 \ + --rpc-host 0.0.0.0 \ + --chain-id {{ $executionChain.id }} \ + --contract-deployment-block=0 \ + --datadir /ethereum/consensus \ + --genesis-state /ethereum/consensus/genesis.ssz \ + --min-sync-peers=0 \ + --chain-config-file=/ethereum/consensus/config.yaml \ + --network-id {{ $executionChain.id }} \ + --suggested-fee-recipient=0x123463a4B065722E99115D6c222f267d9cABb524 \ + --minimum-peers-per-subnet=0 \ + --force-clear-db + resources: {{- include "devnet.node.resources" ( dict "node" $chain "context" $ ) | trim | nindent 12 }} + volumeMounts: + - name: ethereum + mountPath: /ethereum + - name: secrets + mountPath: /etc/secrets + - name: validator + image: {{ $chain.config.validator.image }} + imagePullPolicy: Always + env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + command: + - bash + - "-c" + - | + echo "Waiting 15 seconds for execution client to be ready..." + sleep 20 + mkdir -p /ethereum/consensus/validator + echo "Starting validator node" + validator \ + --accept-terms-of-use \ + --beacon-rpc-provider=localhost:4000 \ + --datadir=/ethereum/consensus/validator \ + --interop-num-validators={{ $chain.config.validator.numValidator }} \ + --interop-start-index=0 \ + --force-clear-db \ + --chain-config-file=/ethereum/consensus/config.yaml \ + --suggested-fee-recipient=0x0C46c2cAFE097b4f7e1BB868B89e5697eE65f934 + resources: {{- include "devnet.node.resources" ( dict "node" $chain "context" $ ) | trim | nindent 12 }} + volumeMounts: + - name: ethereum + mountPath: /ethereum + - name: secrets + mountPath: /etc/secrets + - name: exposer + image: {{ $.Values.exposer.image }} + imagePullPolicy: Always + env: + - name: GENESIS_HOST + value: "{{ $chain.name }}-{{ $chain.id }}-0" + - name: GENESIS_PORT + value: "{{ $.Values.exposer.ports.rest }}" + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: EXPOSER_HTTP_PORT + value: "8081" + - name: EXPOSER_GRPC_PORT + value: "9099" + - name: EXPOSER_GENESIS_FILE + value: /ethereum/execution/genesis.json + - name: EXPOSER_GENESIS_SSZ + value: /ethereum/execution/genesis.ssz + - name: EXPOSER_PRIV_VAL_FILE + value: {{ $chain.home }}/config/priv_validator_key.json + - name: EXPOSER_NODE_KEY_FILE + value: {{ $chain.home }}/config/node_key.json + - name: EXPOSER_NODE_ID_FILE + value: {{ $chain.home }}/config/node_id.json + - name: EXPOSER_PRIV_VAL_STATE_FILE + value: {{ $chain.home }}/data/priv_validator_state.json + resources: {{- include "devnet.exposer.resources" ( dict "node" $chain "context" $ ) | trim | nindent 12 }} + volumes: + - name: config + configMap: + name: config-ethereum + - name: ethereum + emptyDir: { } + - name: secrets + emptyDir: { } +--- +{{- end }} +{{- end }} \ No newline at end of file diff --git a/starship/charts/devnet/templates/chains/eth/execution.yaml b/starship/charts/devnet/templates/chains/eth/execution.yaml new file mode 100644 index 00000000..ed72c9f4 --- /dev/null +++ b/starship/charts/devnet/templates/chains/eth/execution.yaml @@ -0,0 +1,289 @@ +{{- range $chain := .Values.chains }} +{{- if hasPrefix "ethereum" $chain.name }} +{{ $defaultFile := $.Files.Get "defaults.yaml" | fromYaml }} + +{{ $chain := include "devnet.fullchain" (dict "name" $chain.id "file" $defaultFile "context" $) | fromJson }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-ethereum +data: + genesis.json: |- + { + "config": { + "chainId": {{ $chain.id }}, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "londonBlock": 0, + "berlinBlock": 0, + "terminalTotalDifficulty": 0, + "terminalTotalDifficultyPassed": true + }, + "nonce": "0x0", + "timestamp": "0x677d172f", + "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0x0000000000000000000000000000000000000001": { + "balance": "0x3635c9adc5dea00000" + }, + "0x4242424242424242424242424242424242424242": { + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100b6578063621fd130146101e3578063c5f2892f14610273575b600080fd5b34801561005057600080fd5b5061009c6004803603602081101561006757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061029e565b604051808215151515815260200191505060405180910390f35b6101e1600480360360808110156100cc57600080fd5b81019080803590602001906401000000008111156100e957600080fd5b8201836020820111156100fb57600080fd5b8035906020019184600183028401116401000000008311171561011d57600080fd5b90919293919293908035906020019064010000000081111561013e57600080fd5b82018360208201111561015057600080fd5b8035906020019184600183028401116401000000008311171561017257600080fd5b90919293919293908035906020019064010000000081111561019357600080fd5b8201836020820111156101a557600080fd5b803590602001918460018302840111640100000000831117156101c757600080fd5b909192939192939080359060200190929190505050610370565b005b3480156101ef57600080fd5b506101f8610fd0565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561023857808201518184015260208101905061021d565b50505050905090810190601f1680156102655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561027f57600080fd5b50610288610fe2565b6040518082815260200191505060405180910390f35b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061036957507f85640907000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b603087879050146103cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806116ec6026913960400191505060405180910390fd5b60208585905014610428576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806116836036913960400191505060405180910390fd5b60608383905014610484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061175f6029913960400191505060405180910390fd5b670de0b6b3a76400003410156104e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806117396026913960400191505060405180910390fd5b6000633b9aca0034816104f457fe5b061461054b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806116b96033913960400191505060405180910390fd5b6000633b9aca00348161055a57fe5b04905067ffffffffffffffff80168111156105c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806117126027913960400191505060405180910390fd5b60606105cb82611314565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a610600602054611314565b60405180806020018060200180602001806020018060200186810386528e8e82818152602001925080828437600081840152601f19601f82011690508083019250505086810385528c8c82818152602001925080828437600081840152601f19601f82011690508083019250505086810384528a818151815260200191508051906020019080838360005b838110156106a657808201518184015260208101905061068b565b50505050905090810190601f1680156106d35780820380516001836020036101000a031916815260200191505b508681038352898982818152602001925080828437600081840152601f19601f820116905080830192505050868103825287818151815260200191508051906020019080838360005b8381101561073757808201518184015260208101905061071c565b50505050905090810190601f1680156107645780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b6040516020018084848082843780830192505050826fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff1916815260100193505050506040516020818303038152906040526040518082805190602001908083835b6020831061080e57805182526020820191506020810190506020830392506107eb565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610850573d6000803e3d6000fd5b5050506040513d602081101561086557600080fd5b8101908080519060200190929190505050905060006002808888600090604092610891939291906115da565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108eb57805182526020820191506020810190506020830392506108c8565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa15801561092d573d6000803e3d6000fd5b5050506040513d602081101561094257600080fd5b8101908080519060200190929190505050600289896040908092610968939291906115da565b6000801b604051602001808484808284378083019250505082815260200193505050506040516020818303038152906040526040518082805190602001908083835b602083106109cd57805182526020820191506020810190506020830392506109aa565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610a0f573d6000803e3d6000fd5b5050506040513d6020811015610a2457600080fd5b810190808051906020019092919050505060405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610a8e5780518252602082019150602081019050602083039250610a6b565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610ad0573d6000803e3d6000fd5b5050506040513d6020811015610ae557600080fd5b810190808051906020019092919050505090506000600280848c8c604051602001808481526020018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610b615780518252602082019150602081019050602083039250610b3e565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610ba3573d6000803e3d6000fd5b5050506040513d6020811015610bb857600080fd5b8101908080519060200190929190505050600286600060401b866040516020018084805190602001908083835b60208310610c085780518252602082019150602081019050602083039250610be5565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610c935780518252602082019150602081019050602083039250610c70565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610cd5573d6000803e3d6000fd5b5050506040513d6020811015610cea57600080fd5b810190808051906020019092919050505060405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610d545780518252602082019150602081019050602083039250610d31565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610d96573d6000803e3d6000fd5b5050506040513d6020811015610dab57600080fd5b81019080805190602001909291905050509050858114610e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252605481526020018061162f6054913960600191505060405180910390fd5b6001602060020a0360205410610e77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061160e6021913960400191505060405180910390fd5b60016020600082825401925050819055506000602054905060008090505b6020811015610fb75760018083161415610ec8578260008260208110610eb757fe5b018190555050505050505050610fc7565b600260008260208110610ed757fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610f335780518252602082019150602081019050602083039250610f10565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610f75573d6000803e3d6000fd5b5050506040513d6020811015610f8a57600080fd5b8101908080519060200190929190505050925060028281610fa757fe5b0491508080600101915050610e95565b506000610fc057fe5b5050505050505b50505050505050565b6060610fdd602054611314565b905090565b6000806000602054905060008090505b60208110156111d057600180831614156110e05760026000826020811061101557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310611071578051825260208201915060208101905060208303925061104e565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa1580156110b3573d6000803e3d6000fd5b5050506040513d60208110156110c857600080fd5b810190808051906020019092919050505092506111b6565b600283602183602081106110f057fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061114b5780518252602082019150602081019050602083039250611128565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa15801561118d573d6000803e3d6000fd5b5050506040513d60208110156111a257600080fd5b810190808051906020019092919050505092505b600282816111c057fe5b0491508080600101915050610ff2565b506002826111df602054611314565b600060401b6040516020018084815260200183805190602001908083835b6020831061122057805182526020820191506020810190506020830392506111fd565b6001836020036101000a0380198251168184511680821785525050505050509050018267ffffffffffffffff191667ffffffffffffffff1916815260180193505050506040516020818303038152906040526040518082805190602001908083835b602083106112a55780518252602082019150602081019050602083039250611282565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa1580156112e7573d6000803e3d6000fd5b5050506040513d60208110156112fc57600080fd5b81019080805190602001909291905050509250505090565b6060600867ffffffffffffffff8111801561132e57600080fd5b506040519080825280601f01601f1916602001820160405280156113615781602001600182028036833780820191505090505b50905060008260c01b90508060076008811061137957fe5b1a60f81b8260008151811061138a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806006600881106113c657fe5b1a60f81b826001815181106113d757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060056008811061141357fe5b1a60f81b8260028151811061142457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060046008811061146057fe5b1a60f81b8260038151811061147157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806003600881106114ad57fe5b1a60f81b826004815181106114be57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806002600881106114fa57fe5b1a60f81b8260058151811061150b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060016008811061154757fe5b1a60f81b8260068151811061155857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060006008811061159457fe5b1a60f81b826007815181106115a557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b600080858511156115ea57600080fd5b838611156115f757600080fd5b600185028301915084860390509450949250505056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220230afd4b6e3551329e50f1239e08fa3ab7907b77403c4f237d9adf679e8e43cf64736f6c634300060b0033", + "balance": "0x0" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0x7", + "excessBlobGas": null, + "blobGasUsed": null + } + jwt.hex: |- + 3fe89f53368415a79e065f3c885b7273b41540d5598488ef475cfdc4009850a4 + config.yaml: |- + CONFIG_NAME: interop + PRESET_BASE: interop + + # Genesis + GENESIS_FORK_VERSION: 0x20000089 + + # Altair + ALTAIR_FORK_EPOCH: 0 + ALTAIR_FORK_VERSION: 0x20000090 + + # Merge + BELLATRIX_FORK_EPOCH: 0 + BELLATRIX_FORK_VERSION: 0x20000091 + TERMINAL_TOTAL_DIFFICULTY: 0 + + # Capella + CAPELLA_FORK_EPOCH: 0 + CAPELLA_FORK_VERSION: 0x20000092 + MAX_WITHDRAWALS_PER_PAYLOAD: 16 + + # Deneb + DENEB_FORK_VERSION: 0x20000093 + + # Electra + ELECTRA_FORK_VERSION: 0x20000094 + + # Time parameters + SECONDS_PER_SLOT: 12 + SLOTS_PER_EPOCH: 6 + + # Deposit contract + DEPOSIT_CONTRACT_ADDRESS: 0x4242424242424242424242424242424242424242 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ $chain.name }}-{{ $chain.id }} + namespace: {{ $.Release.Namespace }} + labels: + app: {{ $chain.name }}-{{ $chain.id }} +spec: + serviceName: {{ $chain.name }}-{{ $chain.id }} + replicas: {{ $chain.replicas }} + selector: + matchLabels: + app.kubernetes.io/instance: {{ $chain.name }}-{{ $chain.id }} + app.kubernetes.io/name: {{ $chain.name }}-{{ $chain.id }} + template: + metadata: + annotations: + quality: release + role: api-gateway + sla: high + tier: gateway + labels: + app.kubernetes.io/instance: {{ $chain.name }}-{{ $chain.id }} + app.kubernetes.io/type: {{ $chain.name }}-{{ $chain.id }} + app.kubernetes.io/name: {{ $chain.name }}-{{ $chain.id }} + app.kubernetes.io/rawname: "{{ $chain.id }}" + app.kubernetes.io/version: {{ $.Chart.AppVersion }} + spec: + {{- include "imagePullSecrets" $chain | indent 6 }} + initContainers: + - name: init-genesis-beacon + image: {{ $chain.config.prysmctl.image }} + imagePullPolicy: IfNotPresent + command: + - bash + - "-c" + - | + mkdir -p /ethereum/consensus /ethereum/execution + cp /config/genesis.json /ethereum/execution/genesis.json + cp /config/config.yaml /ethereum/consensus/config.yaml + + echo "Initializing genesis" + prysmctl testnet generate-genesis \ + --fork=capella \ + --num-validators={{ $chain.config.validator.numValidator }} \ + --genesis-time-delay=15 \ + --output-ssz=/ethereum/consensus/genesis.ssz \ + --chain-config-file=/ethereum/consensus/config.yaml \ + --geth-genesis-json-in=/ethereum/execution/genesis.json \ + --geth-genesis-json-out=/ethereum/execution/genesis.json + + echo "Copy secrets over" + cp /config/jwt.hex /etc/secrets/jwt.hex + resources: {{- include "devnet.node.resources" ( dict "node" $chain "context" $ ) | trim | nindent 12 }} + volumeMounts: + - name: secrets + mountPath: /etc/secrets + - name: config + mountPath: /config + - name: ethereum + mountPath: /ethereum + - name: init-genesis-execution + image: {{ $chain.image }} + imagePullPolicy: IfNotPresent + command: + - bash + - "-c" + - | + echo "Initializing genesis geth" + geth --datadir /ethereum/execution init /ethereum/execution/genesis.json + resources: {{- include "devnet.node.resources" ( dict "node" $chain "context" $ ) | trim | nindent 12 }} + volumeMounts: + - name: secrets + mountPath: /etc/secrets + - name: config + mountPath: /config + - name: ethereum + mountPath: /ethereum + containers: + - name: geth + image: {{ $chain.image }} + imagePullPolicy: IfNotPresent + env: + - name: HTTP_PORT + value: "8545" + - name: WS_PORT + value: "8546" + - name: RPC_PORT + value: "8551" + command: + - bash + - "-c" + - | + echo "Starting execution chain" + geth --datadir /ethereum/execution --http \ + --http.addr=0.0.0.0 \ + --http.port=$HTTP_PORT \ + --http.api=eth,net,web3,debug \ + --ws --ws.addr=0.0.0.0 \ + --ws.port=$WS_PORT \ + --authrpc.addr=0.0.0.0 \ + --authrpc.port=$RPC_PORT \ + --nodiscover \ + --http.corsdomain=* \ + --ws.api=eth,net,web3 \ + --ws.origins=* \ + --http.vhosts=* \ + --authrpc.vhosts=* \ + --authrpc.jwtsecret=/etc/secrets/jwt.hex \ + --allow-insecure-unlock \ + --unlock=0x123463a4B065722E99115D6c222f267d9cABb524 \ + --password=/dev/null \ + --syncmode=full \ + --networkid={{ $chain.id }} \ + --mine \ + --log.vmodule=engine=6 + resources: {{- include "devnet.node.resources" ( dict "node" $chain "context" $ ) | trim | nindent 12 }} + volumeMounts: + - name: ethereum + mountPath: /ethereum + - name: secrets + mountPath: /etc/secrets + - name: beacon-chain + image: {{ $chain.config.beacon.image }} + imagePullPolicy: Always + env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + command: + - bash + - "-c" + - | + echo "Waiting 15 seconds for execution client to be ready..." + sleep 15 + + echo "Starting consensus chain" + beacon-chain \ + --execution-endpoint=http://0.0.0.0:8551 \ + --jwt-secret=/etc/secrets/jwt.hex \ + --accept-terms-of-use \ + --http-host 0.0.0.0 \ + --rpc-host 0.0.0.0 \ + --chain-id {{ $chain.id }} \ + --contract-deployment-block=0 \ + --datadir /ethereum/consensus \ + --genesis-state /ethereum/consensus/genesis.ssz \ + --min-sync-peers=0 \ + --chain-config-file=/ethereum/consensus/config.yaml \ + --network-id {{ $chain.id }} \ + --suggested-fee-recipient=0x123463a4B065722E99115D6c222f267d9cABb524 \ + --minimum-peers-per-subnet=0 \ + --force-clear-db + resources: {{- include "devnet.node.resources" ( dict "node" $chain "context" $ ) | trim | nindent 12 }} + volumeMounts: + - name: ethereum + mountPath: /ethereum + - name: secrets + mountPath: /etc/secrets + - name: validator + image: {{ $chain.config.validator.image }} + imagePullPolicy: Always + env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + command: + - bash + - "-c" + - | + echo "Waiting 15 seconds for execution client to be ready..." + sleep 20 + mkdir -p /ethereum/consensus/validator + echo "Starting validator node" + validator \ + --accept-terms-of-use \ + --beacon-rpc-provider=localhost:4000 \ + --datadir=/ethereum/consensus/validator \ + --interop-num-validators={{ $chain.config.validator.numValidator }} \ + --interop-start-index=0 \ + --force-clear-db \ + --chain-config-file=/ethereum/consensus/config.yaml \ + --suggested-fee-recipient=0x0C46c2cAFE097b4f7e1BB868B89e5697eE65f934 + resources: {{- include "devnet.node.resources" ( dict "node" $chain "context" $ ) | trim | nindent 12 }} + volumeMounts: + - name: ethereum + mountPath: /ethereum + - name: secrets + mountPath: /etc/secrets + volumes: + - name: config + configMap: + name: config-ethereum + - name: ethereum + emptyDir: { } + - name: secrets + emptyDir: { } +--- +{{- end }} +{{- end }} \ No newline at end of file diff --git a/starship/charts/devnet/templates/chains/eth/service.yaml b/starship/charts/devnet/templates/chains/eth/service.yaml new file mode 100644 index 00000000..dcfe010a --- /dev/null +++ b/starship/charts/devnet/templates/chains/eth/service.yaml @@ -0,0 +1,27 @@ +{{ $portMap := dict "http" 8545 "ws" 8546 "rpc" 8551 }} +{{- range $chain := .Values.chains }} +{{- if hasPrefix "ethereum-execution" $chain.name }} +{{ $defaultFile := $.Files.Get "defaults.yaml" | fromYaml }} + +{{ $chain := include "devnet.fullchain" (dict "name" $chain.id "file" $defaultFile "context" $) | fromJson }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ $chain.name }}-{{ $chain.id }} + labels: + app.kubernetes.io/name: {{ $chain.name }}-{{ $chain.id }} +spec: + clusterIP: None + ports: + {{- range $name, $port := $portMap }} + - name: {{ $name }} + port: {{ $port }} + protocol: TCP + targetPort: {{ $port }} + {{- end }} + selector: + app.kubernetes.io/name: {{ $chain.name }}-{{ $chain.id }} +--- +{{- end }} +{{- end }} diff --git a/starship/charts/devnet/values.schema.json b/starship/charts/devnet/values.schema.json index 327f27b8..b573808e 100644 --- a/starship/charts/devnet/values.schema.json +++ b/starship/charts/devnet/values.schema.json @@ -112,7 +112,7 @@ "type": "object", "properties": { "id": { - "type": "string" + "type": ["string", "integer"] }, "name": { "type": "string", @@ -146,7 +146,8 @@ "agoric", "kujira", "hyperweb", - "noble" + "noble", + "ethereum" ] }, "numValidators": { @@ -561,6 +562,9 @@ }, "readinessProbe": { "type": "object" + }, + "config": { + "type": "object" } }, "additionalProperties": false, diff --git a/starship/tests/e2e/configs/eth.yaml b/starship/tests/e2e/configs/eth.yaml new file mode 100644 index 00000000..de33f868 --- /dev/null +++ b/starship/tests/e2e/configs/eth.yaml @@ -0,0 +1,7 @@ +chains: + - id: 1337 + name: ethereum + numValidators: 1 + ports: + rest: 8545 + rpc: 8551