diff --git a/.gitmodules b/.gitmodules index 8e8091378..8e75b5bce 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,3 @@ [submodule "go-ethereum"] path = go-ethereum url = https://github.com/morph-l2/go-ethereum.git -branch = release/2.0.x diff --git a/Makefile b/Makefile index 5b554518f..14fb195ef 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ################## update dependencies #################### - +ETHEREUM_SUBMODULE_COMMIT_OR_TAG := morph-v2.0.8 ETHEREUM_TARGET_VERSION := morph-v2.0.8 TENDERMINT_TARGET_VERSION := v0.3.2 @@ -39,7 +39,13 @@ update: submodules: git submodule update --init - git submodule update --remote + @if [ -d "go-ethereum" ]; then \ + echo "Updating go-ethereum submodule to tag $(ETHEREUM_SUBMODULE_COMMIT_OR_TAG)..."; \ + cd go-ethereum && \ + git fetch --tags && \ + git checkout $(ETHEREUM_SUBMODULE_COMMIT_OR_TAG) && \ + cd ..; \ + fi .PHONY: submodules ################## bindings #################### @@ -141,7 +147,7 @@ devnet-down: cd ops/docker && docker compose -f docker-compose-4nodes.yml down .PHONY: devnet-down -devnet-clean-build: devnet-down +devnet-clean-build: devnet-down devnet-l1-clean docker volume ls --filter name=docker-* --format='{{.Name}}' | xargs -r docker volume rm rm -rf ops/l2-genesis/.devnet rm -rf ops/docker/.devnet @@ -157,6 +163,10 @@ devnet-clean: devnet-clean-build devnet-l1: python3 ops/devnet-morph/main.py --polyrepo-dir=. --only-l1 +devnet-l1-clean: + @cd ops/docker && ./layer1/scripts/clean.sh +.PHONY: devnet-l1-clean + devnet-logs: @(cd ops/docker && docker-compose logs -f) .PHONY: devnet-logs diff --git a/go.work.sum b/go.work.sum index 7fb84abf4..7006bf015 100644 --- a/go.work.sum +++ b/go.work.sum @@ -44,6 +44,7 @@ cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMv cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= cloud.google.com/go/dataplex v1.14.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= @@ -66,6 +67,7 @@ cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgN cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= cloud.google.com/go/gkemulticloud v1.1.0/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= @@ -167,7 +169,10 @@ github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8V github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= +github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= @@ -348,10 +353,12 @@ github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPP github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -380,6 +387,7 @@ github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= @@ -423,6 +431,7 @@ github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpT github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/ianlancetaylor/demangle v0.0.0-20220517205856-0058ec4f073c/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/iden3/go-iden3-crypto v0.0.12/go.mod h1:swXIv0HFbJKobbQBtsB50G7IHr6PbTowutSew/iBEoo= @@ -462,11 +471,13 @@ github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= @@ -481,9 +492,11 @@ github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4F github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -520,6 +533,8 @@ github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= @@ -574,6 +589,7 @@ github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7 github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= @@ -681,6 +697,7 @@ github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqri github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= @@ -693,6 +710,7 @@ github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsr github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= @@ -711,6 +729,7 @@ go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znn go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -779,6 +798,7 @@ golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2 golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/node/derivation/derivation.go b/node/derivation/derivation.go index 25afbc0d9..5eccd2e9c 100644 --- a/node/derivation/derivation.go +++ b/node/derivation/derivation.go @@ -359,10 +359,10 @@ func (d *Derivation) fetchRollupDataByTxHash(txHash common.Hash, blockNumber uin copy(blob[:], b) // Verify blob - if err := VerifyBlobProof(&blob, commitment, kzg4844.Proof(sidecar.KZGProof)); err != nil { - d.logger.Error("Blob verification failed", "error", err) - continue - } + //if err := VerifyBlobProof(&blob, commitment, kzg4844.Proof(sidecar.KZGProof)); err != nil { + // d.logger.Error("Blob verification failed", "error", err) + // continue + //} // Add to sidecar blobTxSidecar.Blobs = append(blobTxSidecar.Blobs, *blob.KZGBlob()) diff --git a/node/types/blob.go b/node/types/blob.go index 847e15ebd..8abbeb4c2 100644 --- a/node/types/blob.go +++ b/node/types/blob.go @@ -52,7 +52,7 @@ func RetrieveBlobBytes(blob *kzg4844.Blob) ([]byte, error) { return data, nil } -func makeBCP(bz []byte) (b kzg4844.Blob, c kzg4844.Commitment, p kzg4844.Proof, err error) { +func makeBlobCommitment(bz []byte) (b kzg4844.Blob, c kzg4844.Commitment, err error) { blob, err := MakeBlobCanonical(bz) if err != nil { return @@ -62,10 +62,6 @@ func makeBCP(bz []byte) (b kzg4844.Blob, c kzg4844.Commitment, p kzg4844.Proof, if err != nil { return } - p, err = kzg4844.ComputeBlobProof(&b, c) - if err != nil { - return - } return } @@ -85,20 +81,19 @@ func MakeBlobTxSidecar(blobBytes []byte) (*eth.BlobTxSidecar, error) { err error blobs = make([]kzg4844.Blob, blobCount) commitments = make([]kzg4844.Commitment, blobCount) - proofs = make([]kzg4844.Proof, blobCount) ) switch blobCount { case 1: - blobs[0], commitments[0], proofs[0], err = makeBCP(blobBytes) + blobs[0], commitments[0], err = makeBlobCommitment(blobBytes) if err != nil { return nil, err } case 2: - blobs[0], commitments[0], proofs[0], err = makeBCP(blobBytes[:MaxBlobBytesSize]) + blobs[0], commitments[0], err = makeBlobCommitment(blobBytes[:MaxBlobBytesSize]) if err != nil { return nil, err } - blobs[1], commitments[1], proofs[1], err = makeBCP(blobBytes[MaxBlobBytesSize:]) + blobs[1], commitments[1], err = makeBlobCommitment(blobBytes[MaxBlobBytesSize:]) if err != nil { return nil, err } @@ -106,7 +101,6 @@ func MakeBlobTxSidecar(blobBytes []byte) (*eth.BlobTxSidecar, error) { return ð.BlobTxSidecar{ Blobs: blobs, Commitments: commitments, - Proofs: proofs, }, nil } diff --git a/ops/devnet-morph/devnet/__init__.py b/ops/devnet-morph/devnet/__init__.py index 061c35350..4ec81c897 100644 --- a/ops/devnet-morph/devnet/__init__.py +++ b/ops/devnet-morph/devnet/__init__.py @@ -73,21 +73,51 @@ def main(): def devnet_l1(paths, result=None): log.info('Starting L1.') - run_command(['docker', 'compose', '-f', 'docker-compose-4nodes.yml', 'build', '--no-cache', 'l1'], check=False, - cwd=paths.ops_dir, env={ + + layer1_dir = pjoin(paths.ops_dir, 'layer1') + genesis_dir = pjoin(layer1_dir, 'genesis') + jwt_dir = pjoin(layer1_dir, 'jwt') + + # Check if genesis files exist, if not generate them + genesis_json = pjoin(genesis_dir, 'genesis.json') + genesis_ssz = pjoin(genesis_dir, 'genesis.ssz') + jwt_secret = pjoin(jwt_dir, 'jwtsecret') + + if not os.path.exists(genesis_json) or not os.path.exists(genesis_ssz) or not os.path.exists(jwt_secret): + log.info('Genesis files not found, generating...') + generate_script = pjoin(layer1_dir, 'scripts', 'generate-genesis.sh') + if os.path.exists(generate_script): + run_command(['bash', generate_script], check=True, cwd=layer1_dir) + else: + log.error(f'Genesis generation script not found at {generate_script}') + raise FileNotFoundError(f'Genesis generation script not found') + + # Start layer1 services + log.info('Starting layer1 services (layer1-el, layer1-cl, layer1-vc)...') + run_command(['docker', 'compose', '-f', 'docker-compose-4nodes.yml', 'up', '-d', + 'layer1-el', 'layer1-cl', 'layer1-vc'], check=False, cwd=paths.ops_dir, env={ 'PWD': paths.ops_dir }) - run_command(['docker', 'compose', '-f', 'docker-compose-4nodes.yml', 'up', '-d', 'l1'], check=False, - cwd=paths.ops_dir, env={ - 'PWD': paths.ops_dir - }) - wait_up(9545) + + # Wait for EL node to be ready + log.info('Waiting for layer1-el to be ready...') + wait_up(9545, retries=60, wait_secs=2) wait_for_rpc_server('127.0.0.1:9545') - log.info('Sleep another 10s...') - time.sleep(10) - res = eth_accounts('127.0.0.1:9545') - response = json.loads(res) - account = response['result'][0] + + # Wait for first block to be mined + log.info('Waiting for first block to be mined...') + max_retries = 60 + retry_count = 0 + while retry_count < max_retries: + block_number = eth_blockNumber('127.0.0.1:9545') + if block_number is not None and block_number >= 1: + log.info(f'First block mined! Current block number: {block_number}') + break + retry_count += 1 + log.info(f'Waiting for first block (current: {block_number if block_number is not None else "N/A"})...') + time.sleep(3) + else: + log.warning('Timeout waiting for first block to be mined') devnet_cfg_orig = pjoin(paths.deploy_config_dir, 'devnet-deploy-config.json') deploy_config = read_json(devnet_cfg_orig) @@ -97,7 +127,7 @@ def devnet_l1(paths, result=None): log.info(f"Account {sequencer}, Balance: {result.stdout}", ) if int(result.stdout) < 5 * ETH: - log.info(f'Insufficient Sequencer: {sequencer}, Founding with account: {account}') + log.info(f'Insufficient Sequencer: {sequencer}, Founding') run_command([ 'cast', 'send', '--private-key', deploy_config['BLOCK_SIGNER_PRIVATE_KEY'], '--rpc-url', 'http://127.0.0.1:9545', @@ -238,8 +268,8 @@ def devnet_deploy(paths, args): 'NODE_DATA_DIR': '/data', 'GETH_DATA_DIR': '/db', 'GENESIS_FILE_PATH': '/genesis.json', - 'L1_ETH_RPC': 'http://l1:8545', - 'L1_BEACON_CHAIN_RPC': 'http://beacon-chain:3500', + 'L1_ETH_RPC': 'http://layer1-el:8545', + 'L1_BEACON_CHAIN_RPC': 'http://layer1-cl:4000', }) wait_up(8545) wait_for_rpc_server('127.0.0.1:8545') @@ -345,3 +375,27 @@ def eth_accounts(url): data = response.read().decode() conn.close() return data + + +def eth_blockNumber(url): + """ + Call eth_blockNumber JSON-RPC method to get the current block number. + Returns the block number as an integer, or None on error. + """ + try: + conn = http.client.HTTPConnection(url) + headers = {'Content-type': 'application/json'} + body = '{"id":1, "jsonrpc":"2.0", "method": "eth_blockNumber", "params":[]}' + conn.request('POST', '/', body, headers) + response = conn.getresponse() + data = response.read().decode() + conn.close() + result = json.loads(data) + if 'result' in result: + # Convert hex string (e.g., "0x1") to integer + block_number_hex = result['result'] + return int(block_number_hex, 16) + return None + except Exception as e: + log.debug(f'Error calling eth_blockNumber: {e}') + return None diff --git a/ops/docker/.env b/ops/docker/.env index 238f50195..8c4125ef4 100644 --- a/ops/docker/.env +++ b/ops/docker/.env @@ -2,8 +2,8 @@ GETH_DATA_DIR=/db GENESIS_FILE_PATH=/genesis.json JWT_SECRET_PATH=/jwt-secret.txt NODE_DATA_DIR=/data -L1_ETH_RPC=http://l1:8545 -L1_BEACON_CHAIN_RPC=http://beacon-chain:3500 +L1_ETH_RPC=http://layer1-el:8545 +L1_BEACON_CHAIN_RPC=http://layer1-cl:4000 L1_CROSS_DOMAIN_MESSENGER=0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9 MORPH_PORTAL=0xdc64a140aa3e981100a9beca4e685f962f0cf6c9 MORPH_ROLLUP=0x0165878a594ca255338adfa4d48449f69242eb8f diff --git a/ops/docker/Makefile.layer1 b/ops/docker/Makefile.layer1 new file mode 100644 index 000000000..d52aef375 --- /dev/null +++ b/ops/docker/Makefile.layer1 @@ -0,0 +1,27 @@ +.PHONY: help generate start stop restart logs clean + +help: + @echo "Available commands:" + @echo " make generate - Generate genesis data and keystores" + @echo " make start - Start network" + @echo " make stop - Stop network" + @echo " make restart - Restart network" + @echo " make logs - View logs" + @echo " make clean - Clean all generated data and reset to initial state" + +generate: + @./layer1/scripts/generate-genesis.sh + +start: + @./layer1/scripts/start.sh + +stop: + @docker compose -f docker-compose-4nodes.yml down + +restart: stop start + +logs: + @docker compose -f docker-compose-4nodes.yml logs -f layer1-el layer1-cl layer1-vc + +clean: + @./layer1/scripts/clean.sh diff --git a/ops/docker/docker-compose-4nodes.yml b/ops/docker/docker-compose-4nodes.yml index 7353ee639..255d2a13e 100644 --- a/ops/docker/docker-compose-4nodes.yml +++ b/ops/docker/docker-compose-4nodes.yml @@ -16,114 +16,110 @@ volumes: sentry_node_data: validator_geth_data: validator_node_data: + layer1-el-data: + layer1-cl-data: + layer1-vc-data: services: - # Runs a Prysm beacon chain from a specified genesis state created in the previous step - # and connects to go-ethereum in the same network as the execution client. - # The account used in go-ethereum is set as the suggested fee recipient for transactions - # proposed via the validators attached to the beacon node. - beacon-chain: - container_name: l1-beacon-chain -# image: gcr.io/prysmaticlabs/prysm/beacon-chain:v4.2.1 - image: morph-beacon-chain - build: - context: ../.. - dockerfile: ops/docker/Dockerfile.l1-beacon - target: beacon-chain - command: - - --datadir=/consensus/beacondata - - --min-sync-peers=0 - - --genesis-state=/consensus/genesis.ssz - - --bootstrap-node= - - --interop-eth1data-votes - - --chain-config-file=/consensus/config.yml - - --contract-deployment-block=0 - - --chain-id=${CHAIN_ID:-900} - - --rpc-host=0.0.0.0 - - --grpc-gateway-host=0.0.0.0 - - --execution-endpoint=http://l1:8551 - - --accept-terms-of-use - - --jwt-secret=/execution/jwtsecret - - --suggested-fee-recipient=0xca062b0fd91172d89bcd4bb084ac4e21972cc467 - - --minimum-peers-per-subnet=0 - - --enable-debug-rpc-endpoints - - --force-clear-db -# depends_on: -# chain-genesis: -# condition: service_completed_successfully - ports: - - 4000 - - 3500 - - 8080 - - 6060 - volumes: - - l1_consensus:/consensus - - l1_execution:/execution - - # We run a validator client with 64, deterministically-generated keys that match - # The validator keys present in the beacon chain genesis state generated a few steps above. - validator: - container_name: l1-validator - image: gcr.io/prysmaticlabs/prysm/validator:v4.2.1 + # ========== Layer1 Ethereum Node ========== + layer1-el: + image: ethereum/client-go:latest + container_name: layer1-el + ports: + - "9545:8545" # RPC + - "9546:8546" # WebSocket + - "8551:8551" # Engine API + volumes: + - ./layer1/genesis:/network-configs:ro + - ./layer1/jwt:/jwt:ro + - layer1-el-data:/data + entrypoint: ["/bin/sh", "-c"] command: - - --beacon-rpc-provider=beacon-chain:4000 - - --datadir=/consensus/validatordata - - --accept-terms-of-use - - --interop-num-validators=64 - - --interop-start-index=0 - - --chain-config-file=/consensus/config.yml - - --force-clear-db + - | + mkdir -p /data/geth/execution-data + if [ ! -f /data/geth/execution-data/geth/chaindata/CURRENT ]; then + echo "Initializing genesis..." + geth init --datadir=/data/geth/execution-data /network-configs/genesis.json || exit 1 + else + echo "Genesis already initialized, skipping init" + fi + exec geth --networkid=900 --datadir=/data/geth/execution-data --http --http.addr=0.0.0.0 --http.port=8545 --http.api=admin,engine,net,eth,web3,debug,txpool --http.vhosts=* --http.corsdomain=* --ws --ws.addr=0.0.0.0 --ws.port=8546 --ws.api=admin,engine,net,eth,web3,debug,txpool --ws.origins=* --allow-insecure-unlock --authrpc.port=8551 --authrpc.addr=0.0.0.0 --authrpc.vhosts=* --authrpc.jwtsecret=/jwt/jwtsecret --syncmode=full --miner.gasprice=1 --rpc.allow-unprotected-txs --metrics --metrics.addr=0.0.0.0 --metrics.port=9001 --discovery.port=30303 --port=30303 + restart: unless-stopped + + layer1-cl: + image: sigp/lighthouse:latest + container_name: layer1-cl depends_on: - beacon-chain: - condition: service_started + - layer1-el + ports: + - "4000:4000" # HTTP API + - "9000:9000" # P2P TCP/UDP + - "9000:9000/udp" # P2P UDP + - "9001:9001" # P2P QUIC + - "5054:5054" # Metrics volumes: - - l1_consensus:/consensus - - l1_execution:/execution - - # Runs the go-ethereum execution client with the specified, unlocked account and necessary - # APIs to allow for proof-of-stake consensus via Prysm. - l1: - container_name: l1-geth - image: ethereum/client-go:v1.14.11 + - ./layer1/genesis:/network-configs:ro + - ./layer1/jwt:/jwt:ro + - layer1-cl-data:/data command: + - lighthouse + - beacon_node + - --supernode + - --debug-level=info + - --datadir=/data/lighthouse/beacon-data + - --listen-address=0.0.0.0 + - --port=9000 - --http - - --http.api=web3,debug,eth,txpool,net,engine - - --http.addr=0.0.0.0 - - --http.corsdomain=* - - --http.vhosts=* - - --ws - - --ws.api=web3,debug,eth,txpool,net,engine - - --ws.addr=0.0.0.0 - - --ws.origins=* - - --authrpc.vhosts=* - - --authrpc.addr=0.0.0.0 - - --authrpc.jwtsecret=/execution/jwtsecret - - --datadir=/execution - - --allow-insecure-unlock - - --unlock=0xca062b0fd91172d89bcd4bb084ac4e21972cc467 - - --password=/execution/password - - --nodiscover - - --syncmode=full - - --gcmode=archive - ports: - - 8551 - - 9545:8545 - - 9546:8546 + - --http-address=0.0.0.0 + - --http-port=4000 + - --disable-packet-filter + - --execution-endpoints=http://layer1-el:8551 + - --jwt-secrets=/jwt/jwtsecret + - --suggested-fee-recipient=0x8943545177806ED17B9F23F0a21ee5948eCaa776 + - --testnet-dir=/network-configs + - --allow-insecure-genesis-sync + - --disable-enr-auto-update + - --enr-tcp-port=9000 + - --enr-udp-port=9000 + - --enr-quic-port=9001 + - --quic-port=9001 + - --metrics + - --metrics-address=0.0.0.0 + - --metrics-allow-origin=* + - --metrics-port=5054 + - --enable-private-discovery + restart: unless-stopped + + layer1-vc: + image: sigp/lighthouse:latest + container_name: layer1-vc depends_on: -# geth-genesis: -# condition: service_completed_successfully - beacon-chain: - condition: service_started - validator: - condition: service_started + - layer1-cl volumes: - - l1_execution:/execution - - l1_consensus:/consensus + - ./layer1/genesis:/network-configs:ro + - ./layer1/keystores/layer1:/validator-keys + - layer1-vc-data:/data + command: + - lighthouse + - vc + - --debug-level=info + - --testnet-dir=/network-configs + - --validators-dir=/validator-keys/keys + - --secrets-dir=/validator-keys/secrets + - --init-slashing-protection + - --beacon-nodes=http://layer1-cl:4000 + - --suggested-fee-recipient=0x8943545177806ED17B9F23F0a21ee5948eCaa776 + - --metrics + - --metrics-address=0.0.0.0 + - --metrics-allow-origin=* + - --metrics-port=5064 + restart: unless-stopped + # ========== L2 Services ========== morph-geth-0: container_name: morph-geth-0 depends_on: - l1: + layer1-el: condition: service_started image: morph-geth:latest build: @@ -388,7 +384,7 @@ services: - "${PWD}/jwt-secret.txt:${JWT_SECRET_PATH}" command: > morphnode - --home $NODE_DATA_DIR + --home $NODE_DATA_DIR validator_geth: @@ -493,7 +489,6 @@ services: - TX_SUBMITTER_L1_STAKING_ADDRESS=${MORPH_L1STAKING:-0x5fc8d32690cc91d4c39d9d3abcbd16989f875707} - TX_SUBMITTER_L1_STAKING_DEPLOYED_BLOCKNUM=0 - tx-submitter-1: container_name: tx-submitter-1 depends_on: @@ -536,7 +531,6 @@ services: - TX_SUBMITTER_L1_STAKING_ADDRESS=${MORPH_L1STAKING:-0x5fc8d32690cc91d4c39d9d3abcbd16989f875707} - TX_SUBMITTER_L1_STAKING_DEPLOYED_BLOCKNUM=0 - tx-submitter-2: container_name: tx-submitter-2 depends_on: @@ -579,7 +573,6 @@ services: - TX_SUBMITTER_L1_STAKING_ADDRESS=${MORPH_L1STAKING:-0x5fc8d32690cc91d4c39d9d3abcbd16989f875707} - TX_SUBMITTER_L1_STAKING_DEPLOYED_BLOCKNUM=0 - tx-submitter-3: container_name: tx-submitter-3 depends_on: @@ -651,31 +644,3 @@ services: - L1_ROLLUP=${MORPH_ROLLUP:-0x6900000000000000000000000000000000000010} - OVERHEAD_SWITCH=${OVERHEAD_SWITCH} - MAX_OVERHEAD=${MAX_OVERHEAD} - - staking-oracle: - container_name: staking-oracle - depends_on: - node-0: - condition: service_started - build: - context: ../.. - dockerfile: ops/docker/Dockerfile.staking-oracle - image: morph-staking-oracle:latest - restart: unless-stopped - command: staking-oracle - ports: - - "9060:6060" - environment: - # change the env variables to your own - - STAKING_ORACLE_BUILD_ENV=dev - - STAKING_ORACLE_L1_ETH_RPC=${L1_ETH_RPC} - - STAKING_ORACLE_RECORD_PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 - - STAKING_ORACLE_L2_ETH_RPC=http://morph-geth-0:8545 - - STAKING_ORACLE_L2_TENDERMINT_RPC=http://node-0:26657 - - STAKING_ORACLE_L2_WS_ENDPOINT=http://node-0:26656 - - STAKING_ORACLE_ROLLUP=${MORPH_ROLLUP:-0x6900000000000000000000000000000000000010} - - STAKING_ORACLE_LOG_FILENAME=staking-oracle.log - - STAKING_ORACLE_LOG_FILE_MAX_SIZE=100 #MB - - STAKING_ORACLE_LOG_FILE_MAX_AGE=7 #day - - STAKING_ORACLE_LOG_COMPRESS=true - - STAKING_ORACLE_METRICS_SERVER_ENABLE=true diff --git a/ops/docker/layer1/.gitignore b/ops/docker/layer1/.gitignore new file mode 100644 index 000000000..9d0924a2c --- /dev/null +++ b/ops/docker/layer1/.gitignore @@ -0,0 +1,5 @@ +genesis/ +keystores/ +configs/ +jwt/ + diff --git a/ops/docker/layer1/configs/values.env.template b/ops/docker/layer1/configs/values.env.template new file mode 100644 index 000000000..52a3ed168 --- /dev/null +++ b/ops/docker/layer1/configs/values.env.template @@ -0,0 +1,85 @@ +export PRESET_BASE=minimal +export CHAIN_ID=900 +export DEPOSIT_CONTRACT_ADDRESS=0x00000000219ab540356cBB839Cbe05303d7705Fa +export EL_AND_CL_MNEMONIC="giant issue aisle success illegal bike spike question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy very lucky have athlete" +export CL_EXEC_BLOCK=0 +export SLOT_DURATION_IN_SECONDS=3 +export SLOT_DURATION_MS=3000 +export DEPOSIT_CONTRACT_BLOCK=0x0000000000000000000000000000000000000000000000000000000000000000 +export NUMBER_OF_VALIDATORS=32 +export GENESIS_FORK_VERSION=0x10000038 +export ALTAIR_FORK_VERSION=0x20000038 +export ALTAIR_FORK_EPOCH=0 +export BELLATRIX_FORK_VERSION=0x30000038 +export BELLATRIX_FORK_EPOCH=0 +export CAPELLA_FORK_VERSION=0x40000038 +export CAPELLA_FORK_EPOCH=0 +export DENEB_FORK_VERSION=0x50000038 +export DENEB_FORK_EPOCH=0 +export ELECTRA_FORK_VERSION=0x60000038 +export ELECTRA_FORK_EPOCH=0 +export FULU_FORK_VERSION=0x70000038 +export FULU_FORK_EPOCH=0 +export GLOAS_FORK_VERSION=0x80000038 +export GLOAS_FORK_EPOCH=18446744073709551615 +export EIP7805_FORK_VERSION=0x90000038 +export EIP7805_FORK_EPOCH=18446744073709551615 +export EIP7441_FORK_VERSION=0xa0000038 +export EIP7441_FORK_EPOCH=18446744073709551615 +export WITHDRAWAL_TYPE=0x01 +export WITHDRAWAL_ADDRESS=0x8943545177806ED17B9F23F0a21ee5948eCaa776 +export VALIDATOR_BALANCE=32000000000 +export GENESIS_TIMESTAMP={{GENESIS_TIMESTAMP}} +export GENESIS_DELAY=0 +export GENESIS_GASLIMIT=60000000 +export MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT=8 +export CHURN_LIMIT_QUOTIENT=65536 +export EJECTION_BALANCE=16000000000 +export ETH1_FOLLOW_DISTANCE=1 +export SHADOW_FORK_FILE= +export MIN_VALIDATOR_WITHDRAWABILITY_DELAY=256 +export SHARD_COMMITTEE_PERIOD=256 +export ATTESTATION_DUE_BPS_GLOAS=2500 +export AGGREGATE_DUE_BPS_GLOAS=5000 +export SYNC_MESSAGE_DUE_BPS_GLOAS=2500 +export CONTRIBUTION_DUE_BPS_GLOAS=5000 +export PAYLOAD_ATTESTATION_DUE_BPS=7500 +export VIEW_FREEZE_CUTOFF_BPS=7500 +export INCLUSION_LIST_SUBMISSION_DUE_BPS=6667 +export PROPOSER_INCLUSION_LIST_CUTOFF_BPS=9167 +export DATA_COLUMN_SIDECAR_SUBNET_COUNT=128 +export SAMPLES_PER_SLOT=8 +export CUSTODY_REQUIREMENT=4 +export MAX_BLOBS_PER_BLOCK_ELECTRA=9 +export TARGET_BLOBS_PER_BLOCK_ELECTRA=6 +export MAX_REQUEST_BLOCKS_DENEB=128 +export MAX_REQUEST_BLOB_SIDECARS_ELECTRA=1152 +export BASEFEE_UPDATE_FRACTION_ELECTRA=5007716 +export MAX_BLOBS_PER_BLOCK_FULU=9 +export TARGET_BLOBS_PER_BLOCK_FULU=6 +export BASEFEE_UPDATE_FRACTION_FULU=5007716 +export ADDITIONAL_PRELOADED_CONTRACTS=/opt/additional-contracts.json +export EL_PREMINE_ADDRS='{"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266": {"balance": "1000000000000000000000000000"}, "0xca062b0fd91172d89bcd4bb084ac4e21972cc467": {"balance": "1000000000000000000000000000"}}' +export MAX_PAYLOAD_SIZE=10485760 +export BPO_1_EPOCH=18446744073709551615 +export BPO_1_MAX_BLOBS=0 +export BPO_1_TARGET_BLOBS=0 +export BPO_1_BASE_FEE_UPDATE_FRACTION=0 +export BPO_2_EPOCH=18446744073709551615 +export BPO_2_MAX_BLOBS=0 +export BPO_2_TARGET_BLOBS=0 +export BPO_2_BASE_FEE_UPDATE_FRACTION=0 +export BPO_3_EPOCH=18446744073709551615 +export BPO_3_MAX_BLOBS=0 +export BPO_3_TARGET_BLOBS=0 +export BPO_3_BASE_FEE_UPDATE_FRACTION=0 +export BPO_4_EPOCH=18446744073709551615 +export BPO_4_MAX_BLOBS=0 +export BPO_4_TARGET_BLOBS=0 +export BPO_4_BASE_FEE_UPDATE_FRACTION=0 +export BPO_5_EPOCH=18446744073709551615 +export BPO_5_MAX_BLOBS=0 +export BPO_5_TARGET_BLOBS=0 +export BPO_5_BASE_FEE_UPDATE_FRACTION=0 +export MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS=4096 +export MIN_EPOCHS_FOR_BLOCK_REQUESTS=33024 diff --git a/ops/docker/layer1/docker-compose.yml b/ops/docker/layer1/docker-compose.yml new file mode 100644 index 000000000..6267e49cd --- /dev/null +++ b/ops/docker/layer1/docker-compose.yml @@ -0,0 +1,116 @@ +version: '3.8' + +services: + # ========== Ethereum Node ========== + # Note: Kurtosis executes "geth init && geth run" in the same container + # with datadir=/data/geth/execution-data + layer1-el: + image: ethereum/client-go:latest + container_name: layer1-el + networks: + - morph-network + ports: + - "9545:8545" # RPC + - "9546:8546" # WebSocket + # - "30303:30303" # P2P TCP + # - "30303:30303/udp" # P2P UDP + - "8551:8551" # Engine API + volumes: + - ./genesis:/network-configs:ro + - ./jwt:/jwt:ro + - layer1-el-data:/data + entrypoint: ["/bin/sh", "-c"] + command: + - | + mkdir -p /data/geth/execution-data + if [ ! -f /data/geth/execution-data/geth/chaindata/CURRENT ]; then + echo "Initializing genesis..." + geth init --datadir=/data/geth/execution-data /network-configs/genesis.json || exit 1 + else + echo "Genesis already initialized, skipping init" + fi + exec geth --networkid=900 --datadir=/data/geth/execution-data --http --http.addr=0.0.0.0 --http.port=8545 --http.api=admin,engine,net,eth,web3,debug,txpool --http.vhosts=* --http.corsdomain=* --ws --ws.addr=0.0.0.0 --ws.port=8546 --ws.api=admin,engine,net,eth,web3,debug,txpool --ws.origins=* --allow-insecure-unlock --authrpc.port=8551 --authrpc.addr=0.0.0.0 --authrpc.vhosts=* --authrpc.jwtsecret=/jwt/jwtsecret --syncmode=full --miner.gasprice=1 --rpc.allow-unprotected-txs --metrics --metrics.addr=0.0.0.0 --metrics.port=9001 --discovery.port=30303 --port=30303 + restart: unless-stopped + + layer1-cl: + image: sigp/lighthouse:latest + container_name: layer1-cl + depends_on: + - layer1-el + networks: + - morph-network + ports: + - "4000:4000" # HTTP API + - "9000:9000" # P2P TCP/UDP + - "9000:9000/udp" # P2P UDP + - "9001:9001" # P2P QUIC + - "5054:5054" # Metrics + volumes: + - ./genesis:/network-configs:ro + - ./jwt:/jwt:ro + - layer1-cl-data:/data + command: + - lighthouse + - beacon_node + - --debug-level=info + - --datadir=/data/lighthouse/beacon-data + - --listen-address=0.0.0.0 + - --port=9000 + - --http + - --http-address=0.0.0.0 + - --http-port=4000 + - --disable-packet-filter + - --execution-endpoints=http://layer1-el:8551 + - --jwt-secrets=/jwt/jwtsecret + - --suggested-fee-recipient=0x8943545177806ED17B9F23F0a21ee5948eCaa776 + - --testnet-dir=/network-configs + - --allow-insecure-genesis-sync + - --disable-enr-auto-update + - --enr-tcp-port=9000 + - --enr-udp-port=9000 + - --enr-quic-port=9001 + - --quic-port=9001 + - --metrics + - --metrics-address=0.0.0.0 + - --metrics-allow-origin=* + - --metrics-port=5054 + - --enable-private-discovery + restart: unless-stopped + + layer1-vc: + image: sigp/lighthouse:latest + container_name: layer1-vc + depends_on: + - layer1-cl + networks: + - morph-network + volumes: + - ./genesis:/network-configs:ro + - ./keystores/layer1:/validator-keys + - layer1-vc-data:/data + command: + - lighthouse + - vc + - --debug-level=info + - --testnet-dir=/network-configs + - --validators-dir=/validator-keys/keys + - --secrets-dir=/validator-keys/secrets + - --init-slashing-protection + - --beacon-nodes=http://layer1-cl:4000 + - --suggested-fee-recipient=0x8943545177806ED17B9F23F0a21ee5948eCaa776 + - --metrics + - --metrics-address=0.0.0.0 + - --metrics-allow-origin=* + - --metrics-port=5064 + restart: unless-stopped + +networks: + morph-network: + driver: bridge + name: morph-network + +volumes: + layer1-el-data: + layer1-cl-data: + layer1-vc-data: + diff --git a/ops/docker/layer1/jwt/jwtsecret b/ops/docker/layer1/jwt/jwtsecret new file mode 100644 index 000000000..9852e4914 --- /dev/null +++ b/ops/docker/layer1/jwt/jwtsecret @@ -0,0 +1,2 @@ +fa94394eb51a9e2f4cc9004706c4ae877bdd3369867db455a90b3c0344bc59d4 + diff --git a/ops/docker/layer1/keystores/layer1-password.txt b/ops/docker/layer1/keystores/layer1-password.txt new file mode 100644 index 000000000..8f7177458 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1-password.txt @@ -0,0 +1,2 @@ +password123 + diff --git a/ops/docker/layer1/keystores/layer1/keys/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb/voting-keystore.json new file mode 100644 index 000000000..97c3fdf3d --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"2a2e99081f3f44634c5e73b079cf5e3ce855a33032d1fb7df9376c590af99c27"},"message":""},"checksum":{"function":"sha256","params":{},"message":"626b9b4db0f705b71f786ea970114972def50f1489e1f20e62b050e8896556ae"},"cipher":{"function":"aes-128-ctr","params":{"iv":"165133464c00067e914f080859bd6660"},"message":"c5a809a113e4e03e3e9af6ced49c1c9ce7460be4e487085433f46845662b0c2f"}},"description":"0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb","pubkey":"81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb","path":"","uuid":"7ef682ad-e17b-467c-a54a-41c2a9212b65","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932/voting-keystore.json new file mode 100644 index 000000000..8d59c1f04 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"50ce342faa62f848df9574c313cd2b1e8e54c46d0b61f1aa26cac255ab1b8df9"},"message":""},"checksum":{"function":"sha256","params":{},"message":"bf6be1a6de5056740a6a23d0ce96ecf056e4fc2168b2cffe385ae0e9b95151fe"},"cipher":{"function":"aes-128-ctr","params":{"iv":"fd9f1e6fb0669ee85fd8b9dd87ade97b"},"message":"1d0d88569c781f99a8bcdfe77adf1cec6b4ecd18720f65e4bfbcd1aa7036033a"}},"description":"0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932","pubkey":"8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932","path":"","uuid":"bba75357-fcdf-4441-be4d-2ae794c262bd","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8/voting-keystore.json new file mode 100644 index 000000000..c34a8da91 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"38c8b764995108cd73ae03fb4df45e08a2fd4b6149c43379353e6343f5e8b90c"},"message":""},"checksum":{"function":"sha256","params":{},"message":"7ae8ec9b327d7a025f5d38488dd1cf9a9b990b18b7920b9e41dfb545c398628f"},"cipher":{"function":"aes-128-ctr","params":{"iv":"8b41b32e094532bf9b425507d4eef378"},"message":"fb21e36d424cdde1c5a87cd81539947c161fb04505fe08acae237dd1e540a98c"}},"description":"0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8","pubkey":"84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8","path":"","uuid":"9313bc22-c3cc-4e47-9e7a-59de6938a8a7","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f/voting-keystore.json new file mode 100644 index 000000000..8bcf0d9e1 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"754eb44c6b05ed7fdcdbbc3841fad3214d4b751404b5e73df034cfe8694511b5"},"message":""},"checksum":{"function":"sha256","params":{},"message":"640dde460b068ab307783d27744c4965b2ba3b8ece2db3d9127c6e0224167850"},"cipher":{"function":"aes-128-ctr","params":{"iv":"c2f135b28d239073cb5206e019dbbc51"},"message":"a5e4114e2bb1e4ddcd6219064ce51886fa6a5e3b37e4709db702afd7d016418a"}},"description":"0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f","pubkey":"87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f","path":"","uuid":"7cbc504e-989d-4f0c-88dc-3605c322622f","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75/voting-keystore.json new file mode 100644 index 000000000..9efa2ab49 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"22c551538a5126f6d8acdfcc7ce8da3e1f31dd3bc6bb18b311c4ebe612cd6953"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b1598d17ff4307d245c8c078e1c150f45e36284ac8a412699530cf02ecc4e513"},"cipher":{"function":"aes-128-ctr","params":{"iv":"657cdbcafd3cb6ab495d90916a42e09c"},"message":"24f00f8db95ccddb572a01c0645227a8d5d314a615904fd6d041428c94b83af7"}},"description":"0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75","pubkey":"8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75","path":"","uuid":"38b7eba0-0c08-4b88-a6eb-8a6b8ebcc871","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6/voting-keystore.json new file mode 100644 index 000000000..79053066b --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"5fc82922d6a3b56c127fafedce08f7dd485c119af6fe7210c593a15ec2f6a4b1"},"message":""},"checksum":{"function":"sha256","params":{},"message":"f56d614600c930b3093abd3c2a142b125d5a0b10dc01f6d90b693ac15d5056a2"},"cipher":{"function":"aes-128-ctr","params":{"iv":"893c684da1616a2b978a9b642f4adc8f"},"message":"5eb88a63416f2c330a3816725f0d34fc38febda8e0431642d08f90b62cfedfb2"}},"description":"0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6","pubkey":"8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6","path":"","uuid":"e48ff448-38eb-4b2e-811c-25b734c9c125","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab/voting-keystore.json new file mode 100644 index 000000000..f31628e48 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"5ccefb67de4aa473b14a6e8924ebe75b7cdf0aa4b5f4eba45b3050638ebdc540"},"message":""},"checksum":{"function":"sha256","params":{},"message":"32f2505d9f610f27419c3e24e379a874f2f24dfa37505933da6faf45e0e2563c"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7d130535cda9c5560abeeeaa28fa91ee"},"message":"db6d4a726e2c501cf130ed3e676881c7c92022f4e7eeb1e15b83bb6751e0fb56"}},"description":"0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab","pubkey":"8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab","path":"","uuid":"5cca9e94-3149-498d-a1f8-3cb50f5fc37d","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4/voting-keystore.json new file mode 100644 index 000000000..42d4066e3 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"15081a6a3959643b42b57aa14a04330078b790b3703ab2417cc12e5078cb67c4"},"message":""},"checksum":{"function":"sha256","params":{},"message":"a2424d9a8e5f88fa640d8ae7662fa0535467802d5a453c02df44979e93e67158"},"cipher":{"function":"aes-128-ctr","params":{"iv":"b9534b4f146a155db58c392c424598e4"},"message":"5145c94106d5700b3eeb83397b44141fd693630c3d2da5b8c192ace6ea716e05"}},"description":"0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4","pubkey":"8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4","path":"","uuid":"fe505f6d-504b-4efa-afc1-143c6b63028a","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071/voting-keystore.json new file mode 100644 index 000000000..60328b40a --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"27b69ffcaf55d9e3884a75298e5a95660d94fc53983d8a86c8aa9f19aa761670"},"message":""},"checksum":{"function":"sha256","params":{},"message":"8045df2eea34e1a326373c042b1802616549b24840183e948c08a931a6ecae9a"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7a51bb36f7de674e8f05f94339acaecf"},"message":"7529f75843df106aa71dd6762e4e852ab35295ceb81e38214af95fd37041086c"}},"description":"0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071","pubkey":"91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071","path":"","uuid":"9c48003a-283e-4614-9647-44e2485b7899","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8/voting-keystore.json new file mode 100644 index 000000000..817176ed2 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"586798b1b0983a9cd54b281283ebbe01c25e08482a2fd2c6e00f3d124a1fd5d1"},"message":""},"checksum":{"function":"sha256","params":{},"message":"dd7d2d86d574cf9a6c6f7fe3ac0de9649178a95d44f7575af22e1c500f5a3553"},"cipher":{"function":"aes-128-ctr","params":{"iv":"9009c6c729ec27470ad0bb1eeb8c1227"},"message":"749e1b3c69a7bf4733610a5df95366f15c5bcb9d6182c54c603864293069cd4c"}},"description":"0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8","pubkey":"930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8","path":"","uuid":"d5fa5791-b381-4e34-b5bd-d395a1e3ccc3","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64/voting-keystore.json new file mode 100644 index 000000000..1dfff9961 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"63e05898e457ab85e2dee0c8da10fdda630558a0a3900ea09da484be8dbd9967"},"message":""},"checksum":{"function":"sha256","params":{},"message":"936dfff7aaed5a48bbc15e308f4079ea18127803be71a974a2acc60db980bef1"},"cipher":{"function":"aes-128-ctr","params":{"iv":"59357db2000d776034a0c5e89d36cd22"},"message":"75ab389e3d57401013883972c5f23602fc2909cc1c7a2ad8c22bd26f59f56aa1"}},"description":"0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64","pubkey":"96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64","path":"","uuid":"00c54fed-7953-439f-ac28-4d4bad382a41","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea/voting-keystore.json new file mode 100644 index 000000000..9f24ed54c --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"41f4391f34c1d1fbef3eb00a379db3bf7fd917ce71dddb007105cd41e5d29891"},"message":""},"checksum":{"function":"sha256","params":{},"message":"0ffaa28fa028d99c0782bf11a72da203cabc3a45e6ef35909a1277cdcf3218cb"},"cipher":{"function":"aes-128-ctr","params":{"iv":"501d50680e3075df7fa00a68929adcd1"},"message":"44a19907c6286ae3226b4f10f6bc744e752706750a8735669f10e807ebe31513"}},"description":"0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea","pubkey":"996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea","path":"","uuid":"8f3eb0ae-dbb9-4d0e-b3e1-293ad94dec02","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af/voting-keystore.json new file mode 100644 index 000000000..d615a7eb7 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"8f1a1499d041e6cc22257abd95660db857b6876f169c58f6ca556aa99638e354"},"message":""},"checksum":{"function":"sha256","params":{},"message":"cf63ec13187a2604fbd0bdc6b6e9cfaca8ecf610ad0d4642b940faa3eefea8b1"},"cipher":{"function":"aes-128-ctr","params":{"iv":"cfc92b4683f440427cfbafb62782cc31"},"message":"f5ca4fbdab0977a91dd40d6c957668048d67049f12b1161d8bb3da41a119ff7a"}},"description":"0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af","pubkey":"996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af","path":"","uuid":"5cf506c7-6a09-4139-b298-f07b02bdc643","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5/voting-keystore.json new file mode 100644 index 000000000..857ceeda3 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"200b09be686266f3767c599168ada8bf61fc27d091fc0d894161b601719ce7b8"},"message":""},"checksum":{"function":"sha256","params":{},"message":"6b28f90fae44774ff87c5b48d688557d3931fedc1e21a9df5a133d741bf8b050"},"cipher":{"function":"aes-128-ctr","params":{"iv":"f61bbdce20571f4dd4eac392ec3ca32f"},"message":"94d30a9a147c52e96fe01e2ba51691a08b887ae153b618bd975e69937cde4360"}},"description":"0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5","pubkey":"a03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5","path":"","uuid":"fa7cd4db-056e-476e-a949-6e56f029a416","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f/voting-keystore.json new file mode 100644 index 000000000..04f54d6a5 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"138175c9f91425c8de63864c4887713585004fe4a9b4126e56a7add4fe71a26a"},"message":""},"checksum":{"function":"sha256","params":{},"message":"8b8998d36aa0cc15c6bbc974bba6ccb172dfe95f2431de8813e3433216a267b5"},"cipher":{"function":"aes-128-ctr","params":{"iv":"e6df1f20454e469f52dde9dbf783c6dd"},"message":"5b7fcc744a4643f520fb5a89634ec3be3e0176a26cc097239ffc6e0eac3d9c27"}},"description":"0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f","pubkey":"a1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f","path":"","uuid":"04ad2f0a-b15f-47d8-9621-a2f7ae1da957","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52/voting-keystore.json new file mode 100644 index 000000000..fc6e38be2 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"682074132dec5cc76e1647487bbf9146e67965f2697a35041608485ce598e5b2"},"message":""},"checksum":{"function":"sha256","params":{},"message":"467d577e4591748782eabfde0a8aea6c0b4d0e62d1624c2cad29296f3ece965b"},"cipher":{"function":"aes-128-ctr","params":{"iv":"37e46657cc42a268d00492ffef93a0a8"},"message":"f952d4f7ee86e1a995f6860934ee838b1ad0b5560ea3468dc388f5703eeedeec"}},"description":"0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52","pubkey":"a1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52","path":"","uuid":"757939aa-f987-4cef-a1b2-88b2296ce568","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb/voting-keystore.json new file mode 100644 index 000000000..c088f5f77 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"c9dec4cc84b90e052f1e2a9dae753c8e8c374a54cb25766315a75a8c5cce59ba"},"message":""},"checksum":{"function":"sha256","params":{},"message":"8e219831653cb3cce5bb5b48776d84c665392d82e069137fd8324e57661cab49"},"cipher":{"function":"aes-128-ctr","params":{"iv":"5157c4cde7ad4d0a416d88a283f30096"},"message":"fb1d78bb7ab5469aa17d63eeaf79bd1ed4fd70c435681bdca9ff0fca874f6cc7"}},"description":"0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb","pubkey":"a35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb","path":"","uuid":"67f42de7-fc6d-4f27-b3d3-63b6fd62fc65","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41/voting-keystore.json new file mode 100644 index 000000000..db497d171 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"4f9441901a303d31ce37c5da83e5e8f1ed67088ba28419718598272800f85d74"},"message":""},"checksum":{"function":"sha256","params":{},"message":"68ee1733c8e58f30d7d46ea951fe5cc96e1cad503cd2eeb81a632c791dcea90b"},"cipher":{"function":"aes-128-ctr","params":{"iv":"a01ba35f529f16359e67d0a67f862e55"},"message":"3651eb1fa2289a9b55af5384674351705a4c113c6eb60a5a52bd668c45e4d559"}},"description":"0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41","pubkey":"a54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41","path":"","uuid":"0dee2eaa-5935-45c9-bf91-2ce8a0f09188","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db/voting-keystore.json new file mode 100644 index 000000000..1532396f4 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"931e7ea2ccc4632146539ae4cba803c0ed67420e54e9d9d79cc65a74674b5591"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b25f021f2ce6d7761a696bd62fcefa7ac9b757147615e4765ac9754ce118e301"},"cipher":{"function":"aes-128-ctr","params":{"iv":"c81acda9bdd5c390ba720710d03d5881"},"message":"ea2f82e1adf200abb628844f8ced24be13c7e28514947437e34145ce984a93d6"}},"description":"0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db","pubkey":"a75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db","path":"","uuid":"e300fd01-792e-4718-bc14-1ccb529fd5a8","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8/voting-keystore.json new file mode 100644 index 000000000..d4e7c7b31 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"22dde765bdb763f4fedf1e5854cddc7abe3d7fe87e1b97a972fc364d6b2d8b9d"},"message":""},"checksum":{"function":"sha256","params":{},"message":"fd224bea1372d2feba3fbe6aba6724cc3b7c0d60bb719bc4a4bd80b9f0d0ff9e"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7c60acf762bf651b619f98d4d392c027"},"message":"07783121901ac016c01a2731a7cffd6c386af757234c1aada2a845e24c792e32"}},"description":"0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8","pubkey":"a804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8","path":"","uuid":"72b953c4-8e95-4b8a-bc98-61a95b58cb20","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4/voting-keystore.json new file mode 100644 index 000000000..e886f33ca --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"dbef2aafe19e2fb2a6cf68eebdf261ff447d174ff69805869fb11870d6081c2b"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b836d69123af0eb7b3b8810d26b156727b043a642a415516abc22a408d6832b5"},"cipher":{"function":"aes-128-ctr","params":{"iv":"5f37825f271dc8724f160778e276042f"},"message":"ad41a3fea964e3775b18e7d9def72fdf197b80bdd91a7e3f088c1ec4deeba8c3"}},"description":"0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4","pubkey":"aaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4","path":"","uuid":"9b885749-f312-45af-9672-db7edc662e8b","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c/voting-keystore.json new file mode 100644 index 000000000..fc25bb9d6 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"a1772b8770416db2982250247c3c37fe4eccb0706371c80a914e279bf129e3dc"},"message":""},"checksum":{"function":"sha256","params":{},"message":"301a47d72e40aec2640bbbd5b6524522e6fc4133cee756d73325377798b78e90"},"cipher":{"function":"aes-128-ctr","params":{"iv":"36ad1c69103d6951f6388e1e303d2fa5"},"message":"3e19bdc5a9509140fa3bdf221d133d46ab9dd43b5e1d1b7e24d9d1d3d92a69c6"}},"description":"0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c","pubkey":"aaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c","path":"","uuid":"b8fc724f-b604-4d6d-8d85-62079488cd3e","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b/voting-keystore.json new file mode 100644 index 000000000..35ec204a6 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"134bcf0fb3bd12a40a8f56f5d501ad32cb2997b1e57127ecb68174b1aa67572f"},"message":""},"checksum":{"function":"sha256","params":{},"message":"a32ebbafdd9bcbe17e42b6b792329e825269037f2bf2e162694e697ce60e0f52"},"cipher":{"function":"aes-128-ctr","params":{"iv":"8b338c77547910599c8c746b13e29c45"},"message":"2b014341fb98f9efc8c8bc5f38140d274a3f7db79bf2fe48d0808e77dffc8c4b"}},"description":"0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b","pubkey":"ab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b","path":"","uuid":"03e47af2-e1f4-401f-8fdb-533d88f7c58b","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e/voting-keystore.json new file mode 100644 index 000000000..3ed4f1d92 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"8e4d0293c4cb76bf079c26ffcbec614fdeef98a8dccac7f3625f755677f2561c"},"message":""},"checksum":{"function":"sha256","params":{},"message":"f0775f94d9f44868e103f6f72b147d8f11426120ec951e608e00f518904f67c6"},"cipher":{"function":"aes-128-ctr","params":{"iv":"aa16d15abd4560bce198fe1394741fe9"},"message":"75e717379b4f8c5b1ce255bd5671067687948f3c26392cdf4857c977bb33295c"}},"description":"0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e","pubkey":"abd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e","path":"","uuid":"ca0eeeb8-8a3b-4157-9b4c-43a6e5607269","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1/voting-keystore.json new file mode 100644 index 000000000..483103501 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"526d87dbfddfda859a89601a584aff34186425f8241b9a886044a77e33b37ded"},"message":""},"checksum":{"function":"sha256","params":{},"message":"2e6ff061b119e326ad88aad0d90034dbc24961a135a13263fc05ad4227d53742"},"cipher":{"function":"aes-128-ctr","params":{"iv":"8aee8b3e69438b10be1f916b0ee3e608"},"message":"9e753dceeb7d8adf306674cc964892a7358df1c04c6b236e5c6d288a274d4412"}},"description":"0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1","pubkey":"ac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1","path":"","uuid":"21c3b6f7-23a3-45e3-8444-6428ba673c6e","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183/voting-keystore.json new file mode 100644 index 000000000..9ce2db384 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"4ff0333603052e80a2d903d61f279ef1e140b0e55ac47bdaffd061d02a4d7abf"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b3535c2d432a6dfba1f5a3b0c241cee1e459d2bc8943cce2222cf58872646ffd"},"cipher":{"function":"aes-128-ctr","params":{"iv":"58fec23cecca2230f870d82b3151d5e8"},"message":"17e754cf5ee643e7c8442cb5d8daa711784437910070c2c579998f76cda425ef"}},"description":"0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183","pubkey":"ad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183","path":"","uuid":"46723964-9060-4c82-b1c5-d7177c96672b","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c/voting-keystore.json new file mode 100644 index 000000000..f011e5ce5 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"1b842a26b0c7eb587e8e3373ad5569756f4acfd8f73e815d6640512f791d71c2"},"message":""},"checksum":{"function":"sha256","params":{},"message":"305d355d2041c556a17aff536770eecabb97004821d67cb80b4649e8b055b31f"},"cipher":{"function":"aes-128-ctr","params":{"iv":"1d729d9aed577493b5b56fff878a7764"},"message":"be7dce5a4765a7830d5d672f836606343d33913a1e6128516c92358f0ee14d04"}},"description":"0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c","pubkey":"ae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c","path":"","uuid":"70ab074f-b273-415f-b6aa-bad700d59063","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8/voting-keystore.json new file mode 100644 index 000000000..06066dca4 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"0da7bdc544e5ebb70eb2fad9b56467fe0679b4bafa422e69eaf3d833769c0d45"},"message":""},"checksum":{"function":"sha256","params":{},"message":"6cd9110ec2d2dfc6feee40feaaeaeb48c528e090597af511a089ed8a84a7e43b"},"cipher":{"function":"aes-128-ctr","params":{"iv":"4bf0acc4600f59ae8012f358f2e39e9d"},"message":"24946b7bfabfd1e7139e09314da0b09348ff6d7eb88110f25d7e9aadd0bf0862"}},"description":"0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8","pubkey":"ae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8","path":"","uuid":"188c3b58-bd99-4ffd-9f98-a8a77102d5b6","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca/voting-keystore.json new file mode 100644 index 000000000..a03308c07 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"5dfc2de5b8d0d33bf80fed98e5059beee41e3fead686f18412d8f731736fc9f7"},"message":""},"checksum":{"function":"sha256","params":{},"message":"61de8e43d1dc0f600022717030f54e60570452b363291253b6e040226d4e39c1"},"cipher":{"function":"aes-128-ctr","params":{"iv":"b6d337601e10d229726b23b6149984f4"},"message":"acfc2545555b59aef1f0cb608adca50bdc1c4b4d7be3d15f5e1eea12de4ad1e2"}},"description":"0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca","pubkey":"afa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca","path":"","uuid":"c26b8e0c-c6dc-404d-99ce-97b80deb506f","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe/voting-keystore.json new file mode 100644 index 000000000..f06753882 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"271f1ac0d5c775545eba7520fe06aa5b86ddcd1c89456d1996bf17898edb5e5b"},"message":""},"checksum":{"function":"sha256","params":{},"message":"f5fa40e12e6766eade84457a7529dbf0b2cf2ea1cc07e554e6ff290051c98dad"},"cipher":{"function":"aes-128-ctr","params":{"iv":"f48e97290ecf6a460cfdc6a3acf538c4"},"message":"2d68c326e9365f655433e3b2e8fa82cb357f91e707bf65a947977b11216ef9d6"}},"description":"0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe","pubkey":"b27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe","path":"","uuid":"22473cbd-6ed0-4816-80eb-08d0b82b56a7","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670/voting-keystore.json new file mode 100644 index 000000000..beb92293c --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"222406294e1fb21caf6f7777a0537b5ae94b1d8820388e1dc268073bf5085ca8"},"message":""},"checksum":{"function":"sha256","params":{},"message":"f1f410a131a0c0a8d216cb39ed5ffe16a8d982a1d00da5d529aefaa3720ad977"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7d6299c83718cb971f368353670321c4"},"message":"3df201ea7052135448dbe4c2f617967d633785e709a30242649db21ddd90d781"}},"description":"0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670","pubkey":"b570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670","path":"","uuid":"0af96913-93e6-4937-bfb9-cb9118b6f513","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360/voting-keystore.json new file mode 100644 index 000000000..76176e142 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"97e8590bea39215bca7ace1cf93453c611aa04bcd0c7d3b0cbea788ad2accfbb"},"message":""},"checksum":{"function":"sha256","params":{},"message":"7af44166d684f436684c2463b65ecbba330779de4e0a9255fd06c1b4f714e2de"},"cipher":{"function":"aes-128-ctr","params":{"iv":"860ea37f28713d0cad22a4794e0d9893"},"message":"dcf43552f417ae3303018c76309a9c394ce818bc5714323d34caac229b2c164d"}},"description":"0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360","pubkey":"b72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360","path":"","uuid":"40b4cada-d794-4973-842b-cf565999c093","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/api-token.txt b/ops/docker/layer1/keystores/layer1/keys/api-token.txt new file mode 100644 index 000000000..ffd99ada4 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/api-token.txt @@ -0,0 +1 @@ +80aooS4HtRHAFPtVkYI0imFBuVWBFYIRK \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/validator_definitions.yml b/ops/docker/layer1/keystores/layer1/keys/validator_definitions.yml new file mode 100644 index 000000000..3aed0a306 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/validator_definitions.yml @@ -0,0 +1,192 @@ +- enabled: true + voting_public_key: 0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071 + description: 0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071 +- enabled: true + voting_public_key: 0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe + description: 0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe +- enabled: true + voting_public_key: 0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4 + description: 0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4 +- enabled: true + voting_public_key: 0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f + description: 0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f +- enabled: true + voting_public_key: 0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5 + description: 0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5 +- enabled: true + voting_public_key: 0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52 + description: 0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52 +- enabled: true + voting_public_key: 0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb + description: 0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb +- enabled: true + voting_public_key: 0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca + description: 0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca +- enabled: true + voting_public_key: 0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64 + description: 0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64 +- enabled: true + voting_public_key: 0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8 + description: 0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8 +- enabled: true + voting_public_key: 0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41 + description: 0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41 +- enabled: true + voting_public_key: 0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8 + description: 0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8 +- enabled: true + voting_public_key: 0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75 + description: 0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75 +- enabled: true + voting_public_key: 0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8 + description: 0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8 +- enabled: true + voting_public_key: 0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4 + description: 0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4 +- enabled: true + voting_public_key: 0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932 + description: 0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932 +- enabled: true + voting_public_key: 0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af + description: 0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af +- enabled: true + voting_public_key: 0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183 + description: 0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183 +- enabled: true + voting_public_key: 0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f + description: 0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f +- enabled: true + voting_public_key: 0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea + description: 0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea +- enabled: true + voting_public_key: 0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8 + description: 0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8 +- enabled: true + voting_public_key: 0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1 + description: 0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1 +- enabled: true + voting_public_key: 0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6 + description: 0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6 +- enabled: true + voting_public_key: 0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c + description: 0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c +- enabled: true + voting_public_key: 0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab + description: 0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab +- enabled: true + voting_public_key: 0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670 + description: 0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670 +- enabled: true + voting_public_key: 0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360 + description: 0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360 +- enabled: true + voting_public_key: 0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db + description: 0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db +- enabled: true + voting_public_key: 0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c + description: 0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c +- enabled: true + voting_public_key: 0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e + description: 0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e +- enabled: true + voting_public_key: 0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b + description: 0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b +- enabled: true + voting_public_key: 0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb + description: 0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb diff --git a/ops/docker/layer1/keystores/layer1/keys/validator_key_cache.json b/ops/docker/layer1/keystores/layer1/keys/validator_key_cache.json new file mode 100644 index 000000000..3c67a1128 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/validator_key_cache.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"scrypt","params":{"dklen":32,"n":262144,"r":8,"p":1,"salt":"0ead8ef6a4e193aa9684ed6163bb9e287dee9e8a37dcf1a51839a6151c1bcd07"},"message":""},"checksum":{"function":"sha256","params":{},"message":"99e1c6667d2d4b52703abf78d754e47bcc1089124ecae1cc248f06553155dc1d"},"cipher":{"function":"aes-128-ctr","params":{"iv":"abcb35fb4e8e123c04737b99d6a0a006"},"message":"1108302561612904b2454bf1a723cdcd4804c498239eb3b00b567b01a363f6c71ffc9ecc8f03af405367a926df1e5170ee0e450fe227adc1d2c40e0a2ac16d19f7d57bd4d1573321e4f2f77d138678840e33eb672a6217d618104f39edee3483469752cce40c673f8599e7bc66c44bc4c80a60f9491f83ae9bc1b68dcedb2e44db23ee65fd861c3cf6e035fa35a560a9a8b4d3e6790be0c2659a409037cca743b8de3cc0d74fa75b1a4e3caa807f151d3e1dd8114da355f4d40cd096c3a5bcdf06b1d594ac22b7a7c0af6ef4b51511376823c1bb6a55ac9e6d53c31d3970aa729aedd7ceb60c70943551fada1f033bfa81066d993f42d21721e984b46353bf5865f7a5fc0bc78726c801e934c1c1921af03762cec224eefa9010f557239d3a1979691732b2ac7acc81bb626bf192e9eee5ddb12faf2357ff88740a2ab1405259207101eb4ee00eb63381e5e825f03301e7bbef995370896990b433e113a37f3b53f4699891c374ab433075473dc518622de53f9ab29932a2811ddba6c9603e2103a5d07586574b65ab372861542eb7a3a362240f2a29ca52588f2c48d85b2d3ed80e8ee646d7d4bae5e64123305a9a9d8c2f5182fd796088db106f79923d56aafaa85fcb32c3edc9129fe808adc0f1c9bd1d63a1f9acfb91fff05fe9e855fb380ea831e0e20d1c2b01219bb5db015e4bba583a872859ccbdaf2a8d5a82eafba0bc6c8e2a03e69cf43e5188fd5a71daa4a923173cec267d159410425f2143803c7d0fe2b6ffaa2fb82ce86205abe972ee563cf0f7ec19a2806337a86a662dec7de54171bf9406be850d74a06b3160d8c234756c43737734282c8be01f7eb58cabb7cf6f46f1a51fecc1bec81044104e312861882d7bb3bcd740e8c0e7029248c5c7ef6260512f683017b8aa377ccd1f71507ace6636c9cc000fa6dfb00491fb07b651add2e76d75fd87b8ec7bff6cd2a26f9ec35c71c68d2121cd10451b47c6e0201bb1c0c37bfe1f90306bc250c13c631bfc2dd805f0c4f4192b548ac9d4670c02e0ff1d0e136d57eb981664739f9dd1107cebfdf95433384ce6027f667eb5a2c7aac705cfa7f7cc1498e501242ab5427d9e5d57e7e66839478b202f1064d5a444ea83b9d047dcdc24ecf736c6fdb8cd65434050bac6c187800ff6b822eaa000dc7953c1a6b04e59e9d4d26a59a5872d48e1aabc90ad4296c51b39fcefd264c44dbe18912e0f3ea676068e98e47538c12e8ba9bca5483a16213edf9d530fa2061e46df8a7b0178b27e9584bd86d9562dc9122954eb64c3827d9ce55949cb8d583bc0568c57c25d98b6a7f051a66934f42c24643403c4bcf63029184a4b15f2c2232af7ec8c4821cb76a9dfcc152721225cf8557dcb60033a1f892a8ee34599d634cdc4e48701ca4143d008375ac769534dce6a93f6e2cc6e53684c5865fc0845cbd6f60c6ada25c9d4126f6d5eed8cd94a90b4027a6b725b3180237ed6bb9ee83ca45e453809fe9c7d1a27eb9a2590608371e7eee9df7603df47c702d93324bed5d3aab2e03a2cf07a3b70bd7f87347d9d78e3420e8b3d4c7295b42fec74ac4bc3a67c46ffdb641b57a7e4ca31767321b449acd888785b4b687b8982cdf27a80b90a392aaf23125dbab2f33614401f83f39ca60f6f01adf77167204b35e47ed814194a90c4a507c9abbb9669a4524a5724ac4c9c23fe0cffde235655b6b09cbac93921fba15756bf75b81d043a1847600158a060cc411d9f45734c1b35385b6b1e33b0150984b6ef77c1835ff54cade18f022070248d86fe41e8480eef5a6b3fd6c9ab96e00773ef22b57f617ed0debcfeacdeb4e42a2ebe216348ee544beb03264bed04e087f745a9a16bc7cfe3990db56c838bd2a542b1b375f958899ae2f8200826deedf66d133e3d1d1f945851db38c1d3f5ee290d17bca876055562c59a2dc80e32bd551c1bd52e7f9660bf21900ab5d61daa421e24dcee2fb7d46355317df5ca63730b33fe8f7e9f6c33e35e7516211bb311906b7a1dd04adae4b33c571e983b997bd9d1e9ebfd0d6e5ca464c5fa1cd7bebdc7df9b1e800d80f43e04fcf14ff4217c2db9ede423955b92f3fceb155953f704b26aa45ce980baec8bb68a11816ec7b99bf23d204519e042774862e5ec07d844c018de2c185dc12b2ab0dff311b11e110872572daadaabbd36ab0502e5c71c2dd331de26af7177a5105b3a20b8461971071019c6f328ab8f23e84713b488a881d483d8f7c451704c9b15db8fff2f3f39b68e70ed2efefe545e16d0a2f4df3dc1d3f322409df77a0a286352ec3859d4d47dea6361f4064a63aed63a35dda51492b664b297f980f41b8c18a59e390c2335b419a03467f6667d01a9a22c5de0aa3507af431dde999f696def77b8a54697fda24e9e094c8227cc02b6fcec4759ce9fa1965b55eb3a332f0e3da0be63ed5b37ba1f515096fd8c66322335c5a65b9ff5fe52fe43af1a9c5e639b3bf1786d8e7cfbfb75d8502d90ed37e83c4f5d86cee3c5f61a05605c178d02531ff8dfa5a207ccc799"}},"uuids":["9c48003a-283e-4614-9647-44e2485b7899","22473cbd-6ed0-4816-80eb-08d0b82b56a7","9b885749-f312-45af-9672-db7edc662e8b","04ad2f0a-b15f-47d8-9621-a2f7ae1da957","fa7cd4db-056e-476e-a949-6e56f029a416","757939aa-f987-4cef-a1b2-88b2296ce568","67f42de7-fc6d-4f27-b3d3-63b6fd62fc65","c26b8e0c-c6dc-404d-99ce-97b80deb506f","00c54fed-7953-439f-ac28-4d4bad382a41","72b953c4-8e95-4b8a-bc98-61a95b58cb20","0dee2eaa-5935-45c9-bf91-2ce8a0f09188","188c3b58-bd99-4ffd-9f98-a8a77102d5b6","38b7eba0-0c08-4b88-a6eb-8a6b8ebcc871","9313bc22-c3cc-4e47-9e7a-59de6938a8a7","fe505f6d-504b-4efa-afc1-143c6b63028a","bba75357-fcdf-4441-be4d-2ae794c262bd","5cf506c7-6a09-4139-b298-f07b02bdc643","46723964-9060-4c82-b1c5-d7177c96672b","7cbc504e-989d-4f0c-88dc-3605c322622f","8f3eb0ae-dbb9-4d0e-b3e1-293ad94dec02","d5fa5791-b381-4e34-b5bd-d395a1e3ccc3","21c3b6f7-23a3-45e3-8444-6428ba673c6e","e48ff448-38eb-4b2e-811c-25b734c9c125","70ab074f-b273-415f-b6aa-bad700d59063","5cca9e94-3149-498d-a1f8-3cb50f5fc37d","0af96913-93e6-4937-bfb9-cb9118b6f513","40b4cada-d794-4973-842b-cf565999c093","e300fd01-792e-4718-bc14-1ccb529fd5a8","b8fc724f-b604-4d6d-8d85-62079488cd3e","ca0eeeb8-8a3b-4157-9b4c-43a6e5607269","03e47af2-e1f4-401f-8fdb-533d88f7c58b","7ef682ad-e17b-467c-a54a-41c2a9212b65"]} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/pubkeys.json b/ops/docker/layer1/keystores/layer1/pubkeys.json new file mode 100644 index 000000000..69d6d544e --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/pubkeys.json @@ -0,0 +1 @@ +["0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c","0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6","0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea","0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f","0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1","0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41","0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183","0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f","0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360","0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe","0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4","0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af","0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071","0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5","0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b","0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca","0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e","0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb","0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75","0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8","0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db","0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8","0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64","0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670","0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c","0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4","0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52","0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932","0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab","0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8","0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb","0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8"] \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb b/ops/docker/layer1/keystores/layer1/secrets/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb new file mode 100644 index 000000000..bcad43dcc --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb @@ -0,0 +1 @@ +ZUWk0okTR2xKYRJ3wOBLbhFE3hvsQK9r8K-KElrQFss= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932 b/ops/docker/layer1/keystores/layer1/secrets/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932 new file mode 100644 index 000000000..ef874e4af --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932 @@ -0,0 +1 @@ +5j_WCIi1BEnRWPK-UHMAx74pGGssHfvnq-CWOo3Wg7E= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8 b/ops/docker/layer1/keystores/layer1/secrets/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8 new file mode 100644 index 000000000..06942b936 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8 @@ -0,0 +1 @@ +xqGP6hfOImR8vjBgHqfBXP651ibAi8CYzr7TPVIp49w= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f b/ops/docker/layer1/keystores/layer1/secrets/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f new file mode 100644 index 000000000..f36900ee0 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f @@ -0,0 +1 @@ +9CARLtXFmeamkSZYGEzKJj21F6xzXhdh9q_Hx1NwKjU= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75 b/ops/docker/layer1/keystores/layer1/secrets/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75 new file mode 100644 index 000000000..dd51762c2 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75 @@ -0,0 +1 @@ +xFtbRMM9OIvL7QEzeJN7IY1aIQGrpzY60XsWqskW0hU= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6 b/ops/docker/layer1/keystores/layer1/secrets/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6 new file mode 100644 index 000000000..9199e1844 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6 @@ -0,0 +1 @@ +HW2zOtCg1rUoxTpI5PrfJf4vBer_g47F9kRa_VCVQl0= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab b/ops/docker/layer1/keystores/layer1/secrets/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab new file mode 100644 index 000000000..0a8bb258d --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab @@ -0,0 +1 @@ +W65ZJicHA9pKlXwoIK9NsExEUzPMvdTnDFqN2sImdNo= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4 b/ops/docker/layer1/keystores/layer1/secrets/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4 new file mode 100644 index 000000000..516097a09 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4 @@ -0,0 +1 @@ +L-mvkrvLL_2TPJMW2dZp-ViIR0WZE362zYzWd5cuvY4= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071 b/ops/docker/layer1/keystores/layer1/secrets/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071 new file mode 100644 index 000000000..ae6327f3e --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071 @@ -0,0 +1 @@ +IRtpLprt_w6WKx1JMe-f-0MAHp7iOXzb99PJgzTKTMg= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8 b/ops/docker/layer1/keystores/layer1/secrets/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8 new file mode 100644 index 000000000..1d33a2bad --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8 @@ -0,0 +1 @@ +o8TqdqYeELpK0-R0J3OhqTAjzO3nA05D82L7voCS0YM= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64 b/ops/docker/layer1/keystores/layer1/secrets/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64 new file mode 100644 index 000000000..4cca50f28 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64 @@ -0,0 +1 @@ +E39ZFm0FK64pO2a19Gi8SkelsNTLSUq1FcVxY1CSQng= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea b/ops/docker/layer1/keystores/layer1/secrets/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea new file mode 100644 index 000000000..c93f662d2 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea @@ -0,0 +1 @@ +6J_smE458smJp2ZBoq5MYjKzuRas-CUzRW1WxByY44k= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af b/ops/docker/layer1/keystores/layer1/secrets/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af new file mode 100644 index 000000000..7b4b42275 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af @@ -0,0 +1 @@ +TPSwkifoWQIxIhPazgESo0ZIYlMdbSGWRzEBLXUQ4BA= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5 b/ops/docker/layer1/keystores/layer1/secrets/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5 new file mode 100644 index 000000000..49ce9eee1 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5 @@ -0,0 +1 @@ +5j-TkOPp5kYICAQQJhUOEngEjSl6Q8OuXkqCD5vEP2I= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f b/ops/docker/layer1/keystores/layer1/secrets/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f new file mode 100644 index 000000000..33d4f3c1c --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f @@ -0,0 +1 @@ +vMEIX4TeB3tk56Ket1pMWjofSgAgGCJ6ZaCc2YMJbWs= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52 b/ops/docker/layer1/keystores/layer1/secrets/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52 new file mode 100644 index 000000000..7fd6bc709 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52 @@ -0,0 +1 @@ +dJXqUc9MPTRrG-1M6CCnqLg1ShOpNicOV2iRflvjPFk= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb b/ops/docker/layer1/keystores/layer1/secrets/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb new file mode 100644 index 000000000..8988cc553 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb @@ -0,0 +1 @@ +qDNu0WskAg1qQr4b8YRJGUrGvBmwrDexshqVTRUahkw= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41 b/ops/docker/layer1/keystores/layer1/secrets/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41 new file mode 100644 index 000000000..ad8c06711 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41 @@ -0,0 +1 @@ +ZFub7IkE88rO8iSgfckfzzmmUFqdAN0ydOBhLbBZvdY= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db b/ops/docker/layer1/keystores/layer1/secrets/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db new file mode 100644 index 000000000..25f5e12c5 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db @@ -0,0 +1 @@ +3CZgGV4YmAfvbb2wUhYmC3J_fH6v502RKjHwGmViwEU= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8 b/ops/docker/layer1/keystores/layer1/secrets/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8 new file mode 100644 index 000000000..276b85e73 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8 @@ -0,0 +1 @@ +_Au4lfBPnpnpIZgh4k2DtmlEt3O2an1Ra91Q4E5YNtQ= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4 b/ops/docker/layer1/keystores/layer1/secrets/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4 new file mode 100644 index 000000000..20068612a --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4 @@ -0,0 +1 @@ +khEI292Bierz0cGZ4vMLew2JeU7LU_gss8FwVWwnKmc= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c b/ops/docker/layer1/keystores/layer1/secrets/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c new file mode 100644 index 000000000..0975a8662 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c @@ -0,0 +1 @@ +rRg3dBHEB0rNd3ws39VbrU9O0TGz8ub5THCab-brfXg= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b b/ops/docker/layer1/keystores/layer1/secrets/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b new file mode 100644 index 000000000..b35c36749 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b @@ -0,0 +1 @@ +GtHr5sN3W-KTOUvA3OSfuPEFUAhOGn9wl97F2smo_EE= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e b/ops/docker/layer1/keystores/layer1/secrets/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e new file mode 100644 index 000000000..4f0c999b9 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e @@ -0,0 +1 @@ +rzUo8KPugtBDRv84uGoultyzCdnxIViLekhy6qrZZL0= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1 b/ops/docker/layer1/keystores/layer1/secrets/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1 new file mode 100644 index 000000000..d5b9b41ba --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1 @@ -0,0 +1 @@ +DQJZCL9IOKlbpyN29EBIdM4sUklMu7zc1IKTrK9VE60= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183 b/ops/docker/layer1/keystores/layer1/secrets/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183 new file mode 100644 index 000000000..04a5e8f4a --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183 @@ -0,0 +1 @@ +VMftlRJfjSD_8oc4maA_pV-IhJRyf1s2jBn_HwK3HjE= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c b/ops/docker/layer1/keystores/layer1/secrets/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c new file mode 100644 index 000000000..c1c395fd3 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c @@ -0,0 +1 @@ +1y8B2Q0VKtGC71U5d4hllb7wGSmxM2T8zW_PhOuneB4= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8 b/ops/docker/layer1/keystores/layer1/secrets/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8 new file mode 100644 index 000000000..addf60c12 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8 @@ -0,0 +1 @@ +qETVYVop1wqSdueWixO_CDeb29an1pV6pkGs3T8t2oE= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca b/ops/docker/layer1/keystores/layer1/secrets/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca new file mode 100644 index 000000000..142831492 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca @@ -0,0 +1 @@ +GtHF8DbPC-1zy36sQVfRz_eEXcTphPoFcczyfPal6gQ= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe b/ops/docker/layer1/keystores/layer1/secrets/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe new file mode 100644 index 000000000..9a5b66574 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe @@ -0,0 +1 @@ +6wIGp35d-hjuXqk_mu4F-vWQRspOyaESCRHOBuamqAI= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670 b/ops/docker/layer1/keystores/layer1/secrets/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670 new file mode 100644 index 000000000..3950f698d --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670 @@ -0,0 +1 @@ +4uT82wJlHt1kGimFo3gffv35MqlITD7O42-zpYYEOJ4= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360 b/ops/docker/layer1/keystores/layer1/secrets/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360 new file mode 100644 index 000000000..0c013f70d --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360 @@ -0,0 +1 @@ +SQO5GHmhiJqumLZh8TzJ0mT-B_7w3b1worvAUnRZTKw= \ No newline at end of file diff --git a/ops/docker/layer1/scripts/clean.sh b/ops/docker/layer1/scripts/clean.sh new file mode 100755 index 000000000..934612b3a --- /dev/null +++ b/ops/docker/layer1/scripts/clean.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +# Clean script to reset the network to initial state +# Removes all generated files from generate-genesis and docker compose data + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" + +echo "=== Cleaning Network Data ===" + +cd "$PROJECT_DIR/.." + +# Stop and remove only layer1 containers +echo "Stopping and removing layer1 containers..." +docker compose -f docker-compose-4nodes.yml stop layer1-el layer1-cl layer1-vc 2>/dev/null || true +docker compose -f docker-compose-4nodes.yml rm -f layer1-el layer1-cl layer1-vc 2>/dev/null || true + +# Remove layer1 volumes +echo "Removing layer1 volumes..." +docker volume rm docker_layer1-el-data docker_layer1-cl-data docker_layer1-vc-data 2>/dev/null || true + +# Remove generated genesis files +echo "Removing generated genesis files..." +if [ -d "layer1/genesis" ]; then + # Remove all generated genesis files - everything in genesis/ is generated by generate-genesis.sh + # These files are regenerated each time generate-genesis.sh runs + rm -rf layer1/genesis/genesis.json + rm -rf layer1/genesis/genesis.ssz + rm -rf layer1/genesis/config.yaml + rm -rf layer1/genesis/metadata + rm -rf layer1/genesis/parsed + rm -rf layer1/genesis/network-configs + rm -rf layer1/genesis/jwt + # Remove all other generated files from ethereum-genesis-generator + rm -f layer1/genesis/*.json + rm -f layer1/genesis/*.yaml + rm -f layer1/genesis/*.txt + rm -f layer1/genesis/*.ssz + echo "✓ Genesis files removed" +fi + +# Remove generated configs (but keep template) +echo "Removing generated config files..." +if [ -d "layer1/configs" ]; then + rm -f layer1/configs/values.env + rm -f layer1/configs/additional-contracts.json + echo "✓ Config files removed (template preserved)" +fi + +# Remove VC slashing protection database (if exists) +echo "Removing VC slashing protection database..." +if [ -d "layer1/keystores/layer1" ]; then + # Remove slashing protection database but keep keys and secrets + find layer1/keystores/layer1 -name "*.db" -o -name "*.sqlite" -o -name "*.sqlite3" | xargs rm -f 2>/dev/null || true + find layer1/keystores/layer1 -type d -name "slashing_protection" -exec rm -rf {} + 2>/dev/null || true + echo "✓ VC slashing protection database removed" +fi + +# Remove any remaining data directories +echo "Removing data directories..." +rm -rf data/ 2>/dev/null || true + +# Clean up any docker volumes that might remain +echo "Cleaning up Docker volumes..." +docker volume ls | grep -E "simple-ethereum-network|layer1-" | awk '{print $2}' | while read volume; do + docker volume rm "$volume" 2>/dev/null || true +done + +echo "" +echo "=== Cleanup Complete ===" +echo "" +echo "Removed:" +echo " - Generated genesis files (genesis.json, genesis.ssz, config.yaml, metadata/, parsed/)" +echo " - Generated config files (values.env, additional-contracts.json)" +echo " - Docker containers and volumes" +echo " - Data directories" +echo "" +echo "Preserved:" +echo " - Configuration templates (layer1/configs/values.env.template)" +echo " - JWT secret (layer1/jwt/jwtsecret)" +echo " - Keystores (layer1/keystores/)" +echo " - Docker Compose file (docker-compose-4nodes.yml)" +echo "" +echo "You can now run 'make generate' and 'make start' again to create a fresh network." + diff --git a/ops/docker/layer1/scripts/generate-genesis.sh b/ops/docker/layer1/scripts/generate-genesis.sh new file mode 100755 index 000000000..62a592c94 --- /dev/null +++ b/ops/docker/layer1/scripts/generate-genesis.sh @@ -0,0 +1,97 @@ +#!/bin/bash + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" + +GENESIS_DIR="$PROJECT_DIR/genesis" +KEYSTORES_DIR="$PROJECT_DIR/keystores" +JWT_DIR="$PROJECT_DIR/jwt" +CONFIGS_DIR="$PROJECT_DIR/configs" + +# Create necessary directories +mkdir -p "$GENESIS_DIR" "$CONFIGS_DIR" + +echo "=== Generating Genesis Data ===" + +# Calculate genesis timestamp (current time + 20 seconds) +GENESIS_TIMESTAMP=$(date -u +%s) +GENESIS_TIMESTAMP=$((GENESIS_TIMESTAMP + 20)) + +# Use ethereum-genesis-generator to generate genesis +echo "Generating genesis data..." + +# Create values.env file from template +VALUES_ENV_TEMPLATE="$SCRIPT_DIR/../configs/values.env.template" +VALUES_ENV="$CONFIGS_DIR/values.env" + +if [ ! -f "$VALUES_ENV_TEMPLATE" ]; then + echo "Error: Template file not found: $VALUES_ENV_TEMPLATE" + exit 1 +fi + +# Replace placeholders in template +sed -e "s/{{GENESIS_TIMESTAMP}}/$GENESIS_TIMESTAMP/g" \ + "$VALUES_ENV_TEMPLATE" > "$VALUES_ENV" + +# Create additional-contracts.json +ADDITIONAL_CONTRACTS="$CONFIGS_DIR/additional-contracts.json" +echo "[]" > "$ADDITIONAL_CONTRACTS" + +# Run genesis generator +# The generator creates files in /data/metadata/ which need to be moved to /data/ root +# Since /data is mounted to genesis/ on the host, moving to /data automatically puts files in genesis/ +# IMPORTANT: additional-contracts.json must be at /opt/additional-contracts.json as specified in values.env +echo "Running genesis generator..." +docker run --rm \ + -v "$CONFIGS_DIR/values.env:/opt/values.env" \ + -v "$CONFIGS_DIR/additional-contracts.json:/opt/additional-contracts.json" \ + -v "$GENESIS_DIR:/data" \ + --entrypoint="" \ + ethpandaops/ethereum-genesis-generator:5.1.0 \ + sh -c "cp /opt/values.env /config/values.env && /work/entrypoint.sh all && mv /data/metadata/* /data/ 2>/dev/null || true && [ -d /data/parsed ] && mv /data/parsed /data/ 2>/dev/null || true && rmdir /data/metadata 2>/dev/null || true" + +# Verify that files were generated (they should be directly in genesis/ now) +if [ ! -f "$GENESIS_DIR/genesis.json" ]; then + echo "❌ Error: genesis.json not found after generation" + exit 1 +fi + +# Check output +if [ -f "$GENESIS_DIR/genesis.json" ]; then + echo "✓ genesis.json generated successfully" +else + echo "❌ Error: genesis.json not generated" + exit 1 +fi + +if [ -f "$GENESIS_DIR/genesis.ssz" ]; then + echo "✓ genesis.ssz generated successfully" +else + echo "⚠ Warning: genesis.ssz not generated" +fi + +if [ -f "$GENESIS_DIR/config.yaml" ]; then + echo "✓ config.yaml generated successfully" +else + echo "⚠ Warning: config.yaml not generated" +fi + +if [ -f "$GENESIS_DIR/deposit_contract_block.txt" ]; then + echo "✓ deposit_contract_block.txt generated successfully" +else + echo "⚠ Warning: deposit_contract_block.txt not generated" +fi + +echo "" +echo "=== Genesis Data Generation Complete ===" +echo "Genesis files location: $GENESIS_DIR" +echo "Keystores location: $KEYSTORES_DIR" +echo "JWT secret location: $JWT_DIR/jwtsecret" +echo "" +echo "Genesis timestamp: $GENESIS_TIMESTAMP" +echo "Validator count: 32" +echo "" +echo "Lighthouse testnet-dir files:" +ls -1 "$GENESIS_DIR"/*.{yaml,ssz,txt} 2>/dev/null | xargs -n 1 basename | head -10 diff --git a/ops/docker/layer1/scripts/start.sh b/ops/docker/layer1/scripts/start.sh new file mode 100755 index 000000000..b57775b5d --- /dev/null +++ b/ops/docker/layer1/scripts/start.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" + +# Check if genesis files exist +if [ ! -f "$PROJECT_DIR/genesis/genesis.json" ]; then + echo "Error: genesis.json does not exist, please run ./scripts/generate-genesis.sh first" + exit 1 +fi + +if [ ! -f "$PROJECT_DIR/genesis/genesis.ssz" ]; then + echo "Error: genesis.ssz does not exist, please run ./scripts/generate-genesis.sh first" + exit 1 +fi + +if [ ! -f "$PROJECT_DIR/jwt/jwtsecret" ]; then + echo "Error: jwtsecret does not exist, please run ./scripts/generate-genesis.sh first" + exit 1 +fi + +echo "=== Starting Ethereum Network ===" + +cd "$PROJECT_DIR/.." + +# Start all services +docker compose -f docker-compose-4nodes.yml up -d layer1-el layer1-cl layer1-vc + +echo "" +echo "Waiting for containers to start..." +sleep 15 + +# Wait for EL node initialization to complete +echo "Waiting for EL node initialization..." +for i in {1..30}; do + if docker exec layer1-el geth --exec "eth.blockNumber" attach http://localhost:8545 > /dev/null 2>&1; then + echo "Layer1 EL is ready" + break + fi + sleep 2 +done + +echo "" +echo "=== Network Started Successfully ===" +echo "" +echo "Access ports:" +echo " Layer1 EL RPC: http://localhost:9545" +echo " Layer1 EL WebSocket: ws://localhost:9546" +echo " Layer1 CL HTTP API: http://localhost:4000" +echo " Layer1 CL Metrics: http://localhost:5054" +echo "" +echo "View logs:" +echo " docker compose -f docker-compose-4nodes.yml logs -f layer1-el layer1-cl layer1-vc" +echo "" +echo "Stop network:" +echo " docker compose -f docker-compose-4nodes.yml down" diff --git a/tx-submitter/go.mod b/tx-submitter/go.mod index f0e258140..044e78141 100644 --- a/tx-submitter/go.mod +++ b/tx-submitter/go.mod @@ -5,6 +5,8 @@ go 1.24.0 replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 require ( + github.com/consensys/gnark-crypto v0.16.0 + github.com/crate-crypto/go-eth-kzg v1.4.0 github.com/holiman/uint256 v1.2.4 github.com/morph-l2/externalsign v0.3.1 github.com/morph-l2/go-ethereum v1.10.14-0.20251031091135-78b17f183b84 @@ -24,9 +26,7 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/consensys/bavard v0.1.27 // indirect - github.com/consensys/gnark-crypto v0.16.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect - github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect diff --git a/tx-submitter/services/blob_hash_test.go b/tx-submitter/services/blob_hash_test.go new file mode 100644 index 000000000..929d57103 --- /dev/null +++ b/tx-submitter/services/blob_hash_test.go @@ -0,0 +1,126 @@ +package services + +import ( + "crypto/sha256" + "testing" + + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/crypto/kzg4844" + "github.com/stretchr/testify/assert" +) + +// TestCalcBlobHashV1VsKZGToVersionedHash verifies that CalcBlobHashV1 and kZGToVersionedHash +// produce the same results for the same commitment. +func TestCalcBlobHashV1VsKZGToVersionedHash(t *testing.T) { + tests := []struct { + name string + commitment kzg4844.Commitment + }{ + { + name: "zero commitment", + commitment: kzg4844.Commitment{}, + }, + { + name: "all ones commitment", + commitment: func() kzg4844.Commitment { + var c kzg4844.Commitment + for i := range c { + c[i] = 0xFF + } + return c + }(), + }, + { + name: "pattern commitment", + commitment: func() kzg4844.Commitment { + var c kzg4844.Commitment + for i := range c { + c[i] = byte(i % 256) + } + return c + }(), + }, + { + name: "reversed pattern commitment", + commitment: func() kzg4844.Commitment { + var c kzg4844.Commitment + for i := range c { + c[i] = byte(255 - (i % 256)) + } + return c + }(), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Calculate using kZGToVersionedHash (v0 method) + hashV0 := kZGToVersionedHash(tt.commitment) + + // Calculate using CalcBlobHashV1 (v1 method) + hasher := sha256.New() + hashV1 := kzg4844.CalcBlobHashV1(hasher, &tt.commitment) + + // Convert hashV1 to common.Hash for comparison + hashV1CommonHash := common.Hash(hashV1) + + // They should be equal + assert.Equal(t, hashV0, hashV1CommonHash, + "CalcBlobHashV1 and kZGToVersionedHash should produce the same result") + + // Verify the first byte is 0x01 (version byte) + assert.Equal(t, uint8(0x01), hashV0[0], "First byte should be version 0x01") + assert.Equal(t, uint8(0x01), hashV1[0], "First byte should be version 0x01") + }) + } +} + +// TestCalcBlobHashV1ReuseHasher verifies that CalcBlobHashV1 can correctly reuse a hasher +// for multiple commitments. +func TestCalcBlobHashV1ReuseHasher(t *testing.T) { + // Create multiple commitments + commitments := []kzg4844.Commitment{ + {0x01, 0x02, 0x03}, // Will be padded with zeros + {0xFF, 0xFE, 0xFD}, // Will be padded with zeros + {}, // Zero commitment + } + + // Calculate hashes using reused hasher + hasher := sha256.New() + hashesV1 := make([]common.Hash, len(commitments)) + for i, commit := range commitments { + hashV1 := kzg4844.CalcBlobHashV1(hasher, &commit) + hashesV1[i] = common.Hash(hashV1) + } + + // Calculate hashes using kZGToVersionedHash (should produce same results) + hashesV0 := make([]common.Hash, len(commitments)) + for i, commit := range commitments { + hashesV0[i] = kZGToVersionedHash(commit) + } + + // Compare results + for i := range commitments { + assert.Equal(t, hashesV0[i], hashesV1[i], + "Hash %d should be equal regardless of hasher reuse", i) + } +} + +// TestCalcBlobHashV1MultipleCalls verifies that CalcBlobHashV1 produces consistent +// results when called multiple times with the same commitment. +func TestCalcBlobHashV1MultipleCalls(t *testing.T) { + commitment := kzg4844.Commitment{0x42} + + hasher1 := sha256.New() + hash1 := kzg4844.CalcBlobHashV1(hasher1, &commitment) + + hasher2 := sha256.New() + hash2 := kzg4844.CalcBlobHashV1(hasher2, &commitment) + + // Same commitment should produce same hash + assert.Equal(t, hash1, hash2, "Same commitment should produce same hash") + + // Should also match kZGToVersionedHash + hashV0 := kZGToVersionedHash(commitment) + assert.Equal(t, common.Hash(hash1), hashV0, "Should match kZGToVersionedHash result") +} diff --git a/tx-submitter/services/rollup.go b/tx-submitter/services/rollup.go index ee47752ce..22d3125ff 100644 --- a/tx-submitter/services/rollup.go +++ b/tx-submitter/services/rollup.go @@ -82,6 +82,8 @@ type Rollup struct { bm *l1checker.BlockMonitor eventInfoStorage *event.EventInfoStorage reorgDetector iface.IReorgDetector + + ChainConfigMap types.ChainBlobConfigs } func NewRollup( @@ -126,6 +128,7 @@ func NewRollup( bm: bm, eventInfoStorage: eventInfoStorage, reorgDetector: reorgDetector, + ChainConfigMap: types.ChainConfigMap, } return r } @@ -298,7 +301,7 @@ func (r *Rollup) ProcessTx() error { // Helper function to detect reorgs with retry func (r *Rollup) detectReorgWithRetry() (bool, uint64, error) { var lastErr error - for i := range 3 { // Try up to 3 times + for i := 0; i < 3; i++ { // Try up to 3 times hasReorg, depth, err := r.reorgDetector.DetectReorg(r.ctx) if err == nil { return hasReorg, depth, nil @@ -839,7 +842,7 @@ func (r *Rollup) finalize() error { if err != nil { return fmt.Errorf("pack finalizeBatch error:%v", err) } - tip, feecap, _, err := r.GetGasTipAndCap() + tip, feecap, _, _, err := r.GetGasTipAndCap() if err != nil { log.Error("get gas tip and cap error", "business", "finalize") return fmt.Errorf("get gas tip and cap error:%v", err) @@ -1065,7 +1068,7 @@ func (r *Rollup) rollup() error { } // tip and cap - tip, gasFeeCap, blobFee, err := r.GetGasTipAndCap() + tip, gasFeeCap, blobFee, head, err := r.GetGasTipAndCap() if err != nil { return fmt.Errorf("get gas tip and cap error:%v", err) } @@ -1102,7 +1105,7 @@ func (r *Rollup) rollup() error { } // Create and sign transaction - tx, err := r.createRollupTx(batch, nonce, gas, tip, gasFeeCap, blobFee, calldata) + tx, err := r.createRollupTx(batch, nonce, gas, tip, gasFeeCap, blobFee, calldata, head) if err != nil { return fmt.Errorf("failed to create rollup tx: %w", err) } @@ -1116,14 +1119,14 @@ func (r *Rollup) rollup() error { r.logTxInfo(signedTx, batchIndex) // Send transaction - if err := r.SendTx(signedTx); err != nil { + if err = r.SendTx(signedTx); err != nil { return fmt.Errorf("failed to send tx: %w", err) } // Update pending state r.pendingTxs.SetPindex(batchIndex) r.pendingTxs.SetNonce(tx.Nonce()) - if err := r.pendingTxs.Add(signedTx); err != nil { + if err = r.pendingTxs.Add(signedTx); err != nil { log.Error("Failed to track transaction", "error", err) } @@ -1143,17 +1146,36 @@ func (r *Rollup) getNextNonce() uint64 { return nonce } -func (r *Rollup) createRollupTx(batch *eth.RPCRollupBatch, nonce, gas uint64, tip, gasFeeCap, blobFee *big.Int, calldata []byte) (*ethtypes.Transaction, error) { +func (r *Rollup) createRollupTx(batch *eth.RPCRollupBatch, nonce, gas uint64, tip, gasFeeCap, blobFee *big.Int, calldata []byte, head *ethtypes.Header) (*ethtypes.Transaction, error) { if len(batch.Sidecar.Blobs) > 0 { - return r.createBlobTx(batch, nonce, gas, tip, gasFeeCap, blobFee, calldata) + return r.createBlobTx(batch, nonce, gas, tip, gasFeeCap, blobFee, calldata, head) } return r.createDynamicFeeTx(nonce, gas, tip, gasFeeCap, calldata) } -func (r *Rollup) createBlobTx(batch *eth.RPCRollupBatch, nonce, gas uint64, tip, gasFeeCap, blobFee *big.Int, calldata []byte) (*ethtypes.Transaction, error) { - versionedHashes := make([]common.Hash, 0, len(batch.Sidecar.Commitments)) - for _, commit := range batch.Sidecar.Commitments { - versionedHashes = append(versionedHashes, kZGToVersionedHash(commit)) +func (r *Rollup) createBlobTx(batch *eth.RPCRollupBatch, nonce, gas uint64, tip, gasFeeCap, blobFee *big.Int, calldata []byte, head *ethtypes.Header) (*ethtypes.Transaction, error) { + versionedHashes := types.BlobHashes(batch.Sidecar.Blobs, batch.Sidecar.Commitments) + sidecar := ðtypes.BlobTxSidecar{ + Blobs: batch.Sidecar.Blobs, + Commitments: batch.Sidecar.Commitments, + } + switch types.DetermineBlobVersion(head, r.chainId.Uint64()) { + case ethtypes.BlobSidecarVersion0: + sidecar.Version = ethtypes.BlobSidecarVersion0 + proof, err := types.MakeBlobProof(sidecar.Blobs, sidecar.Commitments) + if err != nil { + return nil, fmt.Errorf("gen blob proof failed %v", err) + } + sidecar.Proofs = proof + case ethtypes.BlobSidecarVersion1: + sidecar.Version = ethtypes.BlobSidecarVersion1 + proof, err := types.MakeCellProof(sidecar.Blobs) + if err != nil { + return nil, fmt.Errorf("gen cell proof failed %v", err) + } + sidecar.Proofs = proof + default: + return nil, fmt.Errorf("unsupported blob version") } return ethtypes.NewTx(ðtypes.BlobTx{ @@ -1166,11 +1188,7 @@ func (r *Rollup) createBlobTx(batch *eth.RPCRollupBatch, nonce, gas uint64, tip, Data: calldata, BlobFeeCap: uint256.MustFromBig(blobFee), BlobHashes: versionedHashes, - Sidecar: ðtypes.BlobTxSidecar{ - Blobs: batch.Sidecar.Blobs, - Commitments: batch.Sidecar.Commitments, - Proofs: batch.Sidecar.Proofs, - }, + Sidecar: sidecar, }), nil } @@ -1239,22 +1257,21 @@ func (r *Rollup) buildSignatureInput(batch *eth.RPCRollupBatch) (*bindings.IRoll return &sigData, nil } -func (r *Rollup) GetGasTipAndCap() (*big.Int, *big.Int, *big.Int, error) { - +func (r *Rollup) GetGasTipAndCap() (*big.Int, *big.Int, *big.Int, *ethtypes.Header, error) { head, err := r.L1Client.HeaderByNumber(context.Background(), nil) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } if head.BaseFee != nil { log.Info("market fee info", "feecap", head.BaseFee) if r.cfg.MaxBaseFee > 0 && head.BaseFee.Cmp(big.NewInt(int64(r.cfg.MaxBaseFee))) > 0 { - return nil, nil, nil, fmt.Errorf("base fee is too high, base fee %v exceeds max %v", head.BaseFee, r.cfg.MaxBaseFee) + return nil, nil, nil, nil, fmt.Errorf("base fee is too high, base fee %v exceeds max %v", head.BaseFee, r.cfg.MaxBaseFee) } } tip, err := r.L1Client.SuggestGasTipCap(context.Background()) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } log.Info("market fee info", "tip", tip) @@ -1263,7 +1280,7 @@ func (r *Rollup) GetGasTipAndCap() (*big.Int, *big.Int, *big.Int, error) { tip = new(big.Int).Div(tip, big.NewInt(100)) } if r.cfg.MaxTip > 0 && tip.Cmp(big.NewInt(int64(r.cfg.MaxTip))) > 0 { - return nil, nil, nil, fmt.Errorf("tip is too high, tip %v exceeds max %v", tip, r.cfg.MaxTip) + return nil, nil, nil, nil, fmt.Errorf("tip is too high, tip %v exceeds max %v", tip, r.cfg.MaxTip) } var gasFeeCap *big.Int @@ -1279,7 +1296,13 @@ func (r *Rollup) GetGasTipAndCap() (*big.Int, *big.Int, *big.Int, error) { // calc blob fee cap var blobFee *big.Int if head.ExcessBlobGas != nil { - blobFee = eip4844.CalcBlobFee(*head.ExcessBlobGas, params.BlobTxBlobGaspriceUpdateFraction) + log.Info("market blob fee info", "excess blob gas", *head.ExcessBlobGas) + blobConfig, exist := types.ChainConfigMap[r.chainId.Uint64()] + if !exist { + blobConfig = types.DefaultBlobConfig + } + blobFeeDenominator := types.GetBlobFeeDenominator(blobConfig, head.Time) + blobFee = eip4844.CalcBlobFee(*head.ExcessBlobGas, blobFeeDenominator.Uint64()) // Set to 3x to handle blob market congestion blobFee = new(big.Int).Mul(blobFee, big.NewInt(3)) } @@ -1290,7 +1313,7 @@ func (r *Rollup) GetGasTipAndCap() (*big.Int, *big.Int, *big.Int, error) { "blobfee", blobFee, ) - return tip, gasFeeCap, blobFee, nil + return tip, gasFeeCap, blobFee, head, nil } // PreCheck is run before the submitter to check whether the submitter can be started @@ -1570,7 +1593,7 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *ethtypes.Transaction) (*ethtypes.Tr "nonce", tx.Nonce(), ) - tip, gasFeeCap, blobFeeCap, err := r.GetGasTipAndCap() + tip, gasFeeCap, blobFeeCap, head, err := r.GetGasTipAndCap() if err != nil { return nil, fmt.Errorf("get gas tip and cap error:%w", err) } @@ -1598,11 +1621,6 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *ethtypes.Transaction) (*ethtypes.Tr if r.cfg.MinTip > 0 && tip.Cmp(big.NewInt(int64(r.cfg.MinTip))) < 0 { log.Info("replace tip is too low, update tip to min tip ", "tip", tip, "min_tip", r.cfg.MinTip) tip = big.NewInt(int64(r.cfg.MinTip)) - // recalc feecap - head, err := r.L1Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, fmt.Errorf("get l1 head error:%w", err) - } var recalculatedFeecap *big.Int if head.BaseFee != nil { recalculatedFeecap = new(big.Int).Add( @@ -1632,7 +1650,14 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *ethtypes.Transaction) (*ethtypes.Tr Data: tx.Data(), }) case ethtypes.BlobTxType: - + sidecar := tx.BlobTxSidecar() + version := types.DetermineBlobVersion(head, r.chainId.Uint64()) + if sidecar.Version == ethtypes.BlobSidecarVersion0 && version == ethtypes.BlobSidecarVersion1 { + err = types.BlobSidecarVersionToV1(sidecar) + if err != nil { + return nil, err + } + } newTx = ethtypes.NewTx(ðtypes.BlobTx{ ChainID: uint256.MustFromBig(tx.ChainId()), Nonce: tx.Nonce(), @@ -1644,7 +1669,7 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *ethtypes.Transaction) (*ethtypes.Tr Data: tx.Data(), BlobFeeCap: uint256.MustFromBig(blobFeeCap), BlobHashes: tx.BlobHashes(), - Sidecar: tx.BlobTxSidecar(), + Sidecar: sidecar, }) default: @@ -1810,7 +1835,7 @@ func (r *Rollup) CancelTx(tx *ethtypes.Transaction) (*ethtypes.Transaction, erro "nonce", tx.Nonce(), ) - tip, gasFeeCap, blobFeeCap, err := r.GetGasTipAndCap() + tip, gasFeeCap, blobFeeCap, _, err := r.GetGasTipAndCap() if err != nil { return nil, fmt.Errorf("get gas tip and cap error:%w", err) } diff --git a/tx-submitter/services/rollup_test.go b/tx-submitter/services/rollup_test.go index abbca1045..79fe4fcd3 100644 --- a/tx-submitter/services/rollup_test.go +++ b/tx-submitter/services/rollup_test.go @@ -64,7 +64,7 @@ func TestGetGasTipAndCap(t *testing.T) { l1Mock.TipCap = initTip l1Mock.Block = block - tip, feecap, blobfee, err := r.GetGasTipAndCap() + tip, feecap, blobfee, _, err := r.GetGasTipAndCap() require.NoError(t, err) require.NotNil(t, tip) require.NotNil(t, feecap) @@ -77,7 +77,7 @@ func TestGetGasTipAndCap(t *testing.T) { l1Mock.Block = block r.cfg.TipFeeBump = 200 - tip, feecap, blobfee, err = r.GetGasTipAndCap() + tip, feecap, blobfee, _, err = r.GetGasTipAndCap() require.NoError(t, err) require.NotNil(t, tip) require.NotNil(t, feecap) @@ -90,7 +90,7 @@ func TestGetGasTipAndCap(t *testing.T) { l1Mock.Block = block r.cfg.MaxBaseFee = baseFee.Uint64() - 1 - _, _, _, err = r.GetGasTipAndCap() + _, _, _, _, err = r.GetGasTipAndCap() require.ErrorContains(t, err, "base fee is too high") // Test with tip too high @@ -99,7 +99,7 @@ func TestGetGasTipAndCap(t *testing.T) { l1Mock.Block = block r.cfg.MaxTip = initTip.Uint64() - 1 - _, _, _, err = r.GetGasTipAndCap() + _, _, _, _, err = r.GetGasTipAndCap() require.ErrorContains(t, err, "tip is too high") } diff --git a/tx-submitter/types/blob.go b/tx-submitter/types/blob.go new file mode 100644 index 000000000..d0da2b6bc --- /dev/null +++ b/tx-submitter/types/blob.go @@ -0,0 +1,73 @@ +package types + +import ( + "crypto/sha256" + + "github.com/morph-l2/go-ethereum/common" + ethtypes "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/crypto/kzg4844" +) + +// BlobHashes computes the blob hashes of the given blobs. +func BlobHashes(blobs []kzg4844.Blob, commitments []kzg4844.Commitment) []common.Hash { + hasher := sha256.New() + h := make([]common.Hash, len(commitments)) + for i := range blobs { + h[i] = kzg4844.CalcBlobHashV1(hasher, &commitments[i]) + } + return h +} + +func MakeBlobProof(blobs []kzg4844.Blob, commitment []kzg4844.Commitment) ([]kzg4844.Proof, error) { + proofs := make([]kzg4844.Proof, len(blobs)) + for i := range blobs { + proof, err := kzg4844.ComputeBlobProof(&blobs[i], commitment[i]) + if err != nil { + return nil, err + } + proofs[i] = proof + } + return proofs, nil +} + +func MakeCellProof(blobs []kzg4844.Blob) ([]kzg4844.Proof, error) { + proofs := make([]kzg4844.Proof, 0, len(blobs)*kzg4844.CellProofsPerBlob) + for _, blob := range blobs { + cellProofs, err := kzg4844.ComputeCellProofs(&blob) + if err != nil { + return nil, err + } + proofs = append(proofs, cellProofs...) + } + return proofs, nil +} + +func DetermineBlobVersion(head *ethtypes.Header, chainID uint64) byte { + if head == nil { + return ethtypes.BlobSidecarVersion0 + } + blobConfig, exist := ChainConfigMap[chainID] + if !exist { + blobConfig = DefaultBlobConfig + } + if blobConfig.OsakaTime != nil && blobConfig.IsOsaka(head.Number, head.Time) { + return ethtypes.BlobSidecarVersion1 + } + return ethtypes.BlobSidecarVersion0 +} + +// BlobSidecarVersionToV1 converts the BlobSidecar to version 1, attaching the cell proofs. +func BlobSidecarVersionToV1(sc *ethtypes.BlobTxSidecar) error { + if sc.Version == ethtypes.BlobSidecarVersion1 { + return nil + } + if sc.Version == ethtypes.BlobSidecarVersion0 { + proofs, err := MakeCellProof(sc.Blobs) + if err != nil { + return err + } + sc.Version = ethtypes.BlobSidecarVersion1 + sc.Proofs = proofs + } + return nil +} diff --git a/tx-submitter/types/blob_config.go b/tx-submitter/types/blob_config.go new file mode 100644 index 000000000..70dc371a3 --- /dev/null +++ b/tx-submitter/types/blob_config.go @@ -0,0 +1,156 @@ +package types + +import ( + "math/big" + + "github.com/morph-l2/go-ethereum/log" +) + +// BlobFeeConfig is used to configure blob fee calculation parameters. +type BlobFeeConfig struct { + ChainID *big.Int + + // LondonBlock is the London block number (used for time determination). + LondonBlock *big.Int + + // Timestamps for each EIP upgrade (Unix timestamp, seconds). + CancunTime *uint64 // EIP-4844 (Cancun) + PragueTime *uint64 // Prague + OsakaTime *uint64 // Osaka + BPO1Time *uint64 // BPO1 + BPO2Time *uint64 // BPO2 + BPO3Time *uint64 // BPO3 + BPO4Time *uint64 // BPO4 + BPO5Time *uint64 // BPO5 + + // BlobConfig corresponding to each EIP. + Cancun *BlobConfig + Prague *BlobConfig + Osaka *BlobConfig + BPO1 *BlobConfig + BPO2 *BlobConfig + BPO3 *BlobConfig + BPO4 *BlobConfig + BPO5 *BlobConfig + + Default *BlobConfig +} + +// BlobConfig contains the parameters required for blob fee calculation. +type BlobConfig struct { + // UpdateFraction is the denominator in the fakeExponential function. + UpdateFraction uint64 +} + +// Time determination methods (referencing go-ethereum logic). +// IsCancun returns whether time is either equal to the Cancun fork time or greater. +func (c *BlobFeeConfig) IsCancun(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.CancunTime, time) +} + +// IsPrague returns whether time is either equal to the Prague fork time or greater. +func (c *BlobFeeConfig) IsPrague(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.PragueTime, time) +} + +// IsOsaka returns whether time is either equal to the Osaka fork time or greater. +func (c *BlobFeeConfig) IsOsaka(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.OsakaTime, time) +} + +// IsBPO1 returns whether time is either equal to the BPO1 fork time or greater. +func (c *BlobFeeConfig) IsBPO1(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.BPO1Time, time) +} + +// IsBPO2 returns whether time is either equal to the BPO2 fork time or greater. +func (c *BlobFeeConfig) IsBPO2(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.BPO2Time, time) +} + +// IsBPO3 returns whether time is either equal to the BPO3 fork time or greater. +func (c *BlobFeeConfig) IsBPO3(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.BPO3Time, time) +} + +// IsBPO4 returns whether time is either equal to the BPO4 fork time or greater. +func (c *BlobFeeConfig) IsBPO4(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.BPO4Time, time) +} + +// IsBPO5 returns whether time is either equal to the BPO5 fork time or greater. +func (c *BlobFeeConfig) IsBPO5(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.BPO5Time, time) +} + +// IsLondon returns whether num is either equal to the London fork block or greater. +func (c *BlobFeeConfig) IsLondon(num *big.Int) bool { + return isBlockForked(c.LondonBlock, num) +} + +// GetBlobFeeDenominator returns the corresponding UpdateFraction based on the time. +func GetBlobFeeDenominator(blobFeeConfig *BlobFeeConfig, blockTime uint64) *big.Int { + if blobFeeConfig == nil { + // If not configured, use default value. + log.Warn("BlobFeeConfig not set, using default denominator", + "default", DefaultOsakaBlobConfig) + return new(big.Int).SetUint64(DefaultOsakaBlobConfig.UpdateFraction) + } + + cfg := blobFeeConfig + londonBlock := cfg.LondonBlock // London block number for fork determination. + + // Check in priority order from high to low (BPO5 -> BPO4 -> ... -> Cancun). + var blobConfig *BlobConfig + + // Check BPO5 + if cfg.BPO5Time != nil && cfg.IsBPO5(londonBlock, blockTime) && cfg.BPO5 != nil { + blobConfig = cfg.BPO5 + } else if cfg.BPO4Time != nil && cfg.IsBPO4(londonBlock, blockTime) && cfg.BPO4 != nil { + blobConfig = cfg.BPO4 + } else if cfg.BPO3Time != nil && cfg.IsBPO3(londonBlock, blockTime) && cfg.BPO3 != nil { + blobConfig = cfg.BPO3 + } else if cfg.BPO2Time != nil && cfg.IsBPO2(londonBlock, blockTime) && cfg.BPO2 != nil { + blobConfig = cfg.BPO2 + } else if cfg.BPO1Time != nil && cfg.IsBPO1(londonBlock, blockTime) && cfg.BPO1 != nil { + blobConfig = cfg.BPO1 + } else if cfg.OsakaTime != nil && cfg.IsOsaka(londonBlock, blockTime) && cfg.Osaka != nil { + blobConfig = cfg.Osaka + } else if cfg.PragueTime != nil && cfg.IsPrague(londonBlock, blockTime) && cfg.Prague != nil { + blobConfig = cfg.Prague + } else if cfg.CancunTime != nil && cfg.IsCancun(londonBlock, blockTime) && cfg.Cancun != nil { + blobConfig = cfg.Cancun + } else if cfg.Default != nil { + blobConfig = cfg.Default + } + + if blobConfig == nil { + log.Warn("No blob config found for current time, using default", + "blockTime", blockTime, + "londonBlock", londonBlock, + "default", DefaultOsakaBlobConfig) + return new(big.Int).SetUint64(DefaultOsakaBlobConfig.UpdateFraction) + } + + return new(big.Int).SetUint64(blobConfig.UpdateFraction) +} + +// isBlockForked returns whether a fork scheduled at block s is active at the +// given head block. Whilst this method is the same as isTimestampForked, they +// are explicitly separate for clearer reading. +func isBlockForked(s, head *big.Int) bool { + if s == nil || head == nil { + return false + } + return s.Cmp(head) <= 0 +} + +// isTimestampForked returns whether a fork scheduled at timestamp s is active +// at the given head timestamp. Whilst this method is the same as isBlockForked, +// they are explicitly separate for clearer reading. +func isTimestampForked(s *uint64, head uint64) bool { + if s == nil { + return false + } + return *s <= head +} diff --git a/tx-submitter/types/blob_config_test.go b/tx-submitter/types/blob_config_test.go new file mode 100644 index 000000000..cfa4e79a6 --- /dev/null +++ b/tx-submitter/types/blob_config_test.go @@ -0,0 +1,271 @@ +package types + +import ( + "strconv" + "testing" + + "github.com/morph-l2/go-ethereum/consensus/misc/eip4844" + "github.com/stretchr/testify/assert" +) + +func TestGetBlobFeeDenominator_MainnetChainConfig(t *testing.T) { + // Use MainnetChainConfig directly since map lookup with *big.Int keys requires exact pointer match + config := MainnetChainConfig + assert.NotNil(t, config, "MainnetChainConfig should exist") + + tests := []struct { + name string + blockTime uint64 + expectedResult uint64 + forkName string + }{ + { + name: "Before Cancun", + blockTime: 1710338134, // Before Cancun (1710338135) + expectedResult: DefaultOsakaBlobConfig.UpdateFraction, // Should use Default + forkName: "Default", + }, + { + name: "At Cancun", + blockTime: 1710338135, // Cancun fork time + expectedResult: DefaultCancunBlobConfig.UpdateFraction, + forkName: "Cancun", + }, + { + name: "After Cancun, Before Prague", + blockTime: 1740000000, // Between Cancun and Prague + expectedResult: DefaultCancunBlobConfig.UpdateFraction, + forkName: "Cancun", + }, + { + name: "At Prague", + blockTime: 1746612311, // Prague fork time + expectedResult: DefaultPragueBlobConfig.UpdateFraction, + forkName: "Prague", + }, + { + name: "After Prague", + blockTime: 1746612312, // After Prague + expectedResult: DefaultPragueBlobConfig.UpdateFraction, + forkName: "Prague", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := GetBlobFeeDenominator(config, tt.blockTime) + assert.NotNil(t, result) + assert.Equal(t, tt.expectedResult, result.Uint64(), "Expected %s fork UpdateFraction", tt.forkName) + }) + } +} + +func TestGetBlobFeeDenominator_HoodiChainConfig(t *testing.T) { + // Use HoodiChainConfig directly since map lookup with *big.Int keys requires exact pointer match + config := HoodiChainConfig + assert.NotNil(t, config, "HoodiChainConfig should exist") + + tests := []struct { + name string + blockTime uint64 + expectedResult uint64 + forkName string + }{ + { + name: "At Cancun (0)", + blockTime: 0, // Cancun fork time is 0 + expectedResult: DefaultCancunBlobConfig.UpdateFraction, + forkName: "Cancun", + }, + { + name: "Before Prague", + blockTime: 1742999831, // Before Prague (1742999832) + expectedResult: DefaultCancunBlobConfig.UpdateFraction, + forkName: "Cancun", + }, + { + name: "At Prague", + blockTime: 1742999832, // Prague fork time + expectedResult: DefaultPragueBlobConfig.UpdateFraction, + forkName: "Prague", + }, + { + name: "Before Osaka", + blockTime: 1761677591, // Before Osaka (1761677592) + expectedResult: DefaultPragueBlobConfig.UpdateFraction, + forkName: "Prague", + }, + { + name: "At Osaka", + blockTime: 1761677592, // Osaka fork time + expectedResult: DefaultOsakaBlobConfig.UpdateFraction, + forkName: "Osaka", + }, + { + name: "Before BPO1", + blockTime: 1762365719, // Before BPO1 (1762365720) + expectedResult: DefaultOsakaBlobConfig.UpdateFraction, + forkName: "Osaka", + }, + { + name: "At BPO1", + blockTime: 1762365720, // BPO1 fork time + expectedResult: DefaultBPO1BlobConfig.UpdateFraction, + forkName: "BPO1", + }, + { + name: "Before BPO2", + blockTime: 1762955543, // Before BPO2 (1762955544) + expectedResult: DefaultBPO1BlobConfig.UpdateFraction, + forkName: "BPO1", + }, + { + name: "At BPO2", + blockTime: 1762955544, // BPO2 fork time + expectedResult: DefaultBPO2BlobConfig.UpdateFraction, + forkName: "BPO2", + }, + { + name: "After BPO2", + blockTime: 1762955545, // After BPO2 + expectedResult: DefaultBPO2BlobConfig.UpdateFraction, + forkName: "BPO2", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := GetBlobFeeDenominator(config, tt.blockTime) + assert.NotNil(t, result) + assert.Equal(t, tt.expectedResult, result.Uint64(), "Expected %s fork UpdateFraction", tt.forkName) + }) + } +} + +func TestGetBlobFeeDenominator_NilConfig(t *testing.T) { + t.Run("Nil config uses default", func(t *testing.T) { + result := GetBlobFeeDenominator(nil, 1000000000) + assert.NotNil(t, result) + assert.Equal(t, DefaultOsakaBlobConfig.UpdateFraction, result.Uint64()) + }) +} + +func TestGetBlobFeeDenominator_AllChainConfigs(t *testing.T) { + // Test that all chain configs in ChainConfigMap work correctly + for chainID, config := range ChainConfigMap { + t.Run("ChainID_"+strconv.FormatUint(chainID, 10), func(t *testing.T) { + assert.NotNil(t, config, "Config should not be nil for chainID %s", chainID) + assert.NotNil(t, config.LondonBlock, "LondonBlock should not be nil for chainID %s", chainID) + + // Test with a very large timestamp to ensure it works + result := GetBlobFeeDenominator(config, 9999999999) + assert.NotNil(t, result) + assert.Greater(t, result.Uint64(), uint64(0), "UpdateFraction should be greater than 0") + }) + } +} + +func TestGetBlobFeeDenominator_ChainConfigMap(t *testing.T) { + // Test GetBlobFeeDenominator using ChainConfigMap + t.Run("Mainnet from ChainConfigMap", func(t *testing.T) { + // Find Mainnet config by ChainID + var mainnetConfig *BlobFeeConfig + for chainID, config := range ChainConfigMap { + if chainID == 1 { + mainnetConfig = config + break + } + } + assert.NotNil(t, mainnetConfig, "Mainnet config should be found in ChainConfigMap") + + // Test various timestamps + result := GetBlobFeeDenominator(mainnetConfig, 1710338135) // At Cancun + assert.Equal(t, DefaultCancunBlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(mainnetConfig, 1746612311) // At Prague + assert.Equal(t, DefaultPragueBlobConfig.UpdateFraction, result.Uint64()) + }) + + t.Run("Hoodi from ChainConfigMap", func(t *testing.T) { + // Find Hoodi config by ChainID + var hoodiConfig *BlobFeeConfig + for chainID, config := range ChainConfigMap { + if chainID == 560048 { + hoodiConfig = config + break + } + } + assert.NotNil(t, hoodiConfig, "Hoodi config should be found in ChainConfigMap") + + // Test various timestamps + result := GetBlobFeeDenominator(hoodiConfig, 0) // At Cancun (0) + assert.Equal(t, DefaultCancunBlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(hoodiConfig, 1761677592) // At Osaka + assert.Equal(t, DefaultOsakaBlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(hoodiConfig, 1762365720) // At BPO1 + assert.Equal(t, DefaultBPO1BlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(hoodiConfig, 1762955544) // At BPO2 + assert.Equal(t, DefaultBPO2BlobConfig.UpdateFraction, result.Uint64()) + }) + + t.Run("Devnet from ChainConfigMap", func(t *testing.T) { + // Find Devnet config by ChainID + var devnetConfig *BlobFeeConfig + for chainID, config := range ChainConfigMap { + if chainID == 900 { + devnetConfig = config + break + } + } + assert.NotNil(t, devnetConfig, "Devnet config should be found in ChainConfigMap") + + // Test various timestamps + result := GetBlobFeeDenominator(devnetConfig, 0) // At Cancun (0) + assert.Equal(t, DefaultCancunBlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(devnetConfig, 1761677592) // At Osaka + assert.Equal(t, DefaultOsakaBlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(devnetConfig, 1762365720) // At BPO1 + assert.Equal(t, DefaultBPO1BlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(devnetConfig, 1762955544) // At BPO2 + assert.Equal(t, DefaultBPO2BlobConfig.UpdateFraction, result.Uint64()) + }) +} + +func TestGetBlobFeeDenominator_ForkPriority(t *testing.T) { + // Test that higher priority forks are checked first + config := HoodiChainConfig + assert.NotNil(t, config) + + // At BPO2 time, should return BPO2, not BPO1, Osaka, Prague, or Cancun + bpo2Time := uint64(1762955544) + result := GetBlobFeeDenominator(config, bpo2Time) + assert.Equal(t, DefaultBPO2BlobConfig.UpdateFraction, result.Uint64()) + + // At BPO1 time, should return BPO1, not Osaka, Prague, or Cancun + bpo1Time := uint64(1762365720) + result = GetBlobFeeDenominator(config, bpo1Time) + assert.Equal(t, DefaultBPO1BlobConfig.UpdateFraction, result.Uint64()) + + // At Osaka time, should return Osaka, not Prague or Cancun + osakaTime := uint64(1761677592) + result = GetBlobFeeDenominator(config, osakaTime) + assert.Equal(t, DefaultOsakaBlobConfig.UpdateFraction, result.Uint64()) +} + +func TestCal(t *testing.T) { + // Test that higher priority forks are checked first + config := HoodiChainConfig + assert.NotNil(t, config) + + timeNow := uint64(1762395060) + result := GetBlobFeeDenominator(config, timeNow) + t.Log(result) + fee := eip4844.CalcBlobFee(170172092, result.Uint64()) + t.Log(fee.Uint64()) +} diff --git a/tx-submitter/types/blob_params.go b/tx-submitter/types/blob_params.go new file mode 100644 index 000000000..4ebe43a41 --- /dev/null +++ b/tx-submitter/types/blob_params.go @@ -0,0 +1,103 @@ +package types + +import ( + "math/big" +) + +var ( + DefaultBlobConfig = HoodiChainConfig + + ChainConfigMap = ChainBlobConfigs{ + 1: MainnetChainConfig, + 560048: HoodiChainConfig, + 900: DevnetChainConfig, + } +) + +func newUint64(val uint64) *uint64 { return &val } + +type ChainBlobConfigs map[uint64]*BlobFeeConfig + +var ( + // MainnetChainConfig is the chain parameters to run a node on the main network. + MainnetChainConfig = &BlobFeeConfig{ + ChainID: big.NewInt(1), + LondonBlock: big.NewInt(12_965_000), + CancunTime: newUint64(1710338135), + PragueTime: newUint64(1746612311), + OsakaTime: newUint64(1764798551), + BPO1Time: newUint64(1765290071), + BPO2Time: newUint64(1767747671), + Cancun: DefaultCancunBlobConfig, + Prague: DefaultPragueBlobConfig, + Osaka: DefaultOsakaBlobConfig, + BPO1: DefaultBPO1BlobConfig, + BPO2: DefaultBPO2BlobConfig, + Default: DefaultOsakaBlobConfig, + } + + // HoodiChainConfig contains the chain parameters to run a node on the Hoodi test network. + HoodiChainConfig = &BlobFeeConfig{ + ChainID: big.NewInt(560048), + LondonBlock: big.NewInt(0), + CancunTime: newUint64(0), + PragueTime: newUint64(1742999832), + OsakaTime: newUint64(1761677592), + BPO1Time: newUint64(1762365720), + BPO2Time: newUint64(1762955544), + Cancun: DefaultCancunBlobConfig, + Prague: DefaultPragueBlobConfig, + Osaka: DefaultOsakaBlobConfig, + BPO1: DefaultBPO1BlobConfig, + BPO2: DefaultBPO2BlobConfig, + Default: DefaultOsakaBlobConfig, + } + + // DevnetChainConfig contains the chain parameters to run a node on the devnet test network. + DevnetChainConfig = &BlobFeeConfig{ + ChainID: big.NewInt(900), + LondonBlock: big.NewInt(0), + CancunTime: newUint64(0), + PragueTime: newUint64(1742999832), + OsakaTime: newUint64(1761677592), + BPO1Time: newUint64(1762365720), + BPO2Time: newUint64(1762955544), + Cancun: DefaultCancunBlobConfig, + Prague: DefaultPragueBlobConfig, + Osaka: DefaultOsakaBlobConfig, + BPO1: DefaultBPO1BlobConfig, + BPO2: DefaultBPO2BlobConfig, + Default: DefaultOsakaBlobConfig, + } +) + +var ( + // DefaultCancunBlobConfig is the default blob configuration for the Cancun fork. + DefaultCancunBlobConfig = &BlobConfig{ + UpdateFraction: 3338477, + } + // DefaultPragueBlobConfig is the default blob configuration for the Prague fork. + DefaultPragueBlobConfig = &BlobConfig{ + UpdateFraction: 5007716, + } + // DefaultOsakaBlobConfig is the default blob configuration for the Osaka fork. + DefaultOsakaBlobConfig = &BlobConfig{ + UpdateFraction: 5007716, + } + // DefaultBPO1BlobConfig is the default blob configuration for the BPO1 fork. + DefaultBPO1BlobConfig = &BlobConfig{ + UpdateFraction: 8346193, + } + // DefaultBPO2BlobConfig is the default blob configuration for the BPO2 fork. + DefaultBPO2BlobConfig = &BlobConfig{ + UpdateFraction: 11684671, + } + // DefaultBPO3BlobConfig is the default blob configuration for the BPO3 fork. + DefaultBPO3BlobConfig = &BlobConfig{ + UpdateFraction: 20609697, + } + // DefaultBPO4BlobConfig is the default blob configuration for the BPO4 fork. + DefaultBPO4BlobConfig = &BlobConfig{ + UpdateFraction: 13739630, + } +) diff --git a/tx-submitter/types/blob_test.go b/tx-submitter/types/blob_test.go new file mode 100644 index 000000000..8f5beae7b --- /dev/null +++ b/tx-submitter/types/blob_test.go @@ -0,0 +1,273 @@ +package types + +import ( + "crypto/rand" + "testing" + + "github.com/consensys/gnark-crypto/ecc/bls12-381/fr" + gokzg4844 "github.com/crate-crypto/go-eth-kzg" + "github.com/morph-l2/go-ethereum/crypto/kzg4844" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// randFieldElement generates a random valid field element for BLS12-381 +func randFieldElement() [32]byte { + bytes := make([]byte, 32) + _, err := rand.Read(bytes) + if err != nil { + panic("failed to get random field element") + } + var r fr.Element + r.SetBytes(bytes) + return gokzg4844.SerializeScalar(r) +} + +// randBlob creates a random valid blob +func randBlob() *kzg4844.Blob { + var blob kzg4844.Blob + for i := 0; i < len(blob); i += gokzg4844.SerializedScalarSize { + fieldElementBytes := randFieldElement() + copy(blob[i:i+gokzg4844.SerializedScalarSize], fieldElementBytes[:]) + } + return &blob +} + +// emptyBlob creates an empty (zero) blob +func emptyBlob() *kzg4844.Blob { + return new(kzg4844.Blob) +} + +func TestMakeBlobProof_SingleBlob(t *testing.T) { + // Create a single blob + blob := randBlob() + + // Generate commitment from blob + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err, "should create commitment from blob") + + // Generate proofs using MakeBlobProof + blobs := []kzg4844.Blob{*blob} + commitments := []kzg4844.Commitment{commitment} + + proofs, err := MakeBlobProof(blobs, commitments) + require.NoError(t, err, "should generate proofs") + require.Len(t, proofs, 1, "should generate one proof for one blob") + + // Verify the proof + err = kzg4844.VerifyBlobProof(blob, commitment, proofs[0]) + assert.NoError(t, err, "proof should verify successfully") +} + +func TestMakeBlobProof_MultipleBlobs(t *testing.T) { + // Create multiple blobs + numBlobs := 3 + blobs := make([]kzg4844.Blob, numBlobs) + commitments := make([]kzg4844.Commitment, numBlobs) + + // Generate commitments for each blob + for i := 0; i < numBlobs; i++ { + blob := randBlob() + blobs[i] = *blob + + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err, "should create commitment from blob") + commitments[i] = commitment + } + + // Generate proofs using MakeBlobProof + proofs, err := MakeBlobProof(blobs, commitments) + require.NoError(t, err, "should generate proofs") + require.Len(t, proofs, numBlobs, "should generate one proof per blob") + + // Verify each proof + for i := 0; i < numBlobs; i++ { + err = kzg4844.VerifyBlobProof(&blobs[i], commitments[i], proofs[i]) + assert.NoError(t, err, "proof %d should verify successfully", i) + } +} + +func TestMakeBlobProof_EmptyBlob(t *testing.T) { + // Test with empty (zero) blob + blob := emptyBlob() + + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err, "should create commitment from empty blob") + + blobs := []kzg4844.Blob{*blob} + commitments := []kzg4844.Commitment{commitment} + + proofs, err := MakeBlobProof(blobs, commitments) + require.NoError(t, err, "should generate proof for empty blob") + require.Len(t, proofs, 1, "should generate one proof") + + // Verify the proof + err = kzg4844.VerifyBlobProof(blob, commitment, proofs[0]) + assert.NoError(t, err, "proof for empty blob should verify successfully") +} + +func TestMakeBlobProof_InvalidCommitment(t *testing.T) { + // Test with blob and mismatched commitment + blob := randBlob() + // Create a different blob and its commitment + otherBlob := randBlob() + wrongCommitment, err := kzg4844.BlobToCommitment(otherBlob) + require.NoError(t, err) + + blobs := []kzg4844.Blob{*blob} + commitments := []kzg4844.Commitment{wrongCommitment} + + // MakeBlobProof should succeed (it doesn't validate commitment matches blob) + proofs, err := MakeBlobProof(blobs, commitments) + require.NoError(t, err, "MakeBlobProof should succeed even with wrong commitment") + require.Len(t, proofs, 1) + + // But verification should fail + err = kzg4844.VerifyBlobProof(blob, wrongCommitment, proofs[0]) + assert.Error(t, err, "verification should fail with mismatched commitment") +} + +func TestMakeBlobProof_EmptySlice(t *testing.T) { + // Test with empty slices + blobs := []kzg4844.Blob{} + commitments := []kzg4844.Commitment{} + + proofs, err := MakeBlobProof(blobs, commitments) + require.NoError(t, err, "should handle empty slices") + require.Len(t, proofs, 0, "should return empty proofs slice") +} + +func TestMakeCellProof_SingleBlob(t *testing.T) { + // Create a single blob + blob := randBlob() + + // Generate commitment from blob + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err, "should create commitment from blob") + + // Generate cell proofs using MakeCellProof + blobs := []kzg4844.Blob{*blob} + proofs, err := MakeCellProof(blobs) + require.NoError(t, err, "should generate cell proofs") + require.Len(t, proofs, kzg4844.CellProofsPerBlob, "should generate %d proofs for one blob", kzg4844.CellProofsPerBlob) + + // Verify the cell proofs + err = kzg4844.VerifyCellProofs(blobs, []kzg4844.Commitment{commitment}, proofs) + assert.NoError(t, err, "cell proofs should verify successfully") +} + +func TestMakeCellProof_MultipleBlobs(t *testing.T) { + // Create multiple blobs + numBlobs := 3 + blobs := make([]kzg4844.Blob, numBlobs) + commitments := make([]kzg4844.Commitment, numBlobs) + + // Generate commitments for each blob + for i := 0; i < numBlobs; i++ { + blob := randBlob() + blobs[i] = *blob + + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err, "should create commitment from blob") + commitments[i] = commitment + } + + // Generate cell proofs using MakeCellProof + proofs, err := MakeCellProof(blobs) + require.NoError(t, err, "should generate cell proofs") + expectedProofCount := numBlobs * kzg4844.CellProofsPerBlob + require.Len(t, proofs, expectedProofCount, "should generate %d proofs for %d blobs", expectedProofCount, numBlobs) + + // Verify all cell proofs + err = kzg4844.VerifyCellProofs(blobs, commitments, proofs) + assert.NoError(t, err, "cell proofs should verify successfully") +} + +func TestMakeCellProof_EmptyBlob(t *testing.T) { + // Test with empty (zero) blob + blob := emptyBlob() + + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err, "should create commitment from empty blob") + + blobs := []kzg4844.Blob{*blob} + proofs, err := MakeCellProof(blobs) + require.NoError(t, err, "should generate cell proofs for empty blob") + require.Len(t, proofs, kzg4844.CellProofsPerBlob, "should generate %d proofs", kzg4844.CellProofsPerBlob) + + // Verify the cell proofs + err = kzg4844.VerifyCellProofs(blobs, []kzg4844.Commitment{commitment}, proofs) + assert.NoError(t, err, "cell proofs for empty blob should verify successfully") +} + +func TestMakeCellProof_EmptySlice(t *testing.T) { + // Test with empty slice + blobs := []kzg4844.Blob{} + + proofs, err := MakeCellProof(blobs) + require.NoError(t, err, "should handle empty slice") + require.Len(t, proofs, 0, "should return empty proofs slice") +} + +func TestMakeCellProof_ProofCount(t *testing.T) { + // Test that each blob generates exactly CellProofsPerBlob proofs + testCases := []struct { + name string + numBlobs int + }{ + {"single blob", 1}, + {"two blobs", 2}, + {"five blobs", 5}, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + blobs := make([]kzg4844.Blob, tc.numBlobs) + for i := 0; i < tc.numBlobs; i++ { + blob := randBlob() + blobs[i] = *blob + } + + proofs, err := MakeCellProof(blobs) + require.NoError(t, err) + expectedCount := tc.numBlobs * kzg4844.CellProofsPerBlob + assert.Equal(t, expectedCount, len(proofs), "should generate %d proofs for %d blobs", expectedCount, tc.numBlobs) + }) + } +} + +func TestMakeCellProof_ProofGrouping(t *testing.T) { + // Test that proofs are correctly grouped by blob + // Each blob's proofs should be consecutive in the proofs slice + numBlobs := 2 + blobs := make([]kzg4844.Blob, numBlobs) + commitments := make([]kzg4844.Commitment, numBlobs) + + for i := 0; i < numBlobs; i++ { + blob := randBlob() + blobs[i] = *blob + + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err) + commitments[i] = commitment + } + + // Generate all proofs + allProofs, err := MakeCellProof(blobs) + require.NoError(t, err) + + // Verify each blob's proofs individually + for i := 0; i < numBlobs; i++ { + startIdx := i * kzg4844.CellProofsPerBlob + endIdx := startIdx + kzg4844.CellProofsPerBlob + blobProofs := allProofs[startIdx:endIdx] + + // Verify this blob's proofs + err = kzg4844.VerifyCellProofs( + []kzg4844.Blob{blobs[i]}, + []kzg4844.Commitment{commitments[i]}, + blobProofs, + ) + assert.NoError(t, err, "blob %d proofs should verify successfully", i) + } +}