mirror of
https://github.com/logos-storage/nim-circom-compat.git
synced 2026-01-05 23:23:07 +00:00
Rework ffi (#1)
* rework ffi * fix types * fix types * update ffi * bump * bump to master update ffi update tests fix tests update ffi update tests
This commit is contained in:
parent
e2abbb034e
commit
39c8891291
@ -6,6 +6,7 @@ import std/macros
|
|||||||
const
|
const
|
||||||
currentDir = currentSourcePath().parentDir()
|
currentDir = currentSourcePath().parentDir()
|
||||||
libDir* = currentDir/"vendor/circom-compat-ffi/target"/"release"
|
libDir* = currentDir/"vendor/circom-compat-ffi/target"/"release"
|
||||||
|
# libDir* = currentDir/"vendor/circom-compat-ffi/target"/"debug" # XXX: uncomment for debug build
|
||||||
libPath* = libDir/"libcircom_compat_ffi.a"
|
libPath* = libDir/"libcircom_compat_ffi.a"
|
||||||
|
|
||||||
static:
|
static:
|
||||||
|
|||||||
@ -31,39 +31,73 @@ const ERR_SERIALIZE_PROOF* = 13
|
|||||||
const ERR_SERIALIZE_INPUTS* = 14
|
const ERR_SERIALIZE_INPUTS* = 14
|
||||||
|
|
||||||
|
|
||||||
|
type CircomBn254Cfg* {.incompleteStruct.} = object
|
||||||
|
|
||||||
type CircomCompatCtx* {.incompleteStruct.} = object
|
type CircomCompatCtx* {.incompleteStruct.} = object
|
||||||
|
|
||||||
type Buffer* = object
|
type G1* = object
|
||||||
data*: pointer
|
x*: array[32, byte]
|
||||||
|
y*: array[32, byte]
|
||||||
|
|
||||||
|
type G2* = object
|
||||||
|
x*: array[2, array[32, byte]]
|
||||||
|
y*: array[2, array[32, byte]]
|
||||||
|
|
||||||
|
type Proof* = object
|
||||||
|
a*: G1
|
||||||
|
b*: G2
|
||||||
|
c*: G1
|
||||||
|
|
||||||
|
type Inputs* = object
|
||||||
|
elms*: ptr array[32, byte]
|
||||||
len*: uint
|
len*: uint
|
||||||
|
|
||||||
## # Safety
|
type VerifyingKey* = object
|
||||||
#
|
alpha1*: G1
|
||||||
proc init_circom_compat*(r1cs_path: pointer,
|
beta2*: G2
|
||||||
|
gamma2*: G2
|
||||||
|
delta2*: G2
|
||||||
|
ic*: ptr G1
|
||||||
|
icLen*: uint
|
||||||
|
|
||||||
|
proc init_circom_config_with_checks*(r1cs_path: pointer,
|
||||||
|
wasm_path: pointer,
|
||||||
|
zkey_path: pointer,
|
||||||
|
sanity_check: bool,
|
||||||
|
cfg_ptr: ptr ptr CircomBn254Cfg): int32 {.importc: "init_circom_config_with_checks".}
|
||||||
|
|
||||||
|
proc init_circom_config*(r1cs_path: pointer,
|
||||||
wasm_path: pointer,
|
wasm_path: pointer,
|
||||||
zkey_path: pointer,
|
zkey_path: pointer,
|
||||||
|
cfg_ptr: ptr ptr CircomBn254Cfg): int32 {.importc: "init_circom_config".}
|
||||||
|
|
||||||
|
proc init_circom_compat*(cfg_ptr: ptr CircomBn254Cfg,
|
||||||
ctx_ptr: ptr ptr CircomCompatCtx): int32 {.importc: "init_circom_compat".}
|
ctx_ptr: ptr ptr CircomCompatCtx): int32 {.importc: "init_circom_compat".}
|
||||||
|
|
||||||
proc release_circom_compat*(ctx_ptr: ptr ptr CircomCompatCtx): void {.importc: "release_circom_compat".}
|
proc release_circom_compat*(ctx_ptr: ptr ptr CircomCompatCtx): void {.importc: "release_circom_compat".}
|
||||||
|
|
||||||
proc release_buffer*(buff_ptr: ptr ptr Buffer): void {.importc: "release_buffer".}
|
proc release_cfg*(cfg_ptr: ptr ptr CircomBn254Cfg): void {.importc: "release_cfg".}
|
||||||
|
|
||||||
## # Safety
|
proc release_proof*(proof_ptr: ptr ptr Proof): void {.importc: "release_proof".}
|
||||||
#
|
|
||||||
proc prove_circuit*(ctx_ptr: ptr CircomCompatCtx,
|
|
||||||
compress: bool,
|
|
||||||
proof_bytes_ptr: ptr ptr Buffer,
|
|
||||||
inputs_bytes_ptr: ptr ptr Buffer): int32 {.importc: "prove_circuit".}
|
|
||||||
|
|
||||||
## # Safety
|
proc release_inputs*(inputs_ptr: ptr ptr Inputs): void {.importc: "release_inputs".}
|
||||||
#
|
|
||||||
proc verify_circuit*(ctx_ptr: ptr CircomCompatCtx,
|
proc release_key*(key_ptr: ptr ptr VerifyingKey): void {.importc: "release_key".}
|
||||||
compress: bool,
|
|
||||||
proof_bytes_ptr: ptr Buffer,
|
proc prove_circuit*(cfg_ptr: ptr CircomBn254Cfg,
|
||||||
inputs_bytes_ptr: ptr Buffer): int32 {.importc: "verify_circuit".}
|
ctx_ptr: ptr CircomCompatCtx,
|
||||||
|
proof_ptr: ptr ptr Proof): int32 {.importc: "prove_circuit".}
|
||||||
|
|
||||||
|
proc get_pub_inputs*(ctx_ptr: ptr CircomCompatCtx,
|
||||||
|
inputs_ptr: ptr ptr Inputs): int32 {.importc: "get_pub_inputs".}
|
||||||
|
|
||||||
|
proc get_verifying_key*(cfg_ptr: ptr CircomBn254Cfg,
|
||||||
|
vk_ptr: ptr ptr VerifyingKey): int32 {.importc: "get_verifying_key".}
|
||||||
|
|
||||||
|
proc verify_circuit*(proof: ptr Proof,
|
||||||
|
inputs: ptr Inputs,
|
||||||
|
pvk: ptr VerifyingKey): int32 {.importc: "verify_circuit".}
|
||||||
|
|
||||||
## # Safety
|
|
||||||
#
|
|
||||||
proc push_input_u256_array*(ctx_ptr: ptr CircomCompatCtx,
|
proc push_input_u256_array*(ctx_ptr: ptr CircomCompatCtx,
|
||||||
name_ptr: pointer,
|
name_ptr: pointer,
|
||||||
input_ptr: pointer,
|
input_ptr: pointer,
|
||||||
|
|||||||
@ -5,36 +5,42 @@ import ../circomcompat
|
|||||||
suite "Test circom compat nim":
|
suite "Test circom compat nim":
|
||||||
test "Should generate witness, prove and verify":
|
test "Should generate witness, prove and verify":
|
||||||
let
|
let
|
||||||
r1csPath = "vendor/circom-compat-ffi/fixtures/mycircuit.r1cs".cstring
|
r1csPath = "vendor/circom-compat-ffi/fixtures/circom2_multiplier2.r1cs".cstring
|
||||||
wasmPath = "vendor/circom-compat-ffi/fixtures/mycircuit.wasm".cstring
|
wasmPath = "vendor/circom-compat-ffi/fixtures/circom2_multiplier2.wasm".cstring
|
||||||
|
|
||||||
var ctx: ptr CircomCompatCtx
|
var cfg_ptr: ptr CircomBn254Cfg
|
||||||
let res = init_circom_compat(
|
check init_circom_config(
|
||||||
r1csPath,
|
r1csPath,
|
||||||
wasmPath,
|
wasmPath,
|
||||||
nil,
|
nil,
|
||||||
ctx.addr)
|
cfg_ptr.addr) == ERR_OK
|
||||||
|
|
||||||
check ctx.push_input_numeric_i8("a".cstring, 3) == ERR_OK
|
var ctx: ptr CircomCompatCtx
|
||||||
check ctx.push_input_numeric_i8("b".cstring, 11) == ERR_OK
|
check init_circom_compat(
|
||||||
|
cfg_ptr,
|
||||||
|
ctx.addr) == ERR_OK
|
||||||
|
|
||||||
var proofBytes: ptr Buffer
|
check ctx.push_input_i8("a".cstring, 3) == ERR_OK
|
||||||
var publicBytes: ptr Buffer
|
check ctx.push_input_i8("b".cstring, 11) == ERR_OK
|
||||||
|
|
||||||
check ctx.prove_circuit(proofBytes.addr, publicBytes.addr) == ERR_OK
|
var proofPtr: ptr Proof
|
||||||
|
var inputsPtr: ptr Inputs
|
||||||
|
var vkPtr: ptr VerifyingKey
|
||||||
|
|
||||||
check proofBytes.len > 0
|
check ctx.get_pub_inputs(inputsPtr.addr) == ERR_OK
|
||||||
check publicBytes.len > 0
|
check cfg_ptr.prove_circuit(ctx, proofPtr.addr) == ERR_OK
|
||||||
|
|
||||||
check ctx.verify_circuit(proofBytes, publicBytes) == ERR_OK
|
check cfg_ptr.get_verifying_key(vkPtr.addr) == ERR_OK
|
||||||
|
check verify_circuit(proofPtr, inputsPtr, vkPtr) == ERR_OK
|
||||||
|
|
||||||
|
release_proof(proofPtr.addr)
|
||||||
|
check proofPtr == nil
|
||||||
|
|
||||||
|
release_inputs(inputsPtr.addr)
|
||||||
|
check inputsPtr == nil
|
||||||
|
|
||||||
|
release_key(vkPtr.addr)
|
||||||
|
check vkPtr == nil
|
||||||
|
|
||||||
ctx.addr.release_circom_compat()
|
ctx.addr.release_circom_compat()
|
||||||
check ctx == nil
|
check ctx == nil
|
||||||
|
|
||||||
proofBytes.addr.release_buffer()
|
|
||||||
check proofBytes == nil
|
|
||||||
|
|
||||||
publicBytes.addr.release_buffer()
|
|
||||||
check publicBytes == nil
|
|
||||||
|
|
||||||
check res == ERR_OK
|
|
||||||
|
|||||||
2
vendor/circom-compat-ffi
vendored
2
vendor/circom-compat-ffi
vendored
@ -1 +1 @@
|
|||||||
Subproject commit aed402f6ee8a2dc225ec2db2eb36d1888aab7790
|
Subproject commit b1755a2b2e8d3978925cb5815c1564f62756b29d
|
||||||
Loading…
x
Reference in New Issue
Block a user