Skip to content

Commit edd8fc8

Browse files
committed
feat : add leaf nil node
1 parent 71d3045 commit edd8fc8

File tree

10 files changed

+87
-19
lines changed

10 files changed

+87
-19
lines changed

circuit/constants.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ import "math/big"
44

55
var (
66
// is poseidon hash(empty account info)
7-
EmptyAccountLeafNodeHash, _ = new(big.Int).SetString("221970e0ba2d0b02a979e616cf186305372e73aab1e74f749772c9fef54dbf91", 16)
7+
EmptyAccountLeafNodeHash, _ = new(big.Int).SetString("2853aadbbd06deb5d6a1389d23a89ff47658aaf4a45b287ecfd62df192bd91a4", 16)
88
)

config/cex_config.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

config/config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"MysqlDataSource" : "root:mysqlpw@tcp(127.0.0.1:55000)/zkpos?parseTime=true",
2+
"MysqlDataSource" : "root:root@tcp(127.0.0.1:3306)/zkpos?parseTime=true",
33
"DbSuffix": "202307",
44
"UserDataFile": "./example_data/",
55
"TreeDB": {

config/proof.csv

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
"id","created_at","updated_at","deleted_at","proof_info","cex_asset_list_commitments","account_tree_roots","batch_commitment","batch_number"
2-
"1","19/10/2023 15:59:53.995","19/10/2023 15:59:53.995",,"B0YgMyGKl1jmXpB/PXLYv9tggjPikOG1qO9Mnl6/xTkfoTsdvvS8JNxpIzgrJGVO3q9Ic0kwe906Z2W8CI/CKQmtIjqDMMlH47dtAT5TycUr8oU98zmo5poXbFgIGcS9FCu+Oibi54WD3vTtpSXLYX0Wo3Sq1ilOHED6l+usr9gkhNcq3gFyGfqq3h3qn04rS4StUMM41NgeKDwW1ikUVB4gRlw4CxGdk75MoZ/1hi2JtvsG0Iig3sIrNKOtTnocLaqglS37kNV4fbGs/5AK3ToTv1u5FfdM0VkDFtT6Q+kBY0lnOdwAP+cy0vFcKcShbNz3WxIBsQbEGeXMzlsefw==","[""BmxPGz4vr4WzdQShYpRzvd3M5iQ0oNyrctaMRTniLrM="",""KC+K1b64VeowYIjMaTE6tM0vEY9++pQ8+ySorEiLUoc=""]","[""ARiSWVTad9GkskH9Fj5Dc+ImXFFc+mCvf80oyMua1Yo="",""L2bJjAl9w9xlTO+tfTb7eRa+xBnXdqZ1B4uHWOrA5Jk=""]","I5EaSCAMUc976+XAUXh25LrAv/38dVlgqp/1+ZFRNdU=","0"
3-
"2","19/10/2023 15:59:56.309","19/10/2023 15:59:56.309",,"FJbOtDNYwHZQcNY+d4NYDpLmr/dnXM3a4TKuKR4qMsAP5yLwWyGLt6Da0e8Z87HhvGZWr+OmaNMtCLrvHziYGgkWgAkhCstz4dP4yaUU/EdE9N2A3fkA6K9JWHc4fEOEGYfgU+pbgU08TPmIIN1/XhumopTK9pIXCV7LhCipTE4J+bhFHmhcwwkMpKOAlqUQpxxMUms4N7is1BzWbk9XjAmrQh1W51lJ3iCweDlVMVFu2FKeDKc/3fRo/QwVv/tzC5uU67O0cqd069FTa7pTacBT740nni/ssr6FikSKJMsjXFoHcgX5M+Slzuoouo/l+bPRvGNe4lKQOZHSif8hOA==","[""KC+K1b64VeowYIjMaTE6tM0vEY9++pQ8+ySorEiLUoc="",""InU1xHqOfXWEHxQGKMkeUliS61RBJtrW68VNBNEAcJM=""]","[""L2bJjAl9w9xlTO+tfTb7eRa+xBnXdqZ1B4uHWOrA5Jk="",""C0cybIeJHMhcZItYgsn/XYJXA2Orfut0fJ61wDtlAxg=""]","DD7De3MNCgJ5YbL8T5wUrXvT5x6/VgAxwFzw35BBDvs=","1"
2+
"1","23/7/2025 08:40:25.372","23/7/2025 08:40:25.372",,"HIRmlRnao41iubEBbMpcUzrCIBHPNr7OCLeix2NLU+cOo3gqPNFOLEMDDfKzle1Hv9DxL30EkMTsRBcjrvcs6Su7jnQFHcIYuAxNTTzw0SgpQl4NsFsZiD7GGrFf2wqzGjwcwhV3s77+O/utCHTOndOYcEPRGVXfAUZvYDpmxQQKeAaubKgxee3Lse/sdJRMnvffrVR4rYMRmJNt7keIoRaJg2hhiuOyt9iNLls3lHkUF+hRpf3wSdLw7RiUeyMcJIE2iHKsKwmIO+hIGFcv/bcaUVS6GlqaJo2aZaS+T04wW4089hSfZUXPRvy37NHuEDXjPYC4R0YrHKIyJyIDrQ==","[""MBZLXih2qaSsy5+kxd9MQi3PHU/KpAGvtqaMHzq/DAU="",""BHduhl9MAeEdh9JGDS0+9tiBn+U2g+NuylX3jjHReWk=""]","[""A3v22P5bfLrs97NWBLV/ghc/XIFVwcdQzvAK/rzWVDY="",""Ln4BrVHVxmjo1YG+g/z+gGZEt8g0h21UCxiIFqZ3eOY=""]","E8ydcbMXhbWubjoZWGY4v6Pku78SzQPJ7ZsIQJlBvGY=","0"

config/user_config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"Arrangement":5,"UniqueIdentification":"0000b4a15114c094443b386dd99c462d8dca059a6025eea47f28a80767b4cbc2","TotalAssetEquity":15464396887760000,"TotalAssetDebt":0,"AssetDetails":[{"Index":53,"Equity":38,"Debt":0},{"Index":180,"Equity":400000000,"Debt":0},{"Index":306,"Equity":128,"Debt":0}],"TreeRootHash":"0b47326c87891cc85c648b5882c9ff5d82570363ab7eeb747c9eb5c03b650318","MerkleProofEncode":["FYBG701cN8Ox33HIsOMDDcJJPN4ycanCryMvY/kHqFY=","CRHdH+Rkdrd/AHgEQSw2Eg1ZiT0U5UsqVfCwgSkPt4A=","KZtpTv2ktWcI5qGWX6km9Ubs/8CqPO22EGpCIwbVmTQ=","Co6rANO8HLSdz5kG+2QYGx3lFGEz1oPcJ0LxZfxT6ZY=","KR17Y6bUSy/mZmuLWicq8+iSa4t3IhgdH/NiQ5yulMM=","GTQjMumYzw7OMkDpvGB9e4g4gfGaGdf7uRCmtUO9gwM=","JaRSES3N43lA+aCXqIIql/raDzZnWEYB7qaC5/34f30=","Ijs0Lr+DM/ZtWATs29ePCuqHwZn1JY5zUXhVAsJ9Aoo=","GML/iwCEjgYlSAmd4cQQhKsjH+xscIG6hbM5HP+OP/I=","BBXHrrH1oIGsjK1PsZt1d+ovsDW5IvHxFUlt8CJ3j/M=","F6GyEMWOjvKBgKDCCkQiOfc5SvGEt2MWyQTzszXzd6Y=","JDZjD4o0q6cGYJzj0BBaBEBEN4y4UjYgMSNIXf2P6Ps=","C+Mh1228yGv2Or6yQs3U0sjBzxxWJPTyH5GNG3FzMbk=","Jpo3tkE2KgMxWoEdMM1sOyJsM9YjsI9aONsEEqmMPnA=","FaWOvl42fYbklbc9WgWFqeW3Q/54KXT5zYdIGyCh9iE=","EvcLzRuRio6YT9QjSPp0GGGFYSIW8fKOqQlcOXFBBwo=","LJos88T9kz5kG0o+yeNX0ij+WwrOEIqRVpJtOrUrnns=","CFv3HhUsTXNa3iT/cc+GhD9lV+weuSWoJJRVgZmn7fQ=","EyfPjcon6R+nXBDT/9++ddQqlxiBaSaTMBiC0R6NPoM=","HOtPMAkz3JJG3n0bxNIqkR1p/Q758Em1Jjn1KE6A2mg=","Lq3n7B3Bs7ILnDLG17szIf9O0OdotsWpSLwejnJVcLY=","HthvmzZ/MHbOWVSuFyc9sUvuSz0ddveEwoyQExrim5k=","BOxHEGxRtmNch1R57kgKMxiBVnR/tCo9y3XcJco7Saw=","Dilkpy2L945iR+BsbaffA7MBZSNofd2PdZSkzN48DOE=","Fotw+U5orv9231KkpBYOXM+odtZGgCaNw5zOY+xZ5Oc=","J7pOZTvxtC7B8RzevUvrd90GfrH2oxtRqkEF+mFdCuc=","EUZQwQDUH48osqrtgcPuAQsQvdVKTC+hYmKvIhzImZQ=","HKC2vx3pnDTdfyrzYjCbJMcxojJfvuyzj2/rMMiMplQ="]}
1+
{"Arrangement":0,"UniqueIdentification":"151471e6f7b7e67511800b8e56f6b8e3df52b0d8854f89d94193a0303682a985","TotalAssetEquity":1737312900000000,"TotalAssetDebt":0,"AssetDetails":[{"Index":110,"Equity":29774,"Debt":0}],"TreeRootHash":"2e7e01ad51d5c668e8d581be83fcfe806644b7c834876d540b188816a67778e6","MerkleProofEncode":["KFOq270G3rXWoTidI6if9HZYqvSkWyh+z9Yt8ZK9kaQ=","EbNWeLOuF1LPF5MOGm8301n1/dUErCHUKq0O7hIGGko=","IEeL496JK3jde0I7HOf9KBkTD4CTRvC5NZGfcOKe2sQ=","BzH6K1nYlUFlRebxL5gqdk98snFwWg/Kc5HeAw+ofSM=","JGhFkRo/y2HE3H0ETjflVplUA9y7MmhjOMqZeTOMlGs=","D27NBdz1wPs8OqBDnY2b2lVqLZTgPM5Mgl1OFe2RaK8=","L8ZMjITh3cSS8MYe1ZvrR4o8lUdQqZX1zR16267tGV0=","L081hh84oNgsmWn8p8hO6wQy76uvyf0pScT7x7OGepU=","CaCS9sFrRl3QvpyDH34Wo67qokPUS9fHNCqegiDu2VE=","Gfhlga/yk87UYI+yH4FhAz0U3KE1qzaI37LNz+W5b1Q=","EYp5tMHVVq3KavMWYLIzA3J4jXIed8IGDXp+ylt1W4c=","EIMDICXBI1EUjqthw2aAGD3BSY7I1sZlYWMzwwGS6tU=","GWHLdyhxjUA8/PxCG271VQTqtZ9MBFoKMOUl5jbBQsQ=","EOUsCnQgMW9JAi0RiG7R7rQV1wM3UHNoQk3GFPqOLbM=","HzeAZCE1p00hkuCUDRzEksRZICttXVH+cf3PfsHMIxc=","DtCg+tvSIF7wIM9yo2Yt3TqvePl+xdZDr9ATX8e2cpc=","AYvet0OlgFcn3HI93Nj7LcmIfh+YIUe9YHfl7Vtal3Q=","E6Y8fK67hoQSLp0eXp7An04XcccnPz15E35r29iYzrk=","I6Go6aDT1gw37OUvoc2jpBZSbAqsBtZhMZiPJkrG4sc=","D1+pYf9FllwIZdntWUCT5EWLz64fo5SgIk+Oiz4kWCY=","CHKAVHnE0vFq7HTa1zfdOU7K/2T2d9VMfBBCdnh5zT0=","BI1oivQjtT0cS1QVEe5y4XujSLsNxXVbrGOoeVZSM0o=","AJfR2Ooiu4mlJhLQvaIe6zyVNG4VLrhBvM4C1pWYno8=","IS/w6ZM/m4W5Lk3Z0ZWIgynnguW9GIJgEgjbDOVBLa4=","CH+attHavPkQiteZ0OfH5IiOyzmHQUq+e8pvfAFyZB8=","IRgQ73CejDyl0SEor22Ol3tj57mlaqAfLB7T7TsBfug=","FMXAjb/IRiryqACdNnToiCLhc0e6uj9QwaUCEANQE28=","ECxfsJKNnJEyMC3hZW+e43aB0GO2UG9a/EykCY+AgVE="]}

