# gnark quick > test for paragraph post with a simple gnark quickstart **Published by:** [gentalman12138](https://paragraph.com/@gentalman12138/) **Published on:** 2025-02-17 **Categories:** gnark, zk-snark, dev **URL:** https://paragraph.com/@gentalman12138/gnark-quickstart ## Content 前期准备安装 [[basic#go]]安装 gnarkgo get github.com/consensys/gnark@latest新建项目mkdir quick-start cd quick-start go mod init quickstart touch main.go一个简单电路// 定义一个简单的电路结构 type SimpleCircuit struct { X frontend.Variable `gnark:"x"` // 输入变量 X Y frontend.Variable `gnark:",public"` // 公共输出变量 Y } // 定义电路的逻辑:Y = X^3 + X + 5 func (sc *SimpleCircuit) Define(api frontend.API) error { // 计算 X 的立方 x3 := api.Mul(sc.X, sc.X, sc.X) // 计算 Y 的值 res := api.Add(x3, sc.X, 5) // 断言 Y 等于计算结果 api.AssertIsEqual(sc.Y, res) return nil }Runpackage main import ( "fmt" "github.com/consensys/gnark-crypto/ecc" "github.com/consensys/gnark/backend/groth16" "github.com/consensys/gnark/frontend" "github.com/consensys/gnark/frontend/cs/r1cs" ) // 定义一个简单的电路结构 type SimpleCircuit struct { X frontend.Variable `gnark:"x"` // 输入变量 X Y frontend.Variable `gnark:",public"` // 公共输出变量 Y } // 定义电路的逻辑:Y = X^3 + X + 5 func (sc *SimpleCircuit) Define(api frontend.API) error { // 计算 X 的立方 x3 := api.Mul(sc.X, sc.X, sc.X) // 计算 Y 的值 res := api.Add(x3, sc.X, 5) // 断言 Y 等于计算结果 api.AssertIsEqual(sc.Y, res) return nil } func main() { // 创建一个 SimpleCircuit 实例 var myCircuit SimpleCircuit // 编译电路,生成 R1CS r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &myCircuit) if err != nil { fmt.Println(err) return } // 设置证明密钥和验证密钥 pk, vk, err := groth16.Setup(r1cs) if err != nil { fmt.Println(err) return } // 创建一个有效的电路实例 validCircuit := &SimpleCircuit{ X: 1, // 输入 X 的值 Y: 7, // 预期输出 Y 的值 } // 创建Witness witness, err := frontend.NewWitness(validCircuit, ecc.BN254.ScalarField()) if err != nil { fmt.Println(err) return } // 生成证明 proof, err := groth16.Prove(r1cs, pk, witness) if err != nil { fmt.Println(err) return } // 创建一个公共电路实例 publicCircuit := &SimpleCircuit{ Y: 7, // 公共输出 Y 的值 } // 创建公共见证 publicWitness, err := frontend.NewWitness(publicCircuit, ecc.BN254.ScalarField(), frontend.PublicOnly()) if err != nil { fmt.Println(err) return } // 验证证明 err = groth16.Verify(proof, vk, publicWitness) if err != nil { fmt.Println(err) } else { // 验证成功 fmt.Printf("Verify success !") } }运行结果:❯ go run ./main.go 02:15:14 INF compiling circuit 02:15:14 INF parsed circuit inputs nbPublic=1 nbSecret=1 02:15:14 INF building constraint builder nbConstraints=3 02:15:14 DBG constraint system solver done nbConstraints=3 took=0.02669 02:15:14 DBG prover done acceleration=none backend=groth16 curve=bn254 nbConstraints=3 took=0.525176 02:15:14 DBG verifier done backend=groth16 curve=bn254 took=0.486966 Verify success ! ## Publication Information - [gentalman12138](https://paragraph.com/@gentalman12138/): Publication homepage - [All Posts](https://paragraph.com/@gentalman12138/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@gentalman12138): Subscribe to updates ## Optional - [Collect as NFT](https://paragraph.com/@gentalman12138/gnark-quickstart): Support the author by collecting this post - [View Collectors](https://paragraph.com/@gentalman12138/gnark-quickstart/collectors): See who has collected this post