Skip to content

Commit 1b22fd7

Browse files
committed
feat: aligned proof aggregation model and contract interface
1 parent 2a4791d commit 1b22fd7

File tree

2 files changed

+143
-0
lines changed

2 files changed

+143
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
defmodule AlignedProofAggregationService do
2+
require Logger
3+
4+
@aligned_config_file System.get_env("ALIGNED_PROOF_AGG_CONFIG_FILE")
5+
6+
config_file_path =
7+
case @aligned_config_file do
8+
nil -> raise("ALIGNED_PROOF_AGG_CONFIG_FILE not set in .env")
9+
file -> file
10+
end
11+
12+
{status, config_json_string} = File.read(config_file_path)
13+
14+
case status do
15+
:ok ->
16+
Logger.debug("Aligned deployment file read successfully")
17+
18+
:error ->
19+
raise(
20+
"Config file not read successfully, make sure your .env is correctly created, and make sure Eigenlayer config file is correctly stored"
21+
)
22+
end
23+
24+
@contract_address Jason.decode!(config_json_string)
25+
|> Map.get("addresses")
26+
|> Map.get("alignedProofAggregationService")
27+
28+
use Ethers.Contract,
29+
abi_file: "lib/abi/AlignedProofAggregationService.json",
30+
default_address: @contract_address
31+
32+
def get_address() do
33+
@contract_address
34+
end
35+
36+
def get_aggregated_proof_event(%{from_block: number, to_block: number}) do
37+
events =
38+
AlignedProofAggregationService.EventFilters.new_batch_v3(nil)
39+
|> Ethers.get_logs(fromBlock: fromBlock, toBlock: toBlock)
40+
41+
[
42+
%{
43+
number: 0,
44+
status: 0,
45+
merkle_root: "",
46+
block_number: 0,
47+
tx_hash: "",
48+
tx_timestamp: "",
49+
blob_versioned_hash: ""
50+
}
51+
]
52+
end
53+
54+
def get_blob_data_from_versioned_hash(versioned_hash) do
55+
# Fetch blob data from a beacon client
56+
"Getting blob data from blob versioned hash: #{versioned_hash}" |> Logger.debug()
57+
# List of bytes
58+
blob_data = []
59+
blob_data
60+
end
61+
end
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
defmodule AggregatedProofs do
2+
require Logger
3+
use Ecto.Schema
4+
import Ecto.Changeset
5+
import Ecto.Query
6+
7+
# Different from proofs.ex (we could use the same but the hashes are constructed differently)
8+
@primary_key {:id, :integer, autogenerate: true}
9+
schema "proofs_agg_mode" do
10+
field(:aggregated_proof_number, :integer)
11+
field(:proof_hash, :string)
12+
end
13+
14+
def changeset_proof(proof, attrs) do
15+
proofs
16+
|> cast(attrs, [:aggregated_proof_number, :proof_hash])
17+
|> validate_required([:aggregated_proof_number, :proof_hash])
18+
end
19+
20+
@primary_key {:number, :integer, autogenerate: false}
21+
schema "aggregated_proofs" do
22+
field(:merkle_root, :string)
23+
field(:status, :integer)
24+
field(:tx_hash, :string)
25+
field(:blob_versioned_hash, :string)
26+
field(:blob_data, :binary)
27+
field(:number_of_proofs, :integer)
28+
field(:block_number, :integer)
29+
field(:tx_timestamp, :utc_datetime)
30+
31+
timestamps()
32+
end
33+
34+
@doc """
35+
Creates a changeset based on the given `attrs`.
36+
"""
37+
def changeset(aggregated_proof, attrs) do
38+
aggregated_proof
39+
|> cast(attrs, [
40+
:number,
41+
:merkle_root,
42+
:status,
43+
:tx_hash,
44+
:blob_versioned_hash,
45+
:blob_data,
46+
:number_of_proofs,
47+
:block_number,
48+
:tx_timestamp
49+
])
50+
|> validate_required([
51+
:number,
52+
:merkle_root,
53+
:status,
54+
:tx_hash,
55+
:blob_versioned_hash,
56+
:number_of_proofs,
57+
:block_number,
58+
:tx_timestamp
59+
])
60+
|> unique_constraint(:number)
61+
end
62+
63+
def insert_or_update(agg_proof) do
64+
changeset = AggregatedProofs.changeset(%AggregatedProofs{}, Map.from_struct(agg_proof))
65+
66+
case Explorer.Repo.get_by(AggregatedProofs, number: agg_proof.number) do
67+
nil ->
68+
Explorer.Repo.insert(changeset)
69+
70+
existing_agg_proof ->
71+
"Updating aggregated proof" |> Logger.debug()
72+
73+
Ecto.Changeset.change(existing_agg_proof, changeset.changes)
74+
|> Explorer.Repo.update()
75+
end
76+
end
77+
78+
def insert_proof(proof) do
79+
changeset = changeset_proof(proof)
80+
Explorer.Repo.insert(changeset)
81+
end
82+
end

0 commit comments

Comments
 (0)