From c4e93a133cee84424dc9451445a23cce33308f2a Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 3 May 2026 19:16:14 +0200 Subject: [PATCH 1/2] feat: OP_VERIFY_ZKP polymorphic SNARK verification opcode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds OP_VERIFY_ZKP at 0xf6 (replacing the OP_UNKNOWN246 reserved slot) with Groth16 and PLONK verifier backends over BLS12-381. Tracks issue #77. Stack expectation (top to bottom): zkp_type:u8 proof publicInputs vk The verifying key is committed in the script body, not the witness — a tapleaf using OP_VERIFY_ZKP includes PUSH as a constant, so the tapleaf hash binds the spend to a specific circuit. Type registry: 0x01 = Groth16 (BLS12-381) — per-circuit trusted setup, ~200 B proof 0x02 = PLONK (BLS12-381 + KZG) — universal updatable setup, ~500 B proof Wire format for proof / vk / public-inputs follows gnark's standard binary marshaling (WriteTo / ReadFrom). Implementation: pkg/arkade/zkp/ — verifier interface + dispatch registry pkg/arkade/zkp/groth16.go — Groth16 backend (consensys/gnark) pkg/arkade/zkp/plonk.go — PLONK backend (consensys/gnark) pkg/arkade/zkp/zkp_test.go — round-trip tests with real proofs pkg/arkade/op_verify_zkp.go — opcode handler pkg/arkade/op_verify_zkp_test.go — handler tests with real proofs Tests generate proofs in-test via gnark's prover (no precomputed fixtures), exercising the full prove → marshal → verify-via-opcode round trip on a trivial x*x == y circuit. Tampered proofs and wrong-input proofs are verified to reject. --- go.mod | 13 ++- go.sum | 36 ++++++- pkg/arkade/go.mod | 13 +++ pkg/arkade/go.sum | 51 ++++++++- pkg/arkade/op_verify_zkp.go | 53 ++++++++++ pkg/arkade/op_verify_zkp_test.go | 152 +++++++++++++++++++++++++++ pkg/arkade/opcode.go | 4 +- pkg/arkade/opcode_test.go | 35 ++++++- pkg/arkade/zkp/groth16.go | 58 +++++++++++ pkg/arkade/zkp/plonk.go | 55 ++++++++++ pkg/arkade/zkp/zkp.go | 107 +++++++++++++++++++ pkg/arkade/zkp/zkp_test.go | 172 +++++++++++++++++++++++++++++++ 12 files changed, 740 insertions(+), 9 deletions(-) create mode 100644 pkg/arkade/op_verify_zkp.go create mode 100644 pkg/arkade/op_verify_zkp_test.go create mode 100644 pkg/arkade/zkp/groth16.go create mode 100644 pkg/arkade/zkp/plonk.go create mode 100644 pkg/arkade/zkp/zkp.go create mode 100644 pkg/arkade/zkp/zkp_test.go diff --git a/go.mod b/go.mod index a668062..bab8382 100644 --- a/go.mod +++ b/go.mod @@ -45,6 +45,8 @@ require ( github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/arkade-os/arkd/pkg/kvdb v0.7.1-0.20260216152434-74a173c67a37 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.22.0 // indirect + github.com/blang/semver/v4 v4.0.0 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4 // indirect github.com/btcsuite/btcwallet/wallet/txrules v1.2.1 // indirect @@ -55,6 +57,8 @@ require ( github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/consensys/gnark v0.13.0 // indirect + github.com/consensys/gnark-crypto v0.18.0 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect @@ -65,6 +69,7 @@ require ( github.com/dgraph-io/ristretto/v2 v2.2.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.8.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-macaroon-bakery/macaroonpb v1.0.0 // indirect @@ -76,6 +81,7 @@ require ( github.com/google/btree v1.1.2 // indirect github.com/google/cel-go v0.26.1 // indirect github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect @@ -84,6 +90,7 @@ require ( github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/ingonyama-zk/icicle-gnark/v3 v3.2.2 // indirect github.com/jonboulle/clockwork v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect @@ -101,6 +108,7 @@ require ( github.com/lightningnetwork/lnd/tlv v1.2.6 // indirect github.com/lightningnetwork/lnd/tor v1.1.3 // indirect github.com/ltcsuite/ltcd/chaincfg/chainhash v1.0.2 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/miekg/dns v1.1.61 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -115,6 +123,8 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rogpeppe/fastuuid v1.2.0 // indirect + github.com/ronanh/intcomp v1.1.1 // indirect + github.com/rs/zerolog v1.34.0 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/soheilhy/cmux v0.1.5 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect @@ -127,6 +137,7 @@ require ( github.com/timshannon/badgerhold/v4 v4.0.3 // indirect github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 // indirect github.com/vulpemventures/go-bip32 v0.0.0-20200624192635-867c159da4d7 // indirect + github.com/x448/float16 v0.8.4 // indirect github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510 // indirect go.etcd.io/bbolt v1.3.10 // indirect go.etcd.io/etcd/api/v3 v3.5.15 // indirect @@ -148,7 +159,7 @@ require ( go.uber.org/zap v1.27.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/crypto v0.48.0 // indirect - golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect + golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect golang.org/x/mod v0.32.0 // indirect golang.org/x/sync v0.19.0 // indirect golang.org/x/sys v0.41.0 // indirect diff --git a/go.sum b/go.sum index da26e80..52e5007 100644 --- a/go.sum +++ b/go.sum @@ -38,6 +38,10 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= +github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= @@ -93,6 +97,10 @@ github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q1 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/consensys/gnark v0.13.0 h1:NDsMmyknIEJA3S/2u1PZSsSIRVXFroICN1jYR+tyR2c= +github.com/consensys/gnark v0.13.0/go.mod h1:F6k35ZIi9GC//wW2i9Fz9mURBcLF8qJLQQ/BETnQ9Z4= +github.com/consensys/gnark-crypto v0.18.0 h1:vIye/FqI50VeAr0B3dx+YjeIvmc3LWz4yEfbWBpTUf0= +github.com/consensys/gnark-crypto v0.18.0/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -154,6 +162,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= +github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= @@ -222,8 +232,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= -github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18= +github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -251,6 +261,8 @@ github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyf github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/ingonyama-zk/icicle-gnark/v3 v3.2.2 h1:B+aWVgAx+GlFLhtYjIaF0uGjU3rzpl99Wf9wZWt+Mq8= +github.com/ingonyama-zk/icicle-gnark/v3 v3.2.2/go.mod h1:CH/cwcr21pPWH+9GtK/PFaa4OGTv4CtfkCKro6GpbRE= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= @@ -314,6 +326,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= @@ -351,6 +365,11 @@ github.com/ltcsuite/ltcd v0.23.5/go.mod h1:JV6swXR5m0cYFi0VYdQPp3UnMdaDQxaRUCaU1 github.com/ltcsuite/ltcd/chaincfg/chainhash v1.0.2 h1:xuWxvRKxLvOKuS7/Q/7I3tpc3cWAB0+hZpU8YdVqkzg= github.com/ltcsuite/ltcd/chaincfg/chainhash v1.0.2/go.mod h1:nkLkAFGhursWf2U68gt61hPieK1I+0m78e+2aevNyD8= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/meshapi/grpc-api-gateway v0.1.0 h1:0rGp4qZQ6T9Ud0KfzdHYsEju4AX/Q3AQOU7unoBLssY= @@ -415,6 +434,11 @@ github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/ronanh/intcomp v1.1.1 h1:+1bGV/wEBiHI0FvzS7RHgzqOpfbBJzLIxkqMJ9e6yxY= +github.com/ronanh/intcomp v1.1.1/go.mod h1:7FOLy3P3Zj3er/kVrU/pl+Ql7JFZj7bwliMGketo0IU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= @@ -470,6 +494,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/vulpemventures/go-bip32 v0.0.0-20200624192635-867c159da4d7 h1:X7DtNv+YWy76kELMZB/xVkIJ7YNp2vpgMFVsDcQA40U= github.com/vulpemventures/go-bip32 v0.0.0-20200624192635-867c159da4d7/go.mod h1:Zrvx8XgpWvSPdz1lXnuN083CkoZnzwxBLEB03S8et1I= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= @@ -548,8 +574,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA= -golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4= +golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -622,10 +648,12 @@ golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/pkg/arkade/go.mod b/pkg/arkade/go.mod index ed60a14..b3a0eae 100644 --- a/pkg/arkade/go.mod +++ b/pkg/arkade/go.mod @@ -9,6 +9,8 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.5 github.com/btcsuite/btcd/btcutil/psbt v1.1.9 github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 + github.com/consensys/gnark v0.13.0 + github.com/consensys/gnark-crypto v0.18.0 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 github.com/stretchr/testify v1.11.1 golang.org/x/crypto v0.48.0 @@ -16,12 +18,23 @@ require ( require ( github.com/arkade-os/arkd/pkg/errors v0.0.0-20260303153651-8615412e4dea // indirect + github.com/bits-and-blooms/bitset v1.22.0 // indirect + github.com/blang/semver/v4 v4.0.0 // indirect github.com/btcsuite/btcd/btcutil v1.1.5 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/crypto/blake256 v1.1.0 // indirect + github.com/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect + github.com/ingonyama-zk/icicle-gnark/v3 v3.2.2 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/ronanh/intcomp v1.1.1 // indirect + github.com/rs/zerolog v1.34.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect + github.com/x448/float16 v0.8.4 // indirect + golang.org/x/sync v0.19.0 // indirect golang.org/x/sys v0.41.0 // indirect google.golang.org/grpc v1.79.3 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/pkg/arkade/go.sum b/pkg/arkade/go.sum index b2f8634..7d9b4b3 100644 --- a/pkg/arkade/go.sum +++ b/pkg/arkade/go.sum @@ -5,6 +5,10 @@ github.com/arkade-os/arkd/pkg/ark-lib v0.8.1-0.20260318170839-137daaec3a70 h1:qL github.com/arkade-os/arkd/pkg/ark-lib v0.8.1-0.20260318170839-137daaec3a70/go.mod h1:VpyqrRS8Qk3uAhUTiH417gyC52caAfan/o8aVPDO528= github.com/arkade-os/arkd/pkg/errors v0.0.0-20260303153651-8615412e4dea h1:x9ZwZL+F2b9E0uBZYBVjCLGtlqIE4zahDOY4C89h3X4= github.com/arkade-os/arkd/pkg/errors v0.0.0-20260303153651-8615412e4dea/go.mod h1:NYGE+baj57ynbXNwjISJddMDpMqAWOX27dV22xqFm2A= +github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= +github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= @@ -34,6 +38,11 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/consensys/gnark v0.13.0 h1:NDsMmyknIEJA3S/2u1PZSsSIRVXFroICN1jYR+tyR2c= +github.com/consensys/gnark v0.13.0/go.mod h1:F6k35ZIi9GC//wW2i9Fz9mURBcLF8qJLQQ/BETnQ9Z4= +github.com/consensys/gnark-crypto v0.18.0 h1:vIye/FqI50VeAr0B3dx+YjeIvmc3LWz4yEfbWBpTUf0= +github.com/consensys/gnark-crypto v0.18.0/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -48,6 +57,9 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjY github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= +github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -62,12 +74,29 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18= +github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ingonyama-zk/icicle-gnark/v3 v3.2.2 h1:B+aWVgAx+GlFLhtYjIaF0uGjU3rzpl99Wf9wZWt+Mq8= +github.com/ingonyama-zk/icicle-gnark/v3 v3.2.2/go.mod h1:CH/cwcr21pPWH+9GtK/PFaa4OGTv4CtfkCKro6GpbRE= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -77,9 +106,17 @@ github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/ronanh/intcomp v1.1.1 h1:+1bGV/wEBiHI0FvzS7RHgzqOpfbBJzLIxkqMJ9e6yxY= +github.com/ronanh/intcomp v1.1.1/go.mod h1:7FOLy3P3Zj3er/kVrU/pl+Ql7JFZj7bwliMGketo0IU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -88,17 +125,23 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= +golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4= +golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -109,6 +152,9 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -129,13 +175,16 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/arkade/op_verify_zkp.go b/pkg/arkade/op_verify_zkp.go new file mode 100644 index 0000000..c667a3e --- /dev/null +++ b/pkg/arkade/op_verify_zkp.go @@ -0,0 +1,53 @@ +package arkade + +import ( + "github.com/ArkLabsHQ/introspector/pkg/arkade/zkp" + "github.com/btcsuite/btcd/txscript" +) + +// opcodeVerifyZkp implements OP_VERIFY_ZKP. It verifies a SNARK proof drawn +// from the script stack using a registered Verifier (see pkg/arkade/zkp). +// +// Stack expectation (top to bottom): +// +// zkp_type:u8 identifies the proof system (zkp.Type) +// proof variable-length, system-specific binary +// publicInputs variable-length, system-specific binary (gnark witness format +// for the bundled Groth16/PLONK verifiers) +// vk variable-length verifying key, pushed earlier in the script +// body (committing the circuit identity to the tapleaf hash) +// +// On success the opcode pushes 1; on any failure (unknown zkp_type, malformed +// inputs, soundness rejection) it returns a script error. Callers typically +// follow it with OP_VERIFY to fail the script on rejection. +func opcodeVerifyZkp(op *opcode, data []byte, vm *Engine) error { + zkpTypeBytes, err := vm.dstack.PopByteArray() + if err != nil { + return err + } + if len(zkpTypeBytes) != 1 { + return scriptError(txscript.ErrInvalidStackOperation, + "OP_VERIFY_ZKP: zkp_type must be exactly 1 byte") + } + zkpType := zkp.Type(zkpTypeBytes[0]) + + proof, err := vm.dstack.PopByteArray() + if err != nil { + return err + } + publicInputs, err := vm.dstack.PopByteArray() + if err != nil { + return err + } + vk, err := vm.dstack.PopByteArray() + if err != nil { + return err + } + + if err := zkp.Verify(zkpType, vk, publicInputs, proof); err != nil { + return scriptError(txscript.ErrNullFail, err.Error()) + } + + vm.dstack.PushInt(1) + return nil +} diff --git a/pkg/arkade/op_verify_zkp_test.go b/pkg/arkade/op_verify_zkp_test.go new file mode 100644 index 0000000..1250c98 --- /dev/null +++ b/pkg/arkade/op_verify_zkp_test.go @@ -0,0 +1,152 @@ +package arkade + +import ( + "bytes" + "testing" + + "github.com/ArkLabsHQ/introspector/pkg/arkade/zkp" + "github.com/btcsuite/btcd/txscript" + "github.com/consensys/gnark-crypto/ecc" + "github.com/consensys/gnark/backend/groth16" + "github.com/consensys/gnark/backend/plonk" + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/frontend/cs/r1cs" + "github.com/consensys/gnark/frontend/cs/scs" + "github.com/consensys/gnark/test/unsafekzg" + "github.com/stretchr/testify/require" +) + +// squareCircuit proves: I know X such that X*X == Y, where Y is public. +// Mirrors the circuit used in pkg/arkade/zkp/zkp_test.go so the round-trip +// vectors produced here exercise the same prover/verifier pair via the opcode +// dispatch. +type squareOpCircuit struct { + X frontend.Variable `gnark:",secret"` + Y frontend.Variable `gnark:",public"` +} + +func (c *squareOpCircuit) Define(api frontend.API) error { + api.AssertIsEqual(api.Mul(c.X, c.X), c.Y) + return nil +} + +// generateGroth16Vectors returns serialized (vk, public_inputs, proof) for a +// known-good Groth16 proof of 3*3 == 9. +func generateGroth16Vectors(t *testing.T) (vk, pub, proof []byte) { + t.Helper() + var c squareOpCircuit + ccs, err := frontend.Compile(ecc.BLS12_381.ScalarField(), r1cs.NewBuilder, &c) + require.NoError(t, err) + pk, vkObj, err := groth16.Setup(ccs) + require.NoError(t, err) + w, err := frontend.NewWitness(&squareOpCircuit{X: 3, Y: 9}, ecc.BLS12_381.ScalarField()) + require.NoError(t, err) + pubW, err := w.Public() + require.NoError(t, err) + proofObj, err := groth16.Prove(ccs, pk, w) + require.NoError(t, err) + + var vkBuf, pubBuf, pBuf bytes.Buffer + _, err = vkObj.WriteTo(&vkBuf) + require.NoError(t, err) + _, err = pubW.WriteTo(&pubBuf) + require.NoError(t, err) + _, err = proofObj.WriteTo(&pBuf) + require.NoError(t, err) + return vkBuf.Bytes(), pubBuf.Bytes(), pBuf.Bytes() +} + +// generatePlonkVectors returns serialized (vk, public_inputs, proof) for a +// known-good PLONK proof of 4*4 == 16. Uses an unsafe in-test KZG SRS — never +// suitable for production deployments, which must use a public ceremony's SRS. +func generatePlonkVectors(t *testing.T) (vk, pub, proof []byte) { + t.Helper() + var c squareOpCircuit + ccs, err := frontend.Compile(ecc.BLS12_381.ScalarField(), scs.NewBuilder, &c) + require.NoError(t, err) + srs, srsLagrange, err := unsafekzg.NewSRS(ccs) + require.NoError(t, err) + pk, vkObj, err := plonk.Setup(ccs, srs, srsLagrange) + require.NoError(t, err) + w, err := frontend.NewWitness(&squareOpCircuit{X: 4, Y: 16}, ecc.BLS12_381.ScalarField()) + require.NoError(t, err) + pubW, err := w.Public() + require.NoError(t, err) + proofObj, err := plonk.Prove(ccs, pk, w) + require.NoError(t, err) + + var vkBuf, pubBuf, pBuf bytes.Buffer + _, err = vkObj.WriteTo(&vkBuf) + require.NoError(t, err) + _, err = pubW.WriteTo(&pubBuf) + require.NoError(t, err) + _, err = proofObj.WriteTo(&pBuf) + require.NoError(t, err) + return vkBuf.Bytes(), pubBuf.Bytes(), pBuf.Bytes() +} + +// runVerifyZkp drives the opcode handler directly against a fresh engine with +// the four required stack items. Returns the engine post-execution and the +// handler error (if any). +func runVerifyZkp(t *testing.T, vk, pub, proof []byte, zkpType zkp.Type) (*Engine, error) { + t.Helper() + vm := &Engine{} + // Push order is bottom-to-top: vk, public_inputs, proof, zkp_type. + vm.dstack.PushByteArray(vk) + vm.dstack.PushByteArray(pub) + vm.dstack.PushByteArray(proof) + vm.dstack.PushByteArray([]byte{byte(zkpType)}) + err := opcodeVerifyZkp(nil, nil, vm) + return vm, err +} + +func TestOpVerifyZkpGroth16Success(t *testing.T) { + vk, pub, proof := generateGroth16Vectors(t) + vm, err := runVerifyZkp(t, vk, pub, proof, zkp.TypeGroth16) + require.NoError(t, err) + + // Handler pushes 1 on success. + top, err := vm.dstack.PopInt() + require.NoError(t, err) + require.Equal(t, int64(1), int64(top)) +} + +func TestOpVerifyZkpPlonkSuccess(t *testing.T) { + vk, pub, proof := generatePlonkVectors(t) + vm, err := runVerifyZkp(t, vk, pub, proof, zkp.TypePLONK) + require.NoError(t, err) + + top, err := vm.dstack.PopInt() + require.NoError(t, err) + require.Equal(t, int64(1), int64(top)) +} + +func TestOpVerifyZkpRejectsTamperedProof(t *testing.T) { + vk, pub, proof := generateGroth16Vectors(t) + tampered := append([]byte(nil), proof...) + tampered[0] ^= 0x01 + _, err := runVerifyZkp(t, vk, pub, tampered, zkp.TypeGroth16) + require.Error(t, err) +} + +func TestOpVerifyZkpRejectsUnknownType(t *testing.T) { + vk, pub, proof := generateGroth16Vectors(t) + _, err := runVerifyZkp(t, vk, pub, proof, zkp.Type(0xff)) + require.Error(t, err) +} + +func TestOpVerifyZkpRejectsBadTypeLength(t *testing.T) { + vk, pub, proof := generateGroth16Vectors(t) + vm := &Engine{} + vm.dstack.PushByteArray(vk) + vm.dstack.PushByteArray(pub) + vm.dstack.PushByteArray(proof) + // Push 2 bytes instead of 1 for zkp_type. + vm.dstack.PushByteArray([]byte{0x01, 0x00}) + err := opcodeVerifyZkp(nil, nil, vm) + require.Error(t, err) + // Should be a script error, not a panic. + var serr txscript.Error + require.ErrorAs(t, err, &serr) + require.Equal(t, txscript.ErrInvalidStackOperation, serr.ErrorCode) +} diff --git a/pkg/arkade/opcode.go b/pkg/arkade/opcode.go index e969332..fd8fc4b 100644 --- a/pkg/arkade/opcode.go +++ b/pkg/arkade/opcode.go @@ -305,7 +305,7 @@ const ( OP_TXID = 0xf3 // 243 OP_INSPECTPACKET = 0xf4 // 244 OP_INSPECTINPUTPACKET = 0xf5 // 245 - OP_UNKNOWN246 = 0xf6 // 246 + OP_VERIFY_ZKP = 0xf6 // 246 OP_UNKNOWN247 = 0xf7 // 247 OP_UNKNOWN248 = 0xf8 // 248 OP_UNKNOWN249 = 0xf9 // 249 @@ -606,7 +606,7 @@ var opcodeArray = [256]opcode{ OP_TXID: {OP_TXID, "OP_TXID", 1, opcodeTxId}, OP_INSPECTPACKET: {OP_INSPECTPACKET, "OP_INSPECTPACKET", 1, opcodeInspectPacket}, OP_INSPECTINPUTPACKET: {OP_INSPECTINPUTPACKET, "OP_INSPECTINPUTPACKET", 1, opcodeInspectInputPacket}, - OP_UNKNOWN246: {OP_UNKNOWN246, "OP_UNKNOWN246", 1, opcodeInvalid}, + OP_VERIFY_ZKP: {OP_VERIFY_ZKP, "OP_VERIFY_ZKP", 1, opcodeVerifyZkp}, OP_UNKNOWN247: {OP_UNKNOWN247, "OP_UNKNOWN247", 1, opcodeInvalid}, OP_UNKNOWN248: {OP_UNKNOWN248, "OP_UNKNOWN248", 1, opcodeInvalid}, OP_UNKNOWN249: {OP_UNKNOWN249, "OP_UNKNOWN249", 1, opcodeInvalid}, diff --git a/pkg/arkade/opcode_test.go b/pkg/arkade/opcode_test.go index 7bc6788..28427da 100644 --- a/pkg/arkade/opcode_test.go +++ b/pkg/arkade/opcode_test.go @@ -348,7 +348,7 @@ var opcodeSpecs = [256]*opcodeSpec{ OP_UNKNOWN208: invalidSpec(OP_UNKNOWN208), OP_INSPECTPACKET: inspectPacketSpec(), OP_INSPECTINPUTPACKET: inspectInputPacketSpec(), - OP_UNKNOWN246: invalidSpec(OP_UNKNOWN246), + OP_VERIFY_ZKP: verifyZkpSpec(), OP_UNKNOWN247: invalidSpec(OP_UNKNOWN247), OP_UNKNOWN248: invalidSpec(OP_UNKNOWN248), OP_UNKNOWN249: invalidSpec(OP_UNKNOWN249), @@ -655,6 +655,39 @@ func nopSpec(op byte) *opcodeSpec { return spec } +// verifyZkpSpec covers OP_VERIFY_ZKP's malformed-input rejection paths. +// Real-proof success/failure cases require gnark to produce vectors and live +// in op_verify_zkp_test.go, which drives the handler directly with dynamic +// fixtures. Here we only assert that obviously broken inputs are rejected. +func verifyZkpSpec() *opcodeSpec { + return &opcodeSpec{ + opcode: OP_VERIFY_ZKP, + checkProperties: func(t *testing.T, c opcodeCheckContext) { + t.Helper() + // Mirrors checksigFromStackSpec's relaxed checker: dstack mutation + // is allowed on error (handler pops items before validation), but + // the altstack and condStack must be untouched. + require.Equal(t, c.before.GetAltStack(), c.after.GetAltStack()) + require.Equal(t, c.before.condStack, c.after.condStack) + if c.execErr == nil { + require.Fail(t, "expected error from invalid input") + } + }, + invalidVectors: []opcodeVector{ + { + name: "zkp_type byte too long", + inputStack: [][]byte{{0xAA}, {0xBB}, {0xCC}, {0x01, 0x00}}, + expectedError: txscript.ErrInvalidStackOperation, + }, + { + name: "stack underflow", + inputStack: [][]byte{{0x01}}, + expectedError: txscript.ErrInvalidStackOperation, + }, + }, + } +} + func invalidSpec(op byte) *opcodeSpec { return &opcodeSpec{ opcode: op, diff --git a/pkg/arkade/zkp/groth16.go b/pkg/arkade/zkp/groth16.go new file mode 100644 index 0000000..4f9d103 --- /dev/null +++ b/pkg/arkade/zkp/groth16.go @@ -0,0 +1,58 @@ +// Groth16 verifier (BLS12-381) using consensys/gnark. +// +// Wire format (matches gnark's standard binary marshaling): +// - vk: groth16.VerifyingKey.WriteTo bytes (BLS12-381 form) +// - publicInputs: witness.Witness.WriteTo bytes for the public-only witness +// - proof: groth16.Proof.WriteTo bytes (BLS12-381 form) +// +// This is a thin adapter around gnark; soundness, side-channel resistance, and +// curve correctness are the library's responsibility. +package zkp + +import ( + "bytes" + "fmt" + + "github.com/consensys/gnark-crypto/ecc" + "github.com/consensys/gnark/backend/groth16" + "github.com/consensys/gnark/backend/witness" +) + +type groth16Verifier struct{} + +// Verify checks a Groth16 proof on BLS12-381. +func (groth16Verifier) Verify(vkBytes, publicInputsBytes, proofBytes []byte) error { + if len(vkBytes) == 0 { + return fmt.Errorf("groth16: empty verifying key") + } + if len(proofBytes) == 0 { + return fmt.Errorf("groth16: empty proof") + } + + vk := groth16.NewVerifyingKey(ecc.BLS12_381) + if _, err := vk.ReadFrom(bytes.NewReader(vkBytes)); err != nil { + return fmt.Errorf("groth16: parse vk: %w", err) + } + + proof := groth16.NewProof(ecc.BLS12_381) + if _, err := proof.ReadFrom(bytes.NewReader(proofBytes)); err != nil { + return fmt.Errorf("groth16: parse proof: %w", err) + } + + pubW, err := witness.New(ecc.BLS12_381.ScalarField()) + if err != nil { + return fmt.Errorf("groth16: init witness: %w", err) + } + if _, err := pubW.ReadFrom(bytes.NewReader(publicInputsBytes)); err != nil { + return fmt.Errorf("groth16: parse public inputs: %w", err) + } + + if err := groth16.Verify(proof, vk, pubW); err != nil { + return fmt.Errorf("groth16: verify failed: %w", err) + } + return nil +} + +func init() { + Register(TypeGroth16, groth16Verifier{}) +} diff --git a/pkg/arkade/zkp/plonk.go b/pkg/arkade/zkp/plonk.go new file mode 100644 index 0000000..d98804a --- /dev/null +++ b/pkg/arkade/zkp/plonk.go @@ -0,0 +1,55 @@ +// PLONK verifier (BLS12-381 + KZG) using consensys/gnark. +// +// Wire format (matches gnark's standard binary marshaling): +// - vk: plonk.VerifyingKey.WriteTo bytes (BLS12-381 form) +// - publicInputs: witness.Witness.WriteTo bytes for the public-only witness +// - proof: plonk.Proof.WriteTo bytes (BLS12-381 form) +package zkp + +import ( + "bytes" + "fmt" + + "github.com/consensys/gnark-crypto/ecc" + "github.com/consensys/gnark/backend/plonk" + "github.com/consensys/gnark/backend/witness" +) + +type plonkVerifier struct{} + +// Verify checks a PLONK proof on BLS12-381 with KZG commitments. +func (plonkVerifier) Verify(vkBytes, publicInputsBytes, proofBytes []byte) error { + if len(vkBytes) == 0 { + return fmt.Errorf("plonk: empty verifying key") + } + if len(proofBytes) == 0 { + return fmt.Errorf("plonk: empty proof") + } + + vk := plonk.NewVerifyingKey(ecc.BLS12_381) + if _, err := vk.ReadFrom(bytes.NewReader(vkBytes)); err != nil { + return fmt.Errorf("plonk: parse vk: %w", err) + } + + proof := plonk.NewProof(ecc.BLS12_381) + if _, err := proof.ReadFrom(bytes.NewReader(proofBytes)); err != nil { + return fmt.Errorf("plonk: parse proof: %w", err) + } + + pubW, err := witness.New(ecc.BLS12_381.ScalarField()) + if err != nil { + return fmt.Errorf("plonk: init witness: %w", err) + } + if _, err := pubW.ReadFrom(bytes.NewReader(publicInputsBytes)); err != nil { + return fmt.Errorf("plonk: parse public inputs: %w", err) + } + + if err := plonk.Verify(proof, vk, pubW); err != nil { + return fmt.Errorf("plonk: verify failed: %w", err) + } + return nil +} + +func init() { + Register(TypePLONK, plonkVerifier{}) +} diff --git a/pkg/arkade/zkp/zkp.go b/pkg/arkade/zkp/zkp.go new file mode 100644 index 0000000..8fb59e9 --- /dev/null +++ b/pkg/arkade/zkp/zkp.go @@ -0,0 +1,107 @@ +// Package zkp provides SNARK verification primitives used by OP_VERIFY_ZKP. +// +// The opcode dispatches to a registered Verifier based on a 1-byte zkp_type +// pulled from the script stack. This package owns the Type enum, the Verifier +// interface, and the dispatch registry. Concrete verifiers (Groth16, PLONK, +// future trustless variants) live in sibling files and register themselves at +// init time. +package zkp + +import ( + "errors" + "fmt" +) + +// Type identifies a SNARK proof system. Allocated values match the type +// registry documented in `docs/specs/2026-05-01-arkade-asset-pool-v0-zkp.md` +// §1.2 and the introspector#77 issue body. +type Type byte + +const ( + // TypeGroth16 — Groth16 over BLS12-381. Per-circuit trusted setup. + // Smallest proofs (~200 B), fastest verification (3 pairings). + TypeGroth16 Type = 0x01 + // TypePLONK — PLONK over BLS12-381 with KZG commitments. Universal + // updatable trusted setup (one ceremony serves all circuits up to its + // constraint cap). ~500 B proofs, ~5 pairings to verify. + TypePLONK Type = 0x02 + // 0x03+ reserved for future systems (Halo 2, Plonky2, STARKs, Binius). + // Currently out of scope: their proof sizes exceed practical witness + // budgets (>10 KB) for current target use cases. +) + +// String returns a human-readable name for the type. Used in error messages +// and disassembly output. +func (t Type) String() string { + switch t { + case TypeGroth16: + return "Groth16" + case TypePLONK: + return "PLONK" + default: + return fmt.Sprintf("Unknown(0x%02x)", byte(t)) + } +} + +// Verifier verifies a single proof of the system it represents. Implementations +// must be deterministic, panic-free, and return a non-nil error on any +// validation failure (including malformed input). +// +// The byte arguments are passed verbatim from the script stack; each +// implementation owns the deserialization format. The canonical format used by +// the bundled Groth16 and PLONK verifiers is `gnark`'s standard binary +// marshaling — see groth16.go and plonk.go for the exact framing. +type Verifier interface { + // Verify checks that proof is valid for vk and publicInputs. It returns + // nil on success and a descriptive error on any failure (malformed + // inputs, soundness rejection, unsupported variant, etc.). + Verify(vk, publicInputs, proof []byte) error +} + +// ErrUnknownType is returned when Verify is called with a Type that has no +// registered implementation. Distinct from a verifier returning an error +// during Verify — this means the dispatch table itself doesn't recognize the +// requested system. +var ErrUnknownType = errors.New("zkp: unknown or unregistered zkp_type") + +// registry maps each registered Type to its Verifier. Populated at init time +// by sibling files (groth16.go, plonk.go). +var registry = map[Type]Verifier{} + +// Register adds a Verifier for the given Type. Subsequent calls for the same +// Type replace the prior registration. Concrete verifier files call this from +// their init() to register themselves; tests may also override registrations +// to inject mocks. +func Register(t Type, v Verifier) { + registry[t] = v +} + +// Lookup returns the registered Verifier for t, or ErrUnknownType if none. +// Exposed so callers (e.g., the opcode handler) can distinguish "no verifier +// available" from "verifier rejected the proof." +func Lookup(t Type) (Verifier, error) { + v, ok := registry[t] + if !ok { + return nil, fmt.Errorf("%w: %s", ErrUnknownType, t) + } + return v, nil +} + +// Verify dispatches to the registered Verifier for t and runs verification. +// Returns ErrUnknownType (or a wrap of it) if t isn't registered, otherwise +// returns whatever the Verifier returns (nil on success). +func Verify(t Type, vk, publicInputs, proof []byte) error { + v, err := Lookup(t) + if err != nil { + return err + } + return v.Verify(vk, publicInputs, proof) +} + +// IsRegistered reports whether t has a registered Verifier. Useful for +// configuration introspection (e.g., "what proof systems does this binary +// support?") without forcing a verification call. +func IsRegistered(t Type) bool { + _, ok := registry[t] + return ok +} diff --git a/pkg/arkade/zkp/zkp_test.go b/pkg/arkade/zkp/zkp_test.go new file mode 100644 index 0000000..11243e1 --- /dev/null +++ b/pkg/arkade/zkp/zkp_test.go @@ -0,0 +1,172 @@ +package zkp + +import ( + "bytes" + "testing" + + "github.com/consensys/gnark-crypto/ecc" + "github.com/consensys/gnark/backend/groth16" + "github.com/consensys/gnark/backend/plonk" + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/frontend/cs/scs" + "github.com/consensys/gnark/frontend/cs/r1cs" + kzg_bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381/kzg" + "github.com/consensys/gnark/test/unsafekzg" +) + +// squareCircuit proves: I know X such that X*X == Y, where Y is public. +type squareCircuit struct { + X frontend.Variable `gnark:",secret"` + Y frontend.Variable `gnark:",public"` +} + +func (c *squareCircuit) Define(api frontend.API) error { + api.AssertIsEqual(api.Mul(c.X, c.X), c.Y) + return nil +} + +func TestTypeString(t *testing.T) { + if TypeGroth16.String() != "Groth16" { + t.Fatalf("Groth16 stringer wrong: %s", TypeGroth16) + } + if TypePLONK.String() != "PLONK" { + t.Fatalf("PLONK stringer wrong: %s", TypePLONK) + } + if Type(0xff).String() != "Unknown(0xff)" { + t.Fatalf("Unknown stringer wrong: %s", Type(0xff)) + } +} + +func TestRegistry(t *testing.T) { + if !IsRegistered(TypeGroth16) { + t.Fatal("Groth16 not registered") + } + if !IsRegistered(TypePLONK) { + t.Fatal("PLONK not registered") + } + if IsRegistered(Type(0xff)) { + t.Fatal("0xff should not be registered") + } + if err := Verify(Type(0xff), nil, nil, nil); err == nil { + t.Fatal("expected ErrUnknownType") + } +} + +func TestGroth16RoundTrip(t *testing.T) { + // Compile circuit, run setup, prove, marshal, then verify via the + // dispatch path. This is a real end-to-end test — no precomputed + // fixtures, just gnark proving and our verifier accepting. + var c squareCircuit + ccs, err := frontend.Compile(ecc.BLS12_381.ScalarField(), r1cs.NewBuilder, &c) + if err != nil { + t.Fatalf("compile: %v", err) + } + pk, vk, err := groth16.Setup(ccs) + if err != nil { + t.Fatalf("setup: %v", err) + } + assignment := &squareCircuit{X: 5, Y: 25} + w, err := frontend.NewWitness(assignment, ecc.BLS12_381.ScalarField()) + if err != nil { + t.Fatalf("witness: %v", err) + } + pubW, err := w.Public() + if err != nil { + t.Fatalf("public witness: %v", err) + } + proof, err := groth16.Prove(ccs, pk, w) + if err != nil { + t.Fatalf("prove: %v", err) + } + + var pBuf, vkBuf, pubBuf bytes.Buffer + if _, err := proof.WriteTo(&pBuf); err != nil { + t.Fatalf("marshal proof: %v", err) + } + if _, err := vk.WriteTo(&vkBuf); err != nil { + t.Fatalf("marshal vk: %v", err) + } + if _, err := pubW.WriteTo(&pubBuf); err != nil { + t.Fatalf("marshal pubW: %v", err) + } + + // Honest proof verifies. + if err := Verify(TypeGroth16, vkBuf.Bytes(), pubBuf.Bytes(), pBuf.Bytes()); err != nil { + t.Fatalf("expected verify success, got: %v", err) + } + + // Tampered proof rejects. + tampered := append([]byte(nil), pBuf.Bytes()...) + tampered[0] ^= 0x01 + if err := Verify(TypeGroth16, vkBuf.Bytes(), pubBuf.Bytes(), tampered); err == nil { + t.Fatal("expected tampered proof to fail") + } + + // Wrong public input rejects. + wrongAssignment := &squareCircuit{X: 5, Y: 26} // 5*5 != 26 + wrongW, _ := frontend.NewWitness(wrongAssignment, ecc.BLS12_381.ScalarField()) + wrongPubW, _ := wrongW.Public() + var wrongBuf bytes.Buffer + wrongPubW.WriteTo(&wrongBuf) + if err := Verify(TypeGroth16, vkBuf.Bytes(), wrongBuf.Bytes(), pBuf.Bytes()); err == nil { + t.Fatal("expected wrong-input proof to fail") + } +} + +func TestPLONKRoundTrip(t *testing.T) { + var c squareCircuit + ccs, err := frontend.Compile(ecc.BLS12_381.ScalarField(), scs.NewBuilder, &c) + if err != nil { + t.Fatalf("compile: %v", err) + } + // PLONK needs a KZG SRS. unsafekzg generates one in-test (NOT for + // production use; production must use a public ceremony's SRS). + srs, srsLagrange, err := unsafekzg.NewSRS(ccs) + if err != nil { + t.Fatalf("srs: %v", err) + } + pk, vk, err := plonk.Setup(ccs, srs, srsLagrange) + if err != nil { + t.Fatalf("setup: %v", err) + } + assignment := &squareCircuit{X: 7, Y: 49} + w, err := frontend.NewWitness(assignment, ecc.BLS12_381.ScalarField()) + if err != nil { + t.Fatalf("witness: %v", err) + } + pubW, err := w.Public() + if err != nil { + t.Fatalf("public witness: %v", err) + } + proof, err := plonk.Prove(ccs, pk, w) + if err != nil { + t.Fatalf("prove: %v", err) + } + + var pBuf, vkBuf, pubBuf bytes.Buffer + if _, err := proof.WriteTo(&pBuf); err != nil { + t.Fatalf("marshal proof: %v", err) + } + if _, err := vk.WriteTo(&vkBuf); err != nil { + t.Fatalf("marshal vk: %v", err) + } + if _, err := pubW.WriteTo(&pubBuf); err != nil { + t.Fatalf("marshal pubW: %v", err) + } + + if err := Verify(TypePLONK, vkBuf.Bytes(), pubBuf.Bytes(), pBuf.Bytes()); err != nil { + t.Fatalf("expected verify success, got: %v", err) + } + + // Tampered proof rejects. + tampered := append([]byte(nil), pBuf.Bytes()...) + tampered[0] ^= 0x01 + if err := Verify(TypePLONK, vkBuf.Bytes(), pubBuf.Bytes(), tampered); err == nil { + t.Fatal("expected tampered proof to fail") + } +} + +// Compile-time assertion that we're using the BLS12-381 KZG package — pulls +// it into the import graph so go.mod tooling resolves it correctly. (gnark +// loads it lazily otherwise, which can confuse `go mod tidy` in some cases.) +var _ = kzg_bls12381.SRS{} From 5bbc008869e8894d4fad859bbe829f1ad1141c0d Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Sun, 3 May 2026 19:21:20 +0200 Subject: [PATCH 2/2] fix: bump gnark to v0.14.0 and gnark-crypto to v0.19.2 Address two HIGH-severity CVEs flagged by Trivy: - CVE-2025-57801 in gnark v0.13.0: signature malleability in EdDSA and ECDSA implementations. Fixed in v0.14.0. - GHSA-fj2x-735w-74vq in gnark-crypto v0.18.0: unchecked memory allocation during vector deserialization. Fixed in v0.19.2. Neither vulnerability is reachable via OP_VERIFY_ZKP's verification path (we use Groth16 / PLONK over BLS12-381, not EdDSA / ECDSA, and gnark's own bounded WriteTo / ReadFrom serializers, not raw vector deserializers). But they're shipped in the binary, and the security scan blocks merge, so the upgrade is the right move regardless of reachability. --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ pkg/arkade/go.mod | 10 +++++----- pkg/arkade/go.sum | 11 +++++++++++ 4 files changed, 34 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index bab8382..c8a3763 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/arkade-os/arkd/pkg/kvdb v0.7.1-0.20260216152434-74a173c67a37 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.22.0 // indirect + github.com/bits-and-blooms/bitset v1.24.0 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4 // indirect @@ -57,8 +57,8 @@ require ( github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/consensys/gnark v0.13.0 // indirect - github.com/consensys/gnark-crypto v0.18.0 // indirect + github.com/consensys/gnark v0.14.0 // indirect + github.com/consensys/gnark-crypto v0.19.2 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect @@ -69,7 +69,7 @@ require ( github.com/dgraph-io/ristretto/v2 v2.2.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-macaroon-bakery/macaroonpb v1.0.0 // indirect @@ -81,7 +81,7 @@ require ( github.com/google/btree v1.1.2 // indirect github.com/google/cel-go v0.26.1 // indirect github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect + github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect @@ -159,7 +159,7 @@ require ( go.uber.org/zap v1.27.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/crypto v0.48.0 // indirect - golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect + golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect golang.org/x/mod v0.32.0 // indirect golang.org/x/sync v0.19.0 // indirect golang.org/x/sys v0.41.0 // indirect diff --git a/go.sum b/go.sum index 52e5007..6ebe2d0 100644 --- a/go.sum +++ b/go.sum @@ -38,8 +38,8 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= -github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.24.0 h1:H4x4TuulnokZKvHLfzVRTHJfFfnHEeSYJizujEZvmAM= +github.com/bits-and-blooms/bitset v1.24.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= @@ -97,10 +97,10 @@ github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q1 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/consensys/gnark v0.13.0 h1:NDsMmyknIEJA3S/2u1PZSsSIRVXFroICN1jYR+tyR2c= -github.com/consensys/gnark v0.13.0/go.mod h1:F6k35ZIi9GC//wW2i9Fz9mURBcLF8qJLQQ/BETnQ9Z4= -github.com/consensys/gnark-crypto v0.18.0 h1:vIye/FqI50VeAr0B3dx+YjeIvmc3LWz4yEfbWBpTUf0= -github.com/consensys/gnark-crypto v0.18.0/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c= +github.com/consensys/gnark v0.14.0 h1:RG+8WxRanFSFBSlmCDRJnYMYYKpH3Ncs5SMzg24B5HQ= +github.com/consensys/gnark v0.14.0/go.mod h1:1IBpDPB/Rdyh55bQRR4b0z1WvfHQN1e0020jCvKP2Gk= +github.com/consensys/gnark-crypto v0.19.2 h1:qrEAIXq3T4egxqiliFFoNrepkIWVEeIYwt3UL0fvS80= +github.com/consensys/gnark-crypto v0.19.2/go.mod h1:rT23F0XSZqE0mUA0+pRtnL56IbPxs6gp4CeRsBk4XS0= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -162,8 +162,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= -github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= @@ -232,8 +232,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18= -github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= +github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 h1:EEHtgt9IwisQ2AZ4pIsMjahcegHh6rmhqxzIRQIyepY= +github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -574,8 +574,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4= -golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= +golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0= +golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= diff --git a/pkg/arkade/go.mod b/pkg/arkade/go.mod index b3a0eae..b52d90c 100644 --- a/pkg/arkade/go.mod +++ b/pkg/arkade/go.mod @@ -9,8 +9,8 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.5 github.com/btcsuite/btcd/btcutil/psbt v1.1.9 github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 - github.com/consensys/gnark v0.13.0 - github.com/consensys/gnark-crypto v0.18.0 + github.com/consensys/gnark v0.14.0 + github.com/consensys/gnark-crypto v0.19.2 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 github.com/stretchr/testify v1.11.1 golang.org/x/crypto v0.48.0 @@ -18,14 +18,14 @@ require ( require ( github.com/arkade-os/arkd/pkg/errors v0.0.0-20260303153651-8615412e4dea // indirect - github.com/bits-and-blooms/bitset v1.22.0 // indirect + github.com/bits-and-blooms/bitset v1.24.0 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/btcsuite/btcd/btcutil v1.1.5 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/crypto/blake256 v1.1.0 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect - github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect github.com/ingonyama-zk/icicle-gnark/v3 v3.2.2 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect diff --git a/pkg/arkade/go.sum b/pkg/arkade/go.sum index 7d9b4b3..329c306 100644 --- a/pkg/arkade/go.sum +++ b/pkg/arkade/go.sum @@ -7,6 +7,8 @@ github.com/arkade-os/arkd/pkg/errors v0.0.0-20260303153651-8615412e4dea h1:x9ZwZ github.com/arkade-os/arkd/pkg/errors v0.0.0-20260303153651-8615412e4dea/go.mod h1:NYGE+baj57ynbXNwjISJddMDpMqAWOX27dV22xqFm2A= github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.24.0 h1:H4x4TuulnokZKvHLfzVRTHJfFfnHEeSYJizujEZvmAM= +github.com/bits-and-blooms/bitset v1.24.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= @@ -40,8 +42,12 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/consensys/gnark v0.13.0 h1:NDsMmyknIEJA3S/2u1PZSsSIRVXFroICN1jYR+tyR2c= github.com/consensys/gnark v0.13.0/go.mod h1:F6k35ZIi9GC//wW2i9Fz9mURBcLF8qJLQQ/BETnQ9Z4= +github.com/consensys/gnark v0.14.0 h1:RG+8WxRanFSFBSlmCDRJnYMYYKpH3Ncs5SMzg24B5HQ= +github.com/consensys/gnark v0.14.0/go.mod h1:1IBpDPB/Rdyh55bQRR4b0z1WvfHQN1e0020jCvKP2Gk= github.com/consensys/gnark-crypto v0.18.0 h1:vIye/FqI50VeAr0B3dx+YjeIvmc3LWz4yEfbWBpTUf0= github.com/consensys/gnark-crypto v0.18.0/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c= +github.com/consensys/gnark-crypto v0.19.2 h1:qrEAIXq3T4egxqiliFFoNrepkIWVEeIYwt3UL0fvS80= +github.com/consensys/gnark-crypto v0.19.2/go.mod h1:rT23F0XSZqE0mUA0+pRtnL56IbPxs6gp4CeRsBk4XS0= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -59,6 +65,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= @@ -76,6 +84,8 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18= github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= +github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 h1:EEHtgt9IwisQ2AZ4pIsMjahcegHh6rmhqxzIRQIyepY= +github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ingonyama-zk/icicle-gnark/v3 v3.2.2 h1:B+aWVgAx+GlFLhtYjIaF0uGjU3rzpl99Wf9wZWt+Mq8= @@ -134,6 +144,7 @@ golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4= golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= +golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=