Skip to content

Commit bebfd19

Browse files
committed
remove the hasher argument from the SMT node constructors
Signed-off-by: Jim Zhang <jim.zhang@kaleido.io>
1 parent 0f735fa commit bebfd19

File tree

16 files changed

+168
-93
lines changed

16 files changed

+168
-93
lines changed

go-sdk/integration-test/common/smt.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func BuildMerkleProofs(inputCommitments []*big.Int, db core.Storage, t *testing.
4141
func AddCommitmentToMerkleTree(mt core.SparseMerkleTree, commitment *big.Int, t *testing.T) {
4242
idx, _ := node.NewNodeIndexFromBigInt(commitment, &hash.PoseidonHasher{})
4343
utxo := node.NewIndexOnly(idx)
44-
n, err := node.NewLeafNode(utxo, nil, &hash.PoseidonHasher{})
44+
n, err := node.NewLeafNode(utxo, nil)
4545
assert.NoError(t, err)
4646
err = mt.AddLeaf(n)
4747
assert.NoError(t, err)

go-sdk/integration-test/db_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func (s *SqliteTestSuite) TestSqliteStorage() {
6767
salt1 := crypto.NewSalt()
6868

6969
utxo1 := node.NewNonFungible(tokenId, uriString, sender.PublicKey, salt1, hasher)
70-
n1, err := node.NewLeafNode(utxo1, nil, hasher)
70+
n1, err := node.NewLeafNode(utxo1, nil)
7171
assert.NoError(s.T(), err)
7272
err = mt.AddLeaf(n1)
7373
assert.NoError(s.T(), err)
@@ -120,7 +120,7 @@ func TestPostgresStorage(t *testing.T) {
120120
salt1 := crypto.NewSalt()
121121

122122
utxo1 := node.NewNonFungible(tokenId, tokenUri, sender.PublicKey, salt1, hasher)
123-
n1, err := node.NewLeafNode(utxo1, nil, hasher)
123+
n1, err := node.NewLeafNode(utxo1, nil)
124124
assert.NoError(t, err)
125125
err = mt.AddLeaf(n1)
126126
assert.NoError(t, err)

go-sdk/integration-test/e2e_anon_nullifier_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (s *E2ETestSuite) TestZeto_anon_nullifier_locked_SuccessfulProving() {
8181

8282
for i, value := range s.regularTest.InputValues {
8383
utxo := node.NewFungible(value, s.sender.PublicKey, s.regularTest.InputSalts[i], hasher)
84-
n, err := node.NewLeafNode(utxo, senderEthAddress, hasher)
84+
n, err := node.NewLeafNode(utxo, senderEthAddress)
8585
assert.NoError(s.T(), err)
8686
err = mt.AddLeaf(n)
8787
assert.NoError(s.T(), err)

go-sdk/integration-test/e2e_nf_anon_nullifier_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func (s *E2ETestSuite) TestZeto_nf_anon_nullifier_SuccessfulProving() {
5656
mt, err := smt.NewMerkleTree(s.db, common.MAX_HEIGHT)
5757
assert.NoError(s.T(), err)
5858
utxo1 := node.NewNonFungible(tokenId, uriString, sender.PublicKey, salt1, hasher)
59-
n1, err := node.NewLeafNode(utxo1, nil, hasher)
59+
n1, err := node.NewLeafNode(utxo1, nil)
6060
assert.NoError(s.T(), err)
6161
err = mt.AddLeaf(n1)
6262
assert.NoError(s.T(), err)

go-sdk/integration-test/smt_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func testConcurrentInsertion(t *testing.T, alice *babyjub.PublicKey, values []in
8282
go func(i, v int) {
8383
salt, _ := new(big.Int).SetString(salts[i], 16)
8484
utxo := node.NewFungible(big.NewInt(int64(v)), alice, salt, hasher)
85-
n, err := node.NewLeafNode(utxo, nil, hasher)
85+
n, err := node.NewLeafNode(utxo, nil)
8686
assert.NoError(t, err)
8787
err = mt.AddLeaf(n)
8888
assert.NoError(t, err)

go-sdk/internal/sparse-merkle-tree/node/fungible.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ func (f *fungibleNode) CalculateIndex() (core.NodeIndex, error) {
5050
return NewNodeIndexFromBigInt(hash, f.hasher)
5151
}
5252

53+
func (f *fungibleNode) GetHasher() apicore.Hasher {
54+
return f.hasher
55+
}
56+
5357
// the "Owner" is the private key that must be properly hashed and trimmed to be
5458
// compatible with the BabyJub curve.
5559
// Reference: https://github.com/iden3/circomlib/blob/master/test/babyjub.js#L103
@@ -77,3 +81,7 @@ func (f *fungibleNullifierNode) CalculateIndex() (core.NodeIndex, error) {
7781
}
7882
return NewNodeIndexFromBigInt(hash, f.hasher)
7983
}
84+
85+
func (f *fungibleNullifierNode) GetHasher() apicore.Hasher {
86+
return f.hasher
87+
}

go-sdk/internal/sparse-merkle-tree/node/node.go

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ var ZERO_INDEX, _ = NewNodeIndexFromBigInt(big.NewInt(0), &hash.PoseidonHasher{}
3333
// nodeIndex is a wrapper around []byte to implement the NodeIndex interface.
3434
// it's a 256-bit number. the path from the root node to a leaf node is determined
3535
// by the index's bits. 0 means go left, 1 means go right.
36-
type nodeIndex [32]byte
36+
type nodeIndex struct {
37+
index [32]byte
38+
hasher apicore.Hasher
39+
}
3740

3841
// node is an implementation of the Node interface
3942
type node struct {
@@ -54,7 +57,7 @@ func NewEmptyNode() core.Node {
5457

5558
// the value parameter is optional. if "nil", the index hash is used in the
5659
// place of the value when calculating the node reference hash (aka "node key").
57-
func NewLeafNode(s core.Indexable, v *big.Int, hasher apicore.Hasher) (core.Node, error) {
60+
func NewLeafNode(s core.Indexable, v *big.Int) (core.Node, error) {
5861
n := &node{nodeType: core.NodeTypeLeaf, state: s}
5962
idx, err := n.state.CalculateIndex()
6063
if err != nil {
@@ -73,11 +76,11 @@ func NewLeafNode(s core.Indexable, v *big.Int, hasher apicore.Hasher) (core.Node
7376
hValue = hKey
7477
}
7578
elements := []*big.Int{hKey, hValue, big.NewInt(1)}
76-
hash, err := hasher.Hash(elements)
79+
hash, err := s.GetHasher().Hash(elements)
7780
if err != nil {
7881
return nil, err
7982
}
80-
n.refKey, err = NewNodeIndexFromBigInt(hash, hasher)
83+
n.refKey, err = NewNodeIndexFromBigInt(hash, s.GetHasher())
8184
return n, err
8285
}
8386

@@ -123,14 +126,14 @@ func NewNodeIndexFromBigInt(i *big.Int, hasher apicore.Hasher) (core.NodeIndex,
123126
if !hasher.CheckInRange(i) {
124127
return nil, ErrNodeIndexTooLarge
125128
}
126-
idx := new(nodeIndex)
127-
copy(idx[:], swapEndianness(i.Bytes()))
129+
idx := &nodeIndex{hasher: hasher}
130+
copy(idx.index[:], swapEndianness(i.Bytes()))
128131
return idx, nil
129132
}
130133

131134
// NewNodeIndexFromHex creates a new NodeIndex from a hex string that
132135
// represents the index in big-endian format.
133-
func NewNodeIndexFromHex(h string) (core.NodeIndex, error) {
136+
func NewNodeIndexFromHex(h string, hasher apicore.Hasher) (core.NodeIndex, error) {
134137
h = strings.TrimPrefix(h, "0x")
135138
b, err := hex.DecodeString(h)
136139
if err != nil {
@@ -139,17 +142,17 @@ func NewNodeIndexFromHex(h string) (core.NodeIndex, error) {
139142
if len(b) != INDEX_BYTES_LEN {
140143
return nil, ErrNodeBytesBadSize
141144
}
142-
idx := new(nodeIndex)
143-
copy(idx[:], b)
145+
idx := &nodeIndex{hasher: hasher}
146+
copy(idx.index[:], b)
144147
return idx, nil
145148
}
146149

147150
func (idx *nodeIndex) BigInt() *big.Int {
148-
return new(big.Int).SetBytes(swapEndianness(idx[:]))
151+
return new(big.Int).SetBytes(swapEndianness(idx.index[:]))
149152
}
150153

151154
func (idx *nodeIndex) Hex() string {
152-
return hex.EncodeToString(idx[:])
155+
return hex.EncodeToString(idx.index[:])
153156
}
154157

155158
func (idx *nodeIndex) IsZero() bool {
@@ -160,6 +163,10 @@ func (idx *nodeIndex) Equal(other core.NodeRef) bool {
160163
return idx.BigInt().Cmp(other.BigInt()) == 0
161164
}
162165

166+
func (idx *nodeIndex) GetHasher() apicore.Hasher {
167+
return idx.hasher
168+
}
169+
163170
// getPath returns the binary path, from the root to the leaf.
164171
func (idx *nodeIndex) ToPath(levels int) []bool {
165172
path := make([]bool, levels)
@@ -173,7 +180,7 @@ func (idx *nodeIndex) IsBitOne(pos uint) bool {
173180
if pos >= 256 {
174181
return false
175182
}
176-
return (idx[pos/8] & (1 << (pos % 8))) != 0
183+
return (idx.index[pos/8] & (1 << (pos % 8))) != 0
177184
}
178185

179186
// swapEndianness swaps the order of the bytes in the byte array of a node index.

go-sdk/internal/sparse-merkle-tree/node/node_test.go

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,29 +24,31 @@ import (
2424
"github.com/hyperledger-labs/zeto/go-sdk/internal/crypto/hash"
2525
"github.com/hyperledger-labs/zeto/go-sdk/internal/sparse-merkle-tree/utils"
2626
"github.com/hyperledger-labs/zeto/go-sdk/pkg/sparse-merkle-tree/core"
27+
apicore "github.com/hyperledger-labs/zeto/go-sdk/pkg/utxo/core"
2728
"github.com/iden3/go-iden3-crypto/poseidon"
2829
"github.com/stretchr/testify/assert"
2930
)
3031

3132
func TestNodeIndex(t *testing.T) {
32-
idx0, _ := NewNodeIndexFromBigInt(big.NewInt(0), &hash.PoseidonHasher{})
33+
hasher := &hash.PoseidonHasher{}
34+
idx0, _ := NewNodeIndexFromBigInt(big.NewInt(0), hasher)
3335
assert.Equal(t, "0000000000000000000000000000000000000000000000000000000000000000", idx0.Hex())
34-
idx1, _ := NewNodeIndexFromBigInt(big.NewInt(1), &hash.PoseidonHasher{})
36+
idx1, _ := NewNodeIndexFromBigInt(big.NewInt(1), hasher)
3537
assert.Equal(t, "0100000000000000000000000000000000000000000000000000000000000000", idx1.Hex())
36-
idx2, _ := NewNodeIndexFromBigInt(big.NewInt(10), &hash.PoseidonHasher{})
38+
idx2, _ := NewNodeIndexFromBigInt(big.NewInt(10), hasher)
3739
assert.Equal(t, "0a00000000000000000000000000000000000000000000000000000000000000", idx2.Hex())
3840

39-
idx3, _ := NewNodeIndexFromBigInt(big.NewInt(12345678), &hash.PoseidonHasher{})
41+
idx3, _ := NewNodeIndexFromBigInt(big.NewInt(12345678), hasher)
4042
assert.Equal(t, "4e61bc0000000000000000000000000000000000000000000000000000000000", idx3.Hex())
4143

4244
v4, _ := new(big.Int).SetString("4932297968297298434239270129193057052722409868268166443802652458940273154854", 10)
43-
idx4, _ := NewNodeIndexFromBigInt(v4, &hash.PoseidonHasher{})
45+
idx4, _ := NewNodeIndexFromBigInt(v4, hasher)
4446
assert.Equal(t, "265baaf161e875c372d08e50f52abddc01d32efc93e90290bb8b3d9ceb94e70a", idx4.Hex())
4547
expectedBytes4 := []byte{38, 91, 170, 241, 97, 232, 117, 195, 114, 208, 142, 80, 245, 42, 189, 220, 1, 211, 46, 252, 147, 233, 2, 144, 187, 139, 61, 156, 235, 148, 231, 10}
4648
rawIndex4 := idx4.(*nodeIndex)
47-
assert.Equal(t, expectedBytes4, rawIndex4[:])
49+
assert.Equal(t, expectedBytes4, rawIndex4.index[:])
4850

49-
idx5, err := NewNodeIndexFromHex("265baaf161e875c372d08e50f52abddc01d32efc93e90290bb8b3d9ceb94e70a")
51+
idx5, err := NewNodeIndexFromHex("265baaf161e875c372d08e50f52abddc01d32efc93e90290bb8b3d9ceb94e70a", hasher)
5052
assert.NoError(t, err)
5153
assert.Equal(t, 0, v4.Cmp(idx5.BigInt()))
5254
}
@@ -63,7 +65,7 @@ func TestNewEmptyNode(t *testing.T) {
6365
func TestNewLeafNode(t *testing.T) {
6466
idx, _ := NewNodeIndexFromBigInt(big.NewInt(10), &hash.PoseidonHasher{})
6567
i := utils.NewIndexOnly(idx)
66-
node, err := NewLeafNode(i, nil, &hash.PoseidonHasher{})
68+
node, err := NewLeafNode(i, nil)
6769
assert.NoError(t, err)
6870
assert.Equal(t, node.Type(), core.NodeTypeLeaf)
6971
assert.Equal(t, node.Index(), idx)
@@ -76,9 +78,9 @@ func TestNewLeafNode(t *testing.T) {
7678
}
7779

7880
func TestNewLeafNodeKeccak256(t *testing.T) {
79-
idx, _ := NewNodeIndexFromBigInt(big.NewInt(10), &hash.PoseidonHasher{})
81+
idx, _ := NewNodeIndexFromBigInt(big.NewInt(10), &hash.Keccak256Hasher{})
8082
i := utils.NewIndexOnly(idx)
81-
node, err := NewLeafNode(i, nil, &hash.Keccak256Hasher{})
83+
node, err := NewLeafNode(i, nil)
8284
assert.NoError(t, err)
8385
assert.Equal(t, node.Type(), core.NodeTypeLeaf)
8486
assert.Equal(t, node.Index(), idx)
@@ -93,7 +95,7 @@ func TestNewLeafNodeKeccak256(t *testing.T) {
9395
func TestNewLeafNodeWithValue(t *testing.T) {
9496
idx, _ := NewNodeIndexFromBigInt(big.NewInt(10), &hash.PoseidonHasher{})
9597
i := utils.NewIndexOnly(idx)
96-
node, err := NewLeafNode(i, big.NewInt(12345), &hash.PoseidonHasher{})
98+
node, err := NewLeafNode(i, big.NewInt(12345))
9799
assert.NoError(t, err)
98100
assert.Equal(t, node.Type(), core.NodeTypeLeaf)
99101
assert.Equal(t, node.Index(), idx)
@@ -125,8 +127,11 @@ type badIndex struct{}
125127
func (f *badIndex) CalculateIndex() (core.NodeIndex, error) {
126128
return nil, errors.New("Bang!")
127129
}
130+
func (f *badIndex) GetHasher() apicore.Hasher {
131+
return &hash.PoseidonHasher{}
132+
}
128133

129134
func TestNewLeafNodeFail(t *testing.T) {
130-
_, err := NewLeafNode(&badIndex{}, nil, &hash.PoseidonHasher{})
135+
_, err := NewLeafNode(&badIndex{}, nil)
131136
assert.EqualError(t, err, "Bang!")
132137
}

go-sdk/internal/sparse-merkle-tree/node/nonfungible.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ func (f *nonFungibleNode) CalculateIndex() (core.NodeIndex, error) {
5252
return NewNodeIndexFromBigInt(hash, f.hasher)
5353
}
5454

55+
func (f *nonFungibleNode) GetHasher() apicore.Hasher {
56+
return f.hasher
57+
}
58+
5559
// the "Owner" is the private key that must be properly hashed and trimmed to be
5660
// compatible with the BabyJub curve.
5761
// Reference: https://github.com/iden3/circomlib/blob/master/test/babyjub.js#L103
@@ -81,3 +85,7 @@ func (f *nonFungibleNullifierNode) CalculateIndex() (core.NodeIndex, error) {
8185
}
8286
return NewNodeIndexFromBigInt(hash, f.hasher)
8387
}
88+
89+
func (f *nonFungibleNullifierNode) GetHasher() apicore.Hasher {
90+
return f.hasher
91+
}

go-sdk/internal/sparse-merkle-tree/smt/merkletree.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ func (mt *sparseMerkleTree) generateProof(key *big.Int, rootKey core.NodeRef) (c
176176
return p, value, nil
177177
}
178178
// We found a leaf whose entry didn't match the node index
179-
p.existingNode, err = node.NewLeafNode(utils.NewIndexOnly(idx), n.Value(), mt.hasher)
179+
p.existingNode, err = node.NewLeafNode(utils.NewIndexOnly(idx), n.Value())
180180
if err != nil {
181181
return nil, nil, err
182182
}

0 commit comments

Comments
 (0)