~edwargix/tallyard

f743be23b14b639226f444e52cd50b9f0f7f4638 — David Florness 5 years ago c76c0d7
Functionality to convert polynomials to merkle trees

It's taking 12 seconds for just 100000 points :(
2 files changed, 22 insertions(+), 13 deletions(-)

M merkle.rkt
M poly.rkt
M merkle.rkt => merkle.rkt +8 -10
@@ 2,13 2,13 @@
(require/typed sha [sha256 (-> Bytes Bytes)])

(struct merkle-tree
  ([root        : merkle-node]
   [leaves      : (Vectorof merkle-node)]))
  ([root    : merkle-node]
   [leaves  : (Vectorof merkle-node)]
   [content : (Vectorof Bytes)]))

(struct merkle-node
  ([parent : (Option merkle-node)]
   [hsh    : Bytes]
   [C      : (Option Bytes)])
   [hsh    : Bytes])
  #:mutable
  #:transparent)



@@ 17,9 17,8 @@
         [leaves
          (build-vector (+ n (modulo n 2))
                        (λ ([i : Natural])
                          (let ([bstr
                                 (vector-ref content (min i (sub1 n)))])
                            (merkle-node #f (sha256 bstr) bstr))))])
                          (let ([bstr (vector-ref content (min i (sub1 n)))])
                            (merkle-node #f (sha256 bstr)))))])
    (let build-level : merkle-tree
         ([nodes : (Vectorof merkle-node)
                 leaves])


@@ 33,11 32,10 @@
                         (merkle-node
                          #f
                          (sha256 (bytes-append (merkle-node-hsh left)
                                                (merkle-node-hsh right)))
                          #f)])
                                                (merkle-node-hsh right))))])
                    (set-merkle-node-parent! left new-node)
                    (set-merkle-node-parent! right new-node)
                    new-node)))
               (merkle-tree (vector-ref nodes 0) leaves))))))
               (merkle-tree (vector-ref nodes 0) leaves content))))))

(provide (all-defined-out))

M poly.rkt => poly.rkt +14 -3
@@ 1,11 1,16 @@
#lang typed/racket
#lang typed/racket/base
(require (only-in racket/math natural?))
(require (only-in racket/vector vector-map))
(require/typed binaryio
  [bytes->integer (->* (Bytes Boolean) (Boolean Natural Natural) Integer)]
  [integer->bytes (->* (Integer Natural Boolean) (Boolean Bytes Natural) Bytes)]
  [integer-bytes-length (Integer Boolean -> Natural)])
  [integer->bytes (->* (Integer Positive-Integer Boolean)
                       (Boolean Bytes Natural) Bytes)]
  [integer-bytes-length (Integer Boolean -> Positive-Integer)])
(require/typed crypto
  [crypto-random-bytes (Natural -> Bytes)])

(require "merkle.rkt")

(define-type Poly (Integer -> Integer))

(define (gen)


@@ 21,4 26,10 @@
                  (* (expt x (add1 i)) (vector-ref coefficients i))))
             Integer))))

(define (poly-merkle [p : Poly]) : merkle-tree
  (merkle
   (vector-map
    (λ ([x : Integer]) (integer->bytes x (integer-bytes-length x #t) #t))
    (build-vector 100000 p))))

(provide (all-defined-out))