aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpukkamustard <pukkamustard@posteo.net>2020-11-27 11:37:53 +0100
committerpukkamustard <pukkamustard@posteo.net>2020-11-27 11:45:32 +0100
commit5c77e13128e05f85cb93f559b163ea472dd665ae (patch)
tree8e936691a33ca630f870be3a3f35bca9b9169fbd
parente26c9b74d61dad060db2f7e01ebd79d9a2cff818 (diff)
(eris) change encoding and decoding API and remove <block-storage>
Now encoding requires a SRFI-171 reduce that takes care of the blocks. This is straighforward enough (especially using rcons to get an alist) that the <block-storage> abstraction is no longer needed. Decoding now takes a 1-ary function `block-ref` to access blocks while decoding.
-rw-r--r--Makefile.am3
-rw-r--r--doc/eris.texi30
-rw-r--r--eris.scm115
-rw-r--r--eris/block-storage.scm53
-rw-r--r--eris/block-storage/hash-table.scm34
-rw-r--r--eris/block-storage/okvs.scm20
-rw-r--r--eris/block-storage/vhash.scm66
-rw-r--r--eris/decode.scm18
-rw-r--r--eris/encode.scm1
-rw-r--r--eris/utils/test-vector.scm37
-rw-r--r--examples/ipfs.scm (renamed from eris/block-storage/ipfs.scm)0
-rw-r--r--hall.scm5
-rw-r--r--test-vectors/eris-test-vector-06.json2
-rw-r--r--tests/eris/pseudo-random.scm63
-rw-r--r--tests/eris/test-vectors.scm12
15 files changed, 182 insertions, 277 deletions
diff --git a/Makefile.am b/Makefile.am
index 110667d..1f91251 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -40,8 +40,7 @@ SOURCES = eris.scm \
eris/decode.scm \
eris/utils/padding.scm \
eris/utils/base32.scm \
- eris/utils/rbytevector.scm \
- eris/block-storage/vhash.scm
+ eris/utils/rbytevector.scm
TESTS = tests/eris/test-vectors.scm \
tests/eris/large.scm \
diff --git a/doc/eris.texi b/doc/eris.texi
index c44d353..1c10efd 100644
--- a/doc/eris.texi
+++ b/doc/eris.texi
@@ -5,7 +5,7 @@
@c %**start of header
@setfilename guile-eris.info
@documentencoding UTF-8
-@settitle Guile Eris Reference Manual
+@settitle Guile-ERIS Reference Manual
@c %**end of header
@include version.texi
@@ -23,11 +23,11 @@ Documentation License''.
@dircategory The Algorithmic Language Scheme
@direntry
-* Guile Eris: (guile-eris).
+* Guile-ERIS: (guile-eris). Guile implementation of the Encoding for Robust Immutable Storage (ERIS)
@end direntry
@titlepage
-@title The Guile Eris Manual
+@title The Guile-ERIS Manual
@author pukkamustard
@page
@@ -42,20 +42,34 @@ Edition @value{EDITION} @*
@c *********************************************************************
@node Top
-@top Guile Eris
+@top Guile-ERIS
-This document describes Guile Eris version @value{VERSION}.
+This document describes Guile-ERIS version @value{VERSION}.
@menu
-* Introduction:: Why Guile Eris?
+* Introduction:: About ERIS.
+* Encoding and Decoding:: Encoding and decoding content with ERIS.
+* Streaming Interface:: Encoding as transducing.
@end menu
@c *********************************************************************
@node Introduction
@chapter Introduction
-INTRODUCTION HERE
+The Encoding for Robust Immutable Storage (ERIS) is an encoding of arbitrary content into a set of uniformly sized, encrypted and content-addressed blocks as well as a read capability. The content can be reassembled from the encrypted blocks only with this read capability. The read capability can be encoded as an URN allowing encoded content to be referenced from existing applications.
-This documentation is a stub.
+This manual documents the Guile implementation of ERIS.
+
+For more information on ERIS see the @url{http://purl.org/eris, specification}.
+
+@node Encoding and Decoding
+@chapter Encoding and Decoding
+
+
+@node Block Storage
+@section Block Storage
+
+@node Streaming Interface
+@chapter Streaming Interface
@bye
diff --git a/eris.scm b/eris.scm
index 353940e..8eec471 100644
--- a/eris.scm
+++ b/eris.scm
@@ -4,67 +4,100 @@
(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-11)
#:use-module (srfi srfi-171)
#:use-module (rnrs bytevectors)
#:use-module (rnrs io ports)
- #:export (eris-encode
- eris-encode-uri
+ #:export (eris-block-size-small
+ eris-block-size-large
+
+ eris-encode
+ eris-encode->urn
eris-decode->bytevector))
+(define eris-block-size-small 1024)
+(define eris-block-size-large 32768)
+
(define null-convergence-secret (make-bytevector 32 0))
+(define (tstore-blocks block-reducer)
+ "Returns a transducer that reduces blocks into @code{block-reducer} and emits a
+single pair consisting of the reduced blocks and the read capability"
+ (lambda (reducer)
+ (let ((read-capability #f)
+ (blocks (block-reducer)))
+ (case-lambda
+
+ ;; identity
+ (() (reducer))
+
+ ;; completion - cons the blocks and read-capability
+ ((result) (reducer (reducer result (cons read-capability blocks))))
+
+ ;; on input
+ ((result input)
+ (cond
+
+ ;; input is a block
+ ((pair? input)
+ ;; reduce block with block reducer
+ (set! blocks (block-reducer blocks input))
+ result)
+
+ ;; input is the read-capability
+ ((read-capability? input)
+ (set! read-capability input)
+ result)))))))
+
+(define* (rlast #:key (default #f))
+ "Returns a reducer that returns the last reduced value or the default value if no values are reduced."
+ (case-lambda
+ (() default)
+ ((result) result)
+ ((result input) input)))
+
;; Higher-level interfaces for encoding
-(define* (eris-encode port #:key block-storage
+(define* (eris-encode port #:key
+ (block-reducer rcons)
(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
+ (block-size eris-block-size-small))
+ "Encode content from a port and reduce blocks into @code{bock-reducer}. Returns the read capability and reduced blocks."
+ (let ((read-capability-blocks
(port-transduce
- (eris-encode-transducer #:convergence-secret convergence-secret
- #:block-size block-size)
- (eris-block-storage-rput block-storage)
+ (compose (eris-encode-transducer #:convergence-secret convergence-secret
+ #:block-size block-size)
+ (tstore-blocks block-reducer))
+ (rlast)
(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)
+ (values (car read-capability-blocks)
+ (cdr read-capability-blocks))))
+
+(define* (eris-encode->urn port #:key
+ (convergence-secret null-convergence-secret)
+ (block-size eris-block-size-small))
+ "Encode content, discard blocks and return the read capability as URN. This is useful for verifying that content is properly encoded."
+ (let-values (((read-capability block-count)
+ (eris-encode port #:convergence-secret convergence-secret
+ #:block-size block-size
+ #:block-reducer rcount)))
+ (read-capability->string read-capability)))
+
+(let-values
+ (((read-capability blocks) (eris-encode (open-bytevector-input-port (string->utf8 "Hello world!")))))
+ (eris-decode->bytevector (read-capability->string read-capability)
+ (lambda (ref) (assoc-ref blocks ref))))
+
+(define (eris-decode->bytevector urn block-ref)
(eris-transduce
(tmap identity)
(rbytevector)
- #:block-storage block-storage
+ #:block-ref block-ref
#:read-capability (string->read-capability urn)))
diff --git a/eris/block-storage.scm b/eris/block-storage.scm
deleted file mode 100644
index d61fe9a..0000000
--- a/eris/block-storage.scm
+++ /dev/null
@@ -1,53 +0,0 @@
-; SPDX-FileCopyrightText: 2020 pukkamustard <pukkamustard@posteo.net>
-;
-; SPDX-License-Identifier: GPL-3.0-or-later
-
-(define-module (eris block-storage)
- #:use-module (eris urn)
-
- #:use-module (oop goops)
-
- #:use-module (srfi srfi-171)
-
- #:export (<eris-block-storage>
- eris-block-storage-put
- eris-block-storage-get
-
- eris-block-storage-rput))
-
-;; ERIS block storage
-;;
-;; Defines the interface for a Block Storage that can be used with ERIS.
-
-(define-class <eris-block-storage> ())
-
-(define-generic eris-block-storage-put)
-(define-generic eris-block-storage-get)
-
-(define (eris-block-storage-rput block-storage)
- "Returns a SRFI-171 reducer that stores blocks in block storage."
- (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/block-storage/hash-table.scm b/eris/block-storage/hash-table.scm
deleted file mode 100644
index 3d32b04..0000000
--- a/eris/block-storage/hash-table.scm
+++ /dev/null
@@ -1,34 +0,0 @@
-; SPDX-FileCopyrightText: 2020 pukkamustard <pukkamustard@posteo.net>
-;
-; SPDX-License-Identifier: GPL-3.0-or-later
-
-(define-module (eris block-storage hash-table)
- #:use-module (eris block-storage)
-
- #:use-module (oop goops)
-
- #:use-module (sodium generichash)
-
- #:use-module (rnrs bytevectors)
-
- #:use-module (srfi srfi-69)
-
- #:export (<eris-block-storage-hash-table>
- eris-block-storage-hash-table-store
-
- make-eris-block-storage-hash-table))
-
-(define-class <eris-block-storage-hash-table> (<eris-block-storage>)
- (store #:init-keyword #:store #:init-form (make-hash-table bytevector=?)
- #:getter eris-block-storage-hash-table-store))
-
-(define (make-eris-block-storage-hash-table)
- (make <eris-block-storage-hash-table>))
-
-(define-method (eris-block-storage-put (bs <eris-block-storage-hash-table>) bv)
- (let ((key (crypto-generichash bv)))
- (hash-table-set! (eris-block-storage-hash-table-store bs) key bv)
- key))
-
-(define-method (eris-block-storage-get (bs <eris-block-storage-hash-table>) key)
- (hash-table-ref (eris-block-storage-hash-table-store bs) key))
diff --git a/eris/block-storage/okvs.scm b/eris/block-storage/okvs.scm
deleted file mode 100644
index 58f418b..0000000
--- a/eris/block-storage/okvs.scm
+++ /dev/null
@@ -1,20 +0,0 @@
-; SPDX-FileCopyrightText: 2020 pukkamustard <pukkamustard@posteo.net>
-;
-; SPDX-License-Identifier: GPL-3.0-or-later
-
-(define-module (eris block-storage okvs)
- #:use-module (eris cas)
- #:use-module (sodium generichash)
- #:use-module (srfi srfi-167)
- #:export (okvs->cas))
-
-(define (okvs->cas okvs)
- ;; Create a content-addressed storage from an okvs
- (make-cas
-
- (lambda (bv)
- (let ((key (crypto-generichash bv)))
- (okvs-set! okvs key bv) key))
-
- (lambda (key)
- (okvs-ref okvs key))))
diff --git a/eris/block-storage/vhash.scm b/eris/block-storage/vhash.scm
deleted file mode 100644
index 9db8d2a..0000000
--- a/eris/block-storage/vhash.scm
+++ /dev/null
@@ -1,66 +0,0 @@
-; SPDX-FileCopyrightText: 2020 pukkamustard <pukkamustard@posteo.net>
-;
-; SPDX-License-Identifier: GPL-3.0-or-later
-
-(define-module (eris block-storage vhash)
- #:use-module (eris block-storage)
- #:use-module (eris utils base32)
- #:use-module (ice-9 vlist)
- #:use-module (oop goops)
- #:use-module (sodium generichash)
- #:use-module (rnrs bytevectors)
-
- #:export (<vhash-block-storage>
- make-vhash-block-storage
- vhash-block-storage-store
-
- vhash-block-storage->obj
- obj->vhash-block-storage))
-
-(define-class <vhash-block-storage> (<eris-block-storage>)
- (store #:init-keyword #:store #:init-form vlist-null
- #:accessor vhash-block-storage-store))
-
-(define* (make-vhash-block-storage #:key (store vlist-null))
- (make <vhash-block-storage> #:store store))
-
-(define (bytevector-hash key size)
- (display key)
- (display size)
- (display " ")
- (display (hash (bytevector->u8-list key) size))
- (display "\n")
- (display "\n")
- (hash (bytevector->u8-list key) size))
-
-(define-method (eris-block-storage-put (bs <vhash-block-storage>) bv)
- (let ((key (base32-encode (crypto-generichash bv))))
- (cond
- ((vhash-assoc key (vhash-block-storage-store bs)) key)
- (else (set! (vhash-block-storage-store bs)
- (vhash-cons key bv (vhash-block-storage-store bs)))))
- key))
-
-(define-method (eris-block-storage-get (bs <vhash-block-storage>) key)
- (cond
- ((vhash-assoc (base32-encode key) (vhash-block-storage-store bs)) => cdr)
- (else #f)))
-
-(define (vhash-block-storage->obj bs)
- "Encode vhash block storage into a JSON serializable object"
- (map
- (lambda (key-block)
- (cons (string->symbol (car key-block))
- (base32-encode (cdr key-block))))
- (vlist->list
- (vhash-block-storage-store bs))))
-
-(define (obj->vhash-block-storage obj)
- "Decode a JSON object to a Block Storage"
- (make-vhash-block-storage
- #:store (alist->vhash
- (map
- (lambda (key-block)
- (cons (symbol->string (car key-block))
- (base32-decode (cdr key-block))))
- obj))))
diff --git a/eris/decode.scm b/eris/decode.scm
index fdb1eb0..a671a26 100644
--- a/eris/decode.scm
+++ b/eris/decode.scm
@@ -3,8 +3,6 @@
; SPDX-License-Identifier: GPL-3.0-or-later
(define-module (eris decode)
- #:use-module (eris block-storage)
-
#:use-module (eris urn)
#:use-module (eris utils padding)
@@ -28,10 +26,10 @@
(define (null-ref? bv)
(bytevector=? bv null-ref))
-(define (tree-reduce reducer init ref key level block-storage)
+(define (tree-reduce reducer init ref key level block-ref)
(let
- ;; get block from block-storage and decrypt
- ((block (crypto-stream-chacha20-ietf-xor (eris-block-storage-get block-storage ref) null-nonce key)))
+ ;; get block and decrypt
+ ((block (crypto-stream-chacha20-ietf-xor (block-ref ref) null-nonce key)))
(if (= 0 level)
;; if ref-key is at level 0 then the block is a data block, reduce
@@ -40,7 +38,7 @@
;; recursively transduce over the reference key pairs in node
(port-reduce
;; reducer passed to port-reduce is the recursive call to tree-reduce
- (lambda (result ref-key) (tree-reduce reducer result (car ref-key) (cdr ref-key) (1- level) block-storage))
+ (lambda (result ref-key) (tree-reduce reducer result (car ref-key) (cdr ref-key) (1- level) block-ref))
init
;; read reference-key pairs
(lambda (port)
@@ -52,17 +50,17 @@
;; open the block as a port for reading
(open-bytevector-input-port block)))))
-(define (tree-transduce xform f init read-capability block-storage)
+(define (tree-transduce xform f init read-capability block-ref)
(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)))
+ block-ref)))
(xf result)))
-(define* (eris-transduce xform f #:key block-storage read-capability)
+(define* (eris-transduce xform f #:key block-ref read-capability)
(tree-transduce
(compose (tunpad (read-capability-block-size read-capability)) xform)
f (f)
- read-capability block-storage))
+ read-capability block-ref))
diff --git a/eris/encode.scm b/eris/encode.scm
index cfdab77..167cf5b 100644
--- a/eris/encode.scm
+++ b/eris/encode.scm
@@ -6,7 +6,6 @@
#:use-module (rnrs bytevectors)
#:use-module (rnrs io ports)
- #:use-module (eris block-storage)
#:use-module (eris urn)
#:use-module (eris utils rbytevector)
diff --git a/eris/utils/test-vector.scm b/eris/utils/test-vector.scm
index 3669f82..d9e1701 100644
--- a/eris/utils/test-vector.scm
+++ b/eris/utils/test-vector.scm
@@ -7,8 +7,6 @@
#:use-module (eris encode)
#:use-module (eris utils base32)
#:use-module (eris urn)
- #:use-module (eris block-storage)
- #:use-module (eris block-storage vhash)
#:use-module (oop goops)
@@ -18,6 +16,7 @@
#:use-module (srfi srfi-9)
#:use-module (srfi srfi-11)
#:use-module (srfi srfi-69)
+ #:use-module (srfi srfi-171)
#:export (<test-vector>
make-test-vector
@@ -58,16 +57,26 @@
(urn test-vector-urn)
(blocks test-vector-blocks))
+;; Reduces blocks into an alist of base32 encoded values so that the blocks can be directly exported to JSON
+(define rtest-vector-blocks
+ (case-lambda
+ (() '())
+ ((result) result)
+ ((result ref-block)
+ (cons
+ (cons (string->symbol (base32-encode (car ref-block)))
+ (base32-encode (cdr ref-block)))
+ result))))
(define (make-test-vector id name description content convergence-secret block-size)
- (let-values (((urn block-storage) (eris-encode (open-bytevector-input-port content)
- #:block-storage (make-vhash-block-storage)
- #:block-size block-size
- #:convergence-secret convergence-secret)))
+ (let-values (((read-capability blocks) (eris-encode (open-bytevector-input-port content)
+ #:block-reducer rtest-vector-blocks
+ #:block-size block-size
+ #:convergence-secret convergence-secret)))
(&make-test-vector id name description content convergence-secret block-size
- (string->read-capability urn)
- urn
- block-storage)))
+ read-capability
+ (read-capability->string read-capability)
+ blocks)))
(define (read-capability->obj read-capability)
`((block-size . ,(read-capability-block-size read-capability))
@@ -82,12 +91,6 @@
(base32-decode (assq-ref obj 'root-reference))
(base32-decode (assq-ref obj 'root-key))))
-;; (read-capability->string
-;; (obj->read-capability
-;; (read-capability->obj
-;; (string->read-capability
-;; "urn:erisx2:AAAAV4OIFHWY67XFEHAOQVXUOWTYDVG5TEY6S6IW4PJ4SQLVJJF4MIKNDLKUDPPHDCKLBUIAJQ3U2IEARRPFHEHWFW5NJY7BJUGFESPGDQ"))))
-
(define (test-vector->obj test-vector)
`((id . ,(test-vector-id test-vector))
(name . ,(test-vector-name test-vector))
@@ -97,7 +100,7 @@
(block-size . ,(test-vector-block-size test-vector))
(read-capability . ,(read-capability->obj (test-vector-read-capability test-vector)))
(urn . ,(test-vector-urn test-vector))
- (blocks . ,(vhash-block-storage->obj (test-vector-blocks test-vector)))))
+ (blocks . ,(test-vector-blocks test-vector))))
(define (obj->test-vector obj)
(&make-test-vector
@@ -109,4 +112,4 @@
(assq-ref obj 'block-size)
(obj->read-capability (assq-ref obj 'read-capability))
(assq-ref obj 'urn)
- (obj->vhash-block-storage (assq-ref obj 'blocks))))
+ (assq-ref obj 'blocks)))
diff --git a/eris/block-storage/ipfs.scm b/examples/ipfs.scm
index b2caacd..b2caacd 100644
--- a/eris/block-storage/ipfs.scm
+++ b/examples/ipfs.scm
diff --git a/hall.scm b/hall.scm
index 87190bc..8f67c18 100644
--- a/hall.scm
+++ b/hall.scm
@@ -26,10 +26,7 @@
"utils"
((scheme-file "padding")
(scheme-file "base32")
- (scheme-file "rbytevector")))
- (directory
- "block-storage"
- ((scheme-file "vhash")))))))
+ (scheme-file "rbytevector")))))))
(tests ((directory
"tests"
((directory "eris"
diff --git a/test-vectors/eris-test-vector-06.json b/test-vectors/eris-test-vector-06.json
index d563250..90d11a2 100644
--- a/test-vectors/eris-test-vector-06.json
+++ b/test-vectors/eris-test-vector-06.json
@@ -1 +1 @@
-{"id":6,"name":"4096 byte null string (block size 1KiB)","description":"Encode 4096 bytes of zeroes using block-size 1KiB. This results in only 3 distinct blocks as 4 content blocks have identical content and are de-duplicated.","content":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","convergence-secret":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","block-size":1024,"read-capability":{"block-size":1024,"level":1,"root-reference":"X5VNB4TLM54B7Y47KXTGPFFRCP4KHZLTNV4H6RO7KCWIS6IJTPSQ","root-key":"3PJASBBUK3CMQR4XV2OU3CRCKZN6GTBMCJEWB2UKCY3BKOIHGE4Q"},"urn":"urn:erisx2:AAA362WQ6JVWO6A74OPVLZTHSSYRH6FD4VZW26D7IXPVBLEJPEEZXZO32IEQINCWYTEEPF5OTVGYUISWLPRUYLASJFQOVCQWGYKTSBZRHE","blocks":{"X5VNB4TLM54B7Y47KXTGPFFRCP4KHZLTNV4H6RO7KCWIS6IJTPSQ":"DWVOXIPWAZSQQITU3BO7WDBJTCLQAZ5OBQNSAQ6WB526GKSHSV4MLFXNUSS2K5U2BCCMMQZIELXUET5MZEOHS7ZVO2AHFWLCDYWFYYKIJNNAOTGIGN33A26G6BXTZX37U76QKRW7B7S7ANPPBKBPUBIPFIWL6ALX5DXFQOUPMXVELUYN6AYILJNTV6E5625KMNSLXQ72R35VALUIENV6I4WSDY4E5AUWJ2LGP6PWB5INAQBOGEQGUWPWL6AWQC7AWXCI2B2TC3MMUDFPBU7Z65ZNUWHXFSEPH32YE4VWPMZUSKZED46KN2X37MMRYUMFNVNCSJUX7HMQJTFWF2J5D7VDWMREBQZHMPGUACR7S4F247QJ3TSJVD2GQDLSVQYPGA2M77SVMUCM4U5EDZTFWEQXAHBFFGVMSLOUOKZEWU43PDEKRWHSD6IYHQYXS6CZUD25C6CS7O6NMUHIGRXHDIO5HS3FNFGQ4266AKUOABXDITJZC2Q6FSOER7IQDB6XQXO2TEFWDABI4HGCJZFPWJUD46IZLTMA6IMO6BT2USSZ25Y4HZJ3BJEH6Y3S6VQKLQOHROIDXPGZYSTP3UBT6VVBRRTHS5DYXAGLHSIP5F7HVGCLXIJQB22J3ZM2ARDUQYXBGAAG66HSJW3SXTGSGNPNWPZ3HO7WD62PJIZNSPRNQLJXYD27IDADZ6HVOSL4KBJAO2BR7OGMN4R7E46AJQVJRUKL4SNY5WJ2IBM2VHXD27EO4276FM4FRWPWORV3ZXMQX2E47PONJUWEYZ27JONINUHDI33BPHBRU57FDQTILL4JQ5TWDGZOKZJAQ4UNBLG7Y665YBZQBESGOCSGYEAX6OPQP4KAWOCWP4ZRICVMSZXWRI7UM44RBKOOJWD7W6GPF6RLBQZTWSY3QQ4FC22GMG6JSYNRF67FE646KN64ABR62C3ECN6RSX3G2PVG5DK5JMJPKO5RJ65AWX5U5TZSVY7JGXRJCZSBQ635OLX427HNPEIXLOA6V5TIY2JCTXM6BVHWVJDWOCXEPVTAKN4P2A2TUPSNH6MS4NMB35PSB3JKIGQPPMWNATU5DUEF2JNLK2ZBWKCCYWOZCDQHWUVBLDHNB6HEJIJAY7NSO66UVOC3BJ32D6BQEBADRUSAZLZVYDN7KC5HUKELIRWU266DORCRZSZINBQXZCXH2WEPEFIYI2NE7OCGR7K2MSJ4Q4TGDD7XYVAZVUKFUEXD2QWTOKXXCIVSV6TXNPDPY754D7O52MVBKG663S2U4FZ6CJURIJZ3WU7XAK5X5YM75R7CALBO4B5ND75ZS3UUWMPDDGYA25WJLXMRATWKOILSRZDPDPWM72ESADD45GTIONTWEFAYTQ63S6MW6AS4AV4OKHTENZKX5ANAZ6HNSVVAQMXVLLUIEY7VMXBVQS6MJVM2REUXK7NMYC6SVKIE4LYCRMYTHGCCO3VODXIGMXDCP6TH6OSR2ORLHGSI4LKAJS74AWOK7MMEORHW3SCXOXUEODGIYLMJW5LSSYNYA5H7AZX35MUNXCSRH5H223NMBBM35G3SZKHTT7HZN3AF6LSKA7MHIFIJ45K3PXAOQR4LA4DUOXVIGKNDMC5CNYY6FT73JVHSCSWYW2VHO5I","GLIUG7QUS2WMFLEQQGRWLKU2H6Y52AM4FOCVUFYRHH2YAXYXEFSA":"SQCIAJEROSUNAD4LMT7MRQXR5Y7L6OVQI5OKYHOCWKTXRZ2HDVX3DDVJNDUTL5PEMDHBXL24UJWHPZJ4IB5T54QLN4KQXIWKRBMQCIDIEI4L2VRHRHSHTJ22FWPA2DTBWL6ZKBYHGYLZ4VXGOVRMEQ2MORFVIG3BPYAP5HKZROAA4RGTEHCXNPGE3SR2BO5XYXX2PDSEMERAXRY3F3WHZFQ4YAVA4C7WVB52NBO2GN3CQDFQSSQCZEFHW2V33CEXSE6YKFOBRMPNY4BVSXVXXSFFK4RRWXYL6YJJC7BBB4GXFO3FKX2GJXGQZCJ5F4IY75THD7BLDPECJXXDBNFIVDPAVVAQBDZMEZZ7WOUUAAXM3OS67OZFOA3RRXVP5JO4MK4RWY2QZQEFFFRUYIM5ZOJ47I22662UBYRNSJMNONFJXFL5MGU333D3OAIT2P5TEYFCTEIUV4EDGBP3MBPXIUJD6ZJ2Z3N7L3JVMAPQROKJBLWAXO6FVJILXCGPNMHFMIOHR4WHWBWPC7IR64K4FIE7LXPIYCPBUGC7MGU32H5HHATKAXY4A35GKMR4QKF7DXD3YLV6TLIMU3EUQGUOFSOUEIYYNAMVSXVOM7P6ZGBJ3XGM3BPKCYU3Q6NDNBSIJGXPQ7LITYSJFWUEPC4OPT4RKHXX2QJDD3UZMPRAD7NXWNCQWZW5T47UL2OBHUTPVDCTJCGP54UD2UOFUOJ7A66GFB6SMGKJOWLR4FNG2M2KIV72YRW7W45XWEHWZHSH4J3TQLG75PCURPF4DG32V7RKFLMS3S3GVC2PREMI75YH5USGG7ISKZXHIXPSTSHZO26HMGOTBBP4IRD3U47X6RMGN6WFAN7BAUPFNS4IWLHOW726IE5BSWDHA2EYZMK2E2KAT7GPBFM6O4UHSLU47MNPTDWHUEOAK4ABXHP3DOVOQILSNTGFOKGD6VH6HEYQWPLKGJJ4CPAFDWPOTQQEVU35NUOGPI2Y5WKJ5U5ZJFNOFW6IJ64WOCPZ6G4P7Q5GTWV7M66OPFKPKHMWAIPCAELLNHJPKEALZJKSW3YL5U5GMLIITANAW6ESKE74ODIAF7BIYOCUFELHVPU5B2HUPYVYCXQ3EG664MRDJTEFPHZQGUCD4OEORCSRFZP5VKDT4KUZNM6OVPEJP237BVGP2BLSHX75QJ5DWGXVRX6IHNO6GWQHKDOIGJMJ5CG54UKYJH2ZUX2NSGEV7XCCDLYWBCQM3CZD2WE2PXVQVWUE4G5Y5IL2EN2RLRECJYJXFGOPQSWQEOUSA25QT5ZUMFG7EU2CUCO6IWFMODAQ6XUJ3UZSCUOWOTVEPIBCTH4IVJWEQ4XOAMFSJO4M6YXUCK4BJ765PRDZEWLLO35XVYVENVXY2E5TRCA6S5XKTATRMY47JSYX7SYXJ4VGFPS52BIGWDBNEPFJGEQEIHAK3ZWXIJMPMEQPVHMMXEFUQLRHYTI57HG42JVAPEKQ7PHSCD7QD25I3FRPLZF6WHCWVFKNU454RLDALMCUVGKWCHLMWYIKWQQGDGK2EPCWZASEF4X5ANI54CK5MHRADT4MRIJXOXAOOV26ASEHSAUAMLIIJCESQ44BE7ZNOWGJWKPKZ7ZUIVIMVBUEGG4UD5SV2WY","4TYIQV6RDSF7RTHOBXLGFHQPZWR2Q44ODBY54SRMOR7FVKKON3HQ":"3YOIQPLKNFD2Y6QCBZB46QL4J6NIGHOF5FOJ7KUWI2ZXHVNNOYGJD6TDI5WPPBUEQZ6IM66O7T7TDAGY4HNKY2347SEDAWLCXMN7WGMEVCZNAJCXTR4CGN2IOXHGOEWATT4BEFATKSNZEHOJ6PK7T5KHKNXHQG3X422TDREDZJAAPHO7MC3ACNOK7DES7SFRMGLLCC4LGT3EASCIAIXRRYND3IHO33X26EBFJTPH4TJ4FTUELATM52K4VZDTC4QD6UPMN4Y3WYGO6XJ7RB6SCCLZLEPIRDQUC74MVGU53YKRIX76HX3NHEADQ6ZJCQQLFDM5LBNNAIFLR4UZPJA3OUE6AVXS4Z2TPCRIKKECVXVHGIMBTOUWBSKILRUMN4I5QAEURQTSFDKAGAFJDCEAK6YPVSUCPJMTVTJDU4JBG5OWBKIA3MSEBXOBSEBTZ665HYQLNM4WOGK7TMGW6R6P6TRRMVGBKBHHIBH5NAFFJRKBWMGNSPWZOD5ZQHRTCBRV7FL2KB24UOJLCFWDLHB6NYDHXXV5KOD6PTW22SXHTA2EL74EUWJJZNKR2BIQYOBCXUTMTB47N4EW53MGRVYZIPPSUGKUII62G4PHQTLYDYZQPFPXT4572VMMZNSZOANMPPCWZDE7URFLL3R5LURLQ3QK6ZWHEZL6HRBOAZAES7B2B2TMR6MSVOPAX5PJOQTZYTJHD6BONEG73XRQDNJC2VGQWVNZR4FQHDK2DMFEKKL7AOFKVATTC232W4T5JNWC7KM46S2MT4LQUEM532QYIPOOYUY2DGT5J4D6RDRP64GT6JF2JWRY46XIHLUIMZ4KDU3RR7VNIV5WGLCB6YL6GPTDL5QR7Q3LCBAPMHPA4FZI4W2W6HWWZAZJHKKQW6NNLOIFVBZ6LRQUYHGRTFQ2R7QXW4QDLZR35PVVQDM5G3IJ2EOZRAL3DLPREMHSEJZA4OAOXYYR7OPWZ56OBDXLU5NWTFZVJLIHXJ4J2WKPEFVKXEZKAI4XXFQWUIOIQPLJ5T5HZT5JJTKLOVXLPGZGHINVLRPT4267P5OPIJFDJ2MLRIJVUFYXJG73GUK5ET77JUZCZZ4DSIJAKTHW5ZNBTHVKU2JYA4NAZN6ELNFVFEXUR4PRBA5FDKC7TGZX2VPIC6FBVTMELN7UPEBPFPIRAUMUCDCPUSJ7LHYPH7P5Y6SKG5SV7LSSWZG3XBPWVSOSCFX7ETN4UZICWZ35SCGMDB5MICOI4YT53CG7LYESERKTT5HJDLYU7PWVDRJIS7PMYJMYTMHMCFHVSUGMIVYAUFAJJSRI7DTPJCNSJAQPNWXK63VPE7EFK2QNFWEDG4RAWPNIFEVTK5QHYUKVL2U4GRC2MN3ZE3QKJDXTNVXEPSZDEXQVVG6TXGYBEJB3MEYG2Q52T3BAN5KANKEN2LKFQ5QRHDV33FIHPK7JC3EJFNQRGD2JNCRYEQFUMXUWCSTR3BXRBKXBCIZMOGBBOU4BEOUKOA3C6XZJUZSR74XTB7AYFJIWOT4OMGCCQFUCGWAZLE57P3WBNHCSMB5KPQFNNKYXBPE6RDWW43CLDNM5C6KLAEZBGJMBMFVD3P7BL5GFDUTEYMHJI262UZRPGXRE5Q4WL5YZIEVZ746ZTUQ"}} \ No newline at end of file
+{"id":6,"name":"4096 byte null string (block size 1KiB)","description":"Encode 4096 bytes of zeroes using block-size 1KiB. This results in only 3 distinct blocks as 4 content blocks have identical content and are de-duplicated.","content":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","convergence-secret":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","block-size":1024,"read-capability":{"block-size":1024,"level":1,"root-reference":"X5VNB4TLM54B7Y47KXTGPFFRCP4KHZLTNV4H6RO7KCWIS6IJTPSQ","root-key":"3PJASBBUK3CMQR4XV2OU3CRCKZN6GTBMCJEWB2UKCY3BKOIHGE4Q"},"urn":"urn:erisx2:AAA362WQ6JVWO6A74OPVLZTHSSYRH6FD4VZW26D7IXPVBLEJPEEZXZO32IEQINCWYTEEPF5OTVGYUISWLPRUYLASJFQOVCQWGYKTSBZRHE","blocks":{"X5VNB4TLM54B7Y47KXTGPFFRCP4KHZLTNV4H6RO7KCWIS6IJTPSQ":"DWVOXIPWAZSQQITU3BO7WDBJTCLQAZ5OBQNSAQ6WB526GKSHSV4MLFXNUSS2K5U2BCCMMQZIELXUET5MZEOHS7ZVO2AHFWLCDYWFYYKIJNNAOTGIGN33A26G6BXTZX37U76QKRW7B7S7ANPPBKBPUBIPFIWL6ALX5DXFQOUPMXVELUYN6AYILJNTV6E5625KMNSLXQ72R35VALUIENV6I4WSDY4E5AUWJ2LGP6PWB5INAQBOGEQGUWPWL6AWQC7AWXCI2B2TC3MMUDFPBU7Z65ZNUWHXFSEPH32YE4VWPMZUSKZED46KN2X37MMRYUMFNVNCSJUX7HMQJTFWF2J5D7VDWMREBQZHMPGUACR7S4F247QJ3TSJVD2GQDLSVQYPGA2M77SVMUCM4U5EDZTFWEQXAHBFFGVMSLOUOKZEWU43PDEKRWHSD6IYHQYXS6CZUD25C6CS7O6NMUHIGRXHDIO5HS3FNFGQ4266AKUOABXDITJZC2Q6FSOER7IQDB6XQXO2TEFWDABI4HGCJZFPWJUD46IZLTMA6IMO6BT2USSZ25Y4HZJ3BJEH6Y3S6VQKLQOHROIDXPGZYSTP3UBT6VVBRRTHS5DYXAGLHSIP5F7HVGCLXIJQB22J3ZM2ARDUQYXBGAAG66HSJW3SXTGSGNPNWPZ3HO7WD62PJIZNSPRNQLJXYD27IDADZ6HVOSL4KBJAO2BR7OGMN4R7E46AJQVJRUKL4SNY5WJ2IBM2VHXD27EO4276FM4FRWPWORV3ZXMQX2E47PONJUWEYZ27JONINUHDI33BPHBRU57FDQTILL4JQ5TWDGZOKZJAQ4UNBLG7Y665YBZQBESGOCSGYEAX6OPQP4KAWOCWP4ZRICVMSZXWRI7UM44RBKOOJWD7W6GPF6RLBQZTWSY3QQ4FC22GMG6JSYNRF67FE646KN64ABR62C3ECN6RSX3G2PVG5DK5JMJPKO5RJ65AWX5U5TZSVY7JGXRJCZSBQ635OLX427HNPEIXLOA6V5TIY2JCTXM6BVHWVJDWOCXEPVTAKN4P2A2TUPSNH6MS4NMB35PSB3JKIGQPPMWNATU5DUEF2JNLK2ZBWKCCYWOZCDQHWUVBLDHNB6HEJIJAY7NSO66UVOC3BJ32D6BQEBADRUSAZLZVYDN7KC5HUKELIRWU266DORCRZSZINBQXZCXH2WEPEFIYI2NE7OCGR7K2MSJ4Q4TGDD7XYVAZVUKFUEXD2QWTOKXXCIVSV6TXNPDPY754D7O52MVBKG663S2U4FZ6CJURIJZ3WU7XAK5X5YM75R7CALBO4B5ND75ZS3UUWMPDDGYA25WJLXMRATWKOILSRZDPDPWM72ESADD45GTIONTWEFAYTQ63S6MW6AS4AV4OKHTENZKX5ANAZ6HNSVVAQMXVLLUIEY7VMXBVQS6MJVM2REUXK7NMYC6SVKIE4LYCRMYTHGCCO3VODXIGMXDCP6TH6OSR2ORLHGSI4LKAJS74AWOK7MMEORHW3SCXOXUEODGIYLMJW5LSSYNYA5H7AZX35MUNXCSRH5H223NMBBM35G3SZKHTT7HZN3AF6LSKA7MHIFIJ45K3PXAOQR4LA4DUOXVIGKNDMC5CNYY6FT73JVHSCSWYW2VHO5I","GLIUG7QUS2WMFLEQQGRWLKU2H6Y52AM4FOCVUFYRHH2YAXYXEFSA":"SQCIAJEROSUNAD4LMT7MRQXR5Y7L6OVQI5OKYHOCWKTXRZ2HDVX3DDVJNDUTL5PEMDHBXL24UJWHPZJ4IB5T54QLN4KQXIWKRBMQCIDIEI4L2VRHRHSHTJ22FWPA2DTBWL6ZKBYHGYLZ4VXGOVRMEQ2MORFVIG3BPYAP5HKZROAA4RGTEHCXNPGE3SR2BO5XYXX2PDSEMERAXRY3F3WHZFQ4YAVA4C7WVB52NBO2GN3CQDFQSSQCZEFHW2V33CEXSE6YKFOBRMPNY4BVSXVXXSFFK4RRWXYL6YJJC7BBB4GXFO3FKX2GJXGQZCJ5F4IY75THD7BLDPECJXXDBNFIVDPAVVAQBDZMEZZ7WOUUAAXM3OS67OZFOA3RRXVP5JO4MK4RWY2QZQEFFFRUYIM5ZOJ47I22662UBYRNSJMNONFJXFL5MGU333D3OAIT2P5TEYFCTEIUV4EDGBP3MBPXIUJD6ZJ2Z3N7L3JVMAPQROKJBLWAXO6FVJILXCGPNMHFMIOHR4WHWBWPC7IR64K4FIE7LXPIYCPBUGC7MGU32H5HHATKAXY4A35GKMR4QKF7DXD3YLV6TLIMU3EUQGUOFSOUEIYYNAMVSXVOM7P6ZGBJ3XGM3BPKCYU3Q6NDNBSIJGXPQ7LITYSJFWUEPC4OPT4RKHXX2QJDD3UZMPRAD7NXWNCQWZW5T47UL2OBHUTPVDCTJCGP54UD2UOFUOJ7A66GFB6SMGKJOWLR4FNG2M2KIV72YRW7W45XWEHWZHSH4J3TQLG75PCURPF4DG32V7RKFLMS3S3GVC2PREMI75YH5USGG7ISKZXHIXPSTSHZO26HMGOTBBP4IRD3U47X6RMGN6WFAN7BAUPFNS4IWLHOW726IE5BSWDHA2EYZMK2E2KAT7GPBFM6O4UHSLU47MNPTDWHUEOAK4ABXHP3DOVOQILSNTGFOKGD6VH6HEYQWPLKGJJ4CPAFDWPOTQQEVU35NUOGPI2Y5WKJ5U5ZJFNOFW6IJ64WOCPZ6G4P7Q5GTWV7M66OPFKPKHMWAIPCAELLNHJPKEALZJKSW3YL5U5GMLIITANAW6ESKE74ODIAF7BIYOCUFELHVPU5B2HUPYVYCXQ3EG664MRDJTEFPHZQGUCD4OEORCSRFZP5VKDT4KUZNM6OVPEJP237BVGP2BLSHX75QJ5DWGXVRX6IHNO6GWQHKDOIGJMJ5CG54UKYJH2ZUX2NSGEV7XCCDLYWBCQM3CZD2WE2PXVQVWUE4G5Y5IL2EN2RLRECJYJXFGOPQSWQEOUSA25QT5ZUMFG7EU2CUCO6IWFMODAQ6XUJ3UZSCUOWOTVEPIBCTH4IVJWEQ4XOAMFSJO4M6YXUCK4BJ765PRDZEWLLO35XVYVENVXY2E5TRCA6S5XKTATRMY47JSYX7SYXJ4VGFPS52BIGWDBNEPFJGEQEIHAK3ZWXIJMPMEQPVHMMXEFUQLRHYTI57HG42JVAPEKQ7PHSCD7QD25I3FRPLZF6WHCWVFKNU454RLDALMCUVGKWCHLMWYIKWQQGDGK2EPCWZASEF4X5ANI54CK5MHRADT4MRIJXOXAOOV26ASEHSAUAMLIIJCESQ44BE7ZNOWGJWKPKZ7ZUIVIMVBUEGG4UD5SV2WY","4TYIQV6RDSF7RTHOBXLGFHQPZWR2Q44ODBY54SRMOR7FVKKON3HQ":"3YOIQPLKNFD2Y6QCBZB46QL4J6NIGHOF5FOJ7KUWI2ZXHVNNOYGJD6TDI5WPPBUEQZ6IM66O7T7TDAGY4HNKY2347SEDAWLCXMN7WGMEVCZNAJCXTR4CGN2IOXHGOEWATT4BEFATKSNZEHOJ6PK7T5KHKNXHQG3X422TDREDZJAAPHO7MC3ACNOK7DES7SFRMGLLCC4LGT3EASCIAIXRRYND3IHO33X26EBFJTPH4TJ4FTUELATM52K4VZDTC4QD6UPMN4Y3WYGO6XJ7RB6SCCLZLEPIRDQUC74MVGU53YKRIX76HX3NHEADQ6ZJCQQLFDM5LBNNAIFLR4UZPJA3OUE6AVXS4Z2TPCRIKKECVXVHGIMBTOUWBSKILRUMN4I5QAEURQTSFDKAGAFJDCEAK6YPVSUCPJMTVTJDU4JBG5OWBKIA3MSEBXOBSEBTZ665HYQLNM4WOGK7TMGW6R6P6TRRMVGBKBHHIBH5NAFFJRKBWMGNSPWZOD5ZQHRTCBRV7FL2KB24UOJLCFWDLHB6NYDHXXV5KOD6PTW22SXHTA2EL74EUWJJZNKR2BIQYOBCXUTMTB47N4EW53MGRVYZIPPSUGKUII62G4PHQTLYDYZQPFPXT4572VMMZNSZOANMPPCWZDE7URFLL3R5LURLQ3QK6ZWHEZL6HRBOAZAES7B2B2TMR6MSVOPAX5PJOQTZYTJHD6BONEG73XRQDNJC2VGQWVNZR4FQHDK2DMFEKKL7AOFKVATTC232W4T5JNWC7KM46S2MT4LQUEM532QYIPOOYUY2DGT5J4D6RDRP64GT6JF2JWRY46XIHLUIMZ4KDU3RR7VNIV5WGLCB6YL6GPTDL5QR7Q3LCBAPMHPA4FZI4W2W6HWWZAZJHKKQW6NNLOIFVBZ6LRQUYHGRTFQ2R7QXW4QDLZR35PVVQDM5G3IJ2EOZRAL3DLPREMHSEJZA4OAOXYYR7OPWZ56OBDXLU5NWTFZVJLIHXJ4J2WKPEFVKXEZKAI4XXFQWUIOIQPLJ5T5HZT5JJTKLOVXLPGZGHINVLRPT4267P5OPIJFDJ2MLRIJVUFYXJG73GUK5ET77JUZCZZ4DSIJAKTHW5ZNBTHVKU2JYA4NAZN6ELNFVFEXUR4PRBA5FDKC7TGZX2VPIC6FBVTMELN7UPEBPFPIRAUMUCDCPUSJ7LHYPH7P5Y6SKG5SV7LSSWZG3XBPWVSOSCFX7ETN4UZICWZ35SCGMDB5MICOI4YT53CG7LYESERKTT5HJDLYU7PWVDRJIS7PMYJMYTMHMCFHVSUGMIVYAUFAJJSRI7DTPJCNSJAQPNWXK63VPE7EFK2QNFWEDG4RAWPNIFEVTK5QHYUKVL2U4GRC2MN3ZE3QKJDXTNVXEPSZDEXQVVG6TXGYBEJB3MEYG2Q52T3BAN5KANKEN2LKFQ5QRHDV33FIHPK7JC3EJFNQRGD2JNCRYEQFUMXUWCSTR3BXRBKXBCIZMOGBBOU4BEOUKOA3C6XZJUZSR74XTB7AYFJIWOT4OMGCCQFUCGWAZLE57P3WBNHCSMB5KPQFNNKYXBPE6RDWW43CLDNM5C6KLAEZBGJMBMFVD3P7BL5GFDUTEYMHJI262UZRPGXRE5Q4WL5YZIEVZ746ZTUQ","4TYIQV6RDSF7RTHOBXLGFHQPZWR2Q44ODBY54SRMOR7FVKKON3HQ":"3YOIQPLKNFD2Y6QCBZB46QL4J6NIGHOF5FOJ7KUWI2ZXHVNNOYGJD6TDI5WPPBUEQZ6IM66O7T7TDAGY4HNKY2347SEDAWLCXMN7WGMEVCZNAJCXTR4CGN2IOXHGOEWATT4BEFATKSNZEHOJ6PK7T5KHKNXHQG3X422TDREDZJAAPHO7MC3ACNOK7DES7SFRMGLLCC4LGT3EASCIAIXRRYND3IHO33X26EBFJTPH4TJ4FTUELATM52K4VZDTC4QD6UPMN4Y3WYGO6XJ7RB6SCCLZLEPIRDQUC74MVGU53YKRIX76HX3NHEADQ6ZJCQQLFDM5LBNNAIFLR4UZPJA3OUE6AVXS4Z2TPCRIKKECVXVHGIMBTOUWBSKILRUMN4I5QAEURQTSFDKAGAFJDCEAK6YPVSUCPJMTVTJDU4JBG5OWBKIA3MSEBXOBSEBTZ665HYQLNM4WOGK7TMGW6R6P6TRRMVGBKBHHIBH5NAFFJRKBWMGNSPWZOD5ZQHRTCBRV7FL2KB24UOJLCFWDLHB6NYDHXXV5KOD6PTW22SXHTA2EL74EUWJJZNKR2BIQYOBCXUTMTB47N4EW53MGRVYZIPPSUGKUII62G4PHQTLYDYZQPFPXT4572VMMZNSZOANMPPCWZDE7URFLL3R5LURLQ3QK6ZWHEZL6HRBOAZAES7B2B2TMR6MSVOPAX5PJOQTZYTJHD6BONEG73XRQDNJC2VGQWVNZR4FQHDK2DMFEKKL7AOFKVATTC232W4T5JNWC7KM46S2MT4LQUEM532QYIPOOYUY2DGT5J4D6RDRP64GT6JF2JWRY46XIHLUIMZ4KDU3RR7VNIV5WGLCB6YL6GPTDL5QR7Q3LCBAPMHPA4FZI4W2W6HWWZAZJHKKQW6NNLOIFVBZ6LRQUYHGRTFQ2R7QXW4QDLZR35PVVQDM5G3IJ2EOZRAL3DLPREMHSEJZA4OAOXYYR7OPWZ56OBDXLU5NWTFZVJLIHXJ4J2WKPEFVKXEZKAI4XXFQWUIOIQPLJ5T5HZT5JJTKLOVXLPGZGHINVLRPT4267P5OPIJFDJ2MLRIJVUFYXJG73GUK5ET77JUZCZZ4DSIJAKTHW5ZNBTHVKU2JYA4NAZN6ELNFVFEXUR4PRBA5FDKC7TGZX2VPIC6FBVTMELN7UPEBPFPIRAUMUCDCPUSJ7LHYPH7P5Y6SKG5SV7LSSWZG3XBPWVSOSCFX7ETN4UZICWZ35SCGMDB5MICOI4YT53CG7LYESERKTT5HJDLYU7PWVDRJIS7PMYJMYTMHMCFHVSUGMIVYAUFAJJSRI7DTPJCNSJAQPNWXK63VPE7EFK2QNFWEDG4RAWPNIFEVTK5QHYUKVL2U4GRC2MN3ZE3QKJDXTNVXEPSZDEXQVVG6TXGYBEJB3MEYG2Q52T3BAN5KANKEN2LKFQ5QRHDV33FIHPK7JC3EJFNQRGD2JNCRYEQFUMXUWCSTR3BXRBKXBCIZMOGBBOU4BEOUKOA3C6XZJUZSR74XTB7AYFJIWOT4OMGCCQFUCGWAZLE57P3WBNHCSMB5KPQFNNKYXBPE6RDWW43CLDNM5C6KLAEZBGJMBMFVD3P7BL5GFDUTEYMHJI262UZRPGXRE5Q4WL5YZIEVZ746ZTUQ","4TYIQV6RDSF7RTHOBXLGFHQPZWR2Q44ODBY54SRMOR7FVKKON3HQ":"3YOIQPLKNFD2Y6QCBZB46QL4J6NIGHOF5FOJ7KUWI2ZXHVNNOYGJD6TDI5WPPBUEQZ6IM66O7T7TDAGY4HNKY2347SEDAWLCXMN7WGMEVCZNAJCXTR4CGN2IOXHGOEWATT4BEFATKSNZEHOJ6PK7T5KHKNXHQG3X422TDREDZJAAPHO7MC3ACNOK7DES7SFRMGLLCC4LGT3EASCIAIXRRYND3IHO33X26EBFJTPH4TJ4FTUELATM52K4VZDTC4QD6UPMN4Y3WYGO6XJ7RB6SCCLZLEPIRDQUC74MVGU53YKRIX76HX3NHEADQ6ZJCQQLFDM5LBNNAIFLR4UZPJA3OUE6AVXS4Z2TPCRIKKECVXVHGIMBTOUWBSKILRUMN4I5QAEURQTSFDKAGAFJDCEAK6YPVSUCPJMTVTJDU4JBG5OWBKIA3MSEBXOBSEBTZ665HYQLNM4WOGK7TMGW6R6P6TRRMVGBKBHHIBH5NAFFJRKBWMGNSPWZOD5ZQHRTCBRV7FL2KB24UOJLCFWDLHB6NYDHXXV5KOD6PTW22SXHTA2EL74EUWJJZNKR2BIQYOBCXUTMTB47N4EW53MGRVYZIPPSUGKUII62G4PHQTLYDYZQPFPXT4572VMMZNSZOANMPPCWZDE7URFLL3R5LURLQ3QK6ZWHEZL6HRBOAZAES7B2B2TMR6MSVOPAX5PJOQTZYTJHD6BONEG73XRQDNJC2VGQWVNZR4FQHDK2DMFEKKL7AOFKVATTC232W4T5JNWC7KM46S2MT4LQUEM532QYIPOOYUY2DGT5J4D6RDRP64GT6JF2JWRY46XIHLUIMZ4KDU3RR7VNIV5WGLCB6YL6GPTDL5QR7Q3LCBAPMHPA4FZI4W2W6HWWZAZJHKKQW6NNLOIFVBZ6LRQUYHGRTFQ2R7QXW4QDLZR35PVVQDM5G3IJ2EOZRAL3DLPREMHSEJZA4OAOXYYR7OPWZ56OBDXLU5NWTFZVJLIHXJ4J2WKPEFVKXEZKAI4XXFQWUIOIQPLJ5T5HZT5JJTKLOVXLPGZGHINVLRPT4267P5OPIJFDJ2MLRIJVUFYXJG73GUK5ET77JUZCZZ4DSIJAKTHW5ZNBTHVKU2JYA4NAZN6ELNFVFEXUR4PRBA5FDKC7TGZX2VPIC6FBVTMELN7UPEBPFPIRAUMUCDCPUSJ7LHYPH7P5Y6SKG5SV7LSSWZG3XBPWVSOSCFX7ETN4UZICWZ35SCGMDB5MICOI4YT53CG7LYESERKTT5HJDLYU7PWVDRJIS7PMYJMYTMHMCFHVSUGMIVYAUFAJJSRI7DTPJCNSJAQPNWXK63VPE7EFK2QNFWEDG4RAWPNIFEVTK5QHYUKVL2U4GRC2MN3ZE3QKJDXTNVXEPSZDEXQVVG6TXGYBEJB3MEYG2Q52T3BAN5KANKEN2LKFQ5QRHDV33FIHPK7JC3EJFNQRGD2JNCRYEQFUMXUWCSTR3BXRBKXBCIZMOGBBOU4BEOUKOA3C6XZJUZSR74XTB7AYFJIWOT4OMGCCQFUCGWAZLE57P3WBNHCSMB5KPQFNNKYXBPE6RDWW43CLDNM5C6KLAEZBGJMBMFVD3P7BL5GFDUTEYMHJI262UZRPGXRE5Q4WL5YZIEVZ746ZTUQ","4TYIQV6RDSF7RTHOBXLGFHQPZWR2Q44ODBY54SRMOR7FVKKON3HQ":"3YOIQPLKNFD2Y6QCBZB46QL4J6NIGHOF5FOJ7KUWI2ZXHVNNOYGJD6TDI5WPPBUEQZ6IM66O7T7TDAGY4HNKY2347SEDAWLCXMN7WGMEVCZNAJCXTR4CGN2IOXHGOEWATT4BEFATKSNZEHOJ6PK7T5KHKNXHQG3X422TDREDZJAAPHO7MC3ACNOK7DES7SFRMGLLCC4LGT3EASCIAIXRRYND3IHO33X26EBFJTPH4TJ4FTUELATM52K4VZDTC4QD6UPMN4Y3WYGO6XJ7RB6SCCLZLEPIRDQUC74MVGU53YKRIX76HX3NHEADQ6ZJCQQLFDM5LBNNAIFLR4UZPJA3OUE6AVXS4Z2TPCRIKKECVXVHGIMBTOUWBSKILRUMN4I5QAEURQTSFDKAGAFJDCEAK6YPVSUCPJMTVTJDU4JBG5OWBKIA3MSEBXOBSEBTZ665HYQLNM4WOGK7TMGW6R6P6TRRMVGBKBHHIBH5NAFFJRKBWMGNSPWZOD5ZQHRTCBRV7FL2KB24UOJLCFWDLHB6NYDHXXV5KOD6PTW22SXHTA2EL74EUWJJZNKR2BIQYOBCXUTMTB47N4EW53MGRVYZIPPSUGKUII62G4PHQTLYDYZQPFPXT4572VMMZNSZOANMPPCWZDE7URFLL3R5LURLQ3QK6ZWHEZL6HRBOAZAES7B2B2TMR6MSVOPAX5PJOQTZYTJHD6BONEG73XRQDNJC2VGQWVNZR4FQHDK2DMFEKKL7AOFKVATTC232W4T5JNWC7KM46S2MT4LQUEM532QYIPOOYUY2DGT5J4D6RDRP64GT6JF2JWRY46XIHLUIMZ4KDU3RR7VNIV5WGLCB6YL6GPTDL5QR7Q3LCBAPMHPA4FZI4W2W6HWWZAZJHKKQW6NNLOIFVBZ6LRQUYHGRTFQ2R7QXW4QDLZR35PVVQDM5G3IJ2EOZRAL3DLPREMHSEJZA4OAOXYYR7OPWZ56OBDXLU5NWTFZVJLIHXJ4J2WKPEFVKXEZKAI4XXFQWUIOIQPLJ5T5HZT5JJTKLOVXLPGZGHINVLRPT4267P5OPIJFDJ2MLRIJVUFYXJG73GUK5ET77JUZCZZ4DSIJAKTHW5ZNBTHVKU2JYA4NAZN6ELNFVFEXUR4PRBA5FDKC7TGZX2VPIC6FBVTMELN7UPEBPFPIRAUMUCDCPUSJ7LHYPH7P5Y6SKG5SV7LSSWZG3XBPWVSOSCFX7ETN4UZICWZ35SCGMDB5MICOI4YT53CG7LYESERKTT5HJDLYU7PWVDRJIS7PMYJMYTMHMCFHVSUGMIVYAUFAJJSRI7DTPJCNSJAQPNWXK63VPE7EFK2QNFWEDG4RAWPNIFEVTK5QHYUKVL2U4GRC2MN3ZE3QKJDXTNVXEPSZDEXQVVG6TXGYBEJB3MEYG2Q52T3BAN5KANKEN2LKFQ5QRHDV33FIHPK7JC3EJFNQRGD2JNCRYEQFUMXUWCSTR3BXRBKXBCIZMOGBBOU4BEOUKOA3C6XZJUZSR74XTB7AYFJIWOT4OMGCCQFUCGWAZLE57P3WBNHCSMB5KPQFNNKYXBPE6RDWW43CLDNM5C6KLAEZBGJMBMFVD3P7BL5GFDUTEYMHJI262UZRPGXRE5Q4WL5YZIEVZ746ZTUQ"}} \ No newline at end of file
diff --git a/tests/eris/pseudo-random.scm b/tests/eris/pseudo-random.scm
index 2803a95..d5ebfb0 100644
--- a/tests/eris/pseudo-random.scm
+++ b/tests/eris/pseudo-random.scm
@@ -5,8 +5,7 @@
(define-module (tests eris pseudo-random)
#:use-module (eris)
- #:use-module (eris block-storage)
- #:use-module (eris block-storage vhash)
+ #:use-module (eris urn)
#:use-module (sodium stream)
#:use-module (sodium generichash)
@@ -15,9 +14,8 @@
#:use-module (rnrs io ports)
#:use-module (srfi srfi-11)
- #:use-module (srfi srfi-64))
-
-(define my-store (make-vhash-block-storage))
+ #:use-module (srfi srfi-64)
+ #:use-module (srfi srfi-171))
(define null-nonce (make-bytevector 12 0))
(define null-convergence-secret (make-bytevector 32 0))
@@ -26,7 +24,41 @@
(crypto-stream-chacha20-ietf length
null-nonce
(crypto-generichash (string->utf8 seed) #:out-len 32)))
-(define content-sizes
+(define content-sizes-small
+ (list 0
+ 1
+ 8
+ 32
+ 1023
+ 1024
+ (* 10 1024)
+ (* 32 1024)
+ (* 1024 1024)))
+
+(test-begin "eris (pseudo-random, 1KiB block-size)")
+
+(for-each
+ (lambda (l)
+
+ (let ((bv (pseudo-random-bytevector l)))
+
+ (let-values (((urn blocks) (eris-encode (open-bytevector-input-port bv)
+ #:block-reducer rcons
+ #:convergence-secret null-convergence-secret
+ #:block-size eris-block-size-small)))
+
+ (test-assert "decoded bytevector is same as initial bytevector"
+ (bytevector=?
+ bv
+ (eris-decode->bytevector
+ (read-capability->string urn)
+ (lambda (ref) (assoc-ref blocks ref))))))))
+
+ content-sizes-small)
+
+(test-end "eris (pseudo-random, 1KiB block-size)")
+
+(define content-sizes-large
(list 0
1
8
@@ -40,24 +72,25 @@
(* 1024 1024)
(* 1024 1024 32)
(* 1024 1024 100)))
-
-(test-begin "eris (pseudo-random)")
+(test-begin "eris (pseudo-random, 32KiB block-size)")
(for-each
(lambda (l)
(let ((bv (pseudo-random-bytevector l)))
- (let-values (((urn _) (eris-encode (open-bytevector-input-port bv)
- #:block-storage my-store
- #:convergence-secret null-convergence-secret
- #:block-size (* 32 1024))))
+ (let-values (((urn blocks) (eris-encode (open-bytevector-input-port bv)
+ #:block-reducer rcons
+ #:convergence-secret null-convergence-secret
+ #:block-size eris-block-size-large)))
(test-assert "decoded bytevector is same as initial bytevector"
(bytevector=?
bv
- (eris-decode->bytevector urn #:block-storage my-store))))))
+ (eris-decode->bytevector
+ (read-capability->string urn)
+ (lambda (ref) (assoc-ref blocks ref))))))))
- content-sizes)
+ content-sizes-large)
-(test-end "eris (pseudo-random)")
+(test-end "eris (pseudo-random, 32KiB block-size)")
diff --git a/tests/eris/test-vectors.scm b/tests/eris/test-vectors.scm
index 887dfec..8694cdd 100644
--- a/tests/eris/test-vectors.scm
+++ b/tests/eris/test-vectors.scm
@@ -5,6 +5,7 @@
(define-module (tests eris test-vectors)
#:use-module (eris)
#:use-module (eris utils test-vector)
+ #:use-module (eris utils base32)
#:use-module (ice-9 ftw)
@@ -27,7 +28,6 @@
(call-with-input-file (string-append test-vector-directory filename)
(lambda (port) (obj->test-vector (json-read port)))))
-
(test-begin "eris (test-vectors)")
(for-each
@@ -38,14 +38,16 @@
(test-equal "content encodes to specified URN"
(test-vector-urn test-vector)
- (eris-encode-uri (open-bytevector-input-port (test-vector-content test-vector))
- #:convergence-secret (test-vector-convergence-secret test-vector)
- #:block-size (test-vector-block-size test-vector)))
+ (eris-encode->urn (open-bytevector-input-port (test-vector-content test-vector))
+ #:convergence-secret (test-vector-convergence-secret test-vector)
+ #:block-size (test-vector-block-size test-vector)))
(test-assert "content can be decoded from blocks and URN"
(bytevector=? (test-vector-content test-vector)
(eris-decode->bytevector (test-vector-urn test-vector)
- #:block-storage (test-vector-blocks test-vector))))))
+ (lambda (ref)
+ (base32-decode (assoc-ref (test-vector-blocks test-vector)
+ (string->symbol (base32-encode ref))))))))))
test-vector-file-names)