plonky2/evm/src/cpu/kernel/aggregator.rs

83 lines
2.7 KiB
Rust
Raw Normal View History

//! Loads each kernel assembly file and concatenates them.
use std::collections::HashMap;
use ethereum_types::U256;
2022-07-20 00:10:52 -07:00
use hex_literal::hex;
use itertools::Itertools;
use once_cell::sync::Lazy;
use super::assembler::{assemble, Kernel};
use crate::cpu::kernel::parser::parse;
use crate::cpu::kernel::txn_fields::NormalizedTxnField;
use crate::memory::segments::Segment;
pub static KERNEL: Lazy<Kernel> = Lazy::new(combined_kernel);
pub fn evm_constants() -> HashMap<String, U256> {
let mut c = HashMap::new();
2022-07-20 00:10:52 -07:00
c.insert(
"BN_BASE".into(),
U256::from_big_endian(&hex!(
"30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47"
)),
);
for segment in Segment::all() {
c.insert(segment.var_name().into(), (segment as u32).into());
}
for txn_field in NormalizedTxnField::all() {
c.insert(txn_field.var_name().into(), (txn_field as u32).into());
}
c
}
#[allow(dead_code)] // TODO: Should be used once witness generation is done.
pub(crate) fn combined_kernel() -> Kernel {
let files = vec![
2022-07-18 13:48:51 -07:00
include_str!("asm/assertions.asm"),
include_str!("asm/basic_macros.asm"),
2022-07-05 21:24:51 +02:00
include_str!("asm/exp.asm"),
2022-07-05 21:12:11 +02:00
include_str!("asm/curve_mul.asm"),
2022-07-01 18:28:22 +02:00
include_str!("asm/curve_add.asm"),
2022-07-18 15:58:12 -07:00
include_str!("asm/memory.asm"),
2022-07-05 15:01:40 +02:00
include_str!("asm/moddiv.asm"),
2022-07-13 19:22:32 +02:00
include_str!("asm/secp256k1/curve_mul.asm"),
include_str!("asm/secp256k1/curve_add.asm"),
include_str!("asm/secp256k1/moddiv.asm"),
2022-07-14 13:07:58 +02:00
include_str!("asm/secp256k1/lift_x.asm"),
include_str!("asm/secp256k1/inverse_scalar.asm"),
2022-07-13 18:48:25 +02:00
include_str!("asm/ecrecover.asm"),
include_str!("asm/rlp/encode.asm"),
include_str!("asm/rlp/decode.asm"),
include_str!("asm/rlp/read_to_memory.asm"),
2022-07-24 08:42:06 -07:00
include_str!("asm/storage/read.asm"),
include_str!("asm/storage/write.asm"),
include_str!("asm/transactions/process_normalized.asm"),
include_str!("asm/transactions/router.asm"),
include_str!("asm/transactions/type_0.asm"),
include_str!("asm/transactions/type_1.asm"),
include_str!("asm/transactions/type_2.asm"),
];
let parsed_files = files.iter().map(|f| parse(f)).collect_vec();
assemble(parsed_files, evm_constants())
}
#[cfg(test)]
mod tests {
use log::debug;
2022-07-07 18:06:24 +02:00
use crate::cpu::kernel::aggregator::combined_kernel;
#[test]
fn make_kernel() {
let _ = env_logger::Builder::from_default_env()
.format_timestamp(None)
.try_init();
// Make sure we can parse and assemble the entire kernel.
let kernel = combined_kernel();
debug!("Total kernel size: {} bytes", kernel.code.len());
}
}