diff --git a/bindings/c_kzg.swg b/bindings/c_kzg.swg index ddb5e8b..1578e87 100644 --- a/bindings/c_kzg.swg +++ b/bindings/c_kzg.swg @@ -6,17 +6,23 @@ #include #include "c_kzg.h" #include "bls12_381.h" +#include "test_util.h" %} %rename(alloc_poly) new_poly; %rename(alloc_poly_l) new_poly_l; -%typemap(in, numinputs=0) OBJECT *out ($1_basetype tmp) { $1 = &tmp; } -%typemap(argout) OBJECT *out { +%typemap(in, numinputs=0) OBJECT *OUTPUT($1_basetype tmp) { $1 = &tmp; } +%typemap(argout) OBJECT *OUTPUT { PyObject *obj = SWIG_NewPointerObj(memcpy(malloc(sizeof($1_basetype)),$1,sizeof($1_basetype)), $descriptor, SWIG_POINTER_NEW); $result = ($result == NULL) ? obj : SWIG_Python_AppendOutput($result, obj); } -%apply OBJECT *out { fr_t *out, poly *out, poly_l *out } +%apply OBJECT *OUTPUT { + fr_t *out, poly *out, poly_l *out, + g1_t *out, g2_t *out, + blst_scalar *out, + FFTSettings *out, KZGSettings *out +} %typemap(in, numinputs=0) uint64_t out[4] (uint64_t tmp[4]) { $1 = tmp; } %typemap(argout) uint64_t out[4] { @@ -29,7 +35,6 @@ } %typemap(in) const uint64_t[4] (uint64_t tmp[4]) { - int i; if (PyTuple_Check($input)) { if (!PyArg_ParseTuple($input, "KKKK", tmp, tmp+1, tmp+2, tmp+3)) { PyErr_SetString(PyExc_TypeError, "tuple must have 4 elements"); @@ -43,8 +48,12 @@ } %array_class(fr_t, frArray) +%array_class(g1_t, g1Array) +%array_class(g2_t, g2Array) %pointer_class(poly, polyp) %pointer_class(poly_l, poly_lp) %include "../src/c_kzg.h" %include "../src/bls12_381.h" +%include "../inc/blst.h" +%include "../src/test_util.h" diff --git a/bindings/python/Makefile b/bindings/python/Makefile index ab93c29..b4508c3 100644 --- a/bindings/python/Makefile +++ b/bindings/python/Makefile @@ -1,7 +1,7 @@ INCLUDE_DIRS = .. ../../src ../../inc INCLUDE_PY = $(shell python -c 'import sysconfig; print(sysconfig.get_config_var("INCLUDEPY"))') -_ckzg.so: c_kzg_wrap.c ../../src/libckzg.a ../../lib/libblst.a +_ckzg.so: c_kzg_wrap.c ../../src/libckzg.a ../../lib/libblst.a ../../src/test_util.o clang -O -Wall -shared -fPIC -Wl,-Bsymbolic -I${INCLUDE_PY} ${addprefix -I,${INCLUDE_DIRS}} -o $@ $^ c_kzg_wrap.c ckzg.py: ../c_kzg.swg diff --git a/bindings/python/example.py b/bindings/python/example.py index 12ca6d1..607897f 100644 --- a/bindings/python/example.py +++ b/bindings/python/example.py @@ -10,7 +10,27 @@ cfa = ckzg.frArray(len(coeffs)) for i, c in enumerate(coeffs): cfa[i] = c ret, pptr = ckzg.new_poly_with_coeffs(cfa.cast(), len(coeffs)) +assert ret == 0 p = ckzg.polyp_frompointer(pptr).value() assert p.length == 4 pcoeffs = ckzg.frArray_frompointer(p.coeffs) assert ckzg.fr_to_uint64s(pcoeffs[1]) == (2, 0, 0, 0) +max_scale = 4 +ret, fs = ckzg.new_fft_settings(max_scale) +assert ret == 0 +secret_s = ckzg.blst_scalar_from_uint64((29,3,1,4)) +num_secrets = 2 ** max_scale +g1s = ckzg.g1Array(num_secrets) +g2s = ckzg.g2Array(num_secrets) +ckzg.generate_trusted_setup(g1s.cast(), g2s.cast(), secret_s, num_secrets) +ret, ks = ckzg.new_kzg_settings(g1s.cast(), g2s.cast(), num_secrets, fs) +assert ret == 0 +ret, p_l = ckzg.new_poly_l_from_poly(p, ks) +assert ret == 0 +ret, y = ckzg.eval_poly_l(p_l, c2, fs) +assert ret == 0 +print(ckzg.fr_to_uint64s(y)) +ckzg.free_poly(p) +ckzg.free_poly_l(p_l) +ckzg.free_fft_settings(fs) +ckzg.free_kzg_settings(ks) diff --git a/src/c_kzg.h b/src/c_kzg.h index 5c5a5e9..70eec02 100644 --- a/src/c_kzg.h +++ b/src/c_kzg.h @@ -57,7 +57,7 @@ typedef struct { fr_t *reverse_roots_of_unity; /**< Descending powers of the root of unity, size `width + 1`. */ } FFTSettings; -C_KZG_RET new_fft_settings(FFTSettings *s, unsigned int max_scale); +C_KZG_RET new_fft_settings(FFTSettings *out, unsigned int max_scale); void free_fft_settings(FFTSettings *s); // @@ -131,7 +131,7 @@ C_KZG_RET check_proof_single(bool *out, const g1_t *commitment, const g1_t *proo C_KZG_RET compute_proof_multi(g1_t *out, const poly *p, const fr_t *x0, uint64_t n, const KZGSettings *ks); C_KZG_RET check_proof_multi(bool *out, const g1_t *commitment, const g1_t *proof, const fr_t *x, const fr_t *ys, uint64_t n, const KZGSettings *ks); -C_KZG_RET new_kzg_settings(KZGSettings *ks, const g1_t *secret_g1, const g2_t *secret_g2, uint64_t length, +C_KZG_RET new_kzg_settings(KZGSettings *out, const g1_t *secret_g1, const g2_t *secret_g2, uint64_t length, const FFTSettings *fs); void free_kzg_settings(KZGSettings *ks);