Release object, release in hand and step 9.c option B (spec v0.15 draft)
The release of a round becomes a file, .dkr: a release object in
deterministic CBOR, {0: "datekeys-release", 1: 1, 2: chain_hash, 3: round,
4: signature}, which provider.EncodeRelease writes and DecodeRelease reads
with its layers (size, type and version, schema). provider.ParseRelease
also reads drand's JSON as the input of the caller. Verify checks the chain
hash a release names before its round and its signature, with
ERR_PROFILE_MISMATCH. provider.Archive reads a local release archive, the
informative format of the draft.
capsule.OpenOptions.Release takes a release in hand, a provider.Supplier,
exclusive with Source: Open does not compare it with the clock (step 9.c,
option B) and reports a clock behind it in Opened.ClockBehind; a network
source is still never asked before the round time. The CLI gains
decrypt -release FILE (.dkr, drand's JSON or a local archive),
decrypt -save-release FILE.dkr and the command release, which fetches,
verifies and saves the .dkr without opening the capsule.
Test data: vectors/release.json, releases/<round>.dkr for rounds 1000,
1001, 1004 and 2000, and a local archive of rounds 1000 to 1004. In
mutations.json every case says its source, "supplied" or "network"; the
case "round not reached yet", a release in hand, now opens, and four cases
are added: the same with a network source, a release of another round from
a network source, and two release objects of another chain. SpecVersion
stays 0.14 until the author approves the draft.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 day ago
{
"spec" : "0.16" ,
Spec v0.15 draft: remove the .dkr file
The author's decision of 7 October 2026. A release saved next to a capsule
cannot exist when the capsule is made, and once the date comes the capsule
can be opened: such a file only opens it again and does not cover the real
case, someone opening it decades later when drand is gone and nobody saved
anything. Long-term recovery rests instead on archives and cache services
that keep the releases of all rounds; a reader asks for its round and
verifies the signature against the pinned key.
Spec: the .dkr extension (section 20, back to v0.14), sections 1, 4, 8, 45,
47.1, 49, 50 (rewritten), 53, 62.1 (rule 28 removed, rule 26 reworded),
63, 70, 73, 74 (the datekeys.release .dkk extension dropped too), 76
(the v0.15 block, with the discarded design) and the annex 79. The
release object, the chain hash at step 10, step 9.c option B and the
archive format stay.
Code: decrypt -save-release and the command datekeys release are gone,
with writeRelease and their tests; decrypt -release FILE stays. The
release objects of testdata/releases are now <round>.cbor, and
TestVectorFilesAreCurrent fails on a file the generator no longer writes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
23 hours ago
"description" : "The release object (spec v0.15, §47.1), and drand's JSON as the input of the caller, each checked against the pinned Quicknet profile and the round of a DateKey as step 10 of spec §63 checks a release that the caller supplies; and the lookups of a local release archive (spec v0.15, §50). See testdata/README.md." ,
Release object, release in hand and step 9.c option B (spec v0.15 draft)
The release of a round becomes a file, .dkr: a release object in
deterministic CBOR, {0: "datekeys-release", 1: 1, 2: chain_hash, 3: round,
4: signature}, which provider.EncodeRelease writes and DecodeRelease reads
with its layers (size, type and version, schema). provider.ParseRelease
also reads drand's JSON as the input of the caller. Verify checks the chain
hash a release names before its round and its signature, with
ERR_PROFILE_MISMATCH. provider.Archive reads a local release archive, the
informative format of the draft.
capsule.OpenOptions.Release takes a release in hand, a provider.Supplier,
exclusive with Source: Open does not compare it with the clock (step 9.c,
option B) and reports a clock behind it in Opened.ClockBehind; a network
source is still never asked before the round time. The CLI gains
decrypt -release FILE (.dkr, drand's JSON or a local archive),
decrypt -save-release FILE.dkr and the command release, which fetches,
verifies and saves the .dkr without opening the capsule.
Test data: vectors/release.json, releases/<round>.dkr for rounds 1000,
1001, 1004 and 2000, and a local archive of rounds 1000 to 1004. In
mutations.json every case says its source, "supplied" or "network"; the
case "round not reached yet", a release in hand, now opens, and four cases
are added: the same with a network source, a release of another round from
a network source, and two release objects of another chain. SpecVersion
stays 0.14 until the author approves the draft.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 day ago
"profile" : "datekeys:quicknet:v1" ,
"objects" : [
{
"name" : "round 1000" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ok"
} ,
{
"name" : "round 1001" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e9045830b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41" ,
"round" : 1001 ,
"release" : {
"round" : 1001 ,
"signature" : "b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ok"
} ,
{
"name" : "round 1004" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903ec045830a40658b820c0f8c10207524179a2031ba9537688a0d04e4851b58026be9a341fee3b96fb48ffad28483d84b40a5864aa" ,
"round" : 1004 ,
"release" : {
"round" : 1004 ,
"signature" : "a40658b820c0f8c10207524179a2031ba9537688a0d04e4851b58026be9a341fee3b96fb48ffad28483d84b40a5864aa" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ok"
} ,
{
"name" : "round 2000" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031907d0045830b6cb8f482a0b15d45936a4c4ea08e98a087e71787caee3f4d07a8a9843b1bc5423c6b3c22f446488b3137eaca799c77e" ,
"round" : 2000 ,
"release" : {
"round" : 2000 ,
"signature" : "b6cb8f482a0b15d45936a4c4ea08e98a087e71787caee3f4d07a8a9843b1bc5423c6b3c22f446488b3137eaca799c77e" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ok"
} ,
{
"name" : "no byte" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object of 0 bytes, outside 1..1024: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "1025 bytes: the object of round 1000 followed by zeros" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object of 1025 bytes, outside 1..1024: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "1025 bytes of an object of version 2: the size first" ,
"encoding" : "a20070646174656b6579732d72656c6561736501020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object of 1025 bytes, outside 1..1024: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "type tag of the Provider Profile, version 2" ,
"encoding" : "a5007819646174656b6579732d70726f76696465722d70726f66696c65010202582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: codec: type \"datekeys-provider-profile\", want \"datekeys-release\": ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "type tag in upper case" ,
"encoding" : "a50070444154454b4559532d52454c45415345010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: codec: type \"DATEKEYS-RELEASE\", want \"datekeys-release\": ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "version 2" ,
"encoding" : "a50070646174656b6579732d72656c65617365010202582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"result" : "ERR_UNSUPPORTED_VERSION" ,
"text" : "provider: release object: codec: datekeys-release schema version 2, want 1: ERR_UNSUPPORTED_VERSION"
} ,
{
"name" : "version 2, an unknown key and another chain" ,
"encoding" : "a60070646174656b6579732d72656c65617365010202582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e970031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e390500" ,
"round" : 1000 ,
"result" : "ERR_UNSUPPORTED_VERSION" ,
"text" : "provider: release object: codec: datekeys-release schema version 2, want 1: ERR_UNSUPPORTED_VERSION"
} ,
{
"name" : "version 0" ,
"encoding" : "a50070646174656b6579732d72656c65617365010002582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"result" : "ERR_UNSUPPORTED_VERSION" ,
"text" : "provider: release object: codec: datekeys-release schema version 0, want 1: ERR_UNSUPPORTED_VERSION"
} ,
{
"name" : "keys 0 and 1 swapped" ,
"encoding" : "a501010070646174656b6579732d72656c6561736502582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: codec: offset 2: map key 1 where key 0 was expected: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "a byte after the object" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e3900" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: codec: offset 111: 1 trailing bytes: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "without the signature" ,
"encoding" : "a40070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: 4 keys, want all 5: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "a key 5" ,
"encoding" : "a60070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e390500" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: codec: offset 1: map of 6 entries, at most 5: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "chain hash of 31 bytes" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102581f52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e9031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: key 2: codec: offset 24: a byte string of 31 bytes outside 32..32: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "chain hash as text" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102784035326462396261373065306363306636656166373830336464303734343761316635343737373335666433663636313739326261393436303063383465393731031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: key 2: codec: offset 22: a text string where a byte string was expected: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "round 0" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e9710300045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: key 3: round 0: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "round 2^53" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031b0020000000000000045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: key 3: codec: offset 66: unsigned integer 9007199254740992 above 9007199254740991: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "round 1000 in four bytes" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031a000003e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: key 3: codec: offset 57: 1000 is not in its shortest form (initial byte 0x1a): ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "signature of no byte" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e80440" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: key 4: codec: offset 62: a byte string of 0 bytes outside 1..96: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "signature of 97 bytes" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045861b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e3900" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: key 4: codec: offset 63: a byte string of 97 bytes outside 1..96: ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "map of indefinite length" ,
"encoding" : "bf0070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39ff" ,
"round" : 1000 ,
"result" : "ERR_NON_CANONICAL_CBOR" ,
"text" : "provider: release object: codec: offset 0: indefinite length (initial byte 0xbf): ERR_NON_CANONICAL_CBOR"
} ,
{
"name" : "another chain" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e970031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e970"
} ,
"result" : "ERR_PROFILE_MISMATCH" ,
"text" : "provider: release of chain 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e970, the pinned profile datekeys:quicknet:v1 is chain 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971: ERR_PROFILE_MISMATCH"
} ,
{
"name" : "another chain, another round and a signature of no point" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e970031903e9045830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ,
"round" : 1000 ,
"release" : {
"round" : 1001 ,
"signature" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e970"
} ,
"result" : "ERR_PROFILE_MISMATCH" ,
"text" : "provider: release of chain 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e970, the pinned profile datekeys:quicknet:v1 is chain 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971: ERR_PROFILE_MISMATCH"
} ,
{
"name" : "round 1001 for a DateKey of round 1000" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e9045830b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41" ,
"round" : 1000 ,
"release" : {
"round" : 1001 ,
"signature" : "b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ERR_ROUND_MISMATCH" ,
"text" : "provider: release for round 1001, expected 1000: ERR_ROUND_MISMATCH"
} ,
{
"name" : "another round and a signature of 47 bytes" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e904582fb33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa" ,
"round" : 1000 ,
"release" : {
"round" : 1001 ,
"signature" : "b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ERR_ROUND_MISMATCH" ,
"text" : "provider: release for round 1001, expected 1000: ERR_ROUND_MISMATCH"
} ,
{
"name" : "the signature of round 1001 as round 1000" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: the signature is not a canonical point encoding, or does not verify as the BLS signature of round 1000 under datekeys:quicknet:v1: ERR_RELEASE_INVALID"
} ,
{
"name" : "signature of 47 bytes" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e804582fb44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: signature is 47 bytes, bls-unchained-g1-rfc9380 uses 48: ERR_RELEASE_INVALID"
} ,
{
"name" : "signature of 96 bytes, the size of G2" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045860b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: signature is 96 bytes, bls-unchained-g1-rfc9380 uses 48: ERR_RELEASE_INVALID"
} ,
{
"name" : "signature of zeros" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: the signature is not a canonical point encoding, or does not verify as the BLS signature of round 1000 under datekeys:quicknet:v1: ERR_RELEASE_INVALID"
} ,
{
"name" : "signature the point at infinity" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: the signature is not a canonical point encoding, or does not verify as the BLS signature of round 1000 under datekeys:quicknet:v1: ERR_RELEASE_INVALID"
} ,
{
"name" : "signature with the infinity flag and a payload" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830d44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "d44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: the signature is not a canonical point encoding, or does not verify as the BLS signature of round 1000 under datekeys:quicknet:v1: ERR_RELEASE_INVALID"
} ,
{
"name" : "signature negated" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830944679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "944679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: the signature is not a canonical point encoding, or does not verify as the BLS signature of round 1000 under datekeys:quicknet:v1: ERR_RELEASE_INVALID"
} ,
{
"name" : "signature of round 1004 with x + p" ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903ec045830be076aa25a40df5b4d22f9f7bcedaff30dcac20d94556107b8e652c7b54b2a440ce796f9fa53ad28023c84b40a580f55" ,
"round" : 1004 ,
"release" : {
"round" : 1004 ,
"signature" : "be076aa25a40df5b4d22f9f7bcedaff30dcac20d94556107b8e652c7b54b2a440ce796f9fa53ad28023c84b40a580f55" ,
"chain_hash" : "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
} ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: the signature is not a canonical point encoding, or does not verify as the BLS signature of round 1004 under datekeys:quicknet:v1: ERR_RELEASE_INVALID"
}
] ,
"json" : [
{
"name" : "the answer of a relay, API v2" ,
"input" : "{\"round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39"
} ,
"result" : "ok"
} ,
{
"name" : "with randomness, API v1" ,
"input" : "{\"round\":1000,\"randomness\":\"fe290beca10872ef2fb164d2aa4442de4566183ec51c56ff3cd603d930e54fdd\",\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39"
} ,
"result" : "ok"
} ,
{
"name" : "spaces and a line feed before and after" ,
"input" : " \n{\"round\": 1000, \"signature\": \"B44679B9A59AF2EC876B1A6B1AD52EA9B1615FC3982B19576350F93447CB1125E342B73A8DD2BACBE47E4B6B63ED5E39\"}\n" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39"
} ,
"result" : "ok"
} ,
{
"name" : "randomness of another signature" ,
"input" : "{\"round\":1000,\"randomness\":\"b0a591ad1b9002cfc372ac6e30abd3da8d3088d4caae026961743474fb94235f\",\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: randomness does not match the signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "without signature" ,
"input" : "{\"round\":1000}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "without round" ,
"input" : "{\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "signature not in hexadecimal" ,
"input" : "{\"round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5ezz\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: signature is not hex: ERR_RELEASE_INVALID"
} ,
{
"name" : "round as a string" ,
"input" : "{\"round\":\"1000\",\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "not JSON" ,
"input" : "{\"round\":1000," ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "8193 bytes" ,
"input" : "{\"round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\" }
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON of 8193 bytes, larger than 8192: ERR_RELEASE_INVALID"
} ,
{
"name" : "round 1001 for a DateKey of round 1000" ,
"input" : "{\"round\":1001,\"signature\":\"b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41\"}" ,
"round" : 1000 ,
"release" : {
"round" : 1001 ,
"signature" : "b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41"
} ,
"result" : "ERR_ROUND_MISMATCH" ,
"text" : "provider: release for round 1001, expected 1000: ERR_ROUND_MISMATCH"
} ,
{
"name" : "the signature of round 1001 as round 1000" ,
"input" : "{\"round\":1000,\"signature\":\"b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41\"}" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41"
} ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: the signature is not a canonical point encoding, or does not verify as the BLS signature of round 1000 under datekeys:quicknet:v1: ERR_RELEASE_INVALID"
} ,
{
"name" : "round twice" ,
"input" : "{\"round\":1000,\"round\":1001,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "round twice, once escaped as \\u0072ound" ,
"input" : "{\"round\":1000,\"\\u0072ound\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "round twice, the second null" ,
"input" : "{\"round\":1000,\"round\":null,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "round escaped as \\u0072ound" ,
"input" : "{\"\\u0072ound\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39"
} ,
"result" : "ok"
} ,
{
"name" : "Round instead of round" ,
"input" : "{\"Round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "ROUND beside round: another name, ignored" ,
"input" : "{\"round\":1000,\"ROUND\":1001,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39"
} ,
"result" : "ok"
} ,
{
"name" : "round null" ,
"input" : "{\"round\":null,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "round 1000.0" ,
"input" : "{\"round\":1000.0,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "round 1e3" ,
"input" : "{\"round\":1e3,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "round -1000" ,
"input" : "{\"round\":-1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "round 0" ,
"input" : "{\"round\":0,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "round 2^53" ,
"input" : "{\"round\":9007199254740992,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "round 2^53 - 1 for a DateKey of round 1000" ,
"input" : "{\"round\":9007199254740991,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"release" : {
"round" : 9007199254740991 ,
"signature" : "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39"
} ,
"result" : "ERR_ROUND_MISMATCH" ,
"text" : "provider: release for round 9007199254740991, expected 1000: ERR_ROUND_MISMATCH"
} ,
{
"name" : "round with a leading zero" ,
"input" : "{\"round\":01000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "signature twice" ,
"input" : "{\"round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\",\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "signature null" ,
"input" : "{\"round\":1000,\"signature\":null}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "randomness empty" ,
"input" : "{\"round\":1000,\"randomness\":\"\",\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: randomness does not match the signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "randomness null" ,
"input" : "{\"round\":1000,\"randomness\":null,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "another name twice" ,
"input" : "{\"round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\",\"note\":1,\"note\":2}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "a name twice in a nested object" ,
"input" : "{\"round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\",\"meta\":{\"a\":1,\"a\":2}}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "nested objects and arrays, ignored" ,
"input" : "{\"round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\",\"meta\":{\"a\":[1,{\"a\":2}],\"b\":{},\"c\":[]}}" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39"
} ,
"result" : "ok"
} ,
{
"name" : "a lone surrogate in another name" ,
"input" : "{\"round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\",\"\\ud800\":1}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "a lone low surrogate in a value" ,
"input" : "{\"round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\",\"note\":\"\\udc00\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "a surrogate pair in a value" ,
"input" : "{\"round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\",\"note\":\"\\ud83d\\ude00\"}" ,
"round" : 1000 ,
"release" : {
"round" : 1000 ,
"signature" : "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39"
} ,
"result" : "ok"
} ,
{
"name" : "a tab inside a string" ,
"input" : "{\"round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\",\"note\":\"a\tb\"}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
} ,
{
"name" : "something after the object" ,
"input" : "{\"round\":1000,\"signature\":\"b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39\"}{}" ,
"round" : 1000 ,
"result" : "ERR_RELEASE_INVALID" ,
"text" : "provider: drand JSON: malformed, or without round or signature: ERR_RELEASE_INVALID"
Release object, release in hand and step 9.c option B (spec v0.15 draft)
The release of a round becomes a file, .dkr: a release object in
deterministic CBOR, {0: "datekeys-release", 1: 1, 2: chain_hash, 3: round,
4: signature}, which provider.EncodeRelease writes and DecodeRelease reads
with its layers (size, type and version, schema). provider.ParseRelease
also reads drand's JSON as the input of the caller. Verify checks the chain
hash a release names before its round and its signature, with
ERR_PROFILE_MISMATCH. provider.Archive reads a local release archive, the
informative format of the draft.
capsule.OpenOptions.Release takes a release in hand, a provider.Supplier,
exclusive with Source: Open does not compare it with the clock (step 9.c,
option B) and reports a clock behind it in Opened.ClockBehind; a network
source is still never asked before the round time. The CLI gains
decrypt -release FILE (.dkr, drand's JSON or a local archive),
decrypt -save-release FILE.dkr and the command release, which fetches,
verifies and saves the .dkr without opening the capsule.
Test data: vectors/release.json, releases/<round>.dkr for rounds 1000,
1001, 1004 and 2000, and a local archive of rounds 1000 to 1004. In
mutations.json every case says its source, "supplied" or "network"; the
case "round not reached yet", a release in hand, now opens, and four cases
are added: the same with a network source, a release of another round from
a network source, and two release objects of another chain. SpecVersion
stays 0.14 until the author approves the draft.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 day ago
}
] ,
"archive" : {
"file" : "releases/archive_1000_1004.bin" ,
"header" : "a5007818646174656b6579732d72656c656173652d61726368697665010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e80405" ,
"lookups" : [
{
"round" : 999 ,
"result" : "ERR_RELEASE_UNAVAILABLE"
} ,
{
"round" : 1000 ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e8045830b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" ,
"result" : "ok"
} ,
{
"round" : 1001 ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903e9045830b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41" ,
"result" : "ok"
} ,
{
"round" : 1002 ,
"result" : "ERR_RELEASE_UNAVAILABLE"
} ,
{
"round" : 1003 ,
"result" : "ERR_RELEASE_UNAVAILABLE"
} ,
{
"round" : 1004 ,
"encoding" : "a50070646174656b6579732d72656c65617365010102582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971031903ec045830a40658b820c0f8c10207524179a2031ba9537688a0d04e4851b58026be9a341fee3b96fb48ffad28483d84b40a5864aa" ,
"result" : "ok"
} ,
{
"round" : 1005 ,
"result" : "ERR_RELEASE_UNAVAILABLE"
}
]
}
}