@@ -53,6 +53,9 @@ type VerkleProof struct {
53
53
}
54
54
55
55
func (vp * VerkleProof ) Copy () * VerkleProof {
56
+ if vp == nil {
57
+ return nil
58
+ }
56
59
ret := & VerkleProof {
57
60
OtherStems : make ([][StemSize ]byte , len (vp .OtherStems )),
58
61
DepthExtensionPresent : make ([]byte , len (vp .DepthExtensionPresent )),
@@ -73,6 +76,35 @@ func (vp *VerkleProof) Copy() *VerkleProof {
73
76
return ret
74
77
}
75
78
79
+ func (vp * VerkleProof ) Equal (other * VerkleProof ) error {
80
+ if len (vp .OtherStems ) != len (other .OtherStems ) {
81
+ return fmt .Errorf ("different number of other stems: %d != %d" , len (vp .OtherStems ), len (other .OtherStems ))
82
+ }
83
+ for i := range vp .OtherStems {
84
+ if vp .OtherStems [i ] != other .OtherStems [i ] {
85
+ return fmt .Errorf ("different other stem: %x != %x" , vp .OtherStems [i ], other .OtherStems [i ])
86
+ }
87
+ }
88
+ if len (vp .DepthExtensionPresent ) != len (other .DepthExtensionPresent ) {
89
+ return fmt .Errorf ("different number of depth extension present: %d != %d" , len (vp .DepthExtensionPresent ), len (other .DepthExtensionPresent ))
90
+ }
91
+ if ! bytes .Equal (vp .DepthExtensionPresent , other .DepthExtensionPresent ) {
92
+ return fmt .Errorf ("different depth extension present: %x != %x" , vp .DepthExtensionPresent , other .DepthExtensionPresent )
93
+ }
94
+ if len (vp .CommitmentsByPath ) != len (other .CommitmentsByPath ) {
95
+ return fmt .Errorf ("different number of commitments by path: %d != %d" , len (vp .CommitmentsByPath ), len (other .CommitmentsByPath ))
96
+ }
97
+ for i := range vp .CommitmentsByPath {
98
+ if vp .CommitmentsByPath [i ] != other .CommitmentsByPath [i ] {
99
+ return fmt .Errorf ("different commitment by path: %x != %x" , vp .CommitmentsByPath [i ], other .CommitmentsByPath [i ])
100
+ }
101
+ }
102
+ if vp .D != other .D {
103
+ return fmt .Errorf ("different D: %x != %x" , vp .D , other .D )
104
+ }
105
+ return nil
106
+ }
107
+
76
108
type Proof struct {
77
109
Multipoint * ipa.MultiProof // multipoint argument
78
110
ExtStatus []byte // the extension status of each stem
@@ -118,6 +150,40 @@ func (sd StateDiff) Copy() StateDiff {
118
150
return ret
119
151
}
120
152
153
+ func (sd StateDiff ) Equal (other StateDiff ) error {
154
+ if len (sd ) != len (other ) {
155
+ return fmt .Errorf ("different number of stem state diffs: %d != %d" , len (sd ), len (other ))
156
+ }
157
+ for i := range sd {
158
+ if sd [i ].Stem != other [i ].Stem {
159
+ return fmt .Errorf ("different stem: %x != %x" , sd [i ].Stem , other [i ].Stem )
160
+ }
161
+ if len (sd [i ].SuffixDiffs ) != len (other [i ].SuffixDiffs ) {
162
+ return fmt .Errorf ("different number of suffix state diffs: %d != %d" , len (sd [i ].SuffixDiffs ), len (other [i ].SuffixDiffs ))
163
+ }
164
+ for j := range sd [i ].SuffixDiffs {
165
+ if sd [i ].SuffixDiffs [j ].Suffix != other [i ].SuffixDiffs [j ].Suffix {
166
+ return fmt .Errorf ("different suffix: %x != %x" , sd [i ].SuffixDiffs [j ].Suffix , other [i ].SuffixDiffs [j ].Suffix )
167
+ }
168
+ if sd [i ].SuffixDiffs [j ].CurrentValue != nil && other [i ].SuffixDiffs [j ].CurrentValue != nil {
169
+ if * sd [i ].SuffixDiffs [j ].CurrentValue != * other [i ].SuffixDiffs [j ].CurrentValue {
170
+ return fmt .Errorf ("different current value: %x != %x" , * sd [i ].SuffixDiffs [j ].CurrentValue , * other [i ].SuffixDiffs [j ].CurrentValue )
171
+ }
172
+ } else if sd [i ].SuffixDiffs [j ].CurrentValue != nil || other [i ].SuffixDiffs [j ].CurrentValue != nil {
173
+ return fmt .Errorf ("different current value: %x != %x" , sd [i ].SuffixDiffs [j ].CurrentValue , other [i ].SuffixDiffs [j ].CurrentValue )
174
+ }
175
+ if sd [i ].SuffixDiffs [j ].NewValue != nil && other [i ].SuffixDiffs [j ].NewValue != nil {
176
+ if * sd [i ].SuffixDiffs [j ].NewValue != * other [i ].SuffixDiffs [j ].NewValue {
177
+ return fmt .Errorf ("different new value: %x != %x" , * sd [i ].SuffixDiffs [j ].NewValue , * other [i ].SuffixDiffs [j ].NewValue )
178
+ }
179
+ } else if sd [i ].SuffixDiffs [j ].NewValue != nil || other [i ].SuffixDiffs [j ].NewValue != nil {
180
+ return fmt .Errorf ("different new value: %x != %x" , sd [i ].SuffixDiffs [j ].NewValue , other [i ].SuffixDiffs [j ].NewValue )
181
+ }
182
+ }
183
+ }
184
+ return nil
185
+ }
186
+
121
187
func GetCommitmentsForMultiproof (root VerkleNode , keys [][]byte , resolver NodeResolverFn ) (* ProofElements , []byte , []Stem , error ) {
122
188
sort .Sort (keylist (keys ))
123
189
return root .GetProofItems (keylist (keys ), resolver )
0 commit comments