use crate::{
rlc::types::{RlcFixedTrace, RlcTrace},
rlp::types::{RlpArrayWitness, RlpFieldTrace},
};
use super::*;
mod input;
pub use input::*;
#[derive(Clone, Debug)]
pub struct TerminalWitness<F: ScalarField> {
pub node_type: AssignedValue<F>,
pub ext: LeafWitness<F>,
pub branch: BranchWitness<F>,
}
pub struct TerminalTrace<F: ScalarField> {
pub node_type: AssignedValue<F>,
pub ext: LeafTrace<F>,
pub branch: BranchTrace<F>,
}
impl<F: ScalarField> TerminalTrace<F> {
pub fn mpt_hash_rlc(
&self,
ctx_gate: &mut Context<F>,
gate: &impl GateInstructions<F>,
) -> RlcVar<F> {
rlc_select(
ctx_gate,
gate,
self.ext.rlcs.mpt_hash,
self.branch.rlcs.mpt_hash,
self.node_type,
)
}
pub fn keccak_rlc(
&self,
ctx_gate: &mut Context<F>,
gate: &impl GateInstructions<F>,
) -> AssignedValue<F> {
assert_eq!(self.ext.rlcs.hash.len, self.branch.rlcs.hash.len);
gate.select(
ctx_gate,
self.ext.rlcs.hash.rlc_val,
self.branch.rlcs.hash.rlc_val,
self.node_type,
)
}
}
#[derive(Clone, Debug)]
pub struct LeafTrace<F: ScalarField> {
pub key_path: RlpFieldTrace<F>,
pub value: RlpFieldTrace<F>,
pub rlcs: MPTHashTrace<F>,
}
#[derive(Clone, Debug)]
pub struct LeafWitness<F: ScalarField> {
pub rlp: RlpArrayWitness<F>,
pub hash_query: MPTHashWitness<F>,
}
#[derive(Clone, Debug)]
pub struct ExtensionTrace<F: ScalarField> {
pub key_path: RlpFieldTrace<F>,
pub node_ref: RlpFieldTrace<F>,
pub rlcs: MPTHashTrace<F>,
}
#[derive(Clone, Debug)]
pub struct ExtensionWitness<F: ScalarField> {
pub rlp: RlpArrayWitness<F>,
pub hash_query: MPTHashWitness<F>,
}
#[derive(Clone, Debug)]
pub struct BranchTrace<F: ScalarField> {
pub node_refs: [RlpFieldTrace<F>; BRANCH_NUM_ITEMS],
pub rlcs: MPTHashTrace<F>,
}
#[derive(Clone, Debug)]
pub struct BranchWitness<F: ScalarField> {
pub rlp: RlpArrayWitness<F>,
pub hash_query: MPTHashWitness<F>,
}
pub type AssignedBytes<F> = Vec<AssignedValue<F>>; pub type AssignedNibbles<F> = Vec<AssignedValue<F>>;
#[derive(Clone, Debug)]
pub struct MPTNode<F: ScalarField> {
pub rlp_bytes: AssignedBytes<F>,
pub node_type: AssignedValue<F>,
}
#[derive(Clone, Debug)]
pub struct MPTNodeWitness<F: ScalarField> {
pub node_type: AssignedValue<F>,
pub ext: ExtensionWitness<F>,
pub branch: BranchWitness<F>,
}
#[derive(Clone, Debug)]
pub struct MPTNodeTrace<F: ScalarField> {
pub node_type: AssignedValue<F>,
pub ext: ExtensionTrace<F>,
pub branch: BranchTrace<F>,
}
impl<F: ScalarField> MPTNodeTrace<F> {
pub fn mpt_hash_rlc(
&self,
ctx_gate: &mut Context<F>,
gate: &impl GateInstructions<F>,
) -> RlcVar<F> {
rlc_select(
ctx_gate,
gate,
self.ext.rlcs.mpt_hash,
self.branch.rlcs.mpt_hash,
self.node_type,
)
}
pub fn keccak_rlc(
&self,
ctx_gate: &mut Context<F>,
gate: &impl GateInstructions<F>,
) -> AssignedValue<F> {
assert_eq!(self.ext.rlcs.hash.len, self.branch.rlcs.hash.len);
gate.select(
ctx_gate,
self.ext.rlcs.hash.rlc_val,
self.branch.rlcs.hash.rlc_val,
self.node_type,
)
}
}
#[derive(Clone, Debug)]
pub struct MPTFragment<F: ScalarField> {
pub nibbles: AssignedNibbles<F>,
pub is_odd: AssignedValue<F>,
pub byte_len: AssignedValue<F>,
}
#[derive(Clone, Debug)]
pub struct MPTProofWitness<F: ScalarField> {
pub value_bytes: AssignedBytes<F>,
pub value_byte_len: AssignedValue<F>,
pub root_hash_bytes: AssignedBytes<F>,
pub key_byte_len: Option<AssignedValue<F>>,
pub depth: AssignedValue<F>,
pub nodes: Vec<MPTNodeWitness<F>>,
pub terminal_node: TerminalWitness<F>,
pub slot_is_empty: AssignedValue<F>,
pub max_key_byte_len: usize,
pub max_depth: usize,
pub key_frag: Vec<MPTFragment<F>>,
pub key_frag_ext_bytes: Vec<AssignedBytes<F>>,
pub key_frag_leaf_bytes: Vec<AssignedBytes<F>>,
pub frag_lens: Vec<AssignedValue<F>>,
pub key_hexs: AssignedNibbles<F>,
}
pub type MPTHashWitness<F> = KeccakVarLenQuery<F>;
#[derive(Clone, Copy, Debug)]
pub struct MPTHashTrace<F: ScalarField> {
pub hash: RlcFixedTrace<F>,
pub mpt_hash: RlcTrace<F>,
}
#[derive(Clone, Debug, Serialize, Deserialize, Hash)]
pub struct PathBytes(pub Vec<u8>);
impl<T: AsRef<[u8]>> From<&T> for PathBytes {
fn from(value: &T) -> Self {
Self(value.as_ref().to_vec())
}
}
impl From<Vec<u8>> for PathBytes {
fn from(value: Vec<u8>) -> Self {
Self(value)
}
}
impl From<H256> for PathBytes {
fn from(value: H256) -> Self {
Self(value.0.to_vec())
}
}
impl AsRef<[u8]> for PathBytes {
fn as_ref(&self) -> &[u8] {
&self.0
}
}