@@ -18,11 +18,11 @@ var IavlSpec = &ProofSpec{
18
18
// You must validate the result is what you have in a header.
19
19
// Returns error if the calculations cannot be performed.
20
20
func (p * ExistenceProof ) Calculate () ([]byte , error ) {
21
- if len (p .Steps ) == 0 {
22
- return nil , fmt .Errorf ("Existence Proof needs at least one step" )
21
+ leaf , inners , err := p .TypeCastSteps ()
22
+ if err != nil {
23
+ return nil , err
23
24
}
24
25
25
- leaf , inners := p .Steps [0 ], p .Steps [1 :]
26
26
// leaf step takes the key and value as input
27
27
res , err := leaf .Apply (p .Key , p .Value )
28
28
if err != nil {
@@ -40,31 +40,42 @@ func (p *ExistenceProof) Calculate() ([]byte, error) {
40
40
}
41
41
42
42
func (p * ExistenceProof ) CheckAgainstSpec (spec * ProofSpec ) error {
43
- if len (p .Steps ) == 0 {
44
- return fmt .Errorf ("Existence Proof needs at least one step" )
45
- }
46
-
47
- leafOp , inners := p .Steps [0 ], p .Steps [1 :]
48
- leaf , err := asLeaf (leafOp )
43
+ leaf , inners , err := p .TypeCastSteps ()
49
44
if err != nil {
50
45
return err
51
46
}
52
47
err = checkLeaf (leaf , spec .LeafSpec )
53
48
if err != nil {
54
49
return err
55
50
}
56
- for _ , innerOp := range inners {
57
- inner , err := asInner (innerOp )
58
- if err != nil {
59
- return err
60
- }
51
+ for _ , inner := range inners {
61
52
if err := checkInner (inner , spec .LeafSpec .Prefix ); err != nil {
62
53
return err
63
54
}
64
55
}
65
56
return nil
66
57
}
67
58
59
+ func (p * ExistenceProof ) TypeCastSteps () (* LeafOp , []* InnerOp , error ) {
60
+ if len (p .Steps ) == 0 {
61
+ return nil , nil , fmt .Errorf ("Existence Proof needs at least one step" )
62
+ }
63
+ leafOp , inners := p .Steps [0 ], p .Steps [1 :]
64
+ leaf , err := asLeaf (leafOp )
65
+ if err != nil {
66
+ return nil , nil , err
67
+ }
68
+ var result []* InnerOp
69
+ for _ , innerOp := range inners {
70
+ inner , err := asInner (innerOp )
71
+ if err != nil {
72
+ return nil , nil , err
73
+ }
74
+ result = append (result , inner )
75
+ }
76
+ return leaf , result , nil
77
+ }
78
+
68
79
func checkLeaf (leaf * LeafOp , spec * LeafOp ) error {
69
80
if leaf .Hash != spec .Hash {
70
81
return fmt .Errorf ("Unexpected HashOp: %d" , leaf .Hash )
0 commit comments