Skip to content

Commit 94a12c4

Browse files
committed
Add non-zero start subtree consistency probes to proofgen
1 parent 86fccf0 commit 94a12c4

176 files changed

Lines changed: 2447 additions & 23 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cmd/proofgen/main.go

Lines changed: 82 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,64 @@ var (
9090
}},
9191
}
9292

93+
subtreeConsistencyProofs = []struct {
94+
start uint64
95+
end uint64
96+
size uint64
97+
proof [][]byte
98+
root1 []byte
99+
root2 []byte
100+
}{
101+
{0, 1, 1, nil, roots[0], roots[0]},
102+
{0, 1, 8, [][]byte{
103+
dh("96a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7", 32),
104+
dh("5f083f0a1a33ca076a95279832580db3e0ef4584bdff1f54c8a360f50de3031e", 32),
105+
dh("6b47aaf29ee3c2af9af889bc1fb9254dabd31177f16232dd6aab035ca39bf6e4", 32),
106+
}, roots[0], roots[7]},
107+
{0, 6, 8, [][]byte{
108+
dh("0ebc5d3437fbe2db158b9f126a1d118e308181031d0a949f8dededebc558ef6a", 32),
109+
dh("ca854ea128ed050b41b35ffc1b87b8eb2bde461e9e3b5596ece6b9d5975a0ae0", 32),
110+
dh("d37ee418976dd95753c1c73862b9398fa2a2cf9b4ff0fdfe8b30cd95209614b7", 32),
111+
}, roots[5], roots[7]},
112+
{0, 2, 5, [][]byte{
113+
dh("5f083f0a1a33ca076a95279832580db3e0ef4584bdff1f54c8a360f50de3031e", 32),
114+
dh("bc1a0643b12e4d2d7c77918f44e0f4f79a838b6cf9ec5b5c283e1f4d88599e6b", 32),
115+
}, roots[1], roots[4]},
116+
{0, 6, 7, [][]byte{
117+
dh("0ebc5d3437fbe2db158b9f126a1d118e308181031d0a949f8dededebc558ef6a", 32),
118+
dh("b08693ec2e721597130641e8211e7eedccb4c26413963eee6c1e2ed16ffb1a5f", 32),
119+
dh("d37ee418976dd95753c1c73862b9398fa2a2cf9b4ff0fdfe8b30cd95209614b7", 32),
120+
}, roots[5], roots[6]},
121+
// Non-zero starting subtree consistency proofs:
122+
// 1. Subtree that doesn't start at 0 and ends at size ([4, 8) in size 8):
123+
{4, 8, 8, [][]byte{
124+
roots[3], // left sibling [0, 4)
125+
}, dh("6b47aaf29ee3c2af9af889bc1fb9254dabd31177f16232dd6aab035ca39bf6e4", 32), roots[7]},
126+
// 2. Subtree of size 1 that doesn't start at 0 ([4, 5) in size 8):
127+
{4, 5, 8, [][]byte{
128+
dh("40414243", 4),
129+
dh("a0b4abfc48ab2bb56227fad12cc063da06069d2bd5b3727cf419a2a4e7fdba4f", 32),
130+
dh("100403353ab9b59c8f2f00584368ffb8513e25fed96d19db1627de86d5cb737c", 32),
131+
}, dh("3031", 2), dh("240be06ec4904347ed5f7a636abadb9efb92f3126d2f03bab3e792c9611d2a54", 32)},
132+
// 3. Another subtree that doesn't start at 0 and ends at size ([6, 8) in size 8):
133+
{6, 8, 8, [][]byte{
134+
dh("ee1d9a518610f7c614fc2041969a0f2991533df04bbd74aa9bd33f6747ba3e19", 32),
135+
dh("100403353ab9b59c8f2f00584368ffb8513e25fed96d19db1627de86d5cb737c", 32),
136+
}, dh("a0b4abfc48ab2bb56227fad12cc063da06069d2bd5b3727cf419a2a4e7fdba4f", 32), dh("240be06ec4904347ed5f7a636abadb9efb92f3126d2f03bab3e792c9611d2a54", 32)},
137+
// 4. Subtree that doesn't start at 0, doesn't end at size, perfect subtree ([2, 4) in size 8):
138+
{2, 4, 8, [][]byte{
139+
dh("47dc540c94ceb704a23875c11273e16bb0b8a87aed84de911f2133568115f254", 32),
140+
dh("bf318a3f7fabd6aac31e69d6fe083b0c398994cd8e057b339d24dda3f401aa1e", 32),
141+
}, dh("d6f02bf8143fe3daeab2126ae2a41827aad31618a257166d6516a81f52fb8d4f", 32), dh("240be06ec4904347ed5f7a636abadb9efb92f3126d2f03bab3e792c9611d2a54", 32)},
142+
// 5. Subtree that doesn't start at 0, doesn't end at size, not perfect subtree ([4, 7) in size 8):
143+
{4, 7, 8, [][]byte{
144+
dh("5051525354555657", 8),
145+
dh("606162636465666768696a6b6c6d6e6f", 16),
146+
dh("ee1d9a518610f7c614fc2041969a0f2991533df04bbd74aa9bd33f6747ba3e19", 32),
147+
dh("100403353ab9b59c8f2f00584368ffb8513e25fed96d19db1627de86d5cb737c", 32),
148+
}, dh("4de1f41f0cd02d69e21935a005bb6cc3753d803eb78332dd7722680bc7d54977", 32), dh("240be06ec4904347ed5f7a636abadb9efb92f3126d2f03bab3e792c9611d2a54", 32)},
149+
}
150+
93151
roots = [][]byte{
94152
dh("6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d", 32),
95153
dh("fac54203e7cc696cf0dfcb42c92a1d9dbaf70ad9e621f4bd8d98662f00e3c125", 32),
@@ -671,14 +729,14 @@ type subtreeConsistencyProbe struct {
671729
}
672730

673731
func subtreeConsistencyProbes(rootDir string) error {
674-
for i, p := range consistencyProofs {
732+
for i, p := range subtreeConsistencyProofs {
675733
dir := filepath.Join(rootDir, strconv.Itoa(i))
676734
if err := os.MkdirAll(dir, 0755); err != nil {
677735
return err
678736
}
679737

680-
if err := corruptedSubtreeConsistencyProbes(dir, p.size1, p.size2, p.proof,
681-
roots[p.size1-1], roots[p.size2-1]); err != nil {
738+
if err := corruptedSubtreeConsistencyProbes(dir, p.start, p.end, p.size, p.proof,
739+
p.root1, p.root2); err != nil {
682740
return fmt.Errorf("write subtree consistency test data: %s", err)
683741
}
684742
}
@@ -695,8 +753,8 @@ func subtreeConsistencyProbes(rootDir string) error {
695753
return nil
696754
}
697755

698-
func corruptedSubtreeConsistencyProbes(dir string, size1, size2 uint64, proof [][]byte, root1, root2 []byte) error {
699-
happyPath := subtreeConsistencyProbe{0, size1, size2, root1, root2, proof, "happy path", false}
756+
func corruptedSubtreeConsistencyProbes(dir string, start, end, size uint64, proof [][]byte, root1, root2 []byte) error {
757+
happyPath := subtreeConsistencyProbe{start, end, size, root1, root2, proof, "happy path", false}
700758
if err := writeSubtreeConsistencyProbe(dir, happyPath); err != nil {
701759
return err
702760
}
@@ -705,7 +763,7 @@ func corruptedSubtreeConsistencyProbes(dir string, size1, size2 uint64, proof []
705763
return nil
706764
}
707765

708-
probes := invalidSubtreeConsistencyProof(size1, size2, root1, root2, proof)
766+
probes := invalidSubtreeConsistencyProof(start, end, size, root1, root2, proof)
709767
for _, p := range probes {
710768
if err := writeSubtreeConsistencyProbe(dir, p); err != nil {
711769
return err
@@ -715,31 +773,31 @@ func corruptedSubtreeConsistencyProbes(dir string, size1, size2 uint64, proof []
715773
return nil
716774
}
717775

718-
func invalidSubtreeConsistencyProof(end, size uint64, root1, root2 []byte, proof [][]byte) []subtreeConsistencyProbe {
776+
func invalidSubtreeConsistencyProof(start, end, size uint64, root1, root2 []byte, proof [][]byte) []subtreeConsistencyProbe {
719777
ln := len(proof)
720778
ret := []subtreeConsistencyProbe{
721779
// Wrong end (size1).
722-
{0, end - 1, size, root1, root2, proof, "size1 sub @1", true},
723-
{0, end + 1, size, root1, root2, proof, "size1 plus @1", true},
724-
{0, end ^ 2, size, root1, root2, proof, "size1 XOR @2", true},
780+
{start, end - 1, size, root1, root2, proof, "size1 sub @1", true},
781+
{start, end + 1, size, root1, root2, proof, "size1 plus @1", true},
782+
{start, end ^ 2, size, root1, root2, proof, "size1 XOR @2", true},
725783
// Wrong tree size (size2).
726-
{0, end, size * 2, root1, root2, proof, "size2 mul @2", true},
727-
{0, end, size / 2, root1, root2, proof, "size2 div @2", true},
784+
{start, end, size * 2, root1, root2, proof, "size2 mul @2", true},
785+
{start, end, size / 2, root1, root2, proof, "size2 div @2", true},
728786
// Wrong root.
729-
{0, end, size, []byte("WrongRoot"), root2, proof, "wrong root1", true},
730-
{0, end, size, root1, []byte("WrongRoot"), proof, "wrong root2", true},
731-
{0, end, size, root2, root1, proof, "swapped roots", true},
787+
{start, end, size, []byte("WrongRoot"), root2, proof, "wrong root1", true},
788+
{start, end, size, root1, []byte("WrongRoot"), proof, "wrong root2", true},
789+
{start, end, size, root2, root1, proof, "swapped roots", true},
732790
// Empty proof.
733-
{0, end, size, root1, root2, [][]byte{}, "empty proof", true},
791+
{start, end, size, root1, root2, [][]byte{}, "empty proof", true},
734792
// Add garbage at the end.
735-
{0, end, size, root1, root2, extend(proof, []byte{}), "trailing garbage", true},
736-
{0, end, size, root1, root2, extend(proof, root1), "trailing root1", true},
737-
{0, end, size, root1, root2, extend(proof, root2), "trailing root2", true},
793+
{start, end, size, root1, root2, extend(proof, []byte{}), "trailing garbage", true},
794+
{start, end, size, root1, root2, extend(proof, root1), "trailing root1", true},
795+
{start, end, size, root1, root2, extend(proof, root2), "trailing root2", true},
738796
// Add garbage at the front.
739-
{0, end, size, root1, root2, prepend(proof, []byte{}), "preceding garbage", true},
740-
{0, end, size, root1, root2, prepend(proof, root1), "preceding root1", true},
741-
{0, end, size, root1, root2, prepend(proof, root2), "preceding root2", true},
742-
{0, end, size, root1, root2, prepend(proof, proof[0]), "preceding proof @0", true},
797+
{start, end, size, root1, root2, prepend(proof, []byte{}), "preceding garbage", true},
798+
{start, end, size, root1, root2, prepend(proof, root1), "preceding root1", true},
799+
{start, end, size, root1, root2, prepend(proof, root2), "preceding root2", true},
800+
{start, end, size, root1, root2, prepend(proof, proof[0]), "preceding proof @0", true},
743801
}
744802

745803
// Remove a node from the end.
@@ -785,6 +843,7 @@ func staticSubtreeConsistencyProbes(dir string) error {
785843
{1, 1, 2, sha256EmptyTreeHash, sha256EmptyTreeHash, proof2, "subtree is empty roots valid but proof is not empty", true},
786844
{1, 1, 2, root1, root1, proof1, "subtree is empty roots match but not valid", true},
787845
// Invalid subtree boundaries (not a multiple of power of 2 >= end - start).
846+
// Invalid subtree boundaries (not a multiple of power of 2 >= end - start):
788847
{1, 15, 15, root1, root2, proof1, "invalid subtree start 1 end 15 size 15", true},
789848
{1, 3, 8, root1, root2, proof1, "invalid subtree start 1 end 3 size 8", true},
790849
{2, 5, 8, root1, root2, proof1, "invalid subtree start 2 end 5 size 8", true},
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"start": 0,
3+
"end": 3,
4+
"size": 8,
5+
"root1": "bjQLnP+zepicpUTmu3gKLHiQHT+zNzh2hRGjBhevoB0=",
6+
"root2": "XcnaeacGWamtVZy3Ad7ZoqudgjqtL0lgz+Nw7/RgQyg=",
7+
"proof": [
8+
"lqKW0iTyhcZ77pPDD4owkVfw2qNdxbh+QQt4YwoJz8c=",
9+
"Xwg/ChozygdqlSeYMlgNs+DvRYS9/x9UyKNg9Q3jAx4=",
10+
"a0eq8p7jwq+a+Im8H7klTavTEXfxYjLdaqsDXKOb9uQ="
11+
],
12+
"desc": "end XOR @2",
13+
"wantErr": true
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"start": 0,
3+
"end": 2,
4+
"size": 8,
5+
"root1": "bjQLnP+zepicpUTmu3gKLHiQHT+zNzh2hRGjBhevoB0=",
6+
"root2": "XcnaeacGWamtVZy3Ad7ZoqudgjqtL0lgz+Nw7/RgQyg=",
7+
"proof": [
8+
"lqKW0iTyhcZ77pPDD4owkVfw2qNdxbh+QQt4YwoJz8c=",
9+
"Xwg/ChozygdqlSeYMlgNs+DvRYS9/x9UyKNg9Q3jAx4=",
10+
"a0eq8p7jwq+a+Im8H7klTavTEXfxYjLdaqsDXKOb9uQ="
11+
],
12+
"desc": "end plus @1",
13+
"wantErr": true
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"start": 0,
3+
"end": 0,
4+
"size": 8,
5+
"root1": "bjQLnP+zepicpUTmu3gKLHiQHT+zNzh2hRGjBhevoB0=",
6+
"root2": "XcnaeacGWamtVZy3Ad7ZoqudgjqtL0lgz+Nw7/RgQyg=",
7+
"proof": [
8+
"lqKW0iTyhcZ77pPDD4owkVfw2qNdxbh+QQt4YwoJz8c=",
9+
"Xwg/ChozygdqlSeYMlgNs+DvRYS9/x9UyKNg9Q3jAx4=",
10+
"a0eq8p7jwq+a+Im8H7klTavTEXfxYjLdaqsDXKOb9uQ="
11+
],
12+
"desc": "end sub @1",
13+
"wantErr": true
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"start": 0,
3+
"end": 1,
4+
"size": 4,
5+
"root1": "bjQLnP+zepicpUTmu3gKLHiQHT+zNzh2hRGjBhevoB0=",
6+
"root2": "XcnaeacGWamtVZy3Ad7ZoqudgjqtL0lgz+Nw7/RgQyg=",
7+
"proof": [
8+
"lqKW0iTyhcZ77pPDD4owkVfw2qNdxbh+QQt4YwoJz8c=",
9+
"Xwg/ChozygdqlSeYMlgNs+DvRYS9/x9UyKNg9Q3jAx4=",
10+
"a0eq8p7jwq+a+Im8H7klTavTEXfxYjLdaqsDXKOb9uQ="
11+
],
12+
"desc": "size div @2",
13+
"wantErr": true
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"start": 0,
3+
"end": 1,
4+
"size": 16,
5+
"root1": "bjQLnP+zepicpUTmu3gKLHiQHT+zNzh2hRGjBhevoB0=",
6+
"root2": "XcnaeacGWamtVZy3Ad7ZoqudgjqtL0lgz+Nw7/RgQyg=",
7+
"proof": [
8+
"lqKW0iTyhcZ77pPDD4owkVfw2qNdxbh+QQt4YwoJz8c=",
9+
"Xwg/ChozygdqlSeYMlgNs+DvRYS9/x9UyKNg9Q3jAx4=",
10+
"a0eq8p7jwq+a+Im8H7klTavTEXfxYjLdaqsDXKOb9uQ="
11+
],
12+
"desc": "size mul @2",
13+
"wantErr": true
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"start": 2,
3+
"end": 1,
4+
"size": 8,
5+
"root1": "bjQLnP+zepicpUTmu3gKLHiQHT+zNzh2hRGjBhevoB0=",
6+
"root2": "XcnaeacGWamtVZy3Ad7ZoqudgjqtL0lgz+Nw7/RgQyg=",
7+
"proof": [
8+
"lqKW0iTyhcZ77pPDD4owkVfw2qNdxbh+QQt4YwoJz8c=",
9+
"Xwg/ChozygdqlSeYMlgNs+DvRYS9/x9UyKNg9Q3jAx4=",
10+
"a0eq8p7jwq+a+Im8H7klTavTEXfxYjLdaqsDXKOb9uQ="
11+
],
12+
"desc": "start XOR @2",
13+
"wantErr": true
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"start": 1,
3+
"end": 1,
4+
"size": 8,
5+
"root1": "bjQLnP+zepicpUTmu3gKLHiQHT+zNzh2hRGjBhevoB0=",
6+
"root2": "XcnaeacGWamtVZy3Ad7ZoqudgjqtL0lgz+Nw7/RgQyg=",
7+
"proof": [
8+
"lqKW0iTyhcZ77pPDD4owkVfw2qNdxbh+QQt4YwoJz8c=",
9+
"Xwg/ChozygdqlSeYMlgNs+DvRYS9/x9UyKNg9Q3jAx4=",
10+
"a0eq8p7jwq+a+Im8H7klTavTEXfxYjLdaqsDXKOb9uQ="
11+
],
12+
"desc": "start plus @1",
13+
"wantErr": true
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"start": 0,
3+
"end": 4,
4+
"size": 8,
5+
"root1": "duZ9rbzfHhDht03cYIq9L5jfsW+851J3tSMqEn8gh+8=",
6+
"root2": "XcnaeacGWamtVZy3Ad7ZoqudgjqtL0lgz+Nw7/RgQyg=",
7+
"proof": [
8+
"DrxdNDf74tsVi58Sah0RjjCBgQMdCpSfje3t68VY72o=",
9+
"yoVOoSjtBQtBs1/8G4e46yveRh6eO1WW7Oa51ZdaCuA=",
10+
"037kGJdt2VdTwcc4Yrk5j6Kiz5tP8P3+izDNlSCWFLc="
11+
],
12+
"desc": "end XOR @2",
13+
"wantErr": true
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"start": 0,
3+
"end": 7,
4+
"size": 8,
5+
"root1": "duZ9rbzfHhDht03cYIq9L5jfsW+851J3tSMqEn8gh+8=",
6+
"root2": "XcnaeacGWamtVZy3Ad7ZoqudgjqtL0lgz+Nw7/RgQyg=",
7+
"proof": [
8+
"DrxdNDf74tsVi58Sah0RjjCBgQMdCpSfje3t68VY72o=",
9+
"yoVOoSjtBQtBs1/8G4e46yveRh6eO1WW7Oa51ZdaCuA=",
10+
"037kGJdt2VdTwcc4Yrk5j6Kiz5tP8P3+izDNlSCWFLc="
11+
],
12+
"desc": "end plus @1",
13+
"wantErr": true
14+
}

0 commit comments

Comments
 (0)