using System.Runtime.InteropServices; using System.Runtime.Loader; namespace Ckzg; public class Ckzg { public const int CommitmentLength = 48; public const int BlobElementLength = 32; public const int BlobLength = BlobElementLength * 4096; public const int ProofLength = 48; static Ckzg() => AssemblyLoadContext.Default.ResolvingUnmanagedDll += (assembly, path) => NativeLibrary.Load($"runtimes/{( RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? "linux" : RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? "osx" : RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "win" : "")}-{RuntimeInformation.ProcessArchitecture switch { Architecture.X64 => "x64", Architecture.Arm64 => "arm64", _ => "" }}/native/{path}.{(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "dll" : "so")}"); /// /// Calculates commitment for the blob /// /// Preallocated buffer of bytes to receive the commitment /// Flatten array of blob elements /// Trusted setup settings /// Returns error code or 0 if successful [DllImport("ckzg", EntryPoint = "blob_to_kzg_commitment", CallingConvention = CallingConvention.Cdecl)] public unsafe static extern int BlobToKzgCommitment(byte* commitment, byte* blob, IntPtr ts); /// /// Calculates aggregated proof for the blobs /// /// Preallocated buffer of bytes to receive the proof /// Blobs as a flatten byte array /// Blobs count /// Trusted setup settings /// Returns error code or 0 if successful [DllImport("ckzg", EntryPoint = "compute_aggregate_kzg_proof", CallingConvention = CallingConvention.Cdecl)] public unsafe static extern int ComputeAggregatedKzgProof(byte* proof, byte* blobs, int count, IntPtr ts); /// /// Verify aggregated proof and commitments for the given blobs /// /// Blobs as a flatten byte array /// Commitments as a flatten byte array /// Blobs and commitments count /// /// Trusted setup settings /// Returns error code or 0 if the proof is correct [DllImport("ckzg", EntryPoint = "verify_aggregate_kzg_proof_wrap", CallingConvention = CallingConvention.Cdecl)] public unsafe static extern int VerifyAggregatedKzgProof(byte* blobs, byte* commitments_bytes, int count, byte* aggregated_proof_bytes, IntPtr ts); /// /// Verify the proof by point evaluation for the given commitment /// /// Commitment /// Z /// Y /// Proof /// Trusted setup settings /// Returns error code or 0 if the proof is correct [DllImport("ckzg", EntryPoint = "verify_kzg_proof_wrap", CallingConvention = CallingConvention.Cdecl)] public unsafe static extern int VerifyKzgProof(byte* commitment_bytes, byte* z_bytes, byte* y_bytes, byte* proof_bytes, IntPtr ts); /// /// Load trusted setup settings from file /// /// Settings file path /// Trusted setup settings as a pointer or 0 in case of failure [DllImport("ckzg", EntryPoint = "load_trusted_setup_wrap")] // free result with free_trusted_setup() public static extern IntPtr LoadTrustedSetup(string filename); /// /// Frees memory allocated for trusted setup settings /// /// Trusted setup settings [DllImport("ckzg", EntryPoint = "free_trusted_setup_wrap", CallingConvention = CallingConvention.Cdecl)] public static extern void FreeTrustedSetup(IntPtr ts); }