aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpukkamustard <pukkamustard@posteo.net>2020-10-26 20:24:34 +0100
committerpukkamustard <pukkamustard@posteo.net>2020-10-26 20:38:35 +0100
commitca9c3ba6024e512de13d5dedebb4b8d09e80cd52 (patch)
tree5c9d2f754d0059b38e0b09251b2b87f3786981d2
parentd6d8409a9c2276562dc87bdd512b20bb92cbbef0 (diff)
*: update read-capability encoding
-rw-r--r--Makefile.am3
-rw-r--r--doc/eris.adoc20
-rw-r--r--eris.scm66
-rw-r--r--eris/block-storage.scm48
-rw-r--r--eris/decode.scm21
-rw-r--r--eris/encode.scm55
-rw-r--r--eris/ui.scm41
-rw-r--r--eris/urn.scm78
-rw-r--r--hall.scm11
-rw-r--r--public/index.html58
-rw-r--r--tests/eris.scm18
11 files changed, 268 insertions, 151 deletions
diff --git a/Makefile.am b/Makefile.am
index e3fdc73..a51957b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -34,7 +34,8 @@ SUFFIXES = .scm .go
.scm.go:
$(AM_V_GEN)$(top_builddir)/pre-inst-env $(GUILE_TOOLS) compile $(GUILE_WARNINGS) -o "$@" "$<"
-SOURCES = eris/ui.scm \
+SOURCES = eris.scm \
+ eris/ui.scm \
eris/encode.scm \
eris/urn.scm \
eris/decode.scm \
diff --git a/doc/eris.adoc b/doc/eris.adoc
index f469025..5e02f30 100644
--- a/doc/eris.adoc
+++ b/doc/eris.adoc
@@ -319,8 +319,27 @@ Random access is possible by only decoding selected sub-trees.
=== Binary Encoding of Read Capability
+The read-capability consisting of the block-size, level of root reference-key pair as well as the root reference-key pair form the necessary pieces of information required to decode content.
+
+We specify an binary encoding of the read-capability 66 bytes:
+
+|===
+|Byte offset | Content | Length (in bytes)
+
+| 0 | block size (`0x00` for block size 1Kb and `0x01` for block size 32Kb)| 1
+| 1 | level of root reference-key pair as unsigned integer | 1
+| 2 | root reference | 32
+| 34 | root key | 32
+|===
+
+The initial field (block size) also encodes the ERIS version. Future versions of ERIS MUST use different codes to encode block sizes.
+
+TODO using 1 byte to encode level limits size of content that can be encoded. Add a comment on that.
+
=== URN
+A read-capability can be encoded as an URN: `urn:eris:BASE32-READ-CAPABILITY`, where `BASE32-READ-CAPABILITY` is the unpadded Base32 <<RFC4648>> encoding of the read capability.
+
== Applications
=== Storage and Transport Layers
@@ -363,6 +382,7 @@ This work is licensed under a http://creativecommons.org/licenses/by-sa/4.0/[Cre
- [[[Polleres2020]]] Polleres, Kamdar, Fernández, Javier David, Tudorache & Musen. https://epub.wu.ac.at/6371/1/IPM_workingpaper_02_2018.pdf[A more decentralized vision for Linked Data]. 2020
- [[[ECRS]]] Grothoff, Grothoff, Horozov, & Lindgren. https://grothoff.org/christian/ecrs.pdf[An encoding for censorship-resistant sharing]. 2003
- [[[RFC2119]]] S. Bradner. https://tools.ietf.org/html/rfc2119[Key words for use in RFCs to Indicate Requirement Levels]. 1997
+- [[[RFC4648]]] S. Josefsson. https://tools.ietf.org/html/rfc4648[The Base16, Base32, and Base64 Data Encodings]. 2006
- [[[RFC7049]]] C. Bormann & P. Hoffman. https://tools.ietf.org/html/rfc7049[Concise Binary Object Representation (CBOR)]. 2013
- [[[RFC7693]]] M-J. Saarinen & J-P. Aumasson. https://tools.ietf.org/html/rfc7693[The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC)]. 2015
- [[[RFC8439]]] Nir & Langley. https://tools.ietf.org/html/rfc8439[ChaCha20 and Poly1305 for IETF Protocols]. 2018
diff --git a/eris.scm b/eris.scm
index e69de29..c84539c 100644
--- a/eris.scm
+++ b/eris.scm
@@ -0,0 +1,66 @@
+(define-module (eris)
+ #:use-module (eris urn)
+ #:use-module (eris block-storage)
+ #:use-module (eris encode)
+ #:use-module (eris decode)
+ #:use-module (eris utils rbytevector)
+
+ #:use-module (srfi srfi-171)
+ #:use-module (rnrs bytevectors)
+ #:use-module (rnrs io ports)
+
+ #:export (eris-encode
+ eris-encode-uri
+
+ eris-decode->bytevector))
+
+(define null-convergence-secret (make-bytevector 32 0))
+
+;; Higher-level interfaces for encoding
+
+(define* (eris-encode port #:key block-storage
+ (convergence-secret null-convergence-secret)
+ (block-size 1024))
+ "Encode content from a port and store blocks into a <eris-block-storage>. Returns the ERIS urn of the content."
+ (let ((read-capability-block-storage
+ (port-transduce
+ (eris-encode-transducer #:convergence-secret convergence-secret
+ #:block-size block-size)
+ (eris-block-storage-rput block-storage)
+ (lambda (port) (get-bytevector-n port block-size))
+ port)))
+ (values
+ (read-capability->string (car read-capability-block-storage))
+ (cdr read-capability-block-storage))))
+
+
+(define* (eris-encode-uri port #:key
+ (convergence-secret null-convergence-secret)
+ (block-size 1024))
+ "Encode content, discard blocks and return the ERIS URI. This is useful for verifying that content is properly encoded."
+ (read-capability->string
+ (car (port-transduce
+ (compose
+
+ ;; apply ERIS encoding on data
+ (eris-encode-transducer #:convergence-secret convergence-secret
+ #:block-size block-size)
+
+ ;; filter out anything that is not the read-capability
+ (tfilter read-capability?))
+
+ ;; store root reference in a list
+ rcons
+
+ ;; read block-size bytes from port
+ (lambda (port) (get-bytevector-n port block-size))
+
+ port))))
+
+
+(define* (eris-decode->bytevector urn #:key block-storage)
+ (eris-transduce
+ (tmap identity)
+ (rbytevector)
+ #:block-storage block-storage
+ #:read-capability (string->read-capability urn)))
diff --git a/eris/block-storage.scm b/eris/block-storage.scm
index b081922..d61fe9a 100644
--- a/eris/block-storage.scm
+++ b/eris/block-storage.scm
@@ -3,9 +3,9 @@
; SPDX-License-Identifier: GPL-3.0-or-later
(define-module (eris block-storage)
- #:use-module (oop goops)
+ #:use-module (eris urn)
- #:use-module (ice-9 match)
+ #:use-module (oop goops)
#:use-module (srfi srfi-171)
@@ -24,22 +24,30 @@
(define-generic eris-block-storage-put)
(define-generic eris-block-storage-get)
-(define-method (eris-block-storage-rput (bs <eris-block-storage>))
+(define (eris-block-storage-rput block-storage)
"Returns a SRFI-171 reducer that stores blocks in block storage."
- (case-lambda
- (() bs)
-
- ((result) result)
-
- ((result input)
- (match input
- (('block _ bv)
- (begin
- (eris-block-storage-put result bv)
- result))
-
- ;; FIXME this is dangerous as it assumes that root is the last thing that is emited
- (('root _ _ _)
- (cons input result))
-
- (_ result)))))
+ (let ((read-capability #f))
+ (case-lambda
+ (() block-storage)
+
+ ;; on completion return the read-capability and the block-storage
+ ((result) (cons read-capability result))
+
+ ;; on input
+ ((result input)
+ (cond
+
+ ;; if input is a pair, then it is a reference-block pair
+ ((pair? input)
+ (begin
+ (eris-block-storage-put result (cdr input))
+ result))
+
+ ;; if input is a read-capability, store in variable
+ ((read-capability? input)
+ (begin
+ (set! read-capability input)
+ result))
+
+ ;; something unexpected...
+ (else result))))))
diff --git a/eris/decode.scm b/eris/decode.scm
index 5b8a66f..fdb1eb0 100644
--- a/eris/decode.scm
+++ b/eris/decode.scm
@@ -52,12 +52,17 @@
;; open the block as a port for reading
(open-bytevector-input-port block)))))
-(define (tree-transduce xform f init urn block-storage)
- (let-values (((level ref key) (decode-eris-urn urn)))
- (let* ((xf (xform f))
- (result (tree-reduce xf init ref key level block-storage)))
- (xf result))))
+(define (tree-transduce xform f init read-capability block-storage)
+ (let* ((xf (xform f))
+ (result (tree-reduce xf init
+ (read-capability-root-reference read-capability)
+ (read-capability-root-key read-capability)
+ (read-capability-level read-capability)
+ block-storage)))
+ (xf result)))
-
-(define* (eris-transduce xform f #:key block-storage block-size urn)
- (tree-transduce (compose (tunpad block-size) xform) f (f) urn block-storage))
+(define* (eris-transduce xform f #:key block-storage read-capability)
+ (tree-transduce
+ (compose (tunpad (read-capability-block-size read-capability)) xform)
+ f (f)
+ read-capability block-storage))
diff --git a/eris/encode.scm b/eris/encode.scm
index efc4474..cfdab77 100644
--- a/eris/encode.scm
+++ b/eris/encode.scm
@@ -16,16 +16,12 @@
#:use-module (sodium padding)
#:use-module (sodium stream)
- #:use-module (ice-9 match)
-
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-9)
#:use-module (srfi srfi-11)
#:use-module (srfi srfi-171)
- #:export (eris-encode-transducer
- eris-encode
- eris-encode-uri))
+ #:export (eris-encode-transducer))
;; ERIS-x2 Encoding
@@ -82,11 +78,6 @@
(hash-set! (encoder-state-levels state)
level (cons rk (encoder-get-level state level))))
-(define (br->out block reference)
- "Pack a block-reference pair to be emmited"
- (list 'block reference block))
-
-
(define (encoder-make-tree-node rks arity)
"Pack a list of ref-key pairs into a Merkle Tree node"
;; this might be a bit too much SRFI-171...
@@ -167,7 +158,7 @@
(encoder-collect state (1+ level)
reducer
;; add the newly created block (node in level (1+ level)) to the list of block created in this collect phase
- (reducer result (br->out block reference))))
+ (reducer result (cons reference block))))
;; nothing to do, return the collected output
result))
@@ -179,7 +170,11 @@
((and (= level (encoder-get-top-level state))
(= (length (encoder-get-level state level)) 1))
(let ((root-ref-key (car (encoder-get-level state level))))
- (reducer result (list 'root level (car root-ref-key) (cdr root-ref-key)))))
+ (reducer result (make-read-capability
+ (* (encoder-state-arity state) 64)
+ level
+ (car root-ref-key)
+ (cdr root-ref-key)))))
;; level is not empty
((< 0 (length (encoder-get-level state level)))
@@ -187,7 +182,7 @@
(let-values (((block reference) (encoder-force-collect state level)))
;; continue finalizing at level above
(encoder-finalize state (1+ level) reducer
- (reducer result (br->out block reference)))))
+ (reducer result (cons reference block)))))
;; level is empty
((null? (encoder-get-level state level))
@@ -216,7 +211,7 @@
;; reduce newly created reference-block pairs
(encoder-collect state 0 reducer
;; reduce the new block
- (reducer result (br->out block reference)))))))))
+ (reducer result (cons reference block)))))))))
(define* (eris-encode-transducer #:key convergence-secret block-size)
"Returns a transducer that takes bytevectors of size block-size (last bytevector may be smaller and will be padded) and encodes the content using ERISx2."
@@ -224,35 +219,3 @@
(compose (tpad block-size)
(tbuild-tree arity convergence-secret))))
-;; Higher-level interfaces for encoding
-
-(define* (eris-encode port #:key block-storage convergence-secret block-size)
- "Encode content from a port and store blocks into a <eris-block-storage>. Returns the ERIS urn of the content."
- (match (car (port-transduce
- (eris-encode-transducer #:convergence-secret convergence-secret
- #:block-size block-size)
- (eris-block-storage-rput block-storage)
- (lambda (port) (get-bytevector-n port block-size))
- port))
- (('root level reference key) (make-eris-urn level reference key))))
-
-(define* (eris-encode-uri port #:key convergence-secret block-size)
- "Encode content, discard blocks and return the ERIS URI. This is useful for verifying that content is properly encoded."
- (match (car (port-transduce
- (compose
-
- ;; apply ERIS encoding on data
- (eris-encode-transducer #:convergence-secret convergence-secret
- #:block-size block-size)
-
- ;; filter out blocks
- (tfilter (lambda (x) (equal? (car x) 'root))))
-
- ;; store root reference in a list
- rcons
-
- ;; read block-size bytes from port
- (lambda (port) (get-bytevector-n port block-size))
-
- port))
- (('root level reference key) (make-eris-urn level reference key))))
diff --git a/eris/ui.scm b/eris/ui.scm
index 2bcac7b..ceac634 100644
--- a/eris/ui.scm
+++ b/eris/ui.scm
@@ -4,16 +4,7 @@
(define-module (eris ui)
- #:use-module (eris encode)
- #:use-module (eris decode)
- #:use-module (eris urn)
- #:use-module (eris block-storage)
- #:use-module (eris block-storage hash-table)
-
- #:use-module (eris utils rbytevector)
- #:use-module (eris utils padding)
-
- #:use-module (oop goops)
+ #:use-module (eris)
#:use-module (rnrs bytevectors)
#:use-module (rnrs io ports)
@@ -24,29 +15,6 @@
#:use-module (srfi srfi-171)
#:export (main))
-(define my-store (make <eris-block-storage-hash-table>))
-(define my-convergence-secret (make-bytevector 32 0))
-
-;; (define my-urn
-;; (eris-encode (open-bytevector-input-port (make-bytevector 12 2))
-;; #:block-storage my-store
-;; #:convergence-secret my-convergence-secret
-;; #:block-size 128))
-
-;; (decode-eris-urn my-urn)
-
-;; (eris-transduce (tmap identity) (rbytevector)
-;; #:block-storage my-store
-;; #:block-size 128
-;; #:urn my-urn)
-
-;; (eris-transduce (tmap identity) rcons my-urn 128 my-store)
-
-
-;; (encode (open-bytevector-input-port (make-bytevector 1280 1))
-;; #:convergence-secret my-convergence-secret
-;; #:block-storage my-store
-;; #:block-size 1024)
(define (show-eris-message)
(format #t "Hail ERIS!~%~%")
@@ -55,9 +23,6 @@
(define (main arg0 . args)
(match args
(() (show-eris-message))
- (("put")
+ (("urn")
(format #t "~a~%"
- (eris-encode-uri (current-input-port)
- #:convergence-secret my-convergence-secret
- #:block-storage my-store
- #:block-size (* 32 1024))))))
+ (eris-encode-uri (current-input-port))))))
diff --git a/eris/urn.scm b/eris/urn.scm
index 37f55ab..1697785 100644
--- a/eris/urn.scm
+++ b/eris/urn.scm
@@ -7,34 +7,74 @@
#:use-module (eris utils base32)
+
+ #:use-module (srfi srfi-9)
#:use-module (srfi srfi-171)
- #:export (make-eris-urn
- decode-eris-urn))
-(define (decode-eris-urn urn)
- (when (equal? (string-take urn 11) "urn:erisx2:")
- (let* ((port (open-bytevector-input-port (base32-decode (string-drop urn 11))))
- (version (get-u8 port))
- (level (get-u8 port))
- (reference (get-bytevector-n port 32))
- (key (get-bytevector-n port 32)))
- (when (= version 0)
- (values level reference key)))))
-
-(define (make-binary-eris-urn level reference key)
+ #:export (make-read-capability
+ read-capability?
+ read-capability-block-size
+ read-capability-level
+ read-capability-root-reference
+ read-capability-root-key
+
+ read-capability->bytevector
+ bytevector->read-capability
+
+ read-capability->string
+ string->read-capability))
+
+(define-record-type <read-capability>
+ (make-read-capability block-size level root-reference root-key)
+ read-capability?
+ (block-size read-capability-block-size)
+ (level read-capability-level)
+ (root-reference read-capability-root-reference)
+ (root-key read-capability-root-key))
+
+(define (read-capability->bytevector read-capability)
(list-transduce (tmap identity)
(rbytevector)
(list
;; version
- (make-bytevector 1 0)
+ (if (= 1024 (read-capability-block-size read-capability))
+ (make-bytevector 1 0)
+ (make-bytevector 1 1))
;; level
- (make-bytevector 1 level)
+ (make-bytevector 1 (read-capability-level read-capability))
+
+ ;; root reference
+ (read-capability-root-reference read-capability)
- reference
+ ;; root key
+ (read-capability-root-key read-capability))))
- key)))
+(define (bytevector->read-capability bv)
+ (let* ((port (open-bytevector-input-port bv))
+ (block-size (get-u8 port))
+ (level (get-u8 port))
+ (reference (get-bytevector-n port 32))
+ (key (get-bytevector-n port 32)))
+ (cond
-(define (make-eris-urn level reference key)
+ ((= block-size 0)
+ (make-read-capability 1024 level reference key))
+
+ ((= block-size 1)
+ (make-read-capability (* 32 1024) level reference key)))))
+
+(define (read-capability->string read-capability)
(string-append "urn:erisx2:"
- (base32-encode (make-binary-eris-urn level reference key))))
+ (base32-encode (read-capability->bytevector read-capability))))
+
+;; (read-capability->string
+;; (make-read-capability 1024 0
+;; (make-bytevector 32 0)
+;; (make-bytevector 32 1)))
+
+(define (string->read-capability urn)
+ (when (equal? (string-take urn 11) "urn:erisx2:")
+ (bytevector->read-capability
+ (base32-decode (string-drop urn 11)))))
+
diff --git a/hall.scm b/hall.scm
index 2eb015f..f691241 100644
--- a/hall.scm
+++ b/hall.scm
@@ -13,7 +13,8 @@
(license gpl3+)
(dependencies `(("guile-sodium" ,guile-sodium)))
(files (libraries
- ((directory "eris" ((scheme-file "ui")
+ ((scheme-file "eris")
+ (directory "eris" ((scheme-file "ui")
(scheme-file "encode")
(scheme-file "urn")
(scheme-file "decode")
@@ -25,10 +26,10 @@
(directory
"block-storage"
((scheme-file "hash-table")))))
- (directory
- "srfi"
- ((scheme-file "srfi-158")
- (scheme-file "srfi-194")))))
+ (directory
+ "srfi"
+ ((scheme-file "srfi-158")
+ (scheme-file "srfi-194")))))
(tests ((directory
"tests"
((scheme-file "eris")
diff --git a/public/index.html b/public/index.html
index c9471fd..12bd134 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1378,11 +1378,60 @@ ERIS-Decode(BLOCK-SIZE, LEVEL, ROOT-REFERENCE, ROOT-KEY):
</div>
<div class="sect2">
<h3 id="_binary_encoding_of_read_capability"><a class="anchor" href="#_binary_encoding_of_read_capability"></a>2.6. Binary Encoding of Read Capability</h3>
-
+<div class="paragraph">
+<p>The read-capability consisting of the block-size, level of root reference-key pair as well as the root reference-key pair form the necessary pieces of information required to decode content.</p>
+</div>
+<div class="paragraph">
+<p>We specify an binary encoding of the read-capability 66 bytes:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Byte offset</th>
+<th class="tableblock halign-left valign-top">Content</th>
+<th class="tableblock halign-left valign-top">Length (in bytes)</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">block size (<code>0x00</code> for block size 1Kb and <code>0x01</code> for block size 32Kb)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">level of root reference-key pair as unsigned integer</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">root reference</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">32</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">34</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">root key</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">32</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The initial field (block size) also encodes the ERIS version. Future versions of ERIS MUST use different codes to encode block sizes.</p>
+</div>
+<div class="paragraph">
+<p>TODO using 1 byte to encode level limits size of content that can be encoded. Add a comment on that.</p>
+</div>
</div>
<div class="sect2">
<h3 id="_urn"><a class="anchor" href="#_urn"></a>2.7. URN</h3>
-
+<div class="paragraph">
+<p>A read-capability can be encoded as an URN: <code>urn:eris:BASE32-READ-CAPABILITY</code>, where <code>BASE32-READ-CAPABILITY</code> is the unpadded Base32 <a href="#RFC4648">[RFC4648]</a> encoding of the read capability.</p>
+</div>
</div>
</div>
</div>
@@ -1461,6 +1510,9 @@ ERIS-Decode(BLOCK-SIZE, LEVEL, ROOT-REFERENCE, ROOT-KEY):
<p><a id="RFC2119"></a>[RFC2119] S. Bradner. <a href="https://tools.ietf.org/html/rfc2119">Key words for use in RFCs to Indicate Requirement Levels</a>. 1997</p>
</li>
<li>
+<p><a id="RFC4648"></a>[RFC4648] S. Josefsson. <a href="https://tools.ietf.org/html/rfc4648">The Base16, Base32, and Base64 Data Encodings</a>. 2006</p>
+</li>
+<li>
<p><a id="RFC7049"></a>[RFC7049] C. Bormann &amp; P. Hoffman. <a href="https://tools.ietf.org/html/rfc7049">Concise Binary Object Representation (CBOR)</a>. 2013</p>
</li>
<li>
@@ -1485,7 +1537,7 @@ ERIS-Decode(BLOCK-SIZE, LEVEL, ROOT-REFERENCE, ROOT-KEY):
</div>
<div id="footer">
<div id="footer-text">
-Last updated 2020-10-23 17:00:04 +0200
+Last updated 2020-10-26 20:35:26 +0100
</div>
</div>
</body>
diff --git a/tests/eris.scm b/tests/eris.scm
index dc7a22d..e93e5b4 100644
--- a/tests/eris.scm
+++ b/tests/eris.scm
@@ -3,9 +3,7 @@
; SPDX-License-Identifier: GPL-3.0-or-later
(define-module (tests eris)
- #:use-module (eris encode)
- #:use-module (eris decode)
- #:use-module (eris utils rbytevector)
+ #:use-module (eris)
#:use-module (eris block-storage)
#:use-module (eris block-storage hash-table)
@@ -17,6 +15,7 @@
#:use-module (tests utils)
+ #:use-module (srfi srfi-11)
#:use-module (srfi srfi-64)
#:use-module (srfi srfi-158)
#:use-module (srfi srfi-171))
@@ -35,19 +34,16 @@
(lambda (bv)
- (let ((eris-urn (eris-encode (open-bytevector-input-port bv)
- #:block-storage my-store
- #:convergence-secret my-convergence-secret
- #:block-size (* 32 1024))))
+ (let-values (((urn _) (eris-encode (open-bytevector-input-port bv)
+ #:block-storage my-store
+ #:convergence-secret my-convergence-secret
+ #:block-size (* 32 1024))))
(test-assert "decoded bytevector is same as initial bytevector"
(bytevector=?
bv
- (eris-transduce (tmap identity) (rbytevector)
- #:block-storage my-store
- #:block-size (* 32 1024)
- #:urn eris-urn)))))
+ (eris-decode->bytevector urn #:block-storage my-store)))))
(gtake random-bytevector-generator 20))