mirror of
https://github.com/luxfi/c-kzg-4844.git
synced 2026-11-03 06:54:56 +00:00
165 lines
5.6 KiB
Nim
165 lines
5.6 KiB
Nim
############################################################
|
|
# FFI to C functions
|
|
############################################################
|
|
|
|
import
|
|
std/strutils
|
|
|
|
from os import DirSep, AltSep
|
|
|
|
const
|
|
# kzgPath: c-kzg-4844 project path, removing 3 last elem
|
|
kzgPath = currentSourcePath.rsplit({DirSep, AltSep}, 3)[0] & "/"
|
|
blstPath = kzgPath & "blst/"
|
|
srcPath = kzgPath & "src/"
|
|
bindingsPath = blstPath & "bindings"
|
|
|
|
when not defined(kzgExternalBlst):
|
|
# Use default blst shipped with c-kzg-4844
|
|
{.compile: blstPath & "build/assembly.S".}
|
|
{.compile: blstPath & "src/server.c"}
|
|
{.passc: "-D__BLST_PORTABLE__"}
|
|
|
|
{.compile: srcPath & "ckzg.c"}
|
|
|
|
{.passc: "-I" & escape(bindingsPath) .}
|
|
{.passc: "-I" & escape(srcPath) .}
|
|
|
|
const
|
|
FIELD_ELEMENTS_PER_BLOB* = 4096
|
|
FIELD_ELEMENTS_PER_CELL* = 64
|
|
BYTES_PER_FIELD_ELEMENT* = 32
|
|
BYTES_PER_BLOB* = FIELD_ELEMENTS_PER_BLOB*BYTES_PER_FIELD_ELEMENT
|
|
BYTES_PER_CELL* = FIELD_ELEMENTS_PER_CELL*BYTES_PER_FIELD_ELEMENT
|
|
CELLS_PER_EXT_BLOB* = 128
|
|
|
|
type
|
|
KZG_RET* = distinct cint
|
|
|
|
const
|
|
# The common return type for all routines in which something can go wrong.
|
|
KZG_OK* = (0).KZG_RET
|
|
KZG_BADARGS* = (1).KZG_RET
|
|
KZG_ERROR* = (2).KZG_RET
|
|
KZG_MALLOC* = (3).KZG_RET
|
|
|
|
func `$`*(x: KZG_RET): string =
|
|
case x
|
|
of KZG_OK: "ok"
|
|
of KZG_BADARGS: "kzg badargs"
|
|
of KZG_ERROR: "kzg error"
|
|
of KZG_MALLOC: "kzg malloc error"
|
|
else: "kzg unknown error"
|
|
|
|
func `==`*(a, b: KZG_RET): bool =
|
|
a.cint == b.cint
|
|
|
|
type
|
|
# Stores the setup and parameters needed for performing FFTs.
|
|
KzgSettings* {.importc: "KZGSettings",
|
|
header: "ckzg.h", byref.} = object
|
|
|
|
# A basic blob data.
|
|
KzgBlob* {.importc: "Blob",
|
|
header: "ckzg.h", completeStruct.} = object
|
|
bytes*: array[BYTES_PER_BLOB, uint8]
|
|
|
|
# An array of 48 bytes. Represents an untrusted
|
|
# (potentially invalid) commitment/proof.
|
|
KzgBytes48* {.importc: "Bytes48",
|
|
header: "ckzg.h", completeStruct.} = object
|
|
bytes*: array[48, uint8]
|
|
|
|
# An array of 32 bytes. Represents an untrusted
|
|
# (potentially invalid) field element.
|
|
KzgBytes32* {.importc: "Bytes32",
|
|
header: "ckzg.h", completeStruct.} = object
|
|
bytes*: array[32, uint8]
|
|
|
|
# A trusted (valid) KZG commitment.
|
|
KzgCommitment* = KzgBytes48
|
|
|
|
# A trusted (valid) KZG proof.
|
|
KzgProof* = KzgBytes48
|
|
|
|
# A single cell for a blob.
|
|
KzgCell* {.importc: "Cell",
|
|
header: "ckzg.h", completeStruct.} = object
|
|
bytes*: array[BYTES_PER_CELL, uint8]
|
|
|
|
{.pragma: kzg_abi, importc, cdecl, header: "ckzg.h".}
|
|
|
|
proc load_trusted_setup*(res: ptr KzgSettings,
|
|
g1MonomialBytes: ptr byte,
|
|
numG1MonomialBytes: uint64,
|
|
g1LagrangeBytes: ptr byte,
|
|
numG1LagrangeBytes: uint64,
|
|
g2MonomialBytes: ptr byte,
|
|
numG2MonomialBytes: uint64,
|
|
precompute: uint64): KZG_RET {.kzg_abi.}
|
|
|
|
proc load_trusted_setup_file*(res: ptr KzgSettings,
|
|
input: File,
|
|
precompute: uint64): KZG_RET {.kzg_abi.}
|
|
|
|
proc free_trusted_setup*(s: ptr KzgSettings) {.kzg_abi.}
|
|
|
|
proc blob_to_kzg_commitment*(res: var KzgCommitment,
|
|
blob: ptr KzgBlob,
|
|
s: ptr KzgSettings): KZG_RET {.kzg_abi.}
|
|
|
|
proc compute_kzg_proof*(res: var KzgProof,
|
|
yOut: var KzgBytes32,
|
|
blob: ptr KzgBlob,
|
|
zBytes: ptr KzgBytes32,
|
|
s: ptr KzgSettings): KZG_RET {.kzg_abi.}
|
|
|
|
proc compute_blob_kzg_proof*(res: var KzgProof,
|
|
blob: ptr KzgBlob,
|
|
commitmentBytes: ptr KzgBytes48,
|
|
s: ptr KzgSettings): KZG_RET {.kzg_abi.}
|
|
|
|
proc verify_kzg_proof*(res: var bool,
|
|
commitmentBytes: ptr KzgBytes48,
|
|
zBytes: ptr KzgBytes32,
|
|
yBytes: ptr KzgBytes32,
|
|
proofBytes: ptr KzgBytes48,
|
|
s: ptr KzgSettings): KZG_RET {.kzg_abi.}
|
|
|
|
proc verify_blob_kzg_proof*(res: var bool,
|
|
blob: ptr KzgBlob,
|
|
commitmentsBytes: ptr KzgBytes48,
|
|
proofBytes: ptr KzgBytes48,
|
|
s: ptr KzgSettings): KZG_RET {.kzg_abi.}
|
|
|
|
proc verify_blob_kzg_proof_batch*(res: var bool,
|
|
blobs: ptr KzgBlob,
|
|
commitmentsBytes: ptr KzgBytes48,
|
|
proofBytes: ptr KzgBytes48,
|
|
n: uint64,
|
|
s: ptr KzgSettings): KZG_RET {.kzg_abi.}
|
|
|
|
proc compute_cells*(cellsOut: ptr KzgCell,
|
|
blob: ptr KzgBlob,
|
|
s: ptr KzgSettings): KZG_RET {.kzg_abi.}
|
|
|
|
proc compute_cells_and_kzg_proofs*(cellsOut: ptr KzgCell,
|
|
proofsOut: ptr KzgProof,
|
|
blob: ptr KzgBlob,
|
|
s: ptr KzgSettings): KZG_RET {.kzg_abi.}
|
|
|
|
proc recover_cells_and_kzg_proofs*(recoveredOut: ptr KzgCell,
|
|
recoveredProofsOut: ptr KzgProof,
|
|
cellIndices: ptr uint64,
|
|
cells: ptr KzgCell,
|
|
numCells: uint64,
|
|
s: ptr KzgSettings): KZG_RET {.kzg_abi.}
|
|
|
|
proc verify_cell_kzg_proof_batch*(res: var bool,
|
|
commitments: ptr KzgBytes48,
|
|
cellIndices: ptr uint64,
|
|
cells: ptr KzgCell,
|
|
proofs: ptr KzgBytes48,
|
|
numCells: uint64,
|
|
s: ptr KzgSettings): KZG_RET {.kzg_abi.}
|