| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- /= ztd-three /common/ztd/three
- => ztd-three
- ~% %proof-lib ..merkle ~
- :: proof-library
- |%
- +| %sur-proof-stream
- +$ noun-digests (list noun-digest:tip5)
- +$ proof-path [leaf=fpoly path=noun-digests]
- +$ proof-path-bf [leaf=bpoly path=noun-digests]
- ::
- +$ proof-data
- $% [%m-root p=noun-digest:tip5] :: merk-root
- [%puzzle commitment=noun-digest:tip5 nonce=noun-digest:tip5 len=@ p=*]
- [%codeword p=fpoly]
- [%terms p=bpoly] :: terminals
- [%m-paths a=proof-path b=proof-path c=proof-path]
- [%m-path p=proof-path] :: merk-path
- [%m-pathbf p=proof-path-bf] :: merk-path-bf
- [%comp-m p=noun-digest:tip5 num=@] :: composition-merk
- [%evals p=fpoly] :: evaluations
- [%heights p=(list @)] :: n, where 2^n is the number of rows
- [%poly p=bpoly]
- ==
- ::
- +$ proof-objects (list proof-data)
- ::
- +$ proof
- $: version=%0
- objects=proof-objects
- hashes=(list noun-digest:tip5)
- read-index=@
- ==
- ::
- +$ tip5-hash-atom @ux
- ::
- :: number of items in proof used for pow
- ++ pow-items 7
- :: extract pow from proof
- ++ get-pow
- ~/ %get-pow
- |= p=proof
- ^- proof
- p(objects (scag pow-items objects.p))
- ::
- ++ proof-to-pow
- ~/ %proof-to-pow
- |= =proof
- ^- tip5-hash-atom
- (digest-to-atom:tip5 (hash-proof (get-pow proof)))
- ::
- ++ hashable-proof-objects
- ~/ %hashable-proof-objects
- |= ps=proof-objects
- ^- hashable:tip5
- [%list (turn ps hashable-proof-data)]
- ::
- ++ hash-proof
- ~/ %hash-proof
- |= p=proof
- ^- noun-digest:tip5
- =/ rng (absorb-proof-objects objects.p ~)
- =^ lis=(list belt) rng (belts:rng 5)
- =- ?> ?=(noun-digest:tip5 -) -
- (list-to-tuple:tip5 lis)
- ::
- ++ absorb-proof-objects
- ~/ %absorb-proof-objects
- |= [objs=proof-objects hashes=(list noun-digest:tip5)]
- ^+ tog:tip5
- =. objs (slag (lent hashes) objs)
- =/ lis-digests=[%list (list hashable:tip5)]
- =/ h (hashable-noun-digests:tip5 hashes)
- ?> ?=(%list -.h)
- h
- =/ lis-objects=[%list (list hashable:tip5)]
- =/ h (hashable-proof-objects objs)
- ?> ?=(%list -.h)
- h
- =/ big-lis=(list noun-digest:tip5)
- (turn `(list hashable:tip5)`(weld +.lis-digests +.lis-objects) hash-hashable:tip5)
- =/ sponge (new:sponge:tip5)
- |-
- ?~ big-lis
- (new:tog:tip5 sponge:sponge)
- =+ [a=@ b=@ c=@ d=@ e=@]=i.big-lis
- =/ lis=(list belt) [a b c d e ~]
- $(big-lis t.big-lis, sponge (absorb:sponge lis))
- ::
- ::
- ++ hashable-proof-data
- ~/ %hashable-proof-data
- |= pd=proof-data
- ^- hashable:tip5
- ?- -.pd
- %m-root [leaf+%m-root hash+p.pd]
- %puzzle [leaf+%puzzle hash+commitment.pd hash+nonce.pd leaf+len.pd leaf+p.pd]
- %comp-m [leaf+%comp-m hash+p.pd leaf+num.pd]
- %heights [leaf+%heights leaf+p.pd]
- %codeword [leaf+%codeword (hashable-fpoly:tip5 p.pd)]
- %evals [leaf+%evals (hashable-fpoly:tip5 p.pd)]
- %terms [leaf+%terms (hashable-bpoly:tip5 p.pd)]
- %poly [leaf+%poly (hashable-bpoly:tip5 p.pd)]
- ::
- %m-pathbf
- :- leaf+%m-pathbf
- :- (hashable-bpoly:tip5 leaf.p.pd)
- (hashable-noun-digests:tip5 path.p.pd)
- ::
- %m-path
- :- leaf+%m-mpath
- :- (hashable-fpoly:tip5 leaf.p.pd)
- (hashable-noun-digests:tip5 path.p.pd)
- ::
- %m-paths
- :- leaf+%m-mpaths
- :+ :- (hashable-fpoly:tip5 leaf.a.pd)
- (hashable-noun-digests:tip5 path.a.pd)
- :- (hashable-fpoly:tip5 leaf.b.pd)
- (hashable-noun-digests:tip5 path.b.pd)
- :- (hashable-fpoly:tip5 leaf.c.pd)
- (hashable-noun-digests:tip5 path.c.pd)
- ==
- ::
- ++ hash-proof-data
- ~/ %hash-proof-data
- |= pd=proof-data
- ^- noun-digest:tip5
- (hash-hashable:tip5 (hashable-proof-data pd))
- ::
- +| %sur-fock
- ::
- :: $zero-map: see description
- ::
- :: Nock 10 edits the noun so it has subject for the original noun and new-subject for the
- :: new edited noun. Nock 0 is proved exactly like a nock 10 but with new-subject=subject.
- :: So when recording a nock 0 you want to just pass subject in for new-subject.
- :: Basically a nock 0 is a special case of nock 10 where the edited tree is the original tree.
- +$ zero-map (map subject=* (map [axis=* new-subject=*] count=@))
- +$ decode-map (map [formula=* head=* tail=*] count=@)
- +$ fock-return
- $+ fock-return
- $: queue=(list *)
- zeroes=zero-map
- decodes=decode-map
- [s=* f=*]
- ::jutes=(list [@tas sam=* prod=*])
- ==
- :: $dyck-stack: horner accumulated stack of dyck path
- :: $dyck-felt: felt representing dyck-stack
- :: $leaf-stack: horner accumulated stack of leaves
- :: $leaf-felt: felt representing leaf-stack
- :: $ion-fprint: compressed $ion-triple: a*len + b*dyck-felt + c*leaf-felt
- :: $ion-triple: dyck encoding of a noun. called the ION fingerprint in the EDEN paper.
- :: $compute-stack: horner accumulated stack of packed-tree-felts
- :: $compute-felt: felt representing compute-stack
- :: $tree-data:
- ::
- :: .len: length of the leaf stack
- +$ tree-data
- $~ [pone pzero pzero 0]
- $: size=pelt :: alf^len
- dyck=pelt
- leaf=pelt
- n=*
- ==
- ::
- +$ pelt $~(pzero @ux)
- ::
- ++ pzero `pelt`(lift 0)
- ++ pone `pelt`(lift 1)
- ::
- ++ pelt-lift
- ~/ %pelt-lift
- |= b=belt
- ^- pelt
- (lift b)
- ::
- ++ padd
- ~/ %padd
- |= [p=pelt q=pelt]
- ^- pelt
- (fadd p q)
- ::
- ++ pneg
- ~/ %pneg
- |= p=pelt
- ^- pelt
- (fneg p)
- ::
- ++ psub
- ~/ %psub
- |= [p=pelt q=pelt]
- ^- pelt
- (fsub p q)
- ::
- ++ pmul
- ~/ %pmul
- |= [p=pelt q=pelt]
- ^- pelt
- (fmul p q)
- ::
- ++ pscal
- ~/ %pscal
- |= [c=belt p=pelt]
- ^- pelt
- dat:(bpscal c [3 p])
- ::
- ::
- ++ pinv
- ~/ %pinv
- |= p=pelt
- ^- pelt
- (finv p)
- ::
- :: +ppow: field power; computes x^n
- ++ ppow
- ~/ %ppow
- |= [x=pelt n=@]
- (fpow x n)
- ::
- ++ print-pelt
- ~/ %print-pelt
- |= [=pelt t=(list belt)]
- ^- (list belt)
- :^ (~(snag bop [3 pelt]) 0)
- (~(snag bop [3 pelt]) 1)
- (~(snag bop [3 pelt]) 2)
- t
- ::
- ++ got-pelt
- ~/ %got-pelt
- |= [mp=(map term belt) t=term]
- ^- pelt
- =< dat
- %- init-bpoly
- :~ (~(got by mp) (crip (weld (trip t) "-a")))
- (~(got by mp) (crip (weld (trip t) "-b")))
- (~(got by mp) (crip (weld (trip t) "-c")))
- ==
- ::
- ++ compress-pelt
- ~/ %compress-pelt
- |= [cs=(list pelt) ps=(list pelt)]
- ^- pelt
- %+ roll (zip-up cs ps)
- |= [[c=pelt p=pelt] acc=pelt]
- ^- pelt
- (padd acc (pmul c p))
- ::
- +$ compute-queue (list tree-data)
- ::
- +| %constants
- ++ ext-degree 3 :: goldilocks field degree
- --
|