Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
a6b878d
Refactor to support updated HeaderExtension format
ToufeeqP Dec 1, 2025
b29691c
feat: add fri commitment generation
ToufeeqP Dec 1, 2025
23ee25e
update e2e to se local rust & work with updtaed HeaderExtension
ToufeeqP Dec 1, 2025
959115b
feat: refactor header extension building to support KZG & Fri commitm…
ToufeeqP Dec 2, 2025
d371e0e
Make Fri commitment scheme as default
ToufeeqP Dec 2, 2025
1f8b48f
feat: implement Fri commitment validation and update commitment schem…
ToufeeqP Dec 2, 2025
940aad9
switch deps
ToufeeqP Dec 2, 2025
c65049b
make e2e compatible
ToufeeqP Dec 2, 2025
9eb674d
re-export FriVersionParams
ToufeeqP Dec 3, 2025
ac97eb4
Remove submit_data support & clean other APIs
ToufeeqP Dec 4, 2025
ec96190
update core deps
ToufeeqP Dec 4, 2025
d41a7ab
Add support for FRI commitment scheme with evaluation point and claim
ToufeeqP Dec 16, 2025
1c1b01a
feat: Add evaluation proof generation and validation for FRI
ToufeeqP Dec 17, 2025
ffec1d2
Enhance HeaderExtension with evaluation proof support and refactor fi…
ToufeeqP Dec 17, 2025
418ceae
refactor: Simplify error handling and improve FRI proof validation in…
ToufeeqP Dec 17, 2025
3ee401e
update deps
ToufeeqP Dec 18, 2025
20f8437
update e2e
ToufeeqP Dec 18, 2025
5e03798
feat: Add new RPC methods for blob summary, evaluation data, and samp…
ToufeeqP Dec 19, 2025
4622780
Add blob RPC docs
ToufeeqP Dec 22, 2025
9808706
move SamplingProof to avail-fri
ToufeeqP Dec 22, 2025
bd97943
added blob_hash to the header
ToufeeqP Jan 5, 2026
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
520 changes: 420 additions & 100 deletions Cargo.lock

Large diffs are not rendered by default.

11 changes: 7 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,12 @@ homepage = "https://www.availproject.org/"


[workspace.dependencies]
avail-core = { git = "https://github.com/availproject/avail-core.git", branch = "ghali/infinity-da", default-features = false, features = [ "runtime"] }
kate = { git = "https://github.com/availproject/avail-core", branch = "ghali/infinity-da", default-features = false }
kate-recovery = { git = "https://github.com/availproject/avail-core", branch = "ghali/infinity-da", default-features = false }
avail-core = { git = "https://github.com/availproject/avail-core.git", rev = "8d018ba7485406cf6f81ee97a8c0eb6238f65a59", default-features = false, features = [ "runtime"] }
avail-fri = { git = "https://github.com/availproject/avail-core.git", rev = "8d018ba7485406cf6f81ee97a8c0eb6238f65a59", default-features = false, features = [ "runtime"] }
kate = { git = "https://github.com/availproject/avail-core", rev = "8d018ba7485406cf6f81ee97a8c0eb6238f65a59", default-features = false }
kate-recovery = { git = "https://github.com/availproject/avail-core", rev = "8d018ba7485406cf6f81ee97a8c0eb6238f65a59", default-features = false }
# avail-core = { path = "../avail-core/core", default-features = false, features = [ "runtime"] }
# avail-fri = { path = "../avail-core/fri", default-features = false }
# kate = { path = "../avail-core/kate/", default-features = false }
# kate-recovery = { path = "../avail-core/kate/recovery/", default-features = false}

Expand Down Expand Up @@ -64,7 +66,7 @@ iai-callgrind = "0.7.3"
divan = "0.1.11"

