mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-08 00:33:06 +00:00
Some cleanup (#1498)
This commit is contained in:
parent
6357963654
commit
f3f7433c29
@ -1,7 +1,5 @@
|
|||||||
use core::iter;
|
|
||||||
use core::ops::Deref;
|
use core::ops::Deref;
|
||||||
|
|
||||||
use itertools::Itertools;
|
|
||||||
use plonky2::field::extension::Extendable;
|
use plonky2::field::extension::Extendable;
|
||||||
use plonky2::field::types::Field;
|
use plonky2::field::types::Field;
|
||||||
use plonky2::hash::hash_types::RichField;
|
use plonky2::hash::hash_types::RichField;
|
||||||
|
|||||||
@ -38,7 +38,6 @@ use plonky2::timed;
|
|||||||
use plonky2::util::timing::TimingTree;
|
use plonky2::util::timing::TimingTree;
|
||||||
use plonky2::util::transpose;
|
use plonky2::util::transpose;
|
||||||
|
|
||||||
use super::columns::BYTE_VALUES_RANGE;
|
|
||||||
use super::NUM_BYTES;
|
use super::NUM_BYTES;
|
||||||
use crate::byte_packing::columns::{
|
use crate::byte_packing::columns::{
|
||||||
index_len, value_bytes, ADDR_CONTEXT, ADDR_SEGMENT, ADDR_VIRTUAL, IS_READ, LEN_INDICES_COLS,
|
index_len, value_bytes, ADDR_CONTEXT, ADDR_SEGMENT, ADDR_VIRTUAL, IS_READ, LEN_INDICES_COLS,
|
||||||
@ -62,7 +61,7 @@ pub(crate) fn ctl_looked_data<F: Field>() -> Vec<Column<F>> {
|
|||||||
// obtain the corresponding limb.
|
// obtain the corresponding limb.
|
||||||
let outputs: Vec<Column<F>> = (0..8)
|
let outputs: Vec<Column<F>> = (0..8)
|
||||||
.map(|i| {
|
.map(|i| {
|
||||||
let range = (value_bytes(i * 4)..value_bytes(i * 4) + 4);
|
let range = value_bytes(i * 4)..value_bytes(i * 4) + 4;
|
||||||
Column::linear_combination(
|
Column::linear_combination(
|
||||||
range
|
range
|
||||||
.enumerate()
|
.enumerate()
|
||||||
|
|||||||
@ -33,10 +33,6 @@ pub(crate) const fn value_bytes(i: usize) -> usize {
|
|||||||
BYTES_VALUES_START + i
|
BYTES_VALUES_START + i
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Range of columns containing the bytes values.
|
|
||||||
pub(crate) const BYTE_VALUES_RANGE: Range<usize> =
|
|
||||||
BYTES_VALUES_START..BYTES_VALUES_START + NUM_BYTES;
|
|
||||||
|
|
||||||
/// The counter column (used for the range check) starts from 0 and increments.
|
/// The counter column (used for the range check) starts from 0 and increments.
|
||||||
pub(crate) const RANGE_COUNTER: usize = BYTES_VALUES_START + NUM_BYTES;
|
pub(crate) const RANGE_COUNTER: usize = BYTES_VALUES_START + NUM_BYTES;
|
||||||
/// The frequencies column used in logUp.
|
/// The frequencies column used in logUp.
|
||||||
|
|||||||
@ -8,12 +8,9 @@ use plonky2::plonk::circuit_builder::CircuitBuilder;
|
|||||||
|
|
||||||
use super::columns::ops::OpsColumnsView;
|
use super::columns::ops::OpsColumnsView;
|
||||||
use super::cpu_stark::{disable_unused_channels, disable_unused_channels_circuit};
|
use super::cpu_stark::{disable_unused_channels, disable_unused_channels_circuit};
|
||||||
use super::membus::NUM_GP_CHANNELS;
|
|
||||||
use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer};
|
use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer};
|
||||||
use crate::cpu::columns::CpuColumnsView;
|
use crate::cpu::columns::CpuColumnsView;
|
||||||
use crate::cpu::kernel::constants::context_metadata::ContextMetadata;
|
|
||||||
use crate::memory::segments::Segment;
|
use crate::memory::segments::Segment;
|
||||||
use crate::memory::VALUE_LIMBS;
|
|
||||||
|
|
||||||
// If true, the instruction will keep the current context for the next row.
|
// If true, the instruction will keep the current context for the next row.
|
||||||
// If false, next row's context is handled manually.
|
// If false, next row's context is handled manually.
|
||||||
@ -88,7 +85,7 @@ fn eval_packed_get<P: PackedField>(
|
|||||||
// Context is scaled by 2^64, hence stored in the 3rd limb.
|
// Context is scaled by 2^64, hence stored in the 3rd limb.
|
||||||
yield_constr.constraint(filter * (new_stack_top[2] - lv.context));
|
yield_constr.constraint(filter * (new_stack_top[2] - lv.context));
|
||||||
|
|
||||||
for (i, &limb) in new_stack_top.iter().enumerate().filter(|(i, _)| *i != 2) {
|
for (_, &limb) in new_stack_top.iter().enumerate().filter(|(i, _)| *i != 2) {
|
||||||
yield_constr.constraint(filter * limb);
|
yield_constr.constraint(filter * limb);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,7 +116,7 @@ fn eval_ext_circuit_get<F: RichField + Extendable<D>, const D: usize>(
|
|||||||
yield_constr.constraint(builder, constr);
|
yield_constr.constraint(builder, constr);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i, &limb) in new_stack_top.iter().enumerate().filter(|(i, _)| *i != 2) {
|
for (_, &limb) in new_stack_top.iter().enumerate().filter(|(i, _)| *i != 2) {
|
||||||
let constr = builder.mul_extension(filter, limb);
|
let constr = builder.mul_extension(filter, limb);
|
||||||
yield_constr.constraint(builder, constr);
|
yield_constr.constraint(builder, constr);
|
||||||
}
|
}
|
||||||
@ -151,7 +148,7 @@ fn eval_packed_set<P: PackedField>(
|
|||||||
|
|
||||||
// The next row's context is read from stack_top.
|
// The next row's context is read from stack_top.
|
||||||
yield_constr.constraint(filter * (stack_top[2] - nv.context));
|
yield_constr.constraint(filter * (stack_top[2] - nv.context));
|
||||||
for (i, &limb) in stack_top.iter().enumerate().filter(|(i, _)| *i != 2) {
|
for (_, &limb) in stack_top.iter().enumerate().filter(|(i, _)| *i != 2) {
|
||||||
yield_constr.constraint(filter * limb);
|
yield_constr.constraint(filter * limb);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,7 +196,7 @@ fn eval_ext_circuit_set<F: RichField + Extendable<D>, const D: usize>(
|
|||||||
let constr = builder.mul_extension(filter, diff);
|
let constr = builder.mul_extension(filter, diff);
|
||||||
yield_constr.constraint(builder, constr);
|
yield_constr.constraint(builder, constr);
|
||||||
}
|
}
|
||||||
for (i, &limb) in stack_top.iter().enumerate().filter(|(i, _)| *i != 2) {
|
for (_, &limb) in stack_top.iter().enumerate().filter(|(i, _)| *i != 2) {
|
||||||
let constr = builder.mul_extension(filter, limb);
|
let constr = builder.mul_extension(filter, limb);
|
||||||
yield_constr.constraint(builder, constr);
|
yield_constr.constraint(builder, constr);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,7 +22,7 @@ use crate::cpu::{
|
|||||||
};
|
};
|
||||||
use crate::cross_table_lookup::TableWithColumns;
|
use crate::cross_table_lookup::TableWithColumns;
|
||||||
use crate::evaluation_frame::{StarkEvaluationFrame, StarkFrame};
|
use crate::evaluation_frame::{StarkEvaluationFrame, StarkFrame};
|
||||||
use crate::lookup::{Column, Filter, Lookup};
|
use crate::lookup::{Column, Filter};
|
||||||
use crate::memory::segments::Segment;
|
use crate::memory::segments::Segment;
|
||||||
use crate::memory::{NUM_CHANNELS, VALUE_LIMBS};
|
use crate::memory::{NUM_CHANNELS, VALUE_LIMBS};
|
||||||
use crate::stark::Stark;
|
use crate::stark::Stark;
|
||||||
|
|||||||
@ -3,7 +3,6 @@ use plonky2::field::packed::PackedField;
|
|||||||
use plonky2::field::types::Field;
|
use plonky2::field::types::Field;
|
||||||
use plonky2::hash::hash_types::RichField;
|
use plonky2::hash::hash_types::RichField;
|
||||||
use plonky2::iop::ext_target::ExtensionTarget;
|
use plonky2::iop::ext_target::ExtensionTarget;
|
||||||
use plonky2::plonk::circuit_builder::CircuitBuilder;
|
|
||||||
|
|
||||||
use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer};
|
use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer};
|
||||||
use crate::cpu::columns::{CpuColumnsView, COL_MAP};
|
use crate::cpu::columns::{CpuColumnsView, COL_MAP};
|
||||||
|
|||||||
@ -6,7 +6,6 @@ use plonky2::hash::hash_types::RichField;
|
|||||||
use plonky2::iop::ext_target::ExtensionTarget;
|
use plonky2::iop::ext_target::ExtensionTarget;
|
||||||
use plonky2::plonk::circuit_builder::CircuitBuilder;
|
use plonky2::plonk::circuit_builder::CircuitBuilder;
|
||||||
|
|
||||||
use super::membus::NUM_GP_CHANNELS;
|
|
||||||
use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer};
|
use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer};
|
||||||
use crate::cpu::columns::{CpuColumnsView, MemoryChannelView};
|
use crate::cpu::columns::{CpuColumnsView, MemoryChannelView};
|
||||||
use crate::memory::segments::Segment;
|
use crate::memory::segments::Segment;
|
||||||
|
|||||||
@ -431,7 +431,6 @@ fn push_target_size(target: &PushTarget) -> u8 {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::cpu::kernel::assembler::*;
|
|
||||||
use crate::cpu::kernel::parser::parse;
|
use crate::cpu::kernel::parser::parse;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
@ -2,7 +2,6 @@ use std::collections::HashMap;
|
|||||||
|
|
||||||
use ethereum_types::U256;
|
use ethereum_types::U256;
|
||||||
use hex_literal::hex;
|
use hex_literal::hex;
|
||||||
use static_assertions::const_assert;
|
|
||||||
|
|
||||||
use crate::cpu::kernel::constants::context_metadata::ContextMetadata;
|
use crate::cpu::kernel::constants::context_metadata::ContextMetadata;
|
||||||
use crate::cpu::kernel::constants::global_metadata::GlobalMetadata;
|
use crate::cpu::kernel::constants::global_metadata::GlobalMetadata;
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
use super::opcodes::get_opcode;
|
|
||||||
use crate::cpu::kernel::assembler::BYTES_PER_OFFSET;
|
use crate::cpu::kernel::assembler::BYTES_PER_OFFSET;
|
||||||
use crate::cpu::kernel::ast::Item;
|
use crate::cpu::kernel::ast::Item;
|
||||||
use crate::cpu::kernel::ast::Item::*;
|
use crate::cpu::kernel::ast::Item::*;
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
use core::cmp::Ordering;
|
use core::cmp::Ordering;
|
||||||
use core::ops::Range;
|
use core::ops::Range;
|
||||||
use std::collections::{BTreeSet, HashMap, HashSet};
|
use std::collections::{BTreeSet, HashMap};
|
||||||
|
|
||||||
use anyhow::bail;
|
use anyhow::bail;
|
||||||
use eth_trie_utils::partial_trie::PartialTrie;
|
use eth_trie_utils::partial_trie::PartialTrie;
|
||||||
@ -11,7 +11,6 @@ use keccak_hash::keccak;
|
|||||||
use plonky2::field::goldilocks_field::GoldilocksField;
|
use plonky2::field::goldilocks_field::GoldilocksField;
|
||||||
|
|
||||||
use super::assembler::BYTES_PER_OFFSET;
|
use super::assembler::BYTES_PER_OFFSET;
|
||||||
use super::utils::u256_from_bool;
|
|
||||||
use crate::cpu::kernel::aggregator::KERNEL;
|
use crate::cpu::kernel::aggregator::KERNEL;
|
||||||
use crate::cpu::kernel::constants::context_metadata::ContextMetadata;
|
use crate::cpu::kernel::constants::context_metadata::ContextMetadata;
|
||||||
use crate::cpu::kernel::constants::global_metadata::GlobalMetadata;
|
use crate::cpu::kernel::constants::global_metadata::GlobalMetadata;
|
||||||
@ -1393,70 +1392,6 @@ impl<'a> Interpreter<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Computes the two's complement of the given integer.
|
|
||||||
fn two_complement(x: U256) -> U256 {
|
|
||||||
let flipped_bits = x ^ MINUS_ONE;
|
|
||||||
flipped_bits.overflowing_add(U256::one()).0
|
|
||||||
}
|
|
||||||
|
|
||||||
fn signed_cmp(x: U256, y: U256) -> Ordering {
|
|
||||||
let x_is_zero = x.is_zero();
|
|
||||||
let y_is_zero = y.is_zero();
|
|
||||||
|
|
||||||
if x_is_zero && y_is_zero {
|
|
||||||
return Ordering::Equal;
|
|
||||||
}
|
|
||||||
|
|
||||||
let x_is_pos = x.eq(&(x & SIGN_MASK));
|
|
||||||
let y_is_pos = y.eq(&(y & SIGN_MASK));
|
|
||||||
|
|
||||||
if x_is_zero {
|
|
||||||
if y_is_pos {
|
|
||||||
return Ordering::Less;
|
|
||||||
} else {
|
|
||||||
return Ordering::Greater;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if y_is_zero {
|
|
||||||
if x_is_pos {
|
|
||||||
return Ordering::Greater;
|
|
||||||
} else {
|
|
||||||
return Ordering::Less;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
match (x_is_pos, y_is_pos) {
|
|
||||||
(true, true) => x.cmp(&y),
|
|
||||||
(true, false) => Ordering::Greater,
|
|
||||||
(false, true) => Ordering::Less,
|
|
||||||
(false, false) => x.cmp(&y).reverse(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// -1 in two's complement representation consists in all bits set to 1.
|
|
||||||
const MINUS_ONE: U256 = U256([
|
|
||||||
0xffffffffffffffff,
|
|
||||||
0xffffffffffffffff,
|
|
||||||
0xffffffffffffffff,
|
|
||||||
0xffffffffffffffff,
|
|
||||||
]);
|
|
||||||
|
|
||||||
/// -2^255 in two's complement representation consists in the MSB set to 1.
|
|
||||||
const MIN_VALUE: U256 = U256([
|
|
||||||
0x0000000000000000,
|
|
||||||
0x0000000000000000,
|
|
||||||
0x0000000000000000,
|
|
||||||
0x8000000000000000,
|
|
||||||
]);
|
|
||||||
|
|
||||||
const SIGN_MASK: U256 = U256([
|
|
||||||
0xffffffffffffffff,
|
|
||||||
0xffffffffffffffff,
|
|
||||||
0xffffffffffffffff,
|
|
||||||
0x7fffffffffffffff,
|
|
||||||
]);
|
|
||||||
|
|
||||||
fn get_mnemonic(opcode: u8) -> &'static str {
|
fn get_mnemonic(opcode: u8) -> &'static str {
|
||||||
match opcode {
|
match opcode {
|
||||||
0x00 => "STOP",
|
0x00 => "STOP",
|
||||||
@ -1651,7 +1586,6 @@ fn get_mnemonic(opcode: u8) -> &'static str {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[macro_use]
|
|
||||||
macro_rules! unpack_address {
|
macro_rules! unpack_address {
|
||||||
($addr:ident) => {{
|
($addr:ident) => {{
|
||||||
let offset = $addr.low_u32() as usize;
|
let offset = $addr.low_u32() as usize;
|
||||||
@ -1729,8 +1663,8 @@ mod tests {
|
|||||||
interpreter.run()?;
|
interpreter.run()?;
|
||||||
|
|
||||||
// sys_stop returns `success` and `cum_gas_used`, that we need to pop.
|
// sys_stop returns `success` and `cum_gas_used`, that we need to pop.
|
||||||
interpreter.pop();
|
interpreter.pop().expect("Stack should not be empty");
|
||||||
interpreter.pop();
|
interpreter.pop().expect("Stack should not be empty");
|
||||||
|
|
||||||
assert_eq!(interpreter.stack(), &[0xff.into(), 0xff00.into()]);
|
assert_eq!(interpreter.stack(), &[0xff.into(), 0xff00.into()]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use anyhow::{anyhow, Result};
|
use anyhow::Result;
|
||||||
use eth_trie_utils::nibbles::Nibbles;
|
use eth_trie_utils::nibbles::Nibbles;
|
||||||
use eth_trie_utils::partial_trie::{HashedPartialTrie, PartialTrie};
|
use eth_trie_utils::partial_trie::{HashedPartialTrie, PartialTrie};
|
||||||
use ethereum_types::{Address, BigEndianHash, H256, U256};
|
use ethereum_types::{Address, BigEndianHash, H256, U256};
|
||||||
@ -327,8 +327,8 @@ fn sstore() -> Result<()> {
|
|||||||
|
|
||||||
// The first two elements in the stack are `success` and `leftover_gas`,
|
// The first two elements in the stack are `success` and `leftover_gas`,
|
||||||
// returned by the `sys_stop` opcode.
|
// returned by the `sys_stop` opcode.
|
||||||
interpreter.pop();
|
interpreter.pop().expect("Stack should not be empty");
|
||||||
interpreter.pop();
|
interpreter.pop().expect("Stack should not be empty");
|
||||||
|
|
||||||
// The code should have added an element to the storage of `to_account`. We run
|
// The code should have added an element to the storage of `to_account`. We run
|
||||||
// `mpt_hash_state_trie` to check that.
|
// `mpt_hash_state_trie` to check that.
|
||||||
|
|||||||
@ -1,24 +1,18 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use anyhow::{anyhow, Result};
|
|
||||||
use eth_trie_utils::nibbles::Nibbles;
|
use eth_trie_utils::nibbles::Nibbles;
|
||||||
use eth_trie_utils::partial_trie::{HashedPartialTrie, Node, PartialTrie};
|
use eth_trie_utils::partial_trie::{HashedPartialTrie, Node, PartialTrie};
|
||||||
use ethereum_types::{Address, BigEndianHash, H256, U256};
|
use ethereum_types::{Address, BigEndianHash, H256};
|
||||||
use hex_literal::hex;
|
use hex_literal::hex;
|
||||||
use keccak_hash::keccak;
|
use keccak_hash::keccak;
|
||||||
|
|
||||||
use crate::cpu::kernel::aggregator::KERNEL;
|
use crate::cpu::kernel::aggregator::KERNEL;
|
||||||
use crate::cpu::kernel::constants::context_metadata::ContextMetadata;
|
use crate::cpu::kernel::constants::context_metadata::ContextMetadata;
|
||||||
use crate::cpu::kernel::constants::global_metadata::GlobalMetadata;
|
|
||||||
use crate::cpu::kernel::interpreter::Interpreter;
|
use crate::cpu::kernel::interpreter::Interpreter;
|
||||||
use crate::cpu::kernel::tests::account_code::initialize_mpts;
|
|
||||||
use crate::generation::mpt::{AccountRlp, LegacyReceiptRlp};
|
use crate::generation::mpt::{AccountRlp, LegacyReceiptRlp};
|
||||||
use crate::generation::rlp::all_rlp_prover_inputs_reversed;
|
|
||||||
use crate::generation::TrieInputs;
|
use crate::generation::TrieInputs;
|
||||||
use crate::memory::segments::Segment;
|
|
||||||
use crate::proof::{BlockHashes, BlockMetadata, TrieRoots};
|
use crate::proof::{BlockHashes, BlockMetadata, TrieRoots};
|
||||||
use crate::util::h2u;
|
|
||||||
use crate::GenerationInputs;
|
use crate::GenerationInputs;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use anyhow::{anyhow, Result};
|
use anyhow::Result;
|
||||||
use eth_trie_utils::partial_trie::{HashedPartialTrie, PartialTrie};
|
use eth_trie_utils::partial_trie::{HashedPartialTrie, PartialTrie};
|
||||||
use ethereum_types::{Address, BigEndianHash, H256, U256};
|
use ethereum_types::{Address, BigEndianHash, H256, U256};
|
||||||
use keccak_hash::keccak;
|
use keccak_hash::keccak;
|
||||||
|
|||||||
@ -3,7 +3,7 @@ use ethereum_types::U256;
|
|||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
|
|
||||||
use crate::cpu::kernel::aggregator::KERNEL;
|
use crate::cpu::kernel::aggregator::KERNEL;
|
||||||
use crate::cpu::kernel::interpreter::{run, run_interpreter, Interpreter};
|
use crate::cpu::kernel::interpreter::{run_interpreter, Interpreter};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_exp() -> Result<()> {
|
fn test_exp() -> Result<()> {
|
||||||
|
|||||||
@ -1,9 +1,6 @@
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use ethereum_types::U256;
|
|
||||||
|
|
||||||
use crate::cpu::kernel::aggregator::{combined_kernel, KERNEL};
|
use crate::cpu::kernel::aggregator::{combined_kernel, KERNEL};
|
||||||
use crate::cpu::kernel::interpreter::Interpreter;
|
|
||||||
use crate::memory::segments::Segment;
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_kernel_code_hash_consistency() -> Result<()> {
|
fn test_kernel_code_hash_consistency() -> Result<()> {
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use anyhow::{anyhow, Result};
|
use anyhow::Result;
|
||||||
use eth_trie_utils::nibbles::Nibbles;
|
use eth_trie_utils::nibbles::Nibbles;
|
||||||
use eth_trie_utils::partial_trie::{HashedPartialTrie, PartialTrie};
|
use eth_trie_utils::partial_trie::{HashedPartialTrie, PartialTrie};
|
||||||
use ethereum_types::{BigEndianHash, H256, U512};
|
use ethereum_types::{BigEndianHash, H256, U512};
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use anyhow::{anyhow, Result};
|
use anyhow::Result;
|
||||||
use eth_trie_utils::partial_trie::PartialTrie;
|
use eth_trie_utils::partial_trie::PartialTrie;
|
||||||
use ethereum_types::{BigEndianHash, H256};
|
use ethereum_types::{BigEndianHash, H256};
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use anyhow::{anyhow, Result};
|
use anyhow::Result;
|
||||||
use eth_trie_utils::nibbles::Nibbles;
|
use eth_trie_utils::nibbles::Nibbles;
|
||||||
use eth_trie_utils::partial_trie::{HashedPartialTrie, PartialTrie};
|
use eth_trie_utils::partial_trie::{HashedPartialTrie, PartialTrie};
|
||||||
use ethereum_types::{BigEndianHash, H256};
|
use ethereum_types::{BigEndianHash, H256};
|
||||||
|
|||||||
@ -1,12 +1,11 @@
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use anyhow::{anyhow, Result};
|
use anyhow::Result;
|
||||||
use eth_trie_utils::nibbles::Nibbles;
|
use eth_trie_utils::nibbles::Nibbles;
|
||||||
use eth_trie_utils::partial_trie::HashedPartialTrie;
|
use eth_trie_utils::partial_trie::HashedPartialTrie;
|
||||||
use ethereum_types::{BigEndianHash, H256, U256};
|
use ethereum_types::{BigEndianHash, H256, U256};
|
||||||
use hex_literal::hex;
|
use hex_literal::hex;
|
||||||
|
|
||||||
use crate::cpu::kernel::aggregator::KERNEL;
|
|
||||||
use crate::cpu::kernel::constants::global_metadata::GlobalMetadata;
|
use crate::cpu::kernel::constants::global_metadata::GlobalMetadata;
|
||||||
use crate::cpu::kernel::constants::trie_type::PartialTrieType;
|
use crate::cpu::kernel::constants::trie_type::PartialTrieType;
|
||||||
use crate::cpu::kernel::interpreter::Interpreter;
|
use crate::cpu::kernel::interpreter::Interpreter;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use anyhow::{anyhow, Result};
|
use anyhow::Result;
|
||||||
use ethereum_types::BigEndianHash;
|
use ethereum_types::BigEndianHash;
|
||||||
|
|
||||||
use crate::cpu::kernel::aggregator::KERNEL;
|
use crate::cpu::kernel::aggregator::KERNEL;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use anyhow::{anyhow, Result};
|
use anyhow::Result;
|
||||||
use ethereum_types::{Address, U256};
|
use ethereum_types::{Address, U256};
|
||||||
use hex_literal::hex;
|
use hex_literal::hex;
|
||||||
use keccak_hash::keccak;
|
use keccak_hash::keccak;
|
||||||
@ -408,9 +408,6 @@ fn test_mpt_insert_receipt() -> Result<()> {
|
|||||||
receipt.push(num_logs.into()); // num_logs
|
receipt.push(num_logs.into()); // num_logs
|
||||||
receipt.extend(logs_0.clone());
|
receipt.extend(logs_0.clone());
|
||||||
|
|
||||||
// First, we load all mpts.
|
|
||||||
let initial_stack: Vec<U256> = vec![retdest];
|
|
||||||
|
|
||||||
let mut interpreter = Interpreter::new_with_kernel(0, vec![]);
|
let mut interpreter = Interpreter::new_with_kernel(0, vec![]);
|
||||||
initialize_mpts(&mut interpreter, &trie_inputs);
|
initialize_mpts(&mut interpreter, &trie_inputs);
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,6 @@ use plonky2::field::packed::PackedField;
|
|||||||
use plonky2::field::types::Field;
|
use plonky2::field::types::Field;
|
||||||
use plonky2::hash::hash_types::RichField;
|
use plonky2::hash::hash_types::RichField;
|
||||||
use plonky2::iop::ext_target::ExtensionTarget;
|
use plonky2::iop::ext_target::ExtensionTarget;
|
||||||
use static_assertions::const_assert;
|
|
||||||
|
|
||||||
use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer};
|
use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer};
|
||||||
use crate::cpu::columns::CpuColumnsView;
|
use crate::cpu::columns::CpuColumnsView;
|
||||||
@ -227,7 +226,7 @@ pub(crate) fn eval_ext_circuit<F: RichField + Extendable<D>, const D: usize>(
|
|||||||
{
|
{
|
||||||
let diff_syscall =
|
let diff_syscall =
|
||||||
builder.sub_extension(jumpdest_channel.addr_virtual, opcode_handler_addr_start);
|
builder.sub_extension(jumpdest_channel.addr_virtual, opcode_handler_addr_start);
|
||||||
let constr = builder.mul_extension((filter_syscall), diff_syscall);
|
let constr = builder.mul_extension(filter_syscall, diff_syscall);
|
||||||
yield_constr.constraint(builder, constr);
|
yield_constr.constraint(builder, constr);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
|||||||
@ -27,15 +27,11 @@
|
|||||||
//! is similar, but we provide not only `local_values` but also `next_values` -- corresponding to
|
//! is similar, but we provide not only `local_values` but also `next_values` -- corresponding to
|
||||||
//! the current and next row values -- when computing the linear combinations.
|
//! the current and next row values -- when computing the linear combinations.
|
||||||
|
|
||||||
use core::borrow::Borrow;
|
|
||||||
use core::cmp::min;
|
use core::cmp::min;
|
||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
use core::iter::repeat;
|
|
||||||
|
|
||||||
use anyhow::{ensure, Result};
|
use anyhow::{ensure, Result};
|
||||||
use hashbrown::HashMap;
|
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use plonky2::field::batch_util::{batch_add_inplace, batch_multiply_inplace};
|
|
||||||
use plonky2::field::extension::{Extendable, FieldExtension};
|
use plonky2::field::extension::{Extendable, FieldExtension};
|
||||||
use plonky2::field::packed::PackedField;
|
use plonky2::field::packed::PackedField;
|
||||||
use plonky2::field::polynomial::PolynomialValues;
|
use plonky2::field::polynomial::PolynomialValues;
|
||||||
@ -46,13 +42,9 @@ use plonky2::iop::ext_target::ExtensionTarget;
|
|||||||
use plonky2::iop::target::Target;
|
use plonky2::iop::target::Target;
|
||||||
use plonky2::plonk::circuit_builder::CircuitBuilder;
|
use plonky2::plonk::circuit_builder::CircuitBuilder;
|
||||||
use plonky2::plonk::config::{AlgebraicHasher, GenericConfig, Hasher};
|
use plonky2::plonk::config::{AlgebraicHasher, GenericConfig, Hasher};
|
||||||
use plonky2::plonk::plonk_common::{
|
|
||||||
reduce_with_powers, reduce_with_powers_circuit, reduce_with_powers_ext_circuit,
|
|
||||||
};
|
|
||||||
use plonky2::util::ceil_div_usize;
|
use plonky2::util::ceil_div_usize;
|
||||||
use plonky2::util::serialization::{Buffer, IoResult, Read, Write};
|
use plonky2::util::serialization::{Buffer, IoResult, Read, Write};
|
||||||
|
|
||||||
use crate::all_stark::Table;
|
|
||||||
use crate::config::StarkConfig;
|
use crate::config::StarkConfig;
|
||||||
use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer};
|
use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer};
|
||||||
use crate::evaluation_frame::StarkEvaluationFrame;
|
use crate::evaluation_frame::StarkEvaluationFrame;
|
||||||
@ -303,7 +295,7 @@ pub(crate) fn num_ctl_helper_columns_by_table<F: Field, const N: usize>(
|
|||||||
for (i, ctl) in ctls.iter().enumerate() {
|
for (i, ctl) in ctls.iter().enumerate() {
|
||||||
let CrossTableLookup {
|
let CrossTableLookup {
|
||||||
looking_tables,
|
looking_tables,
|
||||||
looked_table,
|
looked_table: _,
|
||||||
} = ctl;
|
} = ctl;
|
||||||
let mut num_by_table = [0; N];
|
let mut num_by_table = [0; N];
|
||||||
|
|
||||||
@ -349,7 +341,7 @@ pub(crate) fn cross_table_lookup_data<'a, F: RichField, const D: usize, const N:
|
|||||||
constraint_degree,
|
constraint_degree,
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut z_looked = partial_sums(
|
let z_looked = partial_sums(
|
||||||
&trace_poly_values[looked_table.table],
|
&trace_poly_values[looked_table.table],
|
||||||
&[(&looked_table.columns, &looked_table.filter)],
|
&[(&looked_table.columns, &looked_table.filter)],
|
||||||
challenge,
|
challenge,
|
||||||
@ -412,7 +404,6 @@ fn ctl_helper_zs_cols<F: Field, const N: usize>(
|
|||||||
grouped_lookups
|
grouped_lookups
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(table, group)| {
|
.map(|(table, group)| {
|
||||||
let degree = all_stark_traces[table][0].len();
|
|
||||||
let columns_filters = group
|
let columns_filters = group
|
||||||
.map(|table| (&table.columns[..], &table.filter))
|
.map(|table| (&table.columns[..], &table.filter))
|
||||||
.collect::<Vec<(&[Column<F>], &Option<Filter<F>>)>>();
|
.collect::<Vec<(&[Column<F>], &Option<Filter<F>>)>>();
|
||||||
@ -517,7 +508,7 @@ impl<'a, F: RichField + Extendable<D>, const D: usize>
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get all cross-table lookup polynomial openings for each STARK proof.
|
// Get all cross-table lookup polynomial openings for each STARK proof.
|
||||||
let mut ctl_zs = proofs
|
let ctl_zs = proofs
|
||||||
.iter()
|
.iter()
|
||||||
.zip(num_lookup_columns)
|
.zip(num_lookup_columns)
|
||||||
.map(|(p, &num_lookup)| {
|
.map(|(p, &num_lookup)| {
|
||||||
@ -551,7 +542,7 @@ impl<'a, F: RichField + Extendable<D>, const D: usize>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i, &table) in filtered_looking_tables.iter().enumerate() {
|
for &table in filtered_looking_tables.iter() {
|
||||||
// We have first all the helper polynomials, then all the z polynomials.
|
// We have first all the helper polynomials, then all the z polynomials.
|
||||||
let (looking_z, looking_z_next) =
|
let (looking_z, looking_z_next) =
|
||||||
ctl_zs[table][total_num_helper_cols_by_table[table] + z_indices[table]];
|
ctl_zs[table][total_num_helper_cols_by_table[table] + z_indices[table]];
|
||||||
@ -736,7 +727,7 @@ impl<'a, F: Field, const D: usize> CtlCheckVarsTarget<F, D> {
|
|||||||
num_helper_ctl_columns: &[usize],
|
num_helper_ctl_columns: &[usize],
|
||||||
) -> Vec<Self> {
|
) -> Vec<Self> {
|
||||||
// Get all cross-table lookup polynomial openings for each STARK proof.
|
// Get all cross-table lookup polynomial openings for each STARK proof.
|
||||||
let mut ctl_zs = {
|
let ctl_zs = {
|
||||||
let openings = &proof.openings;
|
let openings = &proof.openings;
|
||||||
let ctl_zs = openings.auxiliary_polys.iter().skip(num_lookup_columns);
|
let ctl_zs = openings.auxiliary_polys.iter().skip(num_lookup_columns);
|
||||||
let ctl_zs_next = openings
|
let ctl_zs_next = openings
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
use core::mem::{self, MaybeUninit};
|
use core::mem::{self, MaybeUninit};
|
||||||
use core::ops::Range;
|
use core::ops::Range;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::path::Path;
|
|
||||||
use std::sync::atomic::AtomicBool;
|
use std::sync::atomic::AtomicBool;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
@ -25,7 +24,6 @@ use plonky2::plonk::config::{AlgebraicHasher, GenericConfig};
|
|||||||
use plonky2::plonk::proof::{ProofWithPublicInputs, ProofWithPublicInputsTarget};
|
use plonky2::plonk::proof::{ProofWithPublicInputs, ProofWithPublicInputsTarget};
|
||||||
use plonky2::recursion::cyclic_recursion::check_cyclic_proof_verifier_data;
|
use plonky2::recursion::cyclic_recursion::check_cyclic_proof_verifier_data;
|
||||||
use plonky2::recursion::dummy_circuit::cyclic_base_proof;
|
use plonky2::recursion::dummy_circuit::cyclic_base_proof;
|
||||||
use plonky2::util::serialization::gate_serialization::default;
|
|
||||||
use plonky2::util::serialization::{
|
use plonky2::util::serialization::{
|
||||||
Buffer, GateSerializer, IoResult, Read, WitnessGeneratorSerializer, Write,
|
Buffer, GateSerializer, IoResult, Read, WitnessGeneratorSerializer, Write,
|
||||||
};
|
};
|
||||||
@ -1100,11 +1098,8 @@ where
|
|||||||
/// ```
|
/// ```
|
||||||
pub fn prove_root_after_initial_stark(
|
pub fn prove_root_after_initial_stark(
|
||||||
&self,
|
&self,
|
||||||
all_stark: &AllStark<F, D>,
|
|
||||||
config: &StarkConfig,
|
|
||||||
all_proof: AllProof<F, C, D>,
|
all_proof: AllProof<F, C, D>,
|
||||||
table_circuits: &[(RecursiveCircuitsForTableSize<F, C, D>, u8); NUM_TABLES],
|
table_circuits: &[(RecursiveCircuitsForTableSize<F, C, D>, u8); NUM_TABLES],
|
||||||
timing: &mut TimingTree,
|
|
||||||
abort_signal: Option<Arc<AtomicBool>>,
|
abort_signal: Option<Arc<AtomicBool>>,
|
||||||
) -> anyhow::Result<(ProofWithPublicInputs<F, C, D>, PublicValues)> {
|
) -> anyhow::Result<(ProofWithPublicInputs<F, C, D>, PublicValues)> {
|
||||||
let mut root_inputs = PartialWitness::new();
|
let mut root_inputs = PartialWitness::new();
|
||||||
@ -1113,7 +1108,6 @@ where
|
|||||||
let (table_circuit, index_verifier_data) = &table_circuits[table];
|
let (table_circuit, index_verifier_data) = &table_circuits[table];
|
||||||
|
|
||||||
let stark_proof = &all_proof.stark_proofs[table];
|
let stark_proof = &all_proof.stark_proofs[table];
|
||||||
let original_degree_bits = stark_proof.proof.recover_degree_bits(config);
|
|
||||||
|
|
||||||
let shrunk_proof = table_circuit.shrink(stark_proof, &all_proof.ctl_challenges)?;
|
let shrunk_proof = table_circuit.shrink(stark_proof, &all_proof.ctl_challenges)?;
|
||||||
root_inputs.set_target(
|
root_inputs.set_target(
|
||||||
|
|||||||
@ -1,11 +1,8 @@
|
|||||||
use std::collections::{BTreeSet, HashMap};
|
use std::collections::{BTreeSet, HashMap};
|
||||||
use std::sync::atomic::AtomicBool;
|
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
use anyhow::anyhow;
|
use anyhow::anyhow;
|
||||||
use eth_trie_utils::partial_trie::{HashedPartialTrie, PartialTrie};
|
use eth_trie_utils::partial_trie::{HashedPartialTrie, PartialTrie};
|
||||||
use ethereum_types::{Address, BigEndianHash, H256, U256};
|
use ethereum_types::{Address, BigEndianHash, H256, U256};
|
||||||
use itertools::enumerate;
|
|
||||||
use plonky2::field::extension::Extendable;
|
use plonky2::field::extension::Extendable;
|
||||||
use plonky2::field::polynomial::PolynomialValues;
|
use plonky2::field::polynomial::PolynomialValues;
|
||||||
use plonky2::field::types::Field;
|
use plonky2::field::types::Field;
|
||||||
@ -22,16 +19,12 @@ use crate::all_stark::{AllStark, NUM_TABLES};
|
|||||||
use crate::config::StarkConfig;
|
use crate::config::StarkConfig;
|
||||||
use crate::cpu::columns::CpuColumnsView;
|
use crate::cpu::columns::CpuColumnsView;
|
||||||
use crate::cpu::kernel::aggregator::KERNEL;
|
use crate::cpu::kernel::aggregator::KERNEL;
|
||||||
use crate::cpu::kernel::assembler::Kernel;
|
|
||||||
use crate::cpu::kernel::constants::global_metadata::GlobalMetadata;
|
use crate::cpu::kernel::constants::global_metadata::GlobalMetadata;
|
||||||
use crate::cpu::kernel::opcodes::get_opcode;
|
|
||||||
use crate::generation::state::GenerationState;
|
use crate::generation::state::GenerationState;
|
||||||
use crate::generation::trie_extractor::{get_receipt_trie, get_state_trie, get_txn_trie};
|
use crate::generation::trie_extractor::{get_receipt_trie, get_state_trie, get_txn_trie};
|
||||||
use crate::memory::segments::Segment;
|
use crate::memory::segments::Segment;
|
||||||
use crate::proof::{BlockHashes, BlockMetadata, ExtraBlockData, PublicValues, TrieRoots};
|
use crate::proof::{BlockHashes, BlockMetadata, ExtraBlockData, PublicValues, TrieRoots};
|
||||||
use crate::prover::check_abort_signal;
|
|
||||||
use crate::util::{h2u, u256_to_u8, u256_to_usize};
|
use crate::util::{h2u, u256_to_u8, u256_to_usize};
|
||||||
use crate::witness::errors::{ProgramError, ProverInputError};
|
|
||||||
use crate::witness::memory::{MemoryAddress, MemoryChannel};
|
use crate::witness::memory::{MemoryAddress, MemoryChannel};
|
||||||
use crate::witness::transition::transition;
|
use crate::witness::transition::transition;
|
||||||
|
|
||||||
@ -41,7 +34,6 @@ pub(crate) mod rlp;
|
|||||||
pub(crate) mod state;
|
pub(crate) mod state;
|
||||||
mod trie_extractor;
|
mod trie_extractor;
|
||||||
|
|
||||||
use self::mpt::{load_all_mpts, TrieRootPtrs};
|
|
||||||
use crate::witness::util::{mem_write_log, stack_peek};
|
use crate::witness::util::{mem_write_log, stack_peek};
|
||||||
|
|
||||||
/// Inputs needed for trace generation.
|
/// Inputs needed for trace generation.
|
||||||
@ -282,7 +274,6 @@ pub fn generate_traces<F: RichField + Extendable<D>, const D: usize>(
|
|||||||
let gas_used_after = read_metadata(GlobalMetadata::BlockGasUsedAfter);
|
let gas_used_after = read_metadata(GlobalMetadata::BlockGasUsedAfter);
|
||||||
let txn_number_after = read_metadata(GlobalMetadata::TxnNumberAfter);
|
let txn_number_after = read_metadata(GlobalMetadata::TxnNumberAfter);
|
||||||
|
|
||||||
let trie_root_ptrs = state.trie_root_ptrs;
|
|
||||||
let extra_block_data = ExtraBlockData {
|
let extra_block_data = ExtraBlockData {
|
||||||
checkpoint_state_trie_root: inputs.checkpoint_state_trie_root,
|
checkpoint_state_trie_root: inputs.checkpoint_state_trie_root,
|
||||||
txn_number_before: inputs.txn_number_before,
|
txn_number_before: inputs.txn_number_before,
|
||||||
@ -372,7 +363,7 @@ fn simulate_cpu_between_labels_and_get_user_jumps<F: Field>(
|
|||||||
}
|
}
|
||||||
let pc = state.registers.program_counter;
|
let pc = state.registers.program_counter;
|
||||||
let context = state.registers.context;
|
let context = state.registers.context;
|
||||||
let mut halt = state.registers.is_kernel
|
let halt = state.registers.is_kernel
|
||||||
&& pc == halt_pc
|
&& pc == halt_pc
|
||||||
&& state.registers.context == initial_context;
|
&& state.registers.context == initial_context;
|
||||||
let Ok(opcode) = u256_to_u8(state.memory.get(MemoryAddress::new(
|
let Ok(opcode) = u256_to_u8(state.memory.get(MemoryAddress::new(
|
||||||
|
|||||||
@ -9,13 +9,10 @@ use keccak_hash::keccak;
|
|||||||
use rlp::{Decodable, DecoderError, Encodable, PayloadInfo, Rlp, RlpStream};
|
use rlp::{Decodable, DecoderError, Encodable, PayloadInfo, Rlp, RlpStream};
|
||||||
use rlp_derive::{RlpDecodable, RlpEncodable};
|
use rlp_derive::{RlpDecodable, RlpEncodable};
|
||||||
|
|
||||||
use crate::cpu::kernel::constants::global_metadata::GlobalMetadata;
|
|
||||||
use crate::cpu::kernel::constants::trie_type::PartialTrieType;
|
use crate::cpu::kernel::constants::trie_type::PartialTrieType;
|
||||||
use crate::generation::TrieInputs;
|
use crate::generation::TrieInputs;
|
||||||
use crate::memory::segments::Segment;
|
|
||||||
use crate::util::h2u;
|
use crate::util::h2u;
|
||||||
use crate::witness::errors::{ProgramError, ProverInputError};
|
use crate::witness::errors::{ProgramError, ProverInputError};
|
||||||
use crate::witness::memory::MemoryAddress;
|
|
||||||
use crate::Node;
|
use crate::Node;
|
||||||
|
|
||||||
#[derive(RlpEncodable, RlpDecodable, Debug)]
|
#[derive(RlpEncodable, RlpDecodable, Debug)]
|
||||||
|
|||||||
@ -1,20 +1,15 @@
|
|||||||
use core::cmp::min;
|
|
||||||
use core::mem::transmute;
|
use core::mem::transmute;
|
||||||
use std::collections::{BTreeSet, HashMap};
|
use std::collections::{BTreeSet, HashMap};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use anyhow::{bail, Error};
|
use anyhow::{bail, Error};
|
||||||
use ethereum_types::{BigEndianHash, H256, U256, U512};
|
use ethereum_types::{BigEndianHash, H256, U256, U512};
|
||||||
use itertools::{enumerate, Itertools};
|
use itertools::Itertools;
|
||||||
use num_bigint::BigUint;
|
use num_bigint::BigUint;
|
||||||
use plonky2::field::extension::Extendable;
|
|
||||||
use plonky2::field::types::Field;
|
use plonky2::field::types::Field;
|
||||||
use plonky2::hash::hash_types::RichField;
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::cpu::kernel::aggregator::KERNEL;
|
|
||||||
use crate::cpu::kernel::constants::context_metadata::ContextMetadata;
|
use crate::cpu::kernel::constants::context_metadata::ContextMetadata;
|
||||||
use crate::cpu::kernel::constants::global_metadata::GlobalMetadata;
|
|
||||||
use crate::extension_tower::{FieldExt, Fp12, BLS381, BN254};
|
use crate::extension_tower::{FieldExt, Fp12, BLS381, BN254};
|
||||||
use crate::generation::prover_input::EvmField::{
|
use crate::generation::prover_input::EvmField::{
|
||||||
Bls381Base, Bls381Scalar, Bn254Base, Bn254Scalar, Secp256k1Base, Secp256k1Scalar,
|
Bls381Base, Bls381Scalar, Bn254Base, Bn254Scalar, Secp256k1Base, Secp256k1Scalar,
|
||||||
@ -252,7 +247,6 @@ impl<F: Field> GenerationState<F> {
|
|||||||
/// Returns the next used jump address.
|
/// Returns the next used jump address.
|
||||||
fn run_next_jumpdest_table_address(&mut self) -> Result<U256, ProgramError> {
|
fn run_next_jumpdest_table_address(&mut self) -> Result<U256, ProgramError> {
|
||||||
let context = u256_to_usize(stack_peek(self, 0)? >> CONTEXT_SCALING_FACTOR)?;
|
let context = u256_to_usize(stack_peek(self, 0)? >> CONTEXT_SCALING_FACTOR)?;
|
||||||
let code_len = u256_to_usize(self.get_current_code_len()?.into());
|
|
||||||
|
|
||||||
if self.jumpdest_table.is_none() {
|
if self.jumpdest_table.is_none() {
|
||||||
self.generate_jumpdest_table()?;
|
self.generate_jumpdest_table()?;
|
||||||
@ -300,10 +294,6 @@ impl<F: Field> GenerationState<F> {
|
|||||||
let checkpoint = self.checkpoint();
|
let checkpoint = self.checkpoint();
|
||||||
let memory = self.memory.clone();
|
let memory = self.memory.clone();
|
||||||
|
|
||||||
let code = self.get_current_code()?;
|
|
||||||
// We need to set the simulated jumpdest bits to one as otherwise
|
|
||||||
// the simulation will fail.
|
|
||||||
|
|
||||||
// Simulate the user's code and (unnecessarily) part of the kernel code, skipping the validate table call
|
// Simulate the user's code and (unnecessarily) part of the kernel code, skipping the validate table call
|
||||||
let Some(jumpdest_table) = simulate_cpu_between_labels_and_get_user_jumps(
|
let Some(jumpdest_table) = simulate_cpu_between_labels_and_get_user_jumps(
|
||||||
"jumpdest_analysis_end",
|
"jumpdest_analysis_end",
|
||||||
@ -343,10 +333,6 @@ impl<F: Field> GenerationState<F> {
|
|||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_current_code(&self) -> Result<Vec<u8>, ProgramError> {
|
|
||||||
self.get_code(self.registers.context)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_code(&self, context: usize) -> Result<Vec<u8>, ProgramError> {
|
fn get_code(&self, context: usize) -> Result<Vec<u8>, ProgramError> {
|
||||||
let code_len = self.get_code_len(context)?;
|
let code_len = self.get_code_len(context)?;
|
||||||
let code = (0..code_len)
|
let code = (0..code_len)
|
||||||
@ -360,17 +346,6 @@ impl<F: Field> GenerationState<F> {
|
|||||||
Ok(code)
|
Ok(code)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_code_len(&mut self, len: usize) {
|
|
||||||
self.memory.set(
|
|
||||||
MemoryAddress::new(
|
|
||||||
self.registers.context,
|
|
||||||
Segment::ContextMetadata,
|
|
||||||
ContextMetadata::CodeSize.unscale(),
|
|
||||||
),
|
|
||||||
len.into(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_code_len(&self, context: usize) -> Result<usize, ProgramError> {
|
fn get_code_len(&self, context: usize) -> Result<usize, ProgramError> {
|
||||||
let code_len = u256_to_usize(self.memory.get(MemoryAddress::new(
|
let code_len = u256_to_usize(self.memory.get(MemoryAddress::new(
|
||||||
context,
|
context,
|
||||||
@ -379,22 +354,6 @@ impl<F: Field> GenerationState<F> {
|
|||||||
)))?;
|
)))?;
|
||||||
Ok(code_len)
|
Ok(code_len)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_current_code_len(&self) -> Result<usize, ProgramError> {
|
|
||||||
self.get_code_len(self.registers.context)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn set_jumpdest_bits(&mut self, code: &[u8]) {
|
|
||||||
const JUMPDEST_OPCODE: u8 = 0x5b;
|
|
||||||
for (pos, opcode) in CodeIterator::new(code) {
|
|
||||||
if opcode == JUMPDEST_OPCODE {
|
|
||||||
self.memory.set(
|
|
||||||
MemoryAddress::new(self.registers.context, Segment::JumpdestBits, pos),
|
|
||||||
U256::one(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// For all address in `jumpdest_table`, each bounded by `largest_address`,
|
/// For all address in `jumpdest_table`, each bounded by `largest_address`,
|
||||||
@ -411,7 +370,7 @@ fn get_proofs_and_jumpdests(
|
|||||||
const PUSH32_OPCODE: u8 = 0x7f;
|
const PUSH32_OPCODE: u8 = 0x7f;
|
||||||
let (proofs, _) = CodeIterator::until(code, largest_address + 1).fold(
|
let (proofs, _) = CodeIterator::until(code, largest_address + 1).fold(
|
||||||
(vec![], 0),
|
(vec![], 0),
|
||||||
|(mut proofs, acc), (pos, opcode)| {
|
|(mut proofs, acc), (pos, _opcode)| {
|
||||||
let has_prefix = if let Some(prefix_start) = pos.checked_sub(32) {
|
let has_prefix = if let Some(prefix_start) = pos.checked_sub(32) {
|
||||||
code[prefix_start..pos]
|
code[prefix_start..pos]
|
||||||
.iter()
|
.iter()
|
||||||
|
|||||||
@ -1,10 +1,8 @@
|
|||||||
use std::collections::{BTreeSet, HashMap};
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use ethereum_types::{Address, BigEndianHash, H160, H256, U256};
|
use ethereum_types::{Address, BigEndianHash, H160, H256, U256};
|
||||||
use keccak_hash::keccak;
|
use keccak_hash::keccak;
|
||||||
use plonky2::field::extension::Extendable;
|
|
||||||
use plonky2::field::types::Field;
|
use plonky2::field::types::Field;
|
||||||
use plonky2::hash::hash_types::RichField;
|
|
||||||
|
|
||||||
use super::mpt::{load_all_mpts, TrieRootPtrs};
|
use super::mpt::{load_all_mpts, TrieRootPtrs};
|
||||||
use super::TrieInputs;
|
use super::TrieInputs;
|
||||||
|
|||||||
@ -4,7 +4,7 @@ use core::iter::repeat;
|
|||||||
|
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use num_bigint::BigUint;
|
use num_bigint::BigUint;
|
||||||
use plonky2::field::batch_util::{batch_add_inplace, batch_multiply_inplace};
|
use plonky2::field::batch_util::batch_add_inplace;
|
||||||
use plonky2::field::extension::{Extendable, FieldExtension};
|
use plonky2::field::extension::{Extendable, FieldExtension};
|
||||||
use plonky2::field::packed::PackedField;
|
use plonky2::field::packed::PackedField;
|
||||||
use plonky2::field::polynomial::PolynomialValues;
|
use plonky2::field::polynomial::PolynomialValues;
|
||||||
@ -108,14 +108,6 @@ impl<F: Field> Filter<F> {
|
|||||||
.map(|col| col.eval_table(table, row))
|
.map(|col| col.eval_table(table, row))
|
||||||
.sum()
|
.sum()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn eval_all_rows(&self, table: &[PolynomialValues<F>]) -> Vec<F> {
|
|
||||||
let length = table[0].len();
|
|
||||||
|
|
||||||
(0..length)
|
|
||||||
.map(|row| self.eval_table(table, row))
|
|
||||||
.collect::<Vec<F>>()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represent two linear combination of columns, corresponding to the current and next row values.
|
/// Represent two linear combination of columns, corresponding to the current and next row values.
|
||||||
@ -480,7 +472,6 @@ pub(crate) fn lookup_helper_columns<F: Field>(
|
|||||||
assert!(BigUint::from(num_total_logup_entries) < F::characteristic());
|
assert!(BigUint::from(num_total_logup_entries) < F::characteristic());
|
||||||
|
|
||||||
let num_helper_columns = lookup.num_helper_columns(constraint_degree);
|
let num_helper_columns = lookup.num_helper_columns(constraint_degree);
|
||||||
let mut helper_columns: Vec<PolynomialValues<F>> = Vec::with_capacity(num_helper_columns);
|
|
||||||
|
|
||||||
let looking_cols = lookup
|
let looking_cols = lookup
|
||||||
.columns
|
.columns
|
||||||
@ -672,7 +663,6 @@ pub(crate) fn get_helper_cols<F: Field>(
|
|||||||
|
|
||||||
let mut helper_columns = Vec::with_capacity(num_helper_columns);
|
let mut helper_columns = Vec::with_capacity(num_helper_columns);
|
||||||
|
|
||||||
let mut filter_index = 0;
|
|
||||||
for mut cols_filts in &columns_filters.iter().chunks(constraint_degree - 1) {
|
for mut cols_filts in &columns_filters.iter().chunks(constraint_degree - 1) {
|
||||||
let (first_col, first_filter) = cols_filts.next().unwrap();
|
let (first_col, first_filter) = cols_filts.next().unwrap();
|
||||||
|
|
||||||
@ -843,7 +833,6 @@ pub(crate) fn eval_ext_lookups_circuit<
|
|||||||
lookup_vars: LookupCheckVarsTarget<D>,
|
lookup_vars: LookupCheckVarsTarget<D>,
|
||||||
yield_constr: &mut RecursiveConstraintConsumer<F, D>,
|
yield_constr: &mut RecursiveConstraintConsumer<F, D>,
|
||||||
) {
|
) {
|
||||||
let one = builder.one_extension();
|
|
||||||
let degree = stark.constraint_degree();
|
let degree = stark.constraint_degree();
|
||||||
let lookups = stark.lookups();
|
let lookups = stark.lookups();
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
use ethereum_types::U256;
|
use ethereum_types::U256;
|
||||||
use num::traits::AsPrimitive;
|
|
||||||
|
|
||||||
pub(crate) const SEGMENT_SCALING_FACTOR: usize = 32;
|
pub(crate) const SEGMENT_SCALING_FACTOR: usize = 32;
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use ethereum_types::{Address, H160, H256, U256};
|
use ethereum_types::{Address, H256, U256};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use plonky2::field::extension::{Extendable, FieldExtension};
|
use plonky2::field::extension::{Extendable, FieldExtension};
|
||||||
use plonky2::fri::oracle::PolynomialBatch;
|
use plonky2::fri::oracle::PolynomialBatch;
|
||||||
@ -19,7 +19,6 @@ use serde::{Deserialize, Serialize};
|
|||||||
use crate::all_stark::NUM_TABLES;
|
use crate::all_stark::NUM_TABLES;
|
||||||
use crate::config::StarkConfig;
|
use crate::config::StarkConfig;
|
||||||
use crate::cross_table_lookup::GrandProductChallengeSet;
|
use crate::cross_table_lookup::GrandProductChallengeSet;
|
||||||
use crate::generation::mpt::TrieRootPtrs;
|
|
||||||
use crate::util::{get_h160, get_h256, h2u};
|
use crate::util::{get_h160, get_h256, h2u};
|
||||||
|
|
||||||
/// A STARK proof for each table, plus some metadata used to create recursive wrapper proofs.
|
/// A STARK proof for each table, plus some metadata used to create recursive wrapper proofs.
|
||||||
|
|||||||
@ -35,7 +35,6 @@ use crate::lookup::{lookup_helper_columns, Lookup, LookupCheckVars};
|
|||||||
use crate::proof::{AllProof, PublicValues, StarkOpeningSet, StarkProof, StarkProofWithMetadata};
|
use crate::proof::{AllProof, PublicValues, StarkOpeningSet, StarkProof, StarkProofWithMetadata};
|
||||||
use crate::stark::Stark;
|
use crate::stark::Stark;
|
||||||
use crate::vanishing_poly::eval_vanishing_poly;
|
use crate::vanishing_poly::eval_vanishing_poly;
|
||||||
use crate::witness::errors::ProgramError;
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
use crate::{
|
use crate::{
|
||||||
cross_table_lookup::testutils::check_ctls, verifier::testutils::get_memory_extra_looking_values,
|
cross_table_lookup::testutils::check_ctls, verifier::testutils::get_memory_extra_looking_values,
|
||||||
|
|||||||
@ -2,7 +2,7 @@ use core::array::from_fn;
|
|||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use ethereum_types::{BigEndianHash, H256, U256};
|
use ethereum_types::{BigEndianHash, U256};
|
||||||
use plonky2::field::extension::Extendable;
|
use plonky2::field::extension::Extendable;
|
||||||
use plonky2::field::types::Field;
|
use plonky2::field::types::Field;
|
||||||
use plonky2::fri::witness_util::set_fri_proof_target;
|
use plonky2::fri::witness_util::set_fri_proof_target;
|
||||||
@ -43,7 +43,7 @@ use crate::proof::{
|
|||||||
TrieRootsTarget,
|
TrieRootsTarget,
|
||||||
};
|
};
|
||||||
use crate::stark::Stark;
|
use crate::stark::Stark;
|
||||||
use crate::util::{h256_limbs, h2u, u256_limbs, u256_to_u32, u256_to_u64};
|
use crate::util::{h256_limbs, u256_limbs, u256_to_u32, u256_to_u64};
|
||||||
use crate::vanishing_poly::eval_vanishing_poly_circuit;
|
use crate::vanishing_poly::eval_vanishing_poly_circuit;
|
||||||
use crate::witness::errors::ProgramError;
|
use crate::witness::errors::ProgramError;
|
||||||
|
|
||||||
@ -348,7 +348,6 @@ fn verify_stark_proof_with_challenges_circuit<
|
|||||||
.iter()
|
.iter()
|
||||||
.map(|ctl| ctl.helper_columns.len())
|
.map(|ctl| ctl.helper_columns.len())
|
||||||
.sum::<usize>();
|
.sum::<usize>();
|
||||||
let num_ctl_z_polys = ctl_vars.len();
|
|
||||||
|
|
||||||
let StarkOpeningSetTarget {
|
let StarkOpeningSetTarget {
|
||||||
local_values,
|
local_values,
|
||||||
|
|||||||
@ -111,7 +111,6 @@ pub trait Stark<F: RichField + Extendable<D>, const D: usize>: Sync {
|
|||||||
let auxiliary_polys_info =
|
let auxiliary_polys_info =
|
||||||
FriPolynomialInfo::from_range(AUXILIARY_ORACLE_INDEX, 0..num_auxiliary_polys);
|
FriPolynomialInfo::from_range(AUXILIARY_ORACLE_INDEX, 0..num_auxiliary_polys);
|
||||||
|
|
||||||
let mut start_index = num_lookup_columns;
|
|
||||||
let ctl_zs_info = FriPolynomialInfo::from_range(
|
let ctl_zs_info = FriPolynomialInfo::from_range(
|
||||||
AUXILIARY_ORACLE_INDEX,
|
AUXILIARY_ORACLE_INDEX,
|
||||||
num_lookup_columns + num_ctl_helpers..num_auxiliary_polys,
|
num_lookup_columns + num_ctl_helpers..num_auxiliary_polys,
|
||||||
|
|||||||
@ -318,7 +318,7 @@ pub(crate) fn verify_stark_proof_with_challenges<
|
|||||||
next_values,
|
next_values,
|
||||||
auxiliary_polys,
|
auxiliary_polys,
|
||||||
auxiliary_polys_next,
|
auxiliary_polys_next,
|
||||||
ctl_zs_first,
|
ctl_zs_first: _,
|
||||||
quotient_polys,
|
quotient_polys,
|
||||||
} = &proof.openings;
|
} = &proof.openings;
|
||||||
let vars = S::EvaluationFrame::from_values(local_values, next_values);
|
let vars = S::EvaluationFrame::from_values(local_values, next_values);
|
||||||
|
|||||||
@ -928,7 +928,7 @@ pub(crate) fn generate_exception<F: Field>(
|
|||||||
row.general.stack_mut().stack_inv_aux = F::ONE;
|
row.general.stack_mut().stack_inv_aux = F::ONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
fill_stack_fields(state, &mut row);
|
fill_stack_fields(state, &mut row)?;
|
||||||
|
|
||||||
row.general.exception_mut().exc_code_bits = [
|
row.general.exception_mut().exc_code_bits = [
|
||||||
F::from_bool(exc_code & 1 != 0),
|
F::from_bool(exc_code & 1 != 0),
|
||||||
|
|||||||
@ -400,7 +400,7 @@ fn try_perform_instruction<F: Field>(
|
|||||||
|
|
||||||
fill_op_flag(op, &mut row);
|
fill_op_flag(op, &mut row);
|
||||||
|
|
||||||
fill_stack_fields(state, &mut row);
|
fill_stack_fields(state, &mut row)?;
|
||||||
|
|
||||||
// Might write in general CPU columns when it shouldn't, but the correct values will
|
// Might write in general CPU columns when it shouldn't, but the correct values will
|
||||||
// overwrite these ones during the op generation.
|
// overwrite these ones during the op generation.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user