example_data/PoR0612.csv

Lines changed: 2 additions & 0 deletions
Large diffs are not rendered by default.

example_data/example_users.csv

Lines changed: 0 additions & 9 deletions
This file was deleted.

hash_verification_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"gate-zkmerkle-proof/utils"
8+
9+
"hash"
10+
11+
"github.com/consensys/gnark-crypto/ecc/bn254/fr"
12+
"github.com/consensys/gnark-crypto/ecc/bn254/fr/poseidon"
13+
zk_smt "github.com/gatechain/gate-zk-smt"
14+
"github.com/gatechain/gate-zk-smt/database/memory"
15+
)
16+
17+
// 电路常量 计算空账户叶子节点哈希 TestEmptyAccountLeafNodeHash
18+
func TestEmptyAccountLeafNodeHash(t *testing.T) {
19+
// 1. 创建零值元素
20+
zero := &fr.Element{0, 0, 0, 0}
21+
fmt.Printf("1. 零值元素: %v\n", zero)
22+
23+
// 2. 创建 Poseidon 哈希器
24+
poseidonHasher := poseidon.NewPoseidon()
25+
fmt.Printf("2. 创建 Poseidon 哈希器\n")
26+
27+
// 3. 创建空资产列表(模拟项目中的逻辑)
28+
emptyAssets := make([]utils.AccountAsset, utils.AssetCounts)
29+
for i := 0; i < utils.AssetCounts; i++ {
30+
emptyAssets[i].Index = uint16(i)
31+
// Equity 和 Debt 默认为 0
32+
}
33+
fmt.Printf("3. 创建了 %d 个空资产,每个资产的 Equity=0, Debt=0\n", utils.AssetCounts)
34+
35+
// 4. 计算空资产的承诺(调用项目中的实际方法)
36+
fmt.Printf("4. 调用 utils.ComputeUserAssetsCommitment 计算资产承诺...\n")
37+
emptyAssetCommitment := utils.ComputeUserAssetsCommitment(&poseidonHasher, emptyAssets)
38+
fmt.Printf(" 空资产承诺: %x\n", emptyAssetCommitment)
39+
40+
tempHash := poseidon.Poseidon(zero, zero, zero, new(fr.Element).SetBytes(emptyAssetCommitment)).Bytes()
41+
fmt.Printf(" 计算得到的空账户哈希: %x\n", tempHash)
42+
}
43+
44+
func TestEmptyAccountTreeRoot(t *testing.T) {
45+
// 1. 计算 NilAccountHash(空账户叶子节点哈希)
46+
fmt.Printf("1. 计算 NilAccountHash...\n")
47+
zero := &fr.Element{0, 0, 0, 0}
48+
poseidonHasher := poseidon.NewPoseidon()
49+
emptyAssets := make([]utils.AccountAsset, utils.AssetCounts)
50+
for i := 0; i < utils.AssetCounts; i++ {
51+
emptyAssets[i].Index = uint16(i)
52+
}
53+
emptyAssetCommitment := utils.ComputeUserAssetsCommitment(&poseidonHasher, emptyAssets)
54+
tempHash := poseidon.Poseidon(zero, zero, zero, new(fr.Element).SetBytes(emptyAssetCommitment)).Bytes()
55+
nilAccountHash := tempHash[:]
56+
fmt.Printf(" NilAccountHash: %x\n", nilAccountHash)
57+
58+
// 2. 创建空账户树
59+
fmt.Printf("2. 创建深度为 %d 的空账户树...\n", utils.AccountTreeDepth)
60+
hasher := zk_smt.NewHasherPool(func() hash.Hash {
61+
return poseidon.NewPoseidon()
62+
})
63+
db := memory.NewMemoryDB()
64+
accountTree, err := zk_smt.NewGateSparseMerkleTree(hasher, db, utils.AccountTreeDepth, nilAccountHash)
65+
if err != nil {
66+
t.Fatalf("创建账户树失败: %v", err)
67+
}
68+
69+
// 3. 获取空树根
70+
fmt.Printf("3. 获取空账户树根...\n")
71+
emptyTreeRoot := accountTree.Root()
72+
fmt.Printf(" 空账户树根: %x\n", emptyTreeRoot)
73+
}

