Skip to content

Commit

Permalink
feat(proof-sdk): Cleanup Hint API
Browse files Browse the repository at this point in the history
  • Loading branch information
clabby committed Feb 4, 2025
1 parent 61ed147 commit 7b3369a
Show file tree
Hide file tree
Showing 11 changed files with 160 additions and 221 deletions.
8 changes: 2 additions & 6 deletions bin/client/src/precompiles/bls12.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ use crate::{HINT_WRITER, ORACLE_READER};
use alloc::{string::ToString, vec::Vec};
use alloy_primitives::{address, keccak256, Address, Bytes};
use kona_preimage::{
errors::PreimageOracleError, HintWriterClient, PreimageKey, PreimageKeyType,
PreimageOracleClient,
errors::PreimageOracleError, PreimageKey, PreimageKeyType, PreimageOracleClient,
};
use kona_proof::{errors::OracleProviderError, HintType};
use revm::{
Expand Down Expand Up @@ -57,10 +56,7 @@ fn fpvm_bls12_pairing(input: &Bytes, gas_limit: u64) -> PrecompileResult {
let result_data = kona_proof::block_on(async move {
// Write the hint for the ecrecover precompile run.
let hint_data = &[BLS12_PAIRING_CHECK.as_ref(), input.as_ref()];
HINT_WRITER
.write(&HintType::L1Precompile.encode_with(hint_data))
.await
.map_err(OracleProviderError::Preimage)?;
HintType::L1Precompile.with_data(hint_data).send(&HINT_WRITER).await?;

// Construct the key hash for the ecrecover precompile run.
let raw_key_data = hint_data.iter().copied().flatten().copied().collect::<Vec<u8>>();
Expand Down
8 changes: 2 additions & 6 deletions bin/client/src/precompiles/bn128_pair.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ use crate::{HINT_WRITER, ORACLE_READER};
use alloc::{string::ToString, vec::Vec};
use alloy_primitives::{keccak256, Address, Bytes};
use kona_preimage::{
errors::PreimageOracleError, HintWriterClient, PreimageKey, PreimageKeyType,
PreimageOracleClient,
errors::PreimageOracleError, PreimageKey, PreimageKeyType, PreimageOracleClient,
};
use kona_proof::{errors::OracleProviderError, HintType};
use revm::{
Expand Down Expand Up @@ -41,10 +40,7 @@ fn fpvm_ecpairing(input: &Bytes, gas_limit: u64) -> PrecompileResult {
let result_data = kona_proof::block_on(async move {
// Write the hint for the ecrecover precompile run.
let hint_data = &[ECPAIRING_ADDRESS.as_ref(), input.as_ref()];
HINT_WRITER
.write(&HintType::L1Precompile.encode_with(hint_data))
.await
.map_err(OracleProviderError::Preimage)?;
HintType::L1Precompile.with_data(hint_data).send(&HINT_WRITER).await?;

// Construct the key hash for the ecrecover precompile run.
let raw_key_data = hint_data.iter().copied().flatten().copied().collect::<Vec<u8>>();
Expand Down
8 changes: 2 additions & 6 deletions bin/client/src/precompiles/ecrecover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ use crate::{HINT_WRITER, ORACLE_READER};
use alloc::{string::ToString, vec::Vec};
use alloy_primitives::{keccak256, Address, Bytes};
use kona_preimage::{
errors::PreimageOracleError, HintWriterClient, PreimageKey, PreimageKeyType,
PreimageOracleClient,
errors::PreimageOracleError, PreimageKey, PreimageKeyType, PreimageOracleClient,
};
use kona_proof::{errors::OracleProviderError, HintType};
use revm::{
Expand All @@ -29,10 +28,7 @@ fn fpvm_ecrecover(input: &Bytes, gas_limit: u64) -> PrecompileResult {
let result_data = kona_proof::block_on(async move {
// Write the hint for the ecrecover precompile run.
let hint_data = &[ECRECOVER_ADDRESS.as_ref(), input.as_ref()];
HINT_WRITER
.write(&HintType::L1Precompile.encode_with(hint_data))
.await
.map_err(OracleProviderError::Preimage)?;
HintType::L1Precompile.with_data(hint_data).send(&HINT_WRITER).await?;

// Construct the key hash for the ecrecover precompile run.
let raw_key_data = hint_data.iter().copied().flatten().copied().collect::<Vec<u8>>();
Expand Down
8 changes: 2 additions & 6 deletions bin/client/src/precompiles/kzg_point_eval.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ use crate::{HINT_WRITER, ORACLE_READER};
use alloc::{string::ToString, vec::Vec};
use alloy_primitives::{keccak256, Address, Bytes};
use kona_preimage::{
errors::PreimageOracleError, HintWriterClient, PreimageKey, PreimageKeyType,
PreimageOracleClient,
errors::PreimageOracleError, PreimageKey, PreimageKeyType, PreimageOracleClient,
};
use kona_proof::{errors::OracleProviderError, HintType};
use revm::{
Expand Down Expand Up @@ -33,10 +32,7 @@ fn fpvm_kzg_point_eval(input: &Bytes, gas_limit: u64) -> PrecompileResult {
let result_data = kona_proof::block_on(async move {
// Write the hint for the ecrecover precompile run.
let hint_data = &[POINT_EVAL_ADDRESS.as_ref(), input.as_ref()];
HINT_WRITER
.write(&HintType::L1Precompile.encode_with(hint_data))
.await
.map_err(OracleProviderError::Preimage)?;
HintType::L1Precompile.with_data(hint_data).send(&HINT_WRITER).await?;

// Construct the key hash for the ecrecover precompile run.
let raw_key_data = hint_data.iter().copied().flatten().copied().collect::<Vec<u8>>();
Expand Down
13 changes: 6 additions & 7 deletions bin/client/src/single.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use alloy_primitives::B256;
use core::fmt::Debug;
use kona_driver::{Driver, DriverError};
use kona_executor::{ExecutorError, KonaHandleRegister, TrieDBProvider};
use kona_preimage::{CommsClient, HintWriterClient, PreimageKeyType, PreimageOracleClient};
use kona_preimage::{CommsClient, HintWriterClient, PreimageKey, PreimageOracleClient};
use kona_proof::{
errors::OracleProviderError,
executor::KonaExecutor,
Expand Down Expand Up @@ -162,12 +162,11 @@ where
{
let mut output_preimage = [0u8; 128];
HintType::StartingL2Output
.get_exact_preimage(
caching_oracle,
agreed_l2_output_root,
PreimageKeyType::Keccak256,
&mut output_preimage,
)
.with_data(&[agreed_l2_output_root.as_ref()])
.send(caching_oracle)
.await?;
caching_oracle
.get_exact(PreimageKey::new_keccak256(*agreed_l2_output_root), output_preimage.as_mut())
.await?;

output_preimage[96..128].try_into().map_err(OracleProviderError::SliceConversion)
Expand Down
123 changes: 52 additions & 71 deletions bin/host/src/interop/handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,21 +34,21 @@ impl HintHandler for InteropHintHandler {
providers: &<Self::Cfg as OnlineHostBackendCfg>::Providers,
kv: SharedKeyValueStore,
) -> Result<()> {
match hint.hint_type {
match hint.ty {
HintType::L1BlockHeader => {
ensure!(hint.hint_data.len() == 32, "Invalid hint data length");
ensure!(hint.data.len() == 32, "Invalid hint data length");

let hash: B256 = hint.hint_data.as_ref().try_into()?;
let hash: B256 = hint.data.as_ref().try_into()?;
let raw_header: Bytes =
providers.l1.client().request("debug_getRawHeader", [hash]).await?;

let mut kv_lock = kv.write().await;
kv_lock.set(PreimageKey::new_keccak256(*hash).into(), raw_header.into())?;
}
HintType::L1Transactions => {
ensure!(hint.hint_data.len() == 32, "Invalid hint data length");
ensure!(hint.data.len() == 32, "Invalid hint data length");

let hash: B256 = hint.hint_data.as_ref().try_into()?;
let hash: B256 = hint.data.as_ref().try_into()?;
let Block { transactions, .. } = providers
.l1
.get_block_by_hash(hash, BlockTransactionsKind::Full)
Expand All @@ -62,20 +62,20 @@ impl HintHandler for InteropHintHandler {
store_ordered_trie(kv.as_ref(), encoded_transactions.as_slice()).await?;
}
HintType::L1Receipts => {
ensure!(hint.hint_data.len() == 32, "Invalid hint data length");
ensure!(hint.data.len() == 32, "Invalid hint data length");

let hash: B256 = hint.hint_data.as_ref().try_into()?;
let hash: B256 = hint.data.as_ref().try_into()?;
let raw_receipts: Vec<Bytes> =
providers.l1.client().request("debug_getRawReceipts", [hash]).await?;

store_ordered_trie(kv.as_ref(), raw_receipts.as_slice()).await?;
}
HintType::L1Blob => {
ensure!(hint.hint_data.len() == 48, "Invalid hint data length");
ensure!(hint.data.len() == 48, "Invalid hint data length");

let hash_data_bytes: [u8; 32] = hint.hint_data[0..32].try_into()?;
let index_data_bytes: [u8; 8] = hint.hint_data[32..40].try_into()?;
let timestamp_data_bytes: [u8; 8] = hint.hint_data[40..48].try_into()?;
let hash_data_bytes: [u8; 32] = hint.data[0..32].try_into()?;
let index_data_bytes: [u8; 8] = hint.data[32..40].try_into()?;
let timestamp_data_bytes: [u8; 8] = hint.data[40..48].try_into()?;

let hash: B256 = hash_data_bytes.into();
let index = u64::from_be_bytes(index_data_bytes);
Expand Down Expand Up @@ -132,11 +132,11 @@ impl HintHandler for InteropHintHandler {
)?;
}
HintType::L1Precompile => {
ensure!(hint.hint_data.len() >= 20, "Invalid hint data length");
ensure!(hint.data.len() >= 20, "Invalid hint data length");

let address = Address::from_slice(&hint.hint_data.as_ref()[..20]);
let input = hint.hint_data[20..].to_vec();
let input_hash = keccak256(hint.hint_data.as_ref());
let address = Address::from_slice(&hint.data.as_ref()[..20]);
let input = hint.data[20..].to_vec();
let input_hash = keccak256(hint.data.as_ref());

let result = crate::eth::execute(address, input).map_or_else(
|_| vec![0u8; 1],
Expand All @@ -149,17 +149,16 @@ impl HintHandler for InteropHintHandler {
);

let mut kv_lock = kv.write().await;
kv_lock
.set(PreimageKey::new_keccak256(*input_hash).into(), hint.hint_data.into())?;
kv_lock.set(PreimageKey::new_keccak256(*input_hash).into(), hint.data.into())?;
kv_lock.set(
PreimageKey::new(*input_hash, PreimageKeyType::Precompile).into(),
result,
)?;
}
HintType::AgreedPreState => {
ensure!(hint.hint_data.len() == 32, "Invalid hint data length");
ensure!(hint.data.len() == 32, "Invalid hint data length");

let hash: B256 = hint.hint_data.as_ref().try_into()?;
let hash: B256 = hint.data.as_ref().try_into()?;

if hash != keccak256(cfg.agreed_l2_pre_state.as_ref()) {
anyhow::bail!("Agreed pre-state hash does not match.");
Expand All @@ -176,13 +175,10 @@ impl HintHandler for InteropHintHandler {
const L2_TO_L1_MESSAGE_PASSER_ADDRESS: Address =
address!("4200000000000000000000000000000000000016");

ensure!(
hint.hint_data.len() >= 32 && hint.hint_data.len() <= 40,
"Invalid hint data length"
);
ensure!(hint.data.len() >= 32 && hint.data.len() <= 40, "Invalid hint data length");

let hash = B256::from_slice(&hint.hint_data.as_ref()[0..32]);
let chain_id = u64::from_be_bytes(hint.hint_data.as_ref()[32..40].try_into()?);
let hash = B256::from_slice(&hint.data.as_ref()[0..32]);
let chain_id = u64::from_be_bytes(hint.data.as_ref()[32..40].try_into()?);
let l2_provider = providers.l2(&chain_id)?;

// Decode the pre-state to determine the timestamp of the block.
Expand Down Expand Up @@ -237,14 +233,11 @@ impl HintHandler for InteropHintHandler {
kv_lock.set(PreimageKey::new_keccak256(*output_root).into(), raw_output.into())?;
}
HintType::L2BlockHeader => {
ensure!(
hint.hint_data.len() >= 32 && hint.hint_data.len() <= 40,
"Invalid hint data length"
);
ensure!(hint.data.len() >= 32 && hint.data.len() <= 40, "Invalid hint data length");

let hash: B256 = hint.hint_data.as_ref()[..32].try_into()?;
let chain_id = if hint.hint_data.len() == 40 {
u64::from_be_bytes(hint.hint_data[32..40].try_into()?)
let hash: B256 = hint.data.as_ref()[..32].try_into()?;
let chain_id = if hint.data.len() == 40 {
u64::from_be_bytes(hint.data[32..40].try_into()?)
} else {
cfg.active_l2_chain_id()?
};
Expand All @@ -256,14 +249,11 @@ impl HintHandler for InteropHintHandler {
kv_lock.set(PreimageKey::new_keccak256(*hash).into(), raw_header.into())?;
}
HintType::L2Transactions => {
ensure!(
hint.hint_data.len() >= 32 && hint.hint_data.len() <= 40,
"Invalid hint data length"
);
ensure!(hint.data.len() >= 32 && hint.data.len() <= 40, "Invalid hint data length");

let hash: B256 = hint.hint_data.as_ref()[..32].try_into()?;
let chain_id = if hint.hint_data.len() == 40 {
u64::from_be_bytes(hint.hint_data[32..40].try_into()?)
let hash: B256 = hint.data.as_ref()[..32].try_into()?;
let chain_id = if hint.data.len() == 40 {
u64::from_be_bytes(hint.data[32..40].try_into()?)
} else {
cfg.active_l2_chain_id()?
};
Expand All @@ -281,14 +271,11 @@ impl HintHandler for InteropHintHandler {
store_ordered_trie(kv.as_ref(), encoded_transactions.as_slice()).await?;
}
HintType::L2Receipts => {
ensure!(
hint.hint_data.len() >= 32 && hint.hint_data.len() <= 40,
"Invalid hint data length"
);
ensure!(hint.data.len() >= 32 && hint.data.len() <= 40, "Invalid hint data length");

let hash: B256 = hint.hint_data.as_ref()[..32].try_into()?;
let chain_id = if hint.hint_data.len() == 40 {
u64::from_be_bytes(hint.hint_data[32..40].try_into()?)
let hash: B256 = hint.data.as_ref()[..32].try_into()?;
let chain_id = if hint.data.len() == 40 {
u64::from_be_bytes(hint.data[32..40].try_into()?)
} else {
cfg.active_l2_chain_id()?
};
Expand All @@ -305,14 +292,11 @@ impl HintHandler for InteropHintHandler {
// geth hashdb scheme code hash key prefix
const CODE_PREFIX: u8 = b'c';

ensure!(
hint.hint_data.len() >= 32 && hint.hint_data.len() <= 40,
"Invalid hint data length"
);
ensure!(hint.data.len() >= 32 && hint.data.len() <= 40, "Invalid hint data length");

let hash: B256 = hint.hint_data[..32].as_ref().try_into()?;
let chain_id = if hint.hint_data.len() == 40 {
u64::from_be_bytes(hint.hint_data[32..40].try_into()?)
let hash: B256 = hint.data[..32].as_ref().try_into()?;
let chain_id = if hint.data.len() == 40 {
u64::from_be_bytes(hint.data[32..40].try_into()?)
} else {
cfg.active_l2_chain_id()?
};
Expand Down Expand Up @@ -340,14 +324,11 @@ impl HintHandler for InteropHintHandler {
kv_lock.set(PreimageKey::new_keccak256(*hash).into(), code.into())?;
}
HintType::L2StateNode => {
ensure!(
hint.hint_data.len() >= 32 && hint.hint_data.len() <= 40,
"Invalid hint data length"
);
ensure!(hint.data.len() >= 32 && hint.data.len() <= 40, "Invalid hint data length");

let hash: B256 = hint.hint_data.as_ref().try_into()?;
let chain_id = if hint.hint_data.len() == 40 {
u64::from_be_bytes(hint.hint_data[32..40].try_into()?)
let hash: B256 = hint.data.as_ref().try_into()?;
let chain_id = if hint.data.len() == 40 {
u64::from_be_bytes(hint.data[32..40].try_into()?)
} else {
cfg.active_l2_chain_id()?
};
Expand All @@ -361,14 +342,14 @@ impl HintHandler for InteropHintHandler {
}
HintType::L2AccountProof => {
ensure!(
hint.hint_data.len() >= 8 + 20 && hint.hint_data.len() <= 8 + 20 + 8,
hint.data.len() >= 8 + 20 && hint.data.len() <= 8 + 20 + 8,
"Invalid hint data length"
);

let block_number = u64::from_be_bytes(hint.hint_data.as_ref()[..8].try_into()?);
let address = Address::from_slice(&hint.hint_data.as_ref()[8..28]);
let chain_id = if hint.hint_data.len() == 8 + 20 + 8 {
u64::from_be_bytes(hint.hint_data[28..].try_into()?)
let block_number = u64::from_be_bytes(hint.data.as_ref()[..8].try_into()?);
let address = Address::from_slice(&hint.data.as_ref()[8..28]);
let chain_id = if hint.data.len() == 8 + 20 + 8 {
u64::from_be_bytes(hint.data[28..].try_into()?)
} else {
cfg.active_l2_chain_id()?
};
Expand All @@ -390,15 +371,15 @@ impl HintHandler for InteropHintHandler {
}
HintType::L2AccountStorageProof => {
ensure!(
hint.hint_data.len() >= 8 + 20 + 32 && hint.hint_data.len() <= 8 + 20 + 32 + 8,
hint.data.len() >= 8 + 20 + 32 && hint.data.len() <= 8 + 20 + 32 + 8,
"Invalid hint data length"
);

let block_number = u64::from_be_bytes(hint.hint_data.as_ref()[..8].try_into()?);
let address = Address::from_slice(&hint.hint_data.as_ref()[8..28]);
let slot = B256::from_slice(&hint.hint_data.as_ref()[28..]);
let chain_id = if hint.hint_data.len() == 8 + 20 + 32 + 8 {
u64::from_be_bytes(hint.hint_data[60..].try_into()?)
let block_number = u64::from_be_bytes(hint.data.as_ref()[..8].try_into()?);
let address = Address::from_slice(&hint.data.as_ref()[8..28]);
let slot = B256::from_slice(&hint.data.as_ref()[28..]);
let chain_id = if hint.data.len() == 8 + 20 + 32 + 8 {
u64::from_be_bytes(hint.data[60..].try_into()?)
} else {
cfg.active_l2_chain_id()?
};
Expand Down
Loading

0 comments on commit 7b3369a

Please sign in to comment.