Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

imp: eth light client and relayer sepolia support #394

Merged
merged 69 commits into from
Mar 13, 2025
Merged
Changes from 1 commit
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
aeaabf7
start add back rust-fixtures
gjermundgaraba Mar 4, 2025
1fba026
feat: electra support in eth lc
gjermundgaraba Mar 7, 2025
c592721
Merge branch 'gjermund/rust-fixtures' into gjermund/electra
gjermundgaraba Mar 7, 2025
266bf5f
imp: electra support
gjermundgaraba Mar 7, 2025
e36d100
Merge remote-tracking branch 'origin/main' into gjermund/electra
gjermundgaraba Mar 7, 2025
5ab4608
update lc
gjermundgaraba Mar 7, 2025
9840fcb
add back rust tests
gjermundgaraba Mar 8, 2025
bfb5d1a
fixes
gjermundgaraba Mar 8, 2025
157bb85
fix nil pointer for multichain tests
gjermundgaraba Mar 8, 2025
f6d3d99
mainnet config wtf
gjermundgaraba Mar 8, 2025
a212a5c
relayer and lc fixes
gjermundgaraba Mar 9, 2025
25be894
more fixes
gjermundgaraba Mar 9, 2025
79a430f
add genesis script
gjermundgaraba Mar 9, 2025
cabe9c1
insert anakin it's working meme here
gjermundgaraba Mar 10, 2025
9ccebc0
cleanup
gjermundgaraba Mar 10, 2025
5a3d2a2
remove ethgenesis script (moved to other branch)
gjermundgaraba Mar 10, 2025
69fce2b
added some more logs
gjermundgaraba Mar 10, 2025
2a3031d
add back ethgenesis script
gjermundgaraba Mar 10, 2025
92ea58c
Merge remote-tracking branch 'origin/main' into gjermund/sepolia
gjermundgaraba Mar 10, 2025
e332e75
did I just make it?
gjermundgaraba Mar 11, 2025
5cc573a
Merge remote-tracking branch 'origin/main' into gjermund/sepolia
gjermundgaraba Mar 11, 2025
4eebcb0
working commit
gjermundgaraba Mar 11, 2025
d6916cb
fix justfile
gjermundgaraba Mar 11, 2025
c0fcc87
update checksum in ethgenesis
gjermundgaraba Mar 11, 2025
6fff846
fix eth genesis script
gjermundgaraba Mar 11, 2025
3863218
fix build error
gjermundgaraba Mar 11, 2025
bba13d1
fix the ethgenesis script again
gjermundgaraba Mar 11, 2025
8e2221e
fix justfile
gjermundgaraba Mar 11, 2025
406429c
wasm fixtures
gjermundgaraba Mar 11, 2025
13baa30
update checksum
gjermundgaraba Mar 11, 2025
081dd30
try something real quick
gjermundgaraba Mar 11, 2025
b2efafd
test1
gjermundgaraba Mar 11, 2025
a91eaee
test1.2
gjermundgaraba Mar 11, 2025
081c684
test2
gjermundgaraba Mar 11, 2025
697c1e2
test3
gjermundgaraba Mar 11, 2025
75e8983
test4
gjermundgaraba Mar 11, 2025
41f8364
test5
gjermundgaraba Mar 11, 2025
b52d8d8
crazy test
gjermundgaraba Mar 11, 2025
6d2ebf4
fix build
gjermundgaraba Mar 11, 2025
59c738e
try something
gjermundgaraba Mar 11, 2025
7ac23ca
new client to test
gjermundgaraba Mar 11, 2025
f1a6129
event type
gjermundgaraba Mar 11, 2025
3ebbe0c
remove debug file
gjermundgaraba Mar 11, 2025
41c4f36
lint
gjermundgaraba Mar 12, 2025
ca74884
Merge remote-tracking branch 'origin/main' into gjermund/sepolia
gjermundgaraba Mar 12, 2025
558b3ef
add heights from tm events
gjermundgaraba Mar 12, 2025
fa290de
code review fixes
gjermundgaraba Mar 12, 2025
7bf8b9d
use trait in TxBuilder
gjermundgaraba Mar 12, 2025
639d73c
code review fixes
gjermundgaraba Mar 12, 2025
abfaae5
clean up wait for finality
gjermundgaraba Mar 13, 2025
682f3c6
fix minimum block number
gjermundgaraba Mar 13, 2025
aac305c
code review fixes
gjermundgaraba Mar 13, 2025
b4a8353
rebuild light client
gjermundgaraba Mar 13, 2025
89d7af3
docs: fix error string
srdtrk Mar 13, 2025
1143687
fix: clippy complaint
srdtrk Mar 13, 2025
dceab5d
style
srdtrk Mar 13, 2025
2976eaa
style
srdtrk Mar 13, 2025
7fccf8d
code review fixes + fixtures
gjermundgaraba Mar 13, 2025
61efb1c
style: imp
srdtrk Mar 13, 2025
12c7ba3
fix fetch events
gjermundgaraba Mar 13, 2025
d938e07
code review fixes
gjermundgaraba Mar 13, 2025
18340b5
more code review fixes
gjermundgaraba Mar 13, 2025
a735559
imp: more additions
srdtrk Mar 13, 2025
44d7ad2
lint
gjermundgaraba Mar 13, 2025
fd4aabc
Merge remote-tracking branch 'origin/gjermund/sepolia' into gjermund/…
srdtrk Mar 13, 2025
9e4b8f9
imp
srdtrk Mar 13, 2025
b5813f1
Merge remote-tracking branch 'origin/gjermund/sepolia' into gjermund/…
srdtrk Mar 13, 2025
ff030c2
add wasm fixture for multi period update client
gjermundgaraba Mar 13, 2025
4552820
imp: remove unneeded clone
srdtrk Mar 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
relayer and lc fixes
gjermundgaraba committed Mar 9, 2025

