From 76f11e8bcc7f7e25971639a16b150d2f375a9c0b Mon Sep 17 00:00:00 2001 From: marioevz Date: Wed, 17 May 2023 00:36:33 +0000 Subject: [PATCH] simulators/eth2/beacon: api first changes --- simulators/eth2/beacon/api/Dockerfile | 18 ++ simulators/eth2/beacon/api/go.mod | 27 ++ simulators/eth2/beacon/api/go.sum | 157 +++++++++++ simulators/eth2/beacon/api/main.go | 243 ++++++++++++++++++ .../beacon_api.yaml | 1 + .../blocks_0.ssz_snappy | Bin 0 -> 1005 bytes .../blocks_1.ssz_snappy | Bin 0 -> 1022 bytes .../withdrawal_success_two_blocks/meta.yaml | 1 + .../post.ssz_snappy | Bin 0 -> 158952 bytes .../pre.ssz_snappy | Bin 0 -> 158614 bytes simulators/eth2/beacon/p2p/Dockerfile | 0 simulators/eth2/beacon/p2p/go.mod | 3 + 12 files changed, 450 insertions(+) create mode 100644 simulators/eth2/beacon/api/Dockerfile create mode 100644 simulators/eth2/beacon/api/go.mod create mode 100644 simulators/eth2/beacon/api/go.sum create mode 100644 simulators/eth2/beacon/api/main.go create mode 100644 simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/beacon_api.yaml create mode 100644 simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/blocks_0.ssz_snappy create mode 100644 simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/blocks_1.ssz_snappy create mode 100644 simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/meta.yaml create mode 100644 simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/post.ssz_snappy create mode 100644 simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/pre.ssz_snappy create mode 100644 simulators/eth2/beacon/p2p/Dockerfile create mode 100644 simulators/eth2/beacon/p2p/go.mod diff --git a/simulators/eth2/beacon/api/Dockerfile b/simulators/eth2/beacon/api/Dockerfile new file mode 100644 index 0000000000..085785dde0 --- /dev/null +++ b/simulators/eth2/beacon/api/Dockerfile @@ -0,0 +1,18 @@ +# Build the simulator binary +FROM golang:1-alpine AS builder +RUN apk --no-cache add gcc musl-dev linux-headers cmake make clang build-base clang-static clang-dev + +# Prepare workspace. +# Note: the build context of this simulator image is the parent directory! +ADD . /source + +# Build within simulator folder +WORKDIR /source +RUN go build -o ./sim . + +# Build the runner container. +FROM alpine:latest +ADD . / +COPY --from=builder /source/sim / + +ENTRYPOINT ["./sim"] diff --git a/simulators/eth2/beacon/api/go.mod b/simulators/eth2/beacon/api/go.mod new file mode 100644 index 0000000000..524a1efc1a --- /dev/null +++ b/simulators/eth2/beacon/api/go.mod @@ -0,0 +1,27 @@ +module github.com/ethereum/hive/simulators/eth2/beacon/api + +go 1.20 + +require ( + github.com/ethereum/hive v0.0.0-20230516150403-448156fa839e + github.com/golang/snappy v0.0.4 + gopkg.in/yaml.v3 v3.0.1 +) + +require ( + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/ethereum/go-ethereum v1.11.4 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect + github.com/tklauser/go-sysconf v0.3.11 // indirect + github.com/tklauser/numcpus v0.6.0 // indirect + github.com/yusufpapurcu/wmi v1.2.2 // indirect + golang.org/x/crypto v0.4.0 // indirect + golang.org/x/sys v0.5.0 // indirect + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect +) diff --git a/simulators/eth2/beacon/api/go.sum b/simulators/eth2/beacon/api/go.sum new file mode 100644 index 0000000000..f336ad04ee --- /dev/null +++ b/simulators/eth2/beacon/api/go.sum @@ -0,0 +1,157 @@ +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= +github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= +github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= +github.com/ethereum/hive v0.0.0-20230516150403-448156fa839e h1:JB3owrEiwh+RNr4vbjaUUO6RoWl7CJ+cliq8AJPsdbk= +github.com/ethereum/hive v0.0.0-20230516150403-448156fa839e/go.mod h1:zKL2DscVzRusnGVpseAvLrXGJ3qrGHuSfOIrv4JfnRk= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= +github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= +github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= +github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= +github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= +golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/simulators/eth2/beacon/api/main.go b/simulators/eth2/beacon/api/main.go new file mode 100644 index 0000000000..965259854f --- /dev/null +++ b/simulators/eth2/beacon/api/main.go @@ -0,0 +1,243 @@ +package main + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "os" + "path" + "path/filepath" + "regexp" + "strconv" + "sync" + + "github.com/ethereum/hive/hivesim" + "github.com/golang/snappy" + "gopkg.in/yaml.v3" +) + +func main() { + suite := hivesim.Suite{ + Name: "beacon-api", + } + suite.Add(hivesim.TestSpec{ + Name: "test file loader", + Description: "This is a meta-test. It loads the tests for the beacon api.", + Run: loaderTest, + AlwaysRun: true, + }) + hivesim.MustRunSuite(hivesim.New(), suite) +} + +// loaderTest loads the blockchain test files and spawns the client tests. +func loaderTest(t *hivesim.T) { + clientTypes, err := t.Sim.ClientTypes() + if err != nil { + t.Fatal("can't get client types:", err) + } + + parallelism := 16 + if val, ok := os.LookupEnv("HIVE_PARALLELISM"); ok { + if p, err := strconv.Atoi(val); err != nil { + t.Logf("Warning: invalid HIVE_PARALLELISM value %q", val) + } else { + parallelism = p + } + } + t.Log("parallelism:", parallelism) + + // Find the tests directory. + /* + testPath, isset := os.LookupEnv("TESTPATH") + if !isset { + t.Fatal("$TESTPATH not set") + } + fileRoot := fmt.Sprintf("%s/BlockchainTests/", testPath) + */ + + // Spawn workers. + var wg sync.WaitGroup + var testCh = make(chan *BeaconAPITest) + wg.Add(parallelism) + for i := 0; i < parallelism; i++ { + go func() { + defer wg.Done() + for test := range testCh { + t.Run(hivesim.TestSpec{ + Name: test.Name, + Run: test.Run, + // Regexp matching on Name is disabled here because it's already done + // in loadTests. Matching in loadTests is better because it has access + // to the full test file path. + AlwaysRun: true, + }) + } + }() + } + + _, testPattern := t.Sim.TestPattern() + re := regexp.MustCompile(testPattern) + + // Deliver test cases. + loadTests(t, "tests", re, func(tc BeaconAPITest) { + for _, client := range clientTypes { + if !client.HasRole("beacon") { + continue + } + tc := tc // shallow copy + tc.ClientType = client.Name + testCh <- &tc + } + }) + close(testCh) + + // Wait for workers to finish. + wg.Wait() +} + +func checkTestFiles(dirPath string) bool { + requiredFiles := []string{"post.ssz_snappy", "beacon_api.yaml", "blocks_0.ssz_snappy", "meta.yaml"} + // Check that all minimum required files are present + for _, file := range requiredFiles { + if _, err := os.Stat(path.Join(dirPath, file)); os.IsNotExist(err) { + return false + } + } + return true +} + +func loadTests(t *hivesim.T, root string, re *regexp.Regexp, fn func(BeaconAPITest)) { + // Walk through the tests directory, each directory is a test + filepath.Walk(root, func(walkpath string, info os.FileInfo, err error) error { + if err != nil { + t.Logf("unable to walk path: %s", err) + return err + } + if !info.IsDir() { + return nil + } + if !checkTestFiles(walkpath) { + return nil // skip + } + if !re.MatchString(info.Name()) { + fmt.Println("skip", info.Name()) + return nil // skip + } + test := BeaconAPITest{ + Name: info.Name(), + } + if err := test.LoadFromDirectory(walkpath); err != nil { + fmt.Println(walkpath) + return nil + } + fn(test) + return nil + }) +} + +type BeaconAPIChecks struct { + StateRoot string `yaml:"state_root"` +} +type BeaconAPITest struct { + // The name of the test + Name string + // Post state + Post []byte + // Post state + Pre []byte + // The blocks to process + Blocks [][]byte + // The checks to perform + Checks BeaconAPIChecks + + ClientType string +} + +func (b *BeaconAPITest) LoadFromDirectory(dirPath string) error { + // Read and uncompress post state + compressedPost, err := os.ReadFile(path.Join(dirPath, "post.ssz_snappy")) + if err != nil { + return err + } + // Uncompress post state using snappy + b.Post, err = snappy.Decode(nil, compressedPost) + if err != nil { + return err + } + // Read and uncompress pre state + compressedPre, err := os.ReadFile(path.Join(dirPath, "pre.ssz_snappy")) + if err != nil { + return err + } + // Uncompress pre state using snappy + b.Pre, err = snappy.Decode(nil, compressedPre) + if err != nil { + return err + } + + // Read and uncompress blocks: each block is a file with the following format: blocks_{i}.ssz_snappy + // where i is the index of the block + // Read each block starting from zero until the block file does not exist + b.Blocks = make([][]byte, 0) + for i := 0; ; i++ { + blockPath := path.Join(dirPath, fmt.Sprintf("blocks_%d.ssz_snappy", i)) + if _, err := os.Stat(blockPath); os.IsNotExist(err) { + break + } + // Read and uncompress block + compressedBlock, err := os.ReadFile(blockPath) + if err != nil { + return err + } + block, err := snappy.Decode(nil, compressedBlock) + if err != nil { + return err + } + // THIS BLOCK IS SIGNED, WE MIGHT NEED TO REMOVE THE SIGNATURE + b.Blocks = append(b.Blocks, block) + } + + // Read checks + checksPath := path.Join(dirPath, "beacon_api.yaml") + if _, err := os.Stat(checksPath); os.IsNotExist(err) { + return err + } + checksFile, err := os.ReadFile(checksPath) + if err != nil { + return err + } + if err := yaml.Unmarshal(checksFile, &b.Checks); err != nil { + return err + } + + return nil +} + +func (b *BeaconAPITest) Run(t *hivesim.T) { + configBundle, err := b.ConfigBundle() + if err != nil { + t.Fatalf("failed to create config bundle: %v", err) + } + t.StartClient(b.ClientType, configBundle) +} + +func BytesSource(data []byte) func() (io.ReadCloser, error) { + return func() (io.ReadCloser, error) { + return ioutil.NopCloser(bytes.NewReader(data)), nil + } +} + +func (b *BeaconAPITest) ConfigBundle() (hivesim.StartOption, error) { + fmt.Printf("checkpoint_block: %x\n", b.Blocks[len(b.Blocks)-1]) + return hivesim.Bundle( + hivesim.WithDynamicFile( + "/hive/input/checkpoint_block.ssz", + BytesSource(b.Blocks[len(b.Blocks)-1]), + ), + hivesim.WithDynamicFile( + "/hive/input/checkpoint_state.ssz", + BytesSource(b.Post), + ), + ), nil +} diff --git a/simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/beacon_api.yaml b/simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/beacon_api.yaml new file mode 100644 index 0000000000..5dfedc4fc0 --- /dev/null +++ b/simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/beacon_api.yaml @@ -0,0 +1 @@ +{state_root: b3f54c80c0abc26d0adc4d8d98ff9b579ac38100ce92cae3f5be21976ac5e90a} diff --git a/simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/blocks_0.ssz_snappy b/simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/blocks_0.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..6ce908651b19c8bbd5dc218906cc4b4597d2199b GIT binary patch literal 1005 zcmeyv`ynTVfq`L1?S}{Ny4fEHIEa)lW?o(O=EcvvMbo~o{&wfgG>=AWQB{XJ&6T-d zC%HYao_11n$45SmjzX@tlm1Iw-_l?k{Cw}h-6hvjHo7@3ZQEM6>eTgp=Rd_XPT&6d zU_$v4uPc3}r@(nZBya!LOvi_TTbEfy&O7&|ONH?A(lvL^oZxTxWGnV7N+K?sUGYR*RS3|iwvAG**0G0Mw>kf> zdUWEa>-{M%t&5`%_rBpbkk0IEO3=UkvSGWgT7T5Hjb%p;- zafzj8c3RbGz4d87H|N^@C|P+ivy$VvKdg+Lr3{ZVMpfqb@vcr|WME)SlV(`Q$iUIU z$l%1n@DC_*;GZKy6(a-VmI*Fw3=C&3DJ9n5Ud^r<6q4<$|9N@i{7rLoI1XL4*%E7d zNN|M~gO>*bg91=}jqDlU7x#|GR;_N`n!fGK6{*WYuF_MwN`yZwbo%RXWwN_hFvxfa z+61)c7En{*bdH9@Ck44#85ty4**Ji{PVD74HOrcjI}T{#oFv_l37<31J=I-uM2c%$ zKzW(Nd)Bv_kA%C8Y(JN;`o!wO=wZdkkn!xZx!U^kxhvEzx2RNaHk!omTG7ei5LwL5 zz)-3$XzrsT_?P$dLZ%-cvwWnVntu5k-yv{PP)AUOfrU50hw1b4<9kDTHg1zqyVj`4 zc!#(49vVL3~am{K62g_nXdnXoBhlu>bgI#*WTscs2~_27{I{8tK)N}y^r

