use openvm_cuda_common::{d_buffer::DeviceBuffer, error::CudaError, stream::GpuDeviceCtx};
use openvm_stark_backend::{StarkProtocolConfig, SystemParams};
#[cfg(feature = "baby-bear-bn254-poseidon2")]
use openvm_stark_sdk::config::baby_bear_bn254_poseidon2::{
BabyBearBn254Poseidon2Config, Digest as Bn254Digest,
};
use openvm_stark_sdk::config::baby_bear_poseidon2::{
BabyBearPoseidon2Config, Digest as BabyBearPoseidon2Digest,
};
use serde::{de::DeserializeOwned, Serialize};
#[cfg(feature = "baby-bear-bn254-poseidon2")]
use crate::{
bn254_sponge::MultiFieldTranscriptGpu,
cuda::bn254_merkle_tree::{
bn254_poseidon2_adjacent_compress_layer, bn254_poseidon2_compressing_row_hashes,
bn254_poseidon2_compressing_row_hashes_ext,
},
};
use crate::{
cuda::merkle_tree::{
poseidon2_adjacent_compress_layer, poseidon2_compressing_row_hashes,
poseidon2_compressing_row_hashes_ext,
},
merkle_tree::BatchQueryMerkle,
sponge::{DuplexSpongeGpu, GpuFiatShamirTranscript},
types::{EF, F},
};
pub trait GpuMerkleHash: Copy + Clone + Send + Sync + 'static {
type Digest: Copy
+ Clone
+ PartialEq
+ Send
+ Sync
+ Serialize
+ DeserializeOwned
+ BatchQueryMerkle
+ 'static;
unsafe fn compress_rows(
out: &mut DeviceBuffer<Self::Digest>,
matrix: &DeviceBuffer<F>,
width: usize,
query_stride: usize,
log_rows_per_query: usize,
device_ctx: &GpuDeviceCtx,
) -> Result<(), CudaError>;
unsafe fn compress_rows_ext(
out: &mut DeviceBuffer<Self::Digest>,
matrix: &DeviceBuffer<EF>,
width: usize,
query_stride: usize,
log_rows_per_query: usize,
device_ctx: &GpuDeviceCtx,
) -> Result<(), CudaError>;
unsafe fn compress_layer(
output: &mut DeviceBuffer<Self::Digest>,
prev_layer: &DeviceBuffer<Self::Digest>,
output_size: usize,
device_ctx: &GpuDeviceCtx,
) -> Result<(), CudaError>;
}
pub trait GpuHashScheme: Copy + Clone + Send + Sync + 'static {
type SC: StarkProtocolConfig<F = F, EF = EF, Digest = Self::Digest>;
type Digest: Copy
+ Clone
+ PartialEq
+ Send
+ Sync
+ Serialize
+ DeserializeOwned
+ BatchQueryMerkle
+ 'static;
type Transcript: GpuFiatShamirTranscript<Self::SC> + Default + Clone + Send + Sync + 'static;
type MerkleHash: GpuMerkleHash<Digest = Self::Digest>;
fn default_config(params: SystemParams) -> Self::SC;
fn default_transcript() -> Self::Transcript;
}
#[derive(Clone, Copy, Debug, Default)]
pub struct Poseidon2MerkleHash;
impl GpuMerkleHash for Poseidon2MerkleHash {
type Digest = BabyBearPoseidon2Digest;
unsafe fn compress_rows(
out: &mut DeviceBuffer<Self::Digest>,
matrix: &DeviceBuffer<F>,
width: usize,
query_stride: usize,
log_rows_per_query: usize,
device_ctx: &GpuDeviceCtx,
) -> Result<(), CudaError> {
poseidon2_compressing_row_hashes(
out,
matrix,
width,
query_stride,
log_rows_per_query,
device_ctx.stream.as_raw(),
)
}
unsafe fn compress_rows_ext(
out: &mut DeviceBuffer<Self::Digest>,
matrix: &DeviceBuffer<EF>,
width: usize,
query_stride: usize,
log_rows_per_query: usize,
device_ctx: &GpuDeviceCtx,
) -> Result<(), CudaError> {
poseidon2_compressing_row_hashes_ext(
out,
matrix,
width,
query_stride,
log_rows_per_query,
device_ctx.stream.as_raw(),
)
}
unsafe fn compress_layer(
output: &mut DeviceBuffer<Self::Digest>,
prev_layer: &DeviceBuffer<Self::Digest>,
output_size: usize,
device_ctx: &GpuDeviceCtx,
) -> Result<(), CudaError> {
poseidon2_adjacent_compress_layer(
output,
prev_layer,
output_size,
device_ctx.stream.as_raw(),
)
}
}
#[derive(Clone, Copy, Debug, Default)]
pub struct BabyBearPoseidon2HashScheme;
impl GpuHashScheme for BabyBearPoseidon2HashScheme {
type SC = BabyBearPoseidon2Config;
type Digest = BabyBearPoseidon2Digest;
type Transcript = DuplexSpongeGpu;
type MerkleHash = Poseidon2MerkleHash;
fn default_config(params: SystemParams) -> Self::SC {
Self::SC::default_from_params(params)
}
fn default_transcript() -> Self::Transcript {
Self::Transcript::default()
}
}
pub type DefaultHashScheme = BabyBearPoseidon2HashScheme;
#[cfg(feature = "baby-bear-bn254-poseidon2")]
#[derive(Clone, Copy, Debug, Default)]
pub struct Bn254Poseidon2MerkleHash;
#[cfg(feature = "baby-bear-bn254-poseidon2")]
impl GpuMerkleHash for Bn254Poseidon2MerkleHash {
type Digest = Bn254Digest;
unsafe fn compress_rows(
out: &mut DeviceBuffer<Self::Digest>,
matrix: &DeviceBuffer<F>,
width: usize,
query_stride: usize,
log_rows_per_query: usize,
device_ctx: &GpuDeviceCtx,
) -> Result<(), CudaError> {
bn254_poseidon2_compressing_row_hashes(
out,
matrix,
width,
query_stride,
log_rows_per_query,
device_ctx.stream.as_raw(),
)
}
unsafe fn compress_rows_ext(
out: &mut DeviceBuffer<Self::Digest>,
matrix: &DeviceBuffer<EF>,
width: usize,
query_stride: usize,
log_rows_per_query: usize,
device_ctx: &GpuDeviceCtx,
) -> Result<(), CudaError> {
bn254_poseidon2_compressing_row_hashes_ext(
out,
matrix,
width,
query_stride,
log_rows_per_query,
device_ctx.stream.as_raw(),
)
}
unsafe fn compress_layer(
output: &mut DeviceBuffer<Self::Digest>,
prev_layer: &DeviceBuffer<Self::Digest>,
output_size: usize,
device_ctx: &GpuDeviceCtx,
) -> Result<(), CudaError> {
bn254_poseidon2_adjacent_compress_layer(
output,
prev_layer,
output_size,
device_ctx.stream.as_raw(),
)
}
}
#[cfg(feature = "baby-bear-bn254-poseidon2")]
#[derive(Clone, Copy, Debug, Default)]
pub struct BabyBearBn254Poseidon2HashScheme;
#[cfg(feature = "baby-bear-bn254-poseidon2")]
impl GpuHashScheme for BabyBearBn254Poseidon2HashScheme {
type SC = BabyBearBn254Poseidon2Config;
type Digest = Bn254Digest;
type Transcript = MultiFieldTranscriptGpu;
type MerkleHash = Bn254Poseidon2MerkleHash;
fn default_config(params: SystemParams) -> Self::SC {
Self::SC::default_from_params(params)
}
fn default_transcript() -> Self::Transcript {
Self::Transcript::default()
}
}