137 lines
4.0 KiB
Nim
137 lines
4.0 KiB
Nim
############################################################
|
|
# Convenience wrapper where KzgSettings is a global variable
|
|
############################################################
|
|
|
|
import
|
|
stew/results,
|
|
./kzg
|
|
|
|
export
|
|
results,
|
|
kzg
|
|
|
|
type
|
|
Kzg* = object
|
|
|
|
when (NimMajor, NimMinor) < (1, 4):
|
|
{.push raises: [Defect].}
|
|
else:
|
|
{.push raises: [].}
|
|
|
|
##############################################################
|
|
# Private helpers
|
|
##############################################################
|
|
|
|
var gCtx: KzgCtx
|
|
|
|
const
|
|
GlobalCtxErr = "kzg global context not loaded"
|
|
|
|
template setupCtx(body: untyped): untyped =
|
|
let res = body
|
|
if res.isErr:
|
|
return err(res.error)
|
|
gCtx = res.get
|
|
ok()
|
|
|
|
template verifyCtx(body: untyped): untyped =
|
|
{.gcsafe.}:
|
|
if gCtx.isNil:
|
|
return err(GlobalCtxErr)
|
|
body
|
|
|
|
##############################################################
|
|
# Public functions
|
|
##############################################################
|
|
|
|
proc loadTrustedSetup*(_: type Kzg,
|
|
input: File): Result[void, string] =
|
|
setupCtx:
|
|
kzg.loadTrustedSetup(input)
|
|
|
|
proc loadTrustedSetup*(_: type Kzg,
|
|
fileName: string): Result[void, string] =
|
|
setupCtx:
|
|
kzg.loadTrustedSetup(fileName)
|
|
|
|
proc loadTrustedSetup*(_: type Kzg, g1: openArray[G1Data],
|
|
g2: openArray[G2Data]):
|
|
Result[void, string] =
|
|
setupCtx:
|
|
kzg.loadTrustedSetup(g1, g2)
|
|
|
|
proc loadTrustedSetupFromString*(_: type Kzg,
|
|
input: string): Result[void, string] =
|
|
setupCtx:
|
|
kzg.loadTrustedSetupFromString(input)
|
|
|
|
proc toCommitment*(blob: KzgBlob):
|
|
Result[KzgCommitment, string] {.gcsafe.} =
|
|
verifyCtx:
|
|
gCtx.toCommitment(blob)
|
|
|
|
proc computeProof*(blob: KzgBlob,
|
|
z: KzgBytes32): Result[KzgProofAndY, string] {.gcsafe.} =
|
|
verifyCtx:
|
|
gCtx.computeProof(blob, z)
|
|
|
|
proc computeProof*(blob: KzgBlob,
|
|
commitmentBytes: KzgBytes48):
|
|
Result[KzgProof, string] {.gcsafe.} =
|
|
verifyCtx:
|
|
gCtx.computeProof(blob, commitmentBytes)
|
|
|
|
proc verifyProof*(commitment: KzgBytes48,
|
|
z: KzgBytes32, # Input Point
|
|
y: KzgBytes32, # Claimed Value
|
|
proof: KzgBytes48): Result[bool, string] {.gcsafe.} =
|
|
verifyCtx:
|
|
gCtx.verifyProof(commitment, z, y, proof)
|
|
|
|
proc verifyProof*(blob: KzgBlob,
|
|
commitment: KzgBytes48,
|
|
proof: KzgBytes48): Result[bool, string] {.gcsafe.} =
|
|
verifyCtx:
|
|
gCtx.verifyProof(blob, commitment, proof)
|
|
|
|
proc verifyProofs*(blobs: openArray[KzgBlob],
|
|
commitments: openArray[KzgBytes48],
|
|
proofs: openArray[KzgBytes48]): Result[bool, string] {.gcsafe.} =
|
|
verifyCtx:
|
|
gCtx.verifyProofs(blobs, commitments, proofs)
|
|
|
|
##############################################################
|
|
# Zero overhead aliases that match the spec
|
|
##############################################################
|
|
|
|
template loadTrustedSetupFile*(T: type Kzg, input: File | string): untyped =
|
|
loadTrustedSetup(T, input)
|
|
|
|
template blobToKzgCommitment*(blob: KzgBlob): untyped =
|
|
toCommitment(blob)
|
|
|
|
template computeKzgProof*(blob: KzgBlob, z: KzgBytes32): untyped =
|
|
computeProof(blob, z)
|
|
|
|
template computeBlobKzgProof*(blob: KzgBlob,
|
|
commitmentBytes: KzgBytes48): untyped =
|
|
computeProof(blob, commitmentBytes)
|
|
|
|
template verifyKzgProof*(commitment: KzgBytes48,
|
|
z: KzgBytes32, # Input Point
|
|
y: KzgBytes32, # Claimed Value
|
|
proof: KzgBytes48): untyped =
|
|
verifyProof(commitment, z, y, proof)
|
|
|
|
template verifyBlobKzgProof*(blob: KzgBlob,
|
|
commitment: KzgBytes48,
|
|
proof: KzgBytes48): untyped =
|
|
verifyProof(blob, commitment, proof)
|
|
|
|
template verifyBlobKzgProofBatch*(blobs: openArray[KzgBlob],
|
|
commitments: openArray[KzgBytes48],
|
|
proofs: openArray[KzgBytes48]): untyped =
|
|
verifyProofs(blobs, commitments, proofs)
|
|
|
|
{. pop .}
|