innitial commit
This commit is contained in:
parent
45d0aaacb5
commit
35253db96b
|
@ -1,3 +1,9 @@
|
||||||
nimcache/
|
nimcache/
|
||||||
nimblecache/
|
nimblecache/
|
||||||
htmldocs/
|
htmldocs/
|
||||||
|
*
|
||||||
|
!*/
|
||||||
|
!*.*
|
||||||
|
*.exe
|
||||||
|
|
||||||
|
.DS_Store
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "vendor/circom-compat-ffi"]
|
||||||
|
path = vendor/circom-compat-ffi
|
||||||
|
url = https://github.com/codex-storage/circom-compat-ffi.git
|
|
@ -0,0 +1,8 @@
|
||||||
|
import std/os
|
||||||
|
|
||||||
|
task genffi, "update the nim ffi bindings":
|
||||||
|
exec "cargo install --git https://github.com/arnetheduck/nbindgen#e80a85f1505d78eeae78ce33b6f406603be27d35 nbindgen"
|
||||||
|
exec "nbindgen -c ./cbindgen.toml vendor/circom-compat-ffi --output circomcompatffi.nim"
|
||||||
|
|
||||||
|
task tests, "run unit tests":
|
||||||
|
exec "nim c -r tests/testcircomcompat.nim"
|
|
@ -0,0 +1,32 @@
|
||||||
|
[parse]
|
||||||
|
parse_deps = false
|
||||||
|
expand = ["circom-compat-ffi"]
|
||||||
|
|
||||||
|
# Configuration for name mangling
|
||||||
|
[export.mangle]
|
||||||
|
# Whether the types should be renamed during mangling, for example
|
||||||
|
# c_char -> CChar, etc.
|
||||||
|
rename_types = "CamelCase"
|
||||||
|
# Whether the underscores from the mangled name should be omitted.
|
||||||
|
remove_underscores = true
|
||||||
|
|
||||||
|
[struct]
|
||||||
|
# A rule to use to rename struct field names. The renaming assumes the input is
|
||||||
|
# the Rust standard snake_case, however it acccepts all the different rename_args
|
||||||
|
# inputs. This means many options here are no-ops or redundant.
|
||||||
|
#
|
||||||
|
# possible values (that actually do something):
|
||||||
|
# * "CamelCase": my_arg => myArg
|
||||||
|
# * "PascalCase": my_arg => MyArg
|
||||||
|
# * "GeckoCase": my_arg => mMyArg
|
||||||
|
# * "ScreamingSnakeCase": my_arg => MY_ARG
|
||||||
|
# * "None": apply no renaming
|
||||||
|
#
|
||||||
|
# technically possible values (that shouldn't have a purpose here):
|
||||||
|
# * "SnakeCase": apply no renaming
|
||||||
|
# * "LowerCase": apply no renaming (actually applies to_lowercase, is this bug?)
|
||||||
|
# * "UpperCase": same as ScreamingSnakeCase in this context
|
||||||
|
# * "QualifiedScreamingSnakeCase" => same as ScreamingSnakeCase in this context
|
||||||
|
#
|
||||||
|
# default: "None"
|
||||||
|
rename_fields = "CamelCase"
|
|
@ -0,0 +1,22 @@
|
||||||
|
|
||||||
|
import std/os
|
||||||
|
import std/strutils
|
||||||
|
import std/macros
|
||||||
|
|
||||||
|
const
|
||||||
|
currentDir = currentSourcePath().parentDir()
|
||||||
|
libDir* = currentDir/"vendor/circom-compat-ffi/target"/"release"
|
||||||
|
libPath* = libDir/"libcircom_compat_ffi.a"
|
||||||
|
|
||||||
|
static:
|
||||||
|
let cmd = "cd vendor/circom-compat-ffi && cargo build --release"
|
||||||
|
warning "\nBuilding circom compat ffi: " & cmd
|
||||||
|
let (output, exitCode) = gorgeEx cmd
|
||||||
|
for ln in output.splitLines():
|
||||||
|
warning("cargo> " & ln)
|
||||||
|
if exitCode != 0:
|
||||||
|
raiseAssert("Failed to build circom-compat-ffi")
|
||||||
|
|
||||||
|
{.passl: "-lcircom_compat_ffi" & " -L" & libDir.}
|
||||||
|
|
||||||
|
include circomcompatffi
|
|
@ -0,0 +1,14 @@
|
||||||
|
# Package
|
||||||
|
|
||||||
|
version = "0.1.0"
|
||||||
|
author = "Dmitriy Ryajov"
|
||||||
|
description = "Nim wrapper for rust circom compat (ark-circom)"
|
||||||
|
license = "MIT"
|
||||||
|
srcDir = "src"
|
||||||
|
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
|
||||||
|
requires "nim >= 1.6.18"
|
||||||
|
|
||||||
|
include "build.nims"
|
|
@ -0,0 +1,84 @@
|
||||||
|
const ERR_UNKNOWN* = -1
|
||||||
|
|
||||||
|
const ERR_OK* = 0
|
||||||
|
|
||||||
|
const ERR_WASM_PATH* = 1
|
||||||
|
|
||||||
|
const ERR_R1CS_PATH* = 2
|
||||||
|
|
||||||
|
const ERR_ZKEY_PATH* = 3
|
||||||
|
|
||||||
|
const ERR_INPUT_NAME* = 4
|
||||||
|
|
||||||
|
const ERR_INVALID_INPUT* = 5
|
||||||
|
|
||||||
|
const ERR_CANT_READ_ZKEY* = 6
|
||||||
|
|
||||||
|
const ERR_CIRCOM_BUILDER* = 7
|
||||||
|
|
||||||
|
const ERR_FAILED_TO_DESERIALIZE_PROOF* = 8
|
||||||
|
|
||||||
|
const ERR_FAILED_TO_DESERIALIZE_INPUTS* = 9
|
||||||
|
|
||||||
|
|
||||||
|
type CircomCompatCtx* {.incompleteStruct.} = object
|
||||||
|
|
||||||
|
type Buffer* = object
|
||||||
|
data*: pointer
|
||||||
|
len*: uint
|
||||||
|
|
||||||
|
## # Safety
|
||||||
|
#
|
||||||
|
proc init_circom_compat*(r1cs_path: pointer,
|
||||||
|
wasm_path: pointer,
|
||||||
|
zkey_path: pointer,
|
||||||
|
ctx_ptr: ptr ptr CircomCompatCtx): int32 {.importc: "init_circom_compat".}
|
||||||
|
|
||||||
|
proc release_circom_compat*(ctx_ptr: ptr ptr CircomCompatCtx): void {.importc: "release_circom_compat".}
|
||||||
|
|
||||||
|
## # Safety
|
||||||
|
#
|
||||||
|
proc push_input_u256_array*(ctx_ptr: ptr CircomCompatCtx,
|
||||||
|
name_ptr: pointer,
|
||||||
|
input_ptr: pointer,
|
||||||
|
len: uint): int32 {.importc: "push_input_u256_array".}
|
||||||
|
|
||||||
|
## # Safety
|
||||||
|
#
|
||||||
|
proc prove_circuit*(ctx_ptr: ptr CircomCompatCtx,
|
||||||
|
proof_bytes_ptr: ptr ptr Buffer,
|
||||||
|
inputs_bytes_ptr: ptr ptr Buffer): int32 {.importc: "prove_circuit".}
|
||||||
|
|
||||||
|
## # Safety
|
||||||
|
#
|
||||||
|
proc verify_circuit*(ctx_ptr: ptr CircomCompatCtx,
|
||||||
|
proof_bytes_ptr: ptr Buffer,
|
||||||
|
inputs_bytes_ptr: ptr Buffer): int32 {.importc: "verify_circuit".}
|
||||||
|
|
||||||
|
proc push_input_numeric_i8*(ctx_ptr: ptr CircomCompatCtx,
|
||||||
|
name_ptr: pointer,
|
||||||
|
input: int8): int32 {.importc: "push_input_numeric_i8".}
|
||||||
|
|
||||||
|
proc push_input_numeric_u8*(ctx_ptr: ptr CircomCompatCtx,
|
||||||
|
name_ptr: pointer,
|
||||||
|
input: uint8): int32 {.importc: "push_input_numeric_u8".}
|
||||||
|
|
||||||
|
proc push_input_numeric_i16*(ctx_ptr: ptr CircomCompatCtx,
|
||||||
|
name_ptr: pointer,
|
||||||
|
input: int16): int32 {.importc: "push_input_numeric_i16".}
|
||||||
|
|
||||||
|
proc push_input_numeric_u16*(ctx_ptr: ptr CircomCompatCtx,
|
||||||
|
name_ptr: pointer,
|
||||||
|
input: uint16): int32 {.importc: "push_input_numeric_u16".}
|
||||||
|
|
||||||
|
proc push_input_numeric_i32*(ctx_ptr: ptr CircomCompatCtx,
|
||||||
|
name_ptr: pointer,
|
||||||
|
input: int32): int32 {.importc: "push_input_numeric_i32".}
|
||||||
|
|
||||||
|
proc push_input_numeric_u32*(ctx_ptr: ptr CircomCompatCtx,
|
||||||
|
name_ptr: pointer,
|
||||||
|
input: uint32): int32 {.importc: "push_input_numeric_u32".}
|
||||||
|
|
||||||
|
proc push_input_numeric_u64*(ctx_ptr: ptr CircomCompatCtx,
|
||||||
|
name_ptr: pointer,
|
||||||
|
input: uint64): int32 {.importc: "push_input_numeric_u64".}
|
|
@ -0,0 +1 @@
|
||||||
|
switch("path", "$projectDir/")
|
|
@ -0,0 +1,32 @@
|
||||||
|
import std/os
|
||||||
|
import std/unittest
|
||||||
|
|
||||||
|
import ../circomcompat
|
||||||
|
|
||||||
|
suite "Test circom compat nim":
|
||||||
|
test "Should generate witness, prove and verify":
|
||||||
|
let
|
||||||
|
r1csPath = "vendor/circom-compat-ffi/fixtures/mycircuit.r1cs".cstring
|
||||||
|
wasmPath = "vendor/circom-compat-ffi/fixtures/mycircuit.wasm".cstring
|
||||||
|
|
||||||
|
var ctx: ptr CircomCompatCtx
|
||||||
|
let res = init_circom_compat(
|
||||||
|
r1csPath,
|
||||||
|
wasmPath,
|
||||||
|
nil,
|
||||||
|
ctx.addr)
|
||||||
|
|
||||||
|
check ctx.push_input_numeric_i8("a".cstring, 3) == ERR_OK
|
||||||
|
check ctx.push_input_numeric_i8("b".cstring, 11) == ERR_OK
|
||||||
|
|
||||||
|
var proofBytes: ptr Buffer
|
||||||
|
var publicBytes: ptr Buffer
|
||||||
|
|
||||||
|
check ctx.prove_circuit(proofBytes.addr, publicBytes.addr) == ERR_OK
|
||||||
|
|
||||||
|
check proofBytes.len > 0
|
||||||
|
check publicBytes.len > 0
|
||||||
|
|
||||||
|
check ctx.verify_circuit(proofBytes, publicBytes) == ERR_OK
|
||||||
|
|
||||||
|
check res == ERR_OK
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 5a522239a62262f6b0fefa1f1d54a22b72da5b38
|
Loading…
Reference in New Issue