service/verify_service/service.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ import (
1010
"gate-zkmerkle-proof/config"
1111
prover_server "gate-zkmerkle-proof/service/prover_service"
1212
"gate-zkmerkle-proof/utils"
13+
"io/ioutil"
14+
"os"
15+
1316
"github.com/consensys/gnark-crypto/ecc"
1417
"github.com/consensys/gnark-crypto/ecc/bn254/fr/poseidon"
1518
"github.com/consensys/gnark/backend/groth16"
1619
"github.com/consensys/gnark/frontend"
1720
"github.com/gocarina/gocsv"
18-
"io/ioutil"
19-
"os"
2021
)
2122

2223
type Proof struct {
@@ -68,7 +69,7 @@ func CexVerify() {
6869
prevCexAssetListCommitments := make([][]byte, 2)
6970
prevAccountTreeRoots := make([][]byte, 2)
7071
// depth-28 empty account tree root
71-
emptyAccountTreeRoot, err := hex.DecodeString("0118925954da77d1a4b241fd163e4373e2265c515cfa60af7fcd28c8cb9ad58a")
72+
emptyAccountTreeRoot, err := hex.DecodeString("037bf6d8fe5b7cbaecf7b35604b57f82173f5c8155c1c750cef00afebcd65436")
7273
if err != nil {
7374
fmt.Println("wrong empty empty account tree root")
7475
return
@@ -152,6 +153,8 @@ func CexVerify() {
152153

153154
if string(accountTreeRoots[0]) != string(prevAccountTreeRoots[1]) ||
154155
string(cexAssetListCommitments[0]) != string(prevCexAssetListCommitments[1]) {
156+
fmt.Println(base64.StdEncoding.EncodeToString(accountTreeRoots[0]))
157+
fmt.Println(base64.StdEncoding.EncodeToString(prevAccountTreeRoots[1]))
155158
fmt.Println(base64.StdEncoding.EncodeToString(cexAssetListCommitments[0]))
156159
fmt.Println(base64.StdEncoding.EncodeToString(prevCexAssetListCommitments[1]))
157160
fmt.Println("mismatch account tree root or cex asset list commitment:", batchNumber)

utils/constants.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
const (
1010
BatchCreateUserOpsCounts = 864
1111
AccountTreeDepth = 28
12-
AssetCounts = 350
12+
AssetCounts = 800
1313
RedisLockKey = "prover_mutex_key"
1414
)
1515

0 commit comments

Comments
 (0)