# Logging and testing
log = "0.4.20"
log = { version = "0.4.20", default-features = false }
test-case = "1.2.3"
hex = "0.4"
const-hex = { version = "1.14.1", default-features = false, features = ["alloc"] }
Expand Down Expand Up @@ -360,3 +362,4 @@ zeroize = { opt-level = 3 }
[profile.release]
# Substrate runtime requires unwinding.
panic = "unwind"
lto = "thin"
5 changes: 3 additions & 2 deletions base/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ frame-support = { workspace = true, default-features = false }
binary-merkle-tree = { workspace = true, default-features = false }

# 3rd-party
log.workspace = true
log = { workspace = true, default-features = false }
derive_more.workspace = true
itertools = { workspace = true, default-features = false }

Expand All @@ -41,8 +41,9 @@ std = [
"binary-merkle-tree/std",
"codec/std",
"frame-support/std",
"sp-authority-discovery/std",
"log/std",
"sp-api/std",
"sp-authority-discovery/std",
"sp-core/std",
"sp-runtime-interface/std",
"sp-runtime/std",
Expand Down
40 changes: 30 additions & 10 deletions base/src/header_extension/builder_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use derive_more::Constructor;
use sp_core::H256;
use sp_runtime::OpaqueExtrinsic;
use sp_runtime_interface::pass_by::PassByCodec;
use sp_std::collections::btree_map::BTreeMap;
use sp_std::{iter::repeat, vec::Vec};

#[derive(Constructor, Debug, Encode, Decode, Clone, PartialEq, Eq)]
Expand All @@ -18,12 +19,16 @@ pub struct BridgedData {
pub addr_msg: AddressedMessage,
}

#[derive(Debug, Constructor, Encode, Decode, PartialEq, Eq, Clone)]
#[derive(Debug, Constructor, Encode, Decode, Default, PartialEq, Eq, Clone)]
pub struct SubmittedData {
pub id: AppId,
pub tx_index: u32,
pub hash: H256,
pub size_bytes: u64,
pub commitments: Vec<u8>,
pub eval_point_seed: Option<[u8; 32]>,
pub eval_claim: Option<[u8; 16]>,
pub eval_proof: Option<Vec<u8>>,
}

impl GetAppId for SubmittedData {
Expand All @@ -44,34 +49,36 @@ pub struct HeaderExtensionBuilderData {
pub bridge_messages: Vec<BridgedData>,
}

#[derive(Clone, Debug, Default)]
pub struct PostInherentInfo {
pub eval_proofs: BTreeMap<u32, Vec<u8>>,
pub failed: Vec<u32>,
}

impl HeaderExtensionBuilderData {
pub fn from_raw_extrinsics<F: HeaderExtensionDataFilter>(
block: u32,
extrinsics: &[Vec<u8>],
cols: u32,
rows: u32,
) -> Self {
let opaques: Vec<OpaqueExtrinsic> = extrinsics
.iter()
.filter_map(|e| OpaqueExtrinsic::from_bytes(e).ok())
.collect();

Self::from_opaque_extrinsics::<F>(block, &opaques, cols, rows)
Self::from_opaque_extrinsics::<F>(block, &opaques)
}

pub fn from_opaque_extrinsics<F: HeaderExtensionDataFilter>(
block: u32,
opaques: &[OpaqueExtrinsic],
cols: u32,
rows: u32,
) -> Self {
let failed_transactions = F::get_failed_transaction_ids(opaques);
let post_inherent_info = F::get_data_from_post_inherents(opaques);

let extracted_tx_datas: Vec<ExtractedTxData> = opaques
.into_iter()
.enumerate()
.filter_map(|(idx, opaque)| {
F::filter(&failed_transactions, opaque.clone(), block, idx, cols, rows)
F::filter(post_inherent_info.clone(), opaque.clone(), block, idx)
})
.collect();

Expand Down Expand Up @@ -260,8 +267,7 @@ mod tests {
#[test]
fn test_from_raw_extrinsics() {
let extrinsics: Vec<Vec<u8>> = vec![vec![1, 2, 3], vec![4, 5, 6]];
let builder_data =
HeaderExtensionBuilderData::from_raw_extrinsics::<()>(1, &extrinsics, 1024, 4096);
let builder_data = HeaderExtensionBuilderData::from_raw_extrinsics::<()>(1, &extrinsics);
assert_eq!(builder_data.data_submissions.len(), 0);
assert_eq!(builder_data.bridge_messages.len(), 0);
}
Expand All @@ -273,7 +279,9 @@ mod tests {
id: AppId::default(),
tx_index: 0,
commitments: vec![],
size_bytes: 0,
hash: H256::from(keccak_256(&vec![1, 2, 3])),
..Default::default()
}],
bridge_messages: vec![],
};
Expand All @@ -290,7 +298,9 @@ mod tests {
id: AppId::default(),
tx_index: 0,
hash: H256::from(keccak_256(&vec![1, 2, 3])),
size_bytes: 0,
commitments: vec![],
..Default::default()
}],
bridge_messages: vec![],
};
Expand All @@ -306,8 +316,10 @@ mod tests {
data_submissions: vec![SubmittedData {
id: AppId::default(),
tx_index: 0,
size_bytes: 0,
hash: H256::from(keccak_256(&vec![1, 2, 3])),
commitments: vec![],
..Default::default()
}],
bridge_messages: vec![],
};
Expand All @@ -320,26 +332,34 @@ mod tests {
SubmittedData {
id: AppId(3),
tx_index: 0,
size_bytes: 0,
hash: H256::from(keccak_256(&vec![1, 2, 3])),
commitments: vec![],
..Default::default()
},
SubmittedData {
id: AppId(1),
tx_index: 1,
size_bytes: 0,
hash: H256::from(keccak_256(&vec![4, 5, 6])),
commitments: vec![],
..Default::default()
},
SubmittedData {
id: AppId(2),
tx_index: 2,
size_bytes: 0,
hash: H256::from(keccak_256(&vec![7, 8, 9])),
commitments: vec![],
..Default::default()
},
SubmittedData {
id: AppId(1),
tx_index: 3,
size_bytes: 0,
hash: H256::from(keccak_256(&vec![7, 8, 9])),
commitments: vec![],
..Default::default()
},
];

Expand Down
4 changes: 3 additions & 1 deletion base/src/header_extension/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,7 @@ pub mod builder_data;
pub mod traits;

// Reexport
pub use builder_data::{BridgedData, ExtractedTxData, HeaderExtensionBuilderData, SubmittedData};
pub use builder_data::{
BridgedData, ExtractedTxData, HeaderExtensionBuilderData, PostInherentInfo, SubmittedData,
};
pub use traits::HeaderExtensionDataFilter;
25 changes: 9 additions & 16 deletions base/src/header_extension/traits.rs
Original file line number Diff line number Diff line change
@@ -1,51 +1,44 @@
use super::ExtractedTxData;
use super::{ExtractedTxData, PostInherentInfo};
use sp_runtime::OpaqueExtrinsic;
use sp_std::vec::Vec;

pub trait HeaderExtensionDataFilter {
fn filter(
failed_transactions: &[u32],
post_inherent_info: PostInherentInfo,
opaque: OpaqueExtrinsic,
block: u32,
tx_idx: usize,
cols: u32,
rows: u32,
) -> Option<ExtractedTxData>;

fn get_failed_transaction_ids(opaques: &[OpaqueExtrinsic]) -> Vec<u32>;
fn get_data_from_post_inherents(opaques: &[OpaqueExtrinsic]) -> PostInherentInfo;
}

#[cfg(feature = "std")]
impl HeaderExtensionDataFilter for () {
fn filter(
_: &[u32],
_: PostInherentInfo,
_: OpaqueExtrinsic,
_: u32,
_: usize,
_: u32,
_: u32,
) -> Option<ExtractedTxData> {
None
}

fn get_failed_transaction_ids(_: &[OpaqueExtrinsic]) -> Vec<u32> {
Vec::new()
fn get_data_from_post_inherents(_: &[OpaqueExtrinsic]) -> PostInherentInfo {
PostInherentInfo::default()
}
}
#[cfg(not(feature = "std"))]
impl HeaderExtensionDataFilter for () {
fn filter(
_: &[u32],
_: PostInherentInfo,
_: OpaqueExtrinsic,
_: u32,
_: usize,
_: u32,
_: u32,
) -> Option<ExtractedTxData> {
None
}

fn get_failed_transaction_ids(_: &[OpaqueExtrinsic]) -> Vec<u32> {
Vec::new()
fn get_data_from_post_inherents(_: &[OpaqueExtrinsic]) -> PostInherentInfo {
PostInherentInfo::default()
}
}
1 change: 1 addition & 0 deletions base/src/post_inherents.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ decl_runtime_apis! {
bool,
Option<String>,
Vec<(sp_runtime::AccountId32, AuthorityId, String, Vec<u8>)>,
Option<Vec<u8>>,
)>, total_blob_size: u64) -> Vec<<Block as BlockT>::Extrinsic>;
}
}
Expand Down
2 changes: 2 additions & 0 deletions blob/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ edition = "2021"
da-runtime = { workspace = true, default-features = false }
da-control = { workspace = true, default-features = false }
avail-core = { workspace = true, default-features = false }
avail-fri = { workspace = true, default-features = false, features = ["serde"]}
pallet-staking = { workspace = true, default-features = false }
sp-consensus-babe = { workspace = true, default-features = false }
sc-transaction-pool = { workspace = true, default-features = false }
Expand Down Expand Up @@ -70,6 +71,7 @@ avail-rust = { package = "avail-rust-client", version = "0.4.0", default-feature
default = ["std"]
std = [
"avail-core/std",
"avail-fri/std",
"kate/std",
"kate-recovery/std",
"frame-benchmarking/std",
Expand Down
17 changes: 12 additions & 5 deletions blob/benches/submit_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ use avail_blob::traits::*;
use avail_blob::types::CompressedBlob;
use avail_blob::utils::CommitmentQueue;
use avail_rust::prelude::*;
use da_commitment::build_da_commitments;
use da_commitment::build_da_commitments::build_da_commitments;
use da_commitment::build_kzg_commitments;
use da_commitment::build_kzg_commitments::build_da_commitments;
use da_runtime::AccountId;
use da_runtime::UncheckedExtrinsic;
use da_runtime::AVAIL;
Expand Down Expand Up @@ -108,6 +108,13 @@ impl RuntimeApiT for DummyRuntimeApi {
fn get_blob_vouch_fee_reserve(&self, _block_hash: H256) -> Result<u128, ApiError> {
Ok(AVAIL)
}

fn commitment_scheme(
&self,
_block_hash: H256,
) -> Result<avail_core::header::extension::CommitmentScheme, ApiError> {
Ok(avail_core::header::extension::CommitmentScheme::Fri)
}
}

struct BuildTxOutput {
Expand Down Expand Up @@ -215,7 +222,7 @@ mod validation {
let queue: Arc<dyn CommitmentQueueApiT> = Arc::new(queue);

// grid & Commitment
let grid = build_da_commitments::build_polynomial_grid(
let grid = build_kzg_commitments::build_polynomial_grid(
&*tx.data,
DEFAULT_ROWS,
DEFAULT_COLS,
Expand All @@ -228,7 +235,7 @@ mod validation {
.bench_local_refs(|params| {
let runtime = tokio::runtime::Runtime::new().unwrap();
runtime.block_on(async {
avail_blob::validation::commitment_validation(
avail_blob::validation::validate_kzg_commitment(
tx.data_hash,
&params.0,
params.1.clone(),
Expand All @@ -246,7 +253,7 @@ mod validation {
let tx = build_transaction(data);

bencher.with_inputs(|| &tx).bench_local_refs(|tx| {
build_da_commitments::build_polynomial_grid(
build_kzg_commitments::build_polynomial_grid(
&*tx.data,
DEFAULT_ROWS,
DEFAULT_COLS,
Expand Down
Loading