From f743be23b14b639226f444e52cd50b9f0f7f4638 Mon Sep 17 00:00:00 2001 From: David Florness Date: Sun, 23 Feb 2020 09:19:09 -0700 Subject: [PATCH] Functionality to convert polynomials to merkle trees It's taking 12 seconds for just 100000 points :( --- merkle.rkt | 18 ++++++++---------- poly.rkt | 17 ++++++++++++++--- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/merkle.rkt b/merkle.rkt index 3dac588..2eb2330 100644 --- a/merkle.rkt +++ b/merkle.rkt @@ -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)) diff --git a/poly.rkt b/poly.rkt index 943f3c4..1d26167 100644 --- a/poly.rkt +++ b/poly.rkt @@ -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)) -- 2.38.4