MFROA85ibE91Trgd>Y)y@EUAYXegxK_W@6&HK0$sq#sK~;=VEV$RLvh;c z8`2%0QZ6{`t_yDZljQzzji3$#7o#S~5J`w3%WD^LEq@}Ce@08V=FXR2=XK-ew*nP$ zGb%FHKvZ1#bytl|c|(pJ-a(9a1+Hv<@#MPDAz6K`{`){1_#l2!gjn+AlM2JEKl`5_ zTVwrRl5y``_3J&~fr|Jcic}a`D}Xlb3)5c1?fP-nbh)I0=VFYf`hKWAg~l}l07ct@ Aj{pDw literal 0 HcmV?d00001 diff --git a/simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/blocks_1.ssz_snappy b/simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/blocks_1.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..ce1faee9a7fb76d40fe4d44ee2eb5d20d104b421 GIT binary patch literal 1022 zcmXBRe=ys37zgmrm&U$E+I~^-Go?$l(WzEhkD#Pf+Ud0sT_+2|Av#fHSzJ_A)2LL| z&5CMGTO8BTv_t8&Sj|itr#ZjbVs(D4MpYKKDr?g{ZlC-7_j;c9^V~ge$a-M{LP(KH z-*@PExwL}Vd24cy>HueKkWZsz>Rec(o!(hbFBka2ailuk2YmV71U#fxgoEj5ghwTwH4c*CPa z2g^iWBaD#1+L&Z3x``oNjv?j-WW*5aFb1P63}N>RL(C8=kN1cyTt20p^{DQ0c)#U% zrX*;Iv`C+_R(b_2XVw|e5f(x&P@nDGdvxxZIy$R9uUXL2JLE8E73x@AAhy<5GT#Ob z6@?w)tjGWV8!@CXY+gAzaHDm;#pD~s{^*Q1_2Dx120~&{SZ8RNXDfLo2$4+i++Q?a zRVIi=vc+Lz%oXn`V_+6BFwe7UP(>?cHuPKKwX3Ju`QeWOIh*Es=r(~L_x>R3BuF8a z5V4sYj6BJB`Zag0%T$oR(vN8)8|BKps~YffaX{1;??Ea-rXgQ49^UF*oOz(4S5AwW zmXbt4V+E9KD)Aw*0%icmVy$je4dB9ILt-0&w+4oLH zxN;|~LMs_L?8m@%z)8SC9%b@@k-g_N5pmBxySnqICbmTs@guSaP63YGc4BGc(p{DD zZ-HicLDZi9L}*QXiX4E2z;QQgzHHy|l)uOf?9NOpDcZ%eP5^cUmad2YzRN1{u`yRT zJf4F1;?RfFf60NJfU|)A@O3}aXVn>sXw%-WZn;Zye}2^ut2qOo0WNPavT`ymVF%j? zPwseZ>0HB#n2;kXa1QW4jym79p@b%6Ii5D*YBovn^~;Cwt-vxeF0}hPR_mak3S7q@ Uq$=W*XH8C@4Hm1*7;skfAGKSRn*aa+ literal 0 HcmV?d00001 diff --git a/simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/meta.yaml b/simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/meta.yaml new file mode 100644 index 0000000000..b3ac963c0a --- /dev/null +++ b/simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/meta.yaml @@ -0,0 +1 @@ +{blocks_count: 2} diff --git a/simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/post.ssz_snappy b/simulators/eth2/beacon/api/tests/withdrawal_success_two_blocks/post.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..6aa570727484f9e047bc458097c8f638623f869e GIT binary patch literal 158952 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 z%0D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