Verified

This commit was signed with the committer’s verified signature.
gjermundgaraba Gjermund Garaba
commit a212a5c86812a417ad7cc51d0dd61edd280a7846
2 changes: 1 addition & 1 deletion e2e/interchaintestv8/chainconfig/kurtosis.go
Original file line number Diff line number Diff line change
@@ -32,7 +32,7 @@ var (
Participants: []kurtosisParticipant{
{
CLType: "lodestar",
CLImage: "ethpandaops/lighthouse:unstable",
CLImage: "ethpandaops/lodestar:prague-devnet-6",
ELType: "geth",
ELImage: "ethpandaops/geth:prague-devnet-6",
ELLogLevel: "info",
22 changes: 13 additions & 9 deletions e2e/interchaintestv8/e2esuite/suite.go
Original file line number Diff line number Diff line change
@@ -50,17 +50,21 @@ func (s *TestSuite) SetupSuite(ctx context.Context) {
case testvalues.EthTestnetTypePoW:
icChainSpecs = append(icChainSpecs, &interchaintest.ChainSpec{ChainConfig: icethereum.DefaultEthereumAnvilChainConfig("ethereum")})
case testvalues.EthTestnetTypePoS:
kurtosisChain, err := chainconfig.SpinUpKurtosisPoS(ctx) // TODO: Run this in a goroutine and wait for it to be ready
// kurtosisChain, err := chainconfig.SpinUpKurtosisPoS(ctx) // TODO: Run this in a goroutine and wait for it to be ready
// s.Require().NoError(err)
faucet, err := crypto.ToECDSA(ethcommon.FromHex("04b9f63ecf84210c5366c66d68fa1f5da1fa4f634fad6dfc86178e4d79ff9e59"))
s.Require().NoError(err)
s.EthChain, err = ethereum.NewEthereum(ctx, kurtosisChain.RPC, &kurtosisChain.BeaconApiClient, kurtosisChain.Faucet)

beaconAPI := ethereum.NewBeaconAPIClient("http://127.0.0.1:33195")
s.EthChain, err = ethereum.NewEthereum(ctx, "http://127.0.0.1:33190", &beaconAPI, faucet)
s.Require().NoError(err)
s.T().Cleanup(func() {
ctx := context.Background()
if s.T().Failed() {
_ = kurtosisChain.DumpLogs(ctx)
}
kurtosisChain.Destroy(ctx)
})
// s.T().Cleanup(func() {
// ctx := context.Background()
// if s.T().Failed() {
// _ = kurtosisChain.DumpLogs(ctx)
// }
// kurtosisChain.Destroy(ctx)
// })
case testvalues.EthTestnetTypeNone:
// Do nothing
default:
3 changes: 3 additions & 0 deletions e2e/interchaintestv8/ibc_eureka_test.go
Original file line number Diff line number Diff line change
@@ -524,6 +524,9 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT
s.Require().True(s.Run("Receive packets on Cosmos chain", func() {
var relayTxBodyBz []byte
s.Require().True(s.Run("Retrieve relay tx", func() {
// fmt.Println("Sleeping for 120 minutes, to test")
// fmt.Printf("Relay request: SrcChain: %s\n DstChain: %s\n SourceTxIds: %v\n TargetClientId: %s\n", eth.ChainID.String(), simd.Config().ChainID, ethcommon.BytesToHash(ethSendTxHash).String(), testvalues.FirstWasmClientID)
// time.Sleep(120 * time.Minute)
resp, err := s.RelayerClient.RelayByTx(context.Background(), &relayertypes.RelayByTxRequest{
SrcChain: eth.ChainID.String(),
DstChain: simd.Config().ChainID,
4 changes: 4 additions & 0 deletions e2e/interchaintestv8/types/rust_fixtures.go
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@ import (
"fmt"
"os"
"strings"
"time"

"github.com/stretchr/testify/suite"

@@ -31,6 +32,9 @@ func NewRustFixtureGenerator(s *suite.Suite, shouldGenerateFixture bool) *RustFi
if err := rustFixtureGenerator.writeFixtures(fixtureName); err != nil {
s.T().Logf("Error writing fixtures: %v", err)
}

fmt.Println("Sleeping for 120 minutes after writing fixtures")
time.Sleep(120 * time.Minute)
})
}

Binary file modified e2e/interchaintestv8/wasm/cw_ics08_wasm_eth.wasm.gz
Binary file not shown.
4 changes: 4 additions & 0 deletions justfile
Original file line number Diff line number Diff line change
@@ -144,6 +144,10 @@ install-operator:
install-relayer:
cargo install --bin relayer --path programs/relayer --locked

run-relayer:
@echo "Running the relayer..."
cargo run --bin relayer --release -- start --config config.json

# Generate the `genesis.json` file using $TENDERMINT_RPC_URL in the `.env` file
# Note that the `scripts/genesis.json` file is ignored in the `.gitignore` file
genesis-sp1-ics07: build-sp1-programs
33 changes: 30 additions & 3 deletions packages/ethereum/ethereum-apis/src/beacon_api/client.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
//! This module implements the `BeaconApiClient` to interact with the Ethereum Beacon API.

use ethereum_types::consensus::{
bootstrap::LightClientBootstrap,
light_client_header::{LightClientFinalityUpdate, LightClientUpdate},
spec::Spec,
};
@@ -10,11 +11,13 @@ use tracing::debug;

use super::{
error::{BeaconApiClientError, InternalServerError, NotFoundError},
response::{Response, Version},
response::{BeaconBlockRoot, Response, Version},
};

const SPEC_PATH: &str = "/eth/v1/config/spec";
const FINALITY_UPDATE_PATH: &str = "/eth/v1/beacon/light_client/finality_update";
const BEACON_BLOCKS_PATH: &str = "/eth/v1/beacon/blocks";
const LIGHT_CLIENT_BOOTSTRAP_PATH: &str = "/eth/v1/beacon/light_client/bootstrap";
const LIGHT_CLIENT_FINALITY_UPDATE_PATH: &str = "/eth/v1/beacon/light_client/finality_update";
const LIGHT_CLIENT_UPDATES_PATH: &str = "/eth/v1/beacon/light_client/updates";

/// The api client for interacting with the Beacon API
@@ -41,13 +44,37 @@ impl BeaconApiClient {
self.get_json(SPEC_PATH).await
}

/// Fetches the `LigthClientBootstrap` for a given beacon block root
/// # Errors
/// Returns an error if the request fails or the response is not successful deserialized
pub async fn light_client_bootstrap(
&self,
beacon_block_root: &str,
) -> Result<Response<LightClientBootstrap>, BeaconApiClientError> {
self.get_json(&format!(
"{LIGHT_CLIENT_BOOTSTRAP_PATH}/{beacon_block_root}"
))
.await
}

/// Fetches the Beacon block root for a given block id
/// # Errors
/// Returns an error if the request fails or the response is not successful deserialized
pub async fn beacon_block_root(&self, block_id: &str) -> Result<String, BeaconApiClientError> {
let resp: Response<BeaconBlockRoot> = self
.get_json(&format!("{BEACON_BLOCKS_PATH}/{block_id}/root"))
.await?;

Ok(resp.data.root)
}

/// Fetches the latest Beacon light client finality update
/// # Errors
/// Returns an error if the request fails or the response is not successful deserialized
pub async fn finality_update(
&self,
) -> Result<Response<LightClientFinalityUpdate, Version>, BeaconApiClientError> {
self.get_json(FINALITY_UPDATE_PATH).await
self.get_json(LIGHT_CLIENT_FINALITY_UPDATE_PATH).await
}

/// Fetches Beacon light client updates starting from a given period
7 changes: 7 additions & 0 deletions packages/ethereum/ethereum-apis/src/beacon_api/response.rs
Original file line number Diff line number Diff line change
@@ -40,3 +40,10 @@ pub struct Version {
/// The version of the Ethereum consensus.
pub version: EthConsensusVersion,
}

/// The Beacon Block Root response structure returned by the Beacon API.
#[derive(Debug, Serialize, Deserialize)]
pub struct BeaconBlockRoot {
/// The root of the Beacon block.
pub root: String,
}

Large diffs are not rendered by default.

7 changes: 6 additions & 1 deletion packages/ethereum/ethereum-light-client/src/verify.rs
Original file line number Diff line number Diff line change
@@ -90,9 +90,14 @@ pub fn verify_header<V: BlsVerify>(
);

let proof_data = header.account_update.account_proof.clone();
print!("{proof_data:?}");

verify_account_storage_root(
header.consensus_update.attested_header.execution.state_root,
header
.consensus_update
.finalized_header
.execution
.state_root,
client_state.ibc_contract_address,
&proof_data.proof,
proof_data.storage_root,
23 changes: 23 additions & 0 deletions packages/ethereum/ethereum-types/src/consensus/bootstrap.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//! This module defines types related to the bootstrap endpoint of the Beacon API.

use alloy_primitives::B256;
use serde::{Deserialize, Serialize};
use serde_with::serde_as;

use super::{
light_client_header::LightClientHeader, merkle::CURRENT_SYNC_COMMITTEE_BRANCH_DEPTH,
sync_committee::SyncCommittee,
};

/// The light client bootstrap
#[serde_as]
#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, Default)]
#[allow(clippy::module_name_repetitions)]
pub struct LightClientBootstrap {
/// The light client header
pub header: LightClientHeader,
/// The current sync committee
pub current_sync_committee: SyncCommittee,
/// The branch of the current sync committee
pub current_sync_committee_branch: [B256; CURRENT_SYNC_COMMITTEE_BRANCH_DEPTH],
}
Original file line number Diff line number Diff line change
@@ -56,6 +56,21 @@ pub struct LightClientFinalityUpdate {
pub signature_slot: u64,
}

// Light Client Finality Update to Light Client Update conversion
impl From<LightClientFinalityUpdate> for LightClientUpdate {
fn from(finality_update: LightClientFinalityUpdate) -> Self {
Self {
attested_header: finality_update.attested_header,
next_sync_committee: None,
next_sync_committee_branch: None,
finalized_header: finality_update.finalized_header,
finality_branch: finality_update.finality_branch,
sync_aggregate: finality_update.sync_aggregate,
signature_slot: finality_update.signature_slot,
}
}
}

/// The header of a light client
#[derive(Serialize, Deserialize, JsonSchema, PartialEq, Eq, Clone, Debug, Default, TreeHash)]
#[allow(clippy::module_name_repetitions)]
3 changes: 3 additions & 0 deletions packages/ethereum/ethereum-types/src/consensus/merkle.rs
Original file line number Diff line number Diff line change
@@ -17,6 +17,9 @@ pub const EXECUTION_PAYLOAD_INDEX: u64 = 25;

/// The depth of the merkle tree for execution payloads.
pub const EXECUTION_BRANCH_DEPTH: usize = floorlog2(EXECUTION_PAYLOAD_INDEX);
/// The depth of the merkle tree for the current sync committee.
pub const CURRENT_SYNC_COMMITTEE_BRANCH_DEPTH: usize =
floorlog2(CURRENT_SYNC_COMMITTEE_GINDEX_ELECTRA);
/// The depth of the merkle tree for the next sync committee.
pub const NEXT_SYNC_COMMITTEE_BRANCH_DEPTH: usize = floorlog2(NEXT_SYNC_COMMITTEE_GINDEX_ELECTRA);
/// The depth of the merkle tree for the finalized root.
1 change: 1 addition & 0 deletions packages/ethereum/ethereum-types/src/consensus/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
//! This module contains types assosicated with the beacon api and Ethereum consensus.

pub mod bls;
pub mod bootstrap;
pub mod domain;
pub mod fork;
pub mod light_client_header;
25 changes: 17 additions & 8 deletions packages/relayer-lib/src/events/eureka.rs
Original file line number Diff line number Diff line change
@@ -2,7 +2,8 @@

use alloy::{
primitives::{hex, Bytes},
sol_types::SolEvent,
rpc::types::Log,
sol_types::{SolEvent, SolEventInterface},
};
use ibc_eureka_solidity_types::ics26::{
router::{routerEvents, SendPacket, WriteAcknowledgement},
@@ -19,9 +20,9 @@ use super::cosmos_sdk;
#[allow(clippy::module_name_repetitions)]
pub enum EurekaEvent {
/// A packet was sent.
SendPacket(SolPacket),
SendPacket(SolPacket, Option<u64>),
/// An acknowledgement was written.
WriteAcknowledgement(SolPacket, Vec<Bytes>),
WriteAcknowledgement(SolPacket, Vec<Bytes>, Option<u64>),
}

impl EurekaEvent {
@@ -33,15 +34,22 @@ impl EurekaEvent {
}
}

impl TryFrom<routerEvents> for EurekaEvent {
impl TryFrom<&Log> for EurekaEvent {
type Error = anyhow::Error;

fn try_from(event: routerEvents) -> anyhow::Result<Self> {
match event {
routerEvents::SendPacket(event) => Ok(Self::SendPacket(event.packet)),
fn try_from(log: &Log) -> anyhow::Result<Self> {
let sol_event = routerEvents::decode_log(&log.inner, true).map_err(|e| {
anyhow::anyhow!(
"Failed to decode log into ICS26Router event: {}",
e.to_string()
)
})?;
match sol_event.data {
routerEvents::SendPacket(event) => Ok(Self::SendPacket(event.packet, log.block_number)),
routerEvents::WriteAcknowledgement(event) => Ok(Self::WriteAcknowledgement(
event.packet,
event.acknowledgements,
log.block_number,
)),
routerEvents::AckPacket(_) => Err(anyhow::anyhow!("AckPacket event is not used")),
routerEvents::TimeoutPacket(_) => {
@@ -82,7 +90,7 @@ impl TryFrom<TmEvent> for EurekaEvent {
}
let packet: Vec<u8> = hex::decode(attr.value_str().ok()?).ok()?;
let packet = Packet::decode(packet.as_slice()).ok()?;
Some(Self::SendPacket(packet.into()))
Some(Self::SendPacket(packet.into(), None))
})
.ok_or_else(|| anyhow::anyhow!("No packet data found")),
cosmos_sdk::EVENT_TYPE_WRITE_ACK => {
@@ -115,6 +123,7 @@ impl TryFrom<TmEvent> for EurekaEvent {
.into_iter()
.map(Into::into)
.collect(),
None,
))
}
cosmos_sdk::EVENT_TYPE_ACKNOWLEDGE_PACKET
13 changes: 3 additions & 10 deletions packages/relayer-lib/src/listener/eth_eureka.rs
Original file line number Diff line number Diff line change
@@ -4,11 +4,10 @@ use alloy::{
primitives::{Address, TxHash},
providers::Provider,
rpc::types::Filter,
sol_types::SolEventInterface,
};
use anyhow::{anyhow, Result};
use futures::future;
use ibc_eureka_solidity_types::ics26::router::{routerEvents, routerInstance};
use ibc_eureka_solidity_types::ics26::router::routerInstance;

use crate::{chain::EthEureka, events::EurekaEvent};

@@ -75,10 +74,7 @@ where
.await?
.iter()
.filter(|log| log.transaction_hash.unwrap_or_default() == tx_id)
.filter_map(|log| {
let sol_event = routerEvents::decode_log(&log.inner, true).ok()?.data;
EurekaEvent::try_from(sol_event).ok()
})
.filter_map(|log| EurekaEvent::try_from(log).ok())
.collect::<Vec<_>>(),
)
}))
@@ -102,10 +98,7 @@ where
.get_logs(&event_filter)
.await?
.iter()
.filter_map(|log| {
let sol_event = routerEvents::decode_log(&log.inner, true).ok()?.data;
EurekaEvent::try_from(sol_event).ok()
})
.filter_map(|log| EurekaEvent::try_from(log).ok())
.collect())
}
}
Loading