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

feat(proof-sdk): Cleanup Hint API #998

Merged
merged 2 commits into from
Feb 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 5 additions & 5 deletions bin/client/src/interop/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,13 @@ where
}
};

caching_oracle
.write(&HintType::L2OutputRoot.encode_with(&[
HintType::L2OutputRoot
.with_data(&[
rich_output.output_root.as_slice(),
rich_output.chain_id.to_be_bytes().as_slice(),
]))
.await
.map_err(OracleProviderError::Preimage)?;
])
.send(caching_oracle)
.await?;
let output_preimage = caching_oracle
.get(PreimageKey::new(*rich_output.output_root, PreimageKeyType::Keccak256))
.await
Expand Down
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