Samuel M Smith
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Note Insights Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    --- tags: KERI email: sam@samuelsmith.org --- # Implementation Notes for KERI https://github.com/decentralized-identity/keri https://github.com/decentralized-identity/keripy https://github.com/decentralized-identity/kerijs https://github.com/decentralized-identity/keriox https://github.com/decentralized-identity/keri/blob/master/implementation.md https://github.com/SmithSamuelM/keri https://hackmd.io/orhyiJkLT721v4PCPkvQiA?both https://github.com/SmithSamuelM/keri/blob/master/implementation.md smith.samuel.m@gmail.com https://github.com/SmithSamuelM/Papers/blob/master/whitepapers/KERI_WP_2.x.web.pdf https://github.com/SmithSamuelM/Papers/blob/master/presentations/KERI2_Overview_IIW_2020_A.pdf ## Things ToDo 1) Seal (Anchors) for arbitrary data: The interpretation of the data associated with the digest or hash tree root in the seal is independent of KERI. This allows KERI to be agnostic about anchored data semantics. Another way of saying this is that seals are data agnostic; they don’t care about the semantics of its associated data. This better preserves privacy because the seal itself does not leak any information about the purpose or specific content of the associated data. Furthermore, because digests are a type of content address, they are self-discoverable. This means there is no need to provide any sort of context or content specific tag or label for the digests. Applications that use KERI may provide discovery of a digest via a hash table (mapping) whose indexes (hash keys) are the digests and the values in the table are the location of the digest in a specific event. To restate, the semantics of the digested data are not needed for discovery of the digest within a key event sequence. To elaborate, the provider of the data understands the purpose and semantics and may disclose those as necessary, but the act of verifying authoritative control does not depend on the data semantics merely the inclusion of the seal in an event. It’s up to the provider of the data to declare or disclose the semantics when used in an application. This may happen independently of verifying the authenticity of the data via the seal. This declaration may be provided by some external application programmer interface (API) that uses KERI. In this way, KERI provides support to applications that satisfies the spanning layer maxim of minimally sufficient means. Seals merely provide evidence of authenticity of the associated (anchored) data whatever that may be. This approach follows the design principle of context independent extensibility. Because the seals are context agnostic, the context is external to KERI. Therefore the context extensibility is external to and hence independent of KERI. This is in contrast to context dependent extensibility or even independently extensible contexts that use extensible context mechanisms such as linked data or tag registries [84; 101; 105; 135]. Context independent extensibility means that KERI itself is not a locus of coordination between contexts for anchored data. This maximizes decentralization and portability. Extensibility is provided instead at the application layer above KERI though context specific external APIs that reference KERI seals in order to establish control authority and hence authenticity of the anchored (digested) data. Each API provides the context not KERI. This means that interoperability within KERI is focused solely on interoperability of control establishment. But that interoperability is total and complete and is not dependent on anchored data context. This approach further reflects KERI’s minimally sufficient means design aesthetic. A seal is an ordered self-describing data structure. Abstractly this means each element of the seal has a tag or label that describes the associated element’s value. A minimal seal must have an element whose label indicates that the value is either a digest or the root of a hash tree. In either case (digest or root) the value is fully qualified Base64 with a prepended derivation code that indicates the type of hash algorithm used to create the digest or hash root. When the seal is referring to another event it must also include the sequence number (sn) and identifier prefix elements in order to indicate the location of the sealed event in its key event sequence. These element labels (digest, root, prefix, sn) are so far the only normative labels needed to process a KERI seal. The data structure that provides the elements of a seal must have a canonical order so that it may be reproduced in a digest of elements of a event. Canonical ordering may be provided by a list of single element mappings. The order of appearance of each {label: value} mapping in the list is standardized. Currently, three types of seals, digest, hash tree root (Merkle tree) and event. Both or fully qualified Base64 with prepended derivation code for hash algorithm Anchors hash links not data format. Keep KERI pure (qua standard, and the logs it produces) no need to define tags in KERI Seals have labeled elements. Must have digest or root (hash tree root)element Event seal may also have sn and prefix elements. Hash trees are sparse trees with finite tree depth using depth prefix on internal hash nodes. These prevents 2nd preimage attacks. Similar to certificate transparency. Hyperledger Indy uses sparse Merkle tree library for revocation registry. Is that a good library to use for KERI Seal Merkle Trees? Discussion notes: - Mitwicki (HCF): we use VCs this way, to contain a minimal payload (hashlink). secure data storage or more public data hubs can be linked this way. - Sam: not just hashlink but an identifier that has to be dereferenced - Robert: We're using Manu's hashlinks (DRI) because it contains its own crypto suite etc, but we're a little worried that it exposes these logs to some kinds of correlation attacks. - Nader: Here's the reference for that hashlink standard https://tools.ietf.org/html/draft-sporny-hashlink-04 - Sam: Tag-dependent level of correlatability/lock-in to one encoding or dereferencing dependency - Robert: [In our usage of VCs?], we have been thinking about the discovery mechanism via DID Resolution (going from DID to DID:Doc to Service Endpoint [to agent and thus to vault/storage and returned resource] - Sam: Payloads should be encoding agnostic, mixing and matching should work This is because KERI only cares about the anchor/digest format. The anchored data is not transported in the KERI event so the anchored data can be any encoding. - - Mark L Smartopia: Kantara Initiative has been working on consent receipts along these lines, and standardizing on these [essentially legal] events across ontologies has been difficult; we're been able to standardize this and present it at ISO. A consent state record would be a notification and a receipt, and I think this could line up well; we have a GDPR delegation (in close dialogue w/w3c data privacy WG on ontology for this). In the last year, lots of standards have been completed and we're working towards a common record format (legally required to be open). - Sam: anchor/tag structure and tag-specific link out to data works with your logging needs? - Sam: a parser needs to know what is anchored by the anchor and how to consume/interpret the digest; the "tag name" is just for a KERI-level categorization of event types - Mark: we think of delegation as tripartite: regulator, subject, authority; our main data object is also tripartite: notice (event), notification (intermediary), receipt (record) - Sam: I think you might be imposing semantics from a similar but different definition of authority; I am trying to keep this super agnostic (and specifically about control authority events); - Mark: Notary/notification ledger: legal notary + SSI-based ledger; - Sam: is KERI preventing you from using KERI in this way? Is this a use-case and can KERI be used without adding anything to it? - documentable as a use case for accompanying documentation? **TODO ITEM?** - Mark: - Michael Gorlick: Digest format bears a resemblance to something I worked on IPFS - Sam: not coincidental! Based on that precedent - Mark: See also https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=coel - Nader: See also https://github.com/ipld/specs/blob/master/block-layer/content-addressable-archives.md for IPLD assembling hashes into a digest - Robert: Payload <----> tag relationship (discoverable semantics?) - Sam: But I'm afraid that puts the cart in front of the horse and creates a dependency; I want the tag to define the form of the digest, but I want to indirect AWAY from that and force the semantics out to the reference; this is the secure overlay for the internet, not everybody's data format - Charles: arbitrary data gets us away from minimal sufficiency - Sam: Just anchors, that's what i'm calling minimmaly sufficient, spec should not dictate anything about what is anchored, no ontological or semantic conditions or restraints - Robert: digest prefix ? - Sam: These list of these tags relates to the DID core spec registry of did doc properties; KERI only cares about the prefixes and assumes a namespaces of self-certifying identifiers (not just DIDs); KERI needs to be a secure spanning layer for identifiers that needs to be manually agnostic to secure events happening in specific namespaces/resolution spaces; - stateless services and self-certifying identifiers - example: a self-certifying did wrapped in a keri DID:Un ``` did:un:AVrTkep6H-Qt27fThWoNZsa884HA8tr54sHON1vWl6FE/path?kkey=me#flab ``` 2) Version format Encoding formats: Json, MsgPack, CBOR, Binary - JSON vs JSON-LD: data referenced by the payload digest could be -LD; - Robert: what's the idea of the representation of the version? - Sam: in my earlier protocol RAET, I used a short string prefix to mark the digest as JSON, MsgPack, Text, or Binary (//Unicode prefix); version-string should bear a prefix (even if redundant from context) in its first few bytes; - Robert: Sam: MsgPack and CBOR are versioned, while JSON isnt, so this `- KERI 1.0.0 MsgPack 1.0` - Robert: MIME type? Sam: I'm open to it, MIME types don't take up that many bytes... - Charles: Restricting the MIME types to a specific subset would help; Sam: yup, each version of KERI should only support a finite list of MIME types (so that it doesn't need to be encoded in each event) - examples `application/keri+json`, `application/keri+binary` ```bash KERI_1.0_application/keri+json KERI_1.0_application/keri+cbor KERI_1.0_application/keri+msgpack KERI_1.0_application/keri+binary ``` version 1.0 (1,0) (major,minor) major is backward breaking minor is backward compatible 3) Derivation codes Context plus code prefix digest of prev event public keys in array Next digest (threshold, public key array) delegation digests by tag data digests data anchor digests witnesses prefixes signatures Other codes See latest table in slide deck and paper Need to cread markdown table as reference Create KID for it 4) Languages: Python, Javascript (nodejs), Rust, Python +rust keripy, kerijs, keriox, Discussion: - Sam: Py - Spherity (hi!): nodeJS - Rust? JOLOCOM ftw (or at least Charles) "KeriOX" What about WASM rust version? Who wants to do this? 5) Derivation Extraction Library - library needs to turn each event into a digest - identifier derivated (base64) - non-inception: cyphersuite of public key; inception: need that data; - tag data digest function probably requires a separate library (anchor sublibrary for each tag?) 6) Verification Engine - inception event populates state machine - derive crypto material, verify it all - each new event, derive material, update state - the more efficient the better to scale - witness validator controller, everyone runs this all the time - Charles: replaying key events (and checking the outcome?) --> authoritative key material at any given time - Charles: historical DID Document checking? 8) Database for KERLs: LMDB - Standardize on LMDB for v1 at least - used by (and hardened by) LDAP - LDAP license (//BSD + (C)) - pretty free - well-coded paragon implementations in every language - useful for recovery --> can have multiple entries for each key (appendonly allowing double-entries for forks if you use sequence numbers properly) https://github.com/LMDB/lmdb https://symas.com/lmdb/ 8) Controller, Validator, Witness, Watcher, Juror, Judge 9) 10) Clients: web, cmd, python, etc WASM rust library for web clients? 10) KERI DID method: DID:UN-method (universal but also undoer and destroyer of worlds) - Charles: un-conference friendly! 11) Delegation Permissions What sort of stuff do we need to permission? Nested delegation of new delegated identifiers? Delegation of only some data tags? 12) KIDs KERI Implementation/Improvement Documents added kids directory to keri repo. 13) Ordered Mappings see issue https://github.com/decentralized-identity/keri/issues/7 One of the complications of serialization of mappings is whether or not the elements of the mapping appear in any given order. The best ordering is insertion order. This allows logical ordering independent of lexicographic ordering of the labels. With Javascript ES6 there is a new datatype called a Map that supports insertion or defined ordered elements. This may be JSON encoded/decoded in an order preserving manner using the JSON.stringify and JSON.parse functions in javasript using the approach below. Python has long had support for ordered dict objects and the various python json parsing libraries preserve that ordering by default. Since Python 3.6 all dict are ordered by default so its comes for free. In binary languages like Rust data structures are explicitly laid out so do not have the hash table problem of un predictable order that objects in Javascript and until recently dicts in Python had. As far as I can tell the rust serde library allows ordered mapping to/from JSON serializations so its not a problem in rust Ruby since 2007 supports ordered Hash objects (dict equivalent) I don't know about other languages like Go and Java. The proposal is to impose an ordered mapping constraint on KERI event serializations and extracted subsets of KERI events. This is not a weak sorted ordering but a strong ordering (order of appearance). We already have to do ordering for extracted sets of elements in order to compute digests. This may be done universally by using list of lists of (lable, value) pairs. But this is less programmer friendly than using ordered Mappings (Map in JS ES6, dict in Python 3.6+) that serialize and deseralize in order. In addition, automatic determination of serialization encoding becomes trivialized when the serializations are guaranteed to preserve the order of the elements. This means we can depend on the version element being the first element serialized. So parsing the encoding means looking at the first few bytes to extract the version string which will always appear in an unambiguous location at the front of the serialization. https://stackoverflow.com/questions/29085197/how-do-you-json-stringify-an-es6-map Both JSON.stringify and JSON.parse support a second argument. replacer and reviver respectively. With replacer and reviver below it's possible to add support for native Map object, including deeply nested values ```javascript function replacer(key, value) { const originalObject = this[key]; if(originalObject instanceof Map) { return { dataType: 'Map', value: Array.from(originalObject.entries()), // or with spread: value: [...originalObject] }; } else { return value; } } function reviver(key, value) { if(typeof value === 'object' && value !== null) { if (value.dataType === 'Map') { return new Map(value.value); } } return value; } Usage: const originalValue = new Map([['a', 1]]); const str = JSON.stringify(originalValue, replacer); const newValue = JSON.parse(str, reviver); console.log(originalValue, newValue); Deep nesting with combination of Arrays, Objects and Maps const originalValue = [ new Map([['a', { b: { c: new Map([['d', 'text']]) } }]]) ]; const str = JSON.stringify(originalValue, replacer); const newValue = JSON.parse(str, reviver); console.log(originalValue, newValue); ``` ## Collaboration COLLAB LOGISTICS: SEE KERI GITHUB REPO on DIF - attend ID & Discovery meetings of DIF! - Next Meeting May 11, 2020 11 a.m. PDT - https://zoom.us/j/801382311 - In process to add DIF slack channel for KERI - In meantime can reach on this slack channel keriworld.slack.com - - DIF ID and Discovery Agenda - https://docs.google.com/document/d/1gV99R7G2bUlRerxznyd0ucwWPfc1v2F2gQVaTawIPYI/edit# ## Old Notes KERI JS Scope Event Streaming Microservices Architecture Serverless compatible Each role is a different microservice Common is core KERI engine Database LMDB Start with online case pairwise case Controller and Validator ## Events ### Inception ![](https://i.imgur.com/foTO32t.png) ```json { "version": "KERI 0.0.1", "prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148", "sn": 0, "ilk": "icp", "digest": "EGEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw", "threshold": 2, "signers": [ "AWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "A8tr54sHON1vWVrTkep6H-4HAl6FEQt27fThWoNZsa88", "AVrTkep6HHA8tr54sHON1Qt27fThWoNZsa88-4vWl6FE" ], "next": "EWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "tally": 2, "witnesses": [ "AVrTkep6H-Qt27fThWoNZsa884HA8tr54sHON1vWl6FE", "AHON1vWl6FEQt27fThWoNZsa88VrTkep6H-4HA8tr54s", "AThWoNZsa88VrTkeQt27fp6H-4HA8tr54sHON1vWl6FE", ], "data": [], "signatures": [0,1] } \r\n\r\n "0AAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8KFFgf8i0tDq8XGizaCg" \r\n\r\n "0AHot0pmdWAcgTo5sKFFgf8i0tDq8XGizaCgAeYbsD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8" ``` ### Rotation ![](https://i.imgur.com/X38o6Kv.png) ```json { "version": "KERI 0.0.1", "prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148", "sn": 1, "ilk": "rot", "digest": "GEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw=", "threshold": 2, "signers": [ "AWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "A8tr54sHON1vWVrTkep6H-4HAl6FEQt27fThWoNZsa88", "AVrTkep6HHA8tr54sHON1Qt27fThWoNZsa88-4vWl6FE" ], "next": "EWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "tally": 2, "prune": [ "AVrTkep6H-Qt27fThWoNZsa884HA8tr54sHON1vWl6FE", ], "graft": [ "AHA8tr54sHON1vWl6FEVrTkep6H-Qt27fThWoNZsa884", ], "seals": [], "signatures": [0,2] } \r\n\r\n "0AAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8KFFgf8i0tDq8XGizaCg" \r\n\r\n "0AKFFgf8i0tDq8XGizaCgAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8" ``` ### Interaction ![](https://i.imgur.com/vr7oyg5.png) ```json { "verison": "KERI 0.0.1", "prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148", "sn": 2, "ilk": "ixn", "digest": "GEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw=", "threshold": 2, "signers": [ "AWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "A8tr54sHON1vWVrTkep6H-4HAl6FEQt27fThWoNZsa88", "AVrTkep6HHA8tr54sHON1Qt27fThWoNZsa88-4vWl6FE" ], "seals": [], "signatures": [0,2] } \r\n\r\n "0AAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8KFFgf8i0tDq8XGizaCg" \r\n\r\n "0AKFFgf8i0tDq8XGizaCgAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8" ``` ### Seals ```json "seals": [ [ ["prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148"], [ "sn": 0], ["digest": "GEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw"] ] , [ ["prefix", "AY25YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn139"], ["sn", 0], ["digest", "GFj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw"] ] ] ``` ### Delegation ![](https://i.imgur.com/QzBtfnb.png) #### Delegating Interaction ![](https://i.imgur.com/bNrHhsu.png) ```json { "verison": "KERI 0.0.1", "prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148", "sn": 2, "ilk": "ixn", "digest": "GEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw=", "threshold": 2, "signers": [ "AWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "A8tr54sHON1vWVrTkep6H-4HAl6FEQt27fThWoNZsa88", "AVrTkep6HHA8tr54sHON1Qt27fThWoNZsa88-4vWl6FE" ], "seals": [ [ ["prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148"], [ "sn": 0], ["digest": "GEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw"] ] ], "signatures": [0,2] } \r\n\r\n "0AAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8KFFgf8i0tDq8XGizaCg" \r\n\r\n "0AKFFgf8i0tDq8XGizaCgAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8" ``` #### Delegating Rotation ![](https://i.imgur.com/mipTTUr.png) ```json { "version": "KERI 0.0.1", "prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148", "sn": 1, "ilk": "rot", "digest": "GEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw=", "threshold": 2, "signers": [ "AWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "A8tr54sHON1vWVrTkep6H-4HAl6FEQt27fThWoNZsa88", "AVrTkep6HHA8tr54sHON1Qt27fThWoNZsa88-4vWl6FE" ], "next": "EWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "tally": 2, "prune": [ "AVrTkep6H-Qt27fThWoNZsa884HA8tr54sHON1vWl6FE", ], "graft": [ "AHA8tr54sHON1vWl6FEVrTkep6H-Qt27fThWoNZsa884", ], "seals": [ [ ["prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148"], [ "sn": 0], ["digest": "GEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw"] ] ], "signatures": [0,2] } \r\n\r\n "0AAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8KFFgf8i0tDq8XGizaCg" \r\n\r\n "0AKFFgf8i0tDq8XGizaCgAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8" ``` ### Delegated Inception ![](https://i.imgur.com/EaKLgLW.png) ![](https://i.imgur.com/JiAyeH5.png) ```json { "version": "KERI 0.0.1", "prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148", "sn": 0, "ilk": "dip", "digest": "EGEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw", "threshold": 2, "signers": [ "AWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "A8tr54sHON1vWVrTkep6H-4HAl6FEQt27fThWoNZsa88", "AVrTkep6HHA8tr54sHON1Qt27fThWoNZsa88-4vWl6FE" ], "next": "EWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "tally": 2, "witnesses": [ "AVrTkep6H-Qt27fThWoNZsa884HA8tr54sHON1vWl6FE", "AHON1vWl6FEQt27fThWoNZsa88VrTkep6H-4HA8tr54s", "AThWoNZsa88VrTkeQt27fp6H-4HA8tr54sHON1vWl6FE", ], "seal": [ ["prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148"], [ "sn": 0], ["digest": "GEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw"] ], "signatures": [0,1] } \r\n\r\n "0AAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8KFFgf8i0tDq8XGizaCg" \r\n\r\n "0AHot0pmdWAcgTo5sKFFgf8i0tDq8XGizaCgAeYbsD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8" ``` ### Delegated Rotation ![](https://i.imgur.com/3T4h8Pu.png) ![](https://i.imgur.com/81nzRTt.png) ```json { "version": "KERI 0.0.1", "prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148", "sn": 1, "ilk": "rot", "digest": "GEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw=", "threshold": 2, "signers": [ "AWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "A8tr54sHON1vWVrTkep6H-4HAl6FEQt27fThWoNZsa88", "AVrTkep6HHA8tr54sHON1Qt27fThWoNZsa88-4vWl6FE" ], "next": "EWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "tally": 2, "prune": [ "AVrTkep6H-Qt27fThWoNZsa884HA8tr54sHON1vWl6FE", ], "graft": [ "AHA8tr54sHON1vWl6FEVrTkep6H-Qt27fThWoNZsa884", ], "seal": [ ["prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148"], [ "sn": 0], ["digest": "GEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw"] ], "signatures": [0,2] } \r\n\r\n "0AAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8KFFgf8i0tDq8XGizaCg" \r\n\r\n "0AKFFgf8i0tDq8XGizaCgAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8" ``` ### Delegated Interaction ![](https://i.imgur.com/U3uqrZh.png) ```json { "verison": "KERI 0.0.1", "prefix": "AXq5YqaL6L48pf0fu7IUhL0JRaU2_RxFP0AL43wYn148", "sn": 2, "ilk": "ixn", "digest": "GEj6YfRWmGViKAesa08UkNWukUkPGsdFPPboBAsjRBw=", "threshold": 2, "signers": [ "AWoNZsa88VrTkep6HQt27fTh-4HA8tr54sHON1vWl6FE", "A8tr54sHON1vWVrTkep6H-4HAl6FEQt27fThWoNZsa88", "AVrTkep6HHA8tr54sHON1Qt27fThWoNZsa88-4vWl6FE" ], "seals": [], "signatures": [0,2] } \r\n\r\n "0AAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8KFFgf8i0tDq8XGizaCg" \r\n\r\n "0AKFFgf8i0tDq8XGizaCgAeYbsHot0pmdWAcgTo5sD8iAuSQAfnH5U6wiIGpVNJQQoYKBYrPPxAoIc1i5SHCIDS8" ```

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully