Skip to content

Commit b3a17f3

Browse files
committed
test: update pipeline & test runner to run mekong + deneb tests
1 parent ef3c071 commit b3a17f3

File tree

6 files changed

+148
-101
lines changed

6 files changed

+148
-101
lines changed

.github/workflows/pipeline.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,17 @@ jobs:
5858
5959
- name: Download blockchain data
6060
run: |
61+
# Download Deneb state
6162
curl -o data/deneb_holesky_beacon_state_2227472.ssz.zip https://dviu8zszosyat.cloudfront.net/deneb_holesky_beacon_state_2227472.ssz.zip
6263
(cd data && unzip deneb_holesky_beacon_state_2227472.ssz.zip)
6364
65+
# Download Electra State
66+
curl -o data/electra_mekong_beacon_state_654719.ssz.zip https://d1w8rcimizlk6a.cloudfront.net/electra_mekong_beacon_state_654719.ssz.zip
67+
(cd data && unzip electra_mekong_beacon_state_654719.ssz.zip)
68+
6469
- name: Run tests
70+
env:
71+
RPC_URL: ${{ secrets.RPC_URL }}
6572
run: |
6673
go test -v ./...
6774
goreleaser:

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ test
1919

2020
**/.DS_Store
2121

22-
*.ssz
22+
*.ssz
23+
24+
.env

eigen_pod_proofs_test.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package eigenpodproofs_test
22

33
import (
4+
"os"
45
"testing"
56

67
eigenpodproofs "github.com/Layr-Labs/eigenpod-proofs-generation"
@@ -11,10 +12,9 @@ import (
1112
"github.com/attestantio/go-eth2-client/spec/phase0"
1213
gethcommon "github.com/ethereum/go-ethereum/common"
1314
"github.com/ethereum/go-ethereum/ethclient"
15+
"github.com/joho/godotenv"
1416
)
1517

16-
const RPC_URL = "https://rpc.mekong.ethpandaops.io"
17-
1818
var BEACON_CHAIN_PROOFS_WRAPPER_ADDRESS = gethcommon.HexToAddress("0x874Be4b0CaC8D3F6286Eee6E6196553aabA8Cb85")
1919

2020
var (
@@ -49,8 +49,17 @@ func loadBeaconState(headerPath, statePath string, chainID uint64) error {
4949
}
5050

5151
func TestMain(m *testing.M) {
52-
var err error
53-
ethClient, err := ethclient.Dial(RPC_URL)
52+
// Load .env file
53+
if err := godotenv.Load(); err != nil {
54+
panic("Error loading .env file")
55+
}
56+
57+
rpcURL := os.Getenv("RPC_URL")
58+
if rpcURL == "" {
59+
panic("RPC_URL must be set in .env file")
60+
}
61+
62+
ethClient, err := ethclient.Dial(rpcURL)
5463
if err != nil {
5564
panic(err)
5665
}
@@ -60,7 +69,7 @@ func TestMain(m *testing.M) {
6069
panic(err)
6170
}
6271

63-
// Run tests twice - once for each network
72+
// Run tests for each hard fork type
6473
if err := loadBeaconState(
6574
"data/electra_mekong_beacon_headers_654719.json",
6675
"data/electra_mekong_beacon_state_654719.ssz",

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ require (
4545
github.com/gorilla/websocket v1.5.3 // indirect
4646
github.com/holiman/uint256 v1.3.1 // indirect
4747
github.com/huandu/go-clone v1.6.0 // indirect
48+
github.com/joho/godotenv v1.5.1 // indirect
4849
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
4950
github.com/mattn/go-colorable v0.1.13 // indirect
5051
github.com/mattn/go-isatty v0.0.20 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7Bd
126126
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
127127
github.com/jbrower95/multicall-go v0.0.0-20241012224745-7e9c19976cb5 h1:MbF9mcEhOK8A1lphvcfh5Tg7Y2p4iUAtw2+yz3jUa94=
128128
github.com/jbrower95/multicall-go v0.0.0-20241012224745-7e9c19976cb5/go.mod h1:cl6hJrk69g0EyKPgNySQbJE1nj29t2q7Pu0as27uC04=
129+
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
130+
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
129131
github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4=
130132
github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
131133
github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=

onchain_test.go

Lines changed: 121 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,123 @@
11
package eigenpodproofs_test
22

3-
// func TestValidatorContainersProofOnChain(t *testing.T) {
4-
// validators, err := beaconState.Validators()
5-
// if err != nil {
6-
// t.Fatal(err)
7-
// }
8-
9-
// validatorIndices := []uint64{}
10-
// for i := int(0); i < len(validators); i += 100000000 {
11-
// validatorIndices = append(validatorIndices, uint64(i))
12-
// }
13-
14-
// verifyValidatorFieldsCallParams, err := epp.ProveValidatorContainers(beaconHeader, beaconState, validatorIndices)
15-
// if err != nil {
16-
// t.Fatal(err)
17-
// }
18-
19-
// blockRoot, err := beaconHeader.HashTreeRoot()
20-
// if err != nil {
21-
// t.Fatal(err)
22-
// }
23-
24-
// err = beaconChainProofsWrapper.VerifyStateRoot(
25-
// &bind.CallOpts{},
26-
// blockRoot,
27-
// BeaconChainProofsWrapper.BeaconChainProofsStateRootProof{
28-
// BeaconStateRoot: verifyValidatorFieldsCallParams.StateRootProof.BeaconStateRoot,
29-
// Proof: verifyValidatorFieldsCallParams.StateRootProof.Proof.ToByteSlice(),
30-
// },
31-
// )
32-
// assert.Nil(t, err)
33-
34-
// for i := 0; i < len(verifyValidatorFieldsCallParams.ValidatorFields); i++ {
35-
// validatorFields := [][32]byte{}
36-
// for _, field := range verifyValidatorFieldsCallParams.ValidatorFields[i] {
37-
// validatorFields = append(validatorFields, field)
38-
// }
39-
40-
// err = beaconChainProofsWrapper.VerifyValidatorFields(
41-
// &bind.CallOpts{},
42-
// uint64(0),
43-
// verifyValidatorFieldsCallParams.StateRootProof.BeaconStateRoot,
44-
// validatorFields,
45-
// verifyValidatorFieldsCallParams.ValidatorFieldsProofs[i].ToByteSlice(),
46-
// new(big.Int).SetUint64(verifyValidatorFieldsCallParams.ValidatorIndices[i]),
47-
// )
48-
// assert.Nil(t, err)
49-
// }
50-
// }
51-
52-
// func TestValidatorBalancesProofOnChain(t *testing.T) {
53-
// validators, err := beaconState.Validators()
54-
// if err != nil {
55-
// t.Fatal(err)
56-
// }
57-
58-
// validatorIndices := []uint64{}
59-
// for i := int(0); i < len(validators); i += 100000000 {
60-
// validatorIndices = append(validatorIndices, uint64(i))
61-
// }
62-
63-
// verifyCheckpointProofsCallParams, err := epp.ProveCheckpointProofs(beaconHeader, beaconState, validatorIndices)
64-
// if err != nil {
65-
// t.Fatal(err)
66-
// }
67-
68-
// blockRoot, err := beaconHeader.HashTreeRoot()
69-
// if err != nil {
70-
// t.Fatal(err)
71-
// }
72-
73-
// err = beaconChainProofsWrapper.VerifyBalanceContainer(
74-
// &bind.CallOpts{},
75-
// uint64(0),
76-
// blockRoot,
77-
// BeaconChainProofsWrapper.BeaconChainProofsBalanceContainerProof{
78-
// BalanceContainerRoot: verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.ValidatorBalancesRoot,
79-
// Proof: verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.Proof.ToByteSlice(),
80-
// },
81-
// )
82-
// assert.Nil(t, err)
83-
84-
// for i := 0; i < len(verifyCheckpointProofsCallParams.BalanceProofs); i++ {
85-
// _, err = beaconChainProofsWrapper.VerifyValidatorBalance(
86-
// &bind.CallOpts{},
87-
// verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.ValidatorBalancesRoot,
88-
// new(big.Int).SetUint64(validatorIndices[i]),
89-
// BeaconChainProofsWrapper.BeaconChainProofsBalanceProof{
90-
// PubkeyHash: verifyCheckpointProofsCallParams.BalanceProofs[i].PubkeyHash,
91-
// BalanceRoot: verifyCheckpointProofsCallParams.BalanceProofs[i].BalanceRoot,
92-
// Proof: verifyCheckpointProofsCallParams.BalanceProofs[i].Proof.ToByteSlice(),
93-
// },
94-
// )
95-
// assert.Nil(t, err)
96-
// }
97-
// }
3+
import (
4+
"math/big"
5+
"testing"
6+
7+
BeaconChainProofsWrapper "github.com/Layr-Labs/eigenpod-proofs-generation/bindings/BeaconChainProofsWrapper"
8+
"github.com/attestantio/go-eth2-client/spec"
9+
"github.com/ethereum/go-ethereum/accounts/abi/bind"
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
func TestValidatorContainersProofOnChain(t *testing.T) {
14+
validators, err := beaconState.Validators()
15+
if err != nil {
16+
t.Fatal(err)
17+
}
18+
19+
validatorIndices := []uint64{}
20+
for i := int(0); i < len(validators); i += 100000 {
21+
validatorIndices = append(validatorIndices, uint64(i))
22+
}
23+
24+
verifyValidatorFieldsCallParams, err := epp.ProveValidatorContainers(beaconHeader, beaconState, validatorIndices)
25+
if err != nil {
26+
t.Fatal(err)
27+
}
28+
29+
blockRoot, err := beaconHeader.HashTreeRoot()
30+
if err != nil {
31+
t.Fatal(err)
32+
}
33+
34+
err = beaconChainProofsWrapper.VerifyStateRoot(
35+
&bind.CallOpts{},
36+
blockRoot,
37+
BeaconChainProofsWrapper.BeaconChainProofsStateRootProof{
38+
BeaconStateRoot: verifyValidatorFieldsCallParams.StateRootProof.BeaconStateRoot,
39+
Proof: verifyValidatorFieldsCallParams.StateRootProof.Proof.ToByteSlice(),
40+
},
41+
)
42+
assert.Nil(t, err)
43+
44+
// Update the proof timestamp depending on the beacon state version
45+
var proofTimestamp uint64
46+
if beaconState.Version == spec.DataVersionElectra {
47+
proofTimestamp = uint64(1730822401) // 1 second after mekong genesis
48+
} else {
49+
proofTimestamp = uint64(0)
50+
}
51+
52+
for i := 0; i < len(verifyValidatorFieldsCallParams.ValidatorFields); i++ {
53+
validatorFields := [][32]byte{}
54+
for _, field := range verifyValidatorFieldsCallParams.ValidatorFields[i] {
55+
validatorFields = append(validatorFields, field)
56+
}
57+
58+
err = beaconChainProofsWrapper.VerifyValidatorFields(
59+
&bind.CallOpts{},
60+
proofTimestamp,
61+
verifyValidatorFieldsCallParams.StateRootProof.BeaconStateRoot,
62+
validatorFields,
63+
verifyValidatorFieldsCallParams.ValidatorFieldsProofs[i].ToByteSlice(),
64+
new(big.Int).SetUint64(verifyValidatorFieldsCallParams.ValidatorIndices[i]),
65+
)
66+
assert.Nil(t, err)
67+
}
68+
}
69+
70+
func TestValidatorBalancesProofOnChain(t *testing.T) {
71+
validators, err := beaconState.Validators()
72+
if err != nil {
73+
t.Fatal(err)
74+
}
75+
76+
validatorIndices := []uint64{}
77+
for i := int(0); i < len(validators); i += 100000 {
78+
validatorIndices = append(validatorIndices, uint64(i))
79+
}
80+
81+
verifyCheckpointProofsCallParams, err := epp.ProveCheckpointProofs(beaconHeader, beaconState, validatorIndices)
82+
if err != nil {
83+
t.Fatal(err)
84+
}
85+
86+
blockRoot, err := beaconHeader.HashTreeRoot()
87+
if err != nil {
88+
t.Fatal(err)
89+
}
90+
91+
// Update the proof timestamp depending on the beacon state version
92+
var proofTimestamp uint64
93+
if beaconState.Version == spec.DataVersionElectra {
94+
proofTimestamp = uint64(1730822401) // 1 second after mekong genesis
95+
} else {
96+
proofTimestamp = uint64(0)
97+
}
98+
99+
err = beaconChainProofsWrapper.VerifyBalanceContainer(
100+
&bind.CallOpts{},
101+
proofTimestamp,
102+
blockRoot,
103+
BeaconChainProofsWrapper.BeaconChainProofsBalanceContainerProof{
104+
BalanceContainerRoot: verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.ValidatorBalancesRoot,
105+
Proof: verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.Proof.ToByteSlice(),
106+
},
107+
)
108+
assert.Nil(t, err)
109+
110+
for i := 0; i < len(verifyCheckpointProofsCallParams.BalanceProofs); i++ {
111+
_, err = beaconChainProofsWrapper.VerifyValidatorBalance(
112+
&bind.CallOpts{},
113+
verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.ValidatorBalancesRoot,
114+
new(big.Int).SetUint64(validatorIndices[i]),
115+
BeaconChainProofsWrapper.BeaconChainProofsBalanceProof{
116+
PubkeyHash: verifyCheckpointProofsCallParams.BalanceProofs[i].PubkeyHash,
117+
BalanceRoot: verifyCheckpointProofsCallParams.BalanceProofs[i].BalanceRoot,
118+
Proof: verifyCheckpointProofsCallParams.BalanceProofs[i].Proof.ToByteSlice(),
119+
},
120+
)
121+
assert.Nil(t, err)
122+
}
123+
}

0 commit comments

Comments
 (0)