@@ -557,3 +557,165 @@ func TestVerkleProofMarshalUnmarshalJSON(t *testing.T) {
557557 t .Errorf ("expected %v, got %v" , vp1 , vp2 )
558558 }
559559}
560+
561+ func TestStatelessDeserialize (t * testing.T ) {
562+ root := New ()
563+ for _ , k := range [][]byte {zeroKeyTest , oneKeyTest , fourtyKeyTest , ffx32KeyTest } {
564+ root .Insert (k , fourtyKeyTest , nil )
565+ }
566+
567+ proof , _ , _ , _ , _ := MakeVerkleMultiProof (root , keylist {zeroKeyTest , fourtyKeyTest }, map [string ][]byte {string (zeroKeyTest ): fourtyKeyTest , string (fourtyKeyTest ): fourtyKeyTest })
568+
569+ serialized , statediff , err := SerializeProof (proof )
570+ if err != nil {
571+ t .Fatalf ("could not serialize proof: %v" , err )
572+ }
573+
574+ dproof , err := DeserializeProof (serialized , statediff )
575+ if err != nil {
576+ t .Fatalf ("error deserializing proof: %v" , err )
577+ }
578+
579+ droot , err := TreeFromProof (dproof , root .Commit ())
580+ if err != nil {
581+ t .Fatal (err )
582+ }
583+
584+ if ! Equal (droot .Commit (), root .Commitment ()) {
585+ t .Log (ToDot (droot ), ToDot (root ))
586+ t .Fatalf ("differing root commitments %x != %x" , droot .Commitment ().Bytes (), root .Commitment ().Bytes ())
587+ }
588+
589+ if ! Equal (droot .(* InternalNode ).children [0 ].(* LeafNode ).commitment , root .(* InternalNode ).children [0 ].Commit ()) {
590+ t .Fatal ("differing commitment for child #0" )
591+ }
592+
593+ if ! Equal (droot .(* InternalNode ).children [64 ].Commit (), root .(* InternalNode ).children [64 ].Commit ()) {
594+ t .Fatal ("differing commitment for child #64" )
595+ }
596+ }
597+
598+ func TestStatelessDeserializeMissginChildNode (t * testing.T ) {
599+ root := New ()
600+ for _ , k := range [][]byte {zeroKeyTest , oneKeyTest , ffx32KeyTest } {
601+ root .Insert (k , fourtyKeyTest , nil )
602+ }
603+
604+ proof , _ , _ , _ , _ := MakeVerkleMultiProof (root , keylist {zeroKeyTest , fourtyKeyTest }, map [string ][]byte {string (zeroKeyTest ): fourtyKeyTest , string (fourtyKeyTest ): nil })
605+
606+ serialized , statediff , err := SerializeProof (proof )
607+ if err != nil {
608+ t .Fatalf ("could not serialize proof: %v" , err )
609+ }
610+
611+ dproof , err := DeserializeProof (serialized , statediff )
612+ if err != nil {
613+ t .Fatalf ("error deserializing proof: %v" , err )
614+ }
615+
616+ droot , err := TreeFromProof (dproof , root .Commit ())
617+ if err != nil {
618+ t .Fatal (err )
619+ }
620+
621+ if ! Equal (droot .Commit (), root .Commit ()) {
622+ t .Fatal ("differing root commitments" )
623+ }
624+ if ! Equal (droot .(* InternalNode ).children [0 ].Commit (), root .(* InternalNode ).children [0 ].Commit ()) {
625+ t .Fatal ("differing commitment for child #0" )
626+ }
627+
628+ if droot .(* InternalNode ).children [64 ] != nil {
629+ t .Fatalf ("non-nil child #64: %v" , droot .(* InternalNode ).children [64 ])
630+ }
631+ }
632+
633+ func TestStatelessDeserializeDepth2 (t * testing.T ) {
634+ root := New ()
635+ key1 , _ := hex .DecodeString ("0000010000000000000000000000000000000000000000000000000000000000" )
636+ for _ , k := range [][]byte {zeroKeyTest , key1 } {
637+ root .Insert (k , fourtyKeyTest , nil )
638+ }
639+
640+ proof , _ , _ , _ , _ := MakeVerkleMultiProof (root , keylist {zeroKeyTest , key1 }, map [string ][]byte {string (zeroKeyTest ): fourtyKeyTest , string (key1 ): nil })
641+
642+ serialized , statediff , err := SerializeProof (proof )
643+ if err != nil {
644+ t .Fatalf ("could not serialize proof: %v" , err )
645+ }
646+
647+ dproof , err := DeserializeProof (serialized , statediff )
648+ if err != nil {
649+ t .Fatalf ("error deserializing proof: %v" , err )
650+ }
651+
652+ droot , err := TreeFromProof (dproof , root .Commit ())
653+ if err != nil {
654+ t .Fatal (err )
655+ }
656+
657+ if ! Equal (droot .Commit (), root .Commit ()) {
658+ t .Fatal ("differing root commitments" )
659+ }
660+
661+ if ! Equal (droot .(* InternalNode ).children [0 ].Commit (), root .(* InternalNode ).children [0 ].Commit ()) {
662+ t .Fatal ("differing commitment for child #0" )
663+ }
664+ }
665+
666+ func TestStatelessGetProofItems (t * testing.T ) {
667+ insertedKeys := [][]byte {zeroKeyTest , oneKeyTest , ffx32KeyTest }
668+ provenKeys := [][]byte {zeroKeyTest , fourtyKeyTest }
669+
670+ root := New ()
671+ for _ , k := range insertedKeys {
672+ root .Insert (k , fourtyKeyTest , nil )
673+ }
674+
675+ proof , _ , _ , _ , _ := MakeVerkleMultiProof (root , keylist (provenKeys ), map [string ][]byte {string (zeroKeyTest ): fourtyKeyTest , string (fourtyKeyTest ): nil })
676+
677+ serialized , statediff , err := SerializeProof (proof )
678+ if err != nil {
679+ t .Fatalf ("could not serialize proof: %v" , err )
680+ }
681+
682+ dproof , err := DeserializeProof (serialized , statediff )
683+ if err != nil {
684+ t .Fatalf ("error deserializing proof: %v" , err )
685+ }
686+
687+ droot , err := TreeFromProof (dproof , root .Commit ())
688+ if err != nil {
689+ t .Fatal (err )
690+ }
691+
692+ pel , _ , _ := droot .GetProofItems (keylist (provenKeys ))
693+ pef , _ , _ := root .GetProofItems (keylist (provenKeys ))
694+
695+ for i , c := range pel .Cis {
696+ if ! Equal (c , pef .Cis [i ]) {
697+ t .Fatalf ("differing commitment at %d: %x != %x" , i , c .Bytes (), pef .Cis [i ].Bytes ())
698+ }
699+ }
700+ if len (pel .Cis ) != len (pef .Cis ) {
701+ t .Fatal ("commitments have different length" )
702+ }
703+
704+ if ! bytes .Equal (pel .Zis , pef .Zis ) {
705+ t .Fatalf ("differing index list %v != %v" , pel .Zis , pef .Zis )
706+ }
707+ if len (pel .Zis ) != len (pef .Zis ) {
708+ t .Fatal ("indices have different length" )
709+ }
710+
711+ for i , y := range pel .Yis {
712+ l := y .Bytes ()
713+ f := pef .Yis [i ].Bytes ()
714+ if ! bytes .Equal (l [:], f [:]) {
715+ t .Fatalf ("differing eval #%d %x != %x" , i , l , f )
716+ }
717+ }
718+ if len (pel .Yis ) != len (pef .Yis ) {
719+ t .Fatal ("evaluations have different length" )
720+ }
721+ }
0 commit comments