home / kskb-text

document_text

31 rows where source_id = "weboftrust-keripy-main"

✎ View and edit SQL

This data as json, CSV (advanced)

source_id 1

  • weboftrust-keripy-main · 31 ✖

license 1

  • Apache-2.0 31

kind 1

  • repository prose file 31
id ▼ source_id kind license title url credit chars text
weboftrust-keripy-main/10 weboftrust-keripy-main repository prose file Apache-2.0 Contributing.md https://github.com/WebOfTrust/keripy/blob/main/Contributing.md WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/Contributing.md. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 8686

Contributors' Guide

Introduction

Welcome to keripy's contribution guide! This project aims to develop a reference implementation of the KERI standards and protocols developed in WebOfTrust on github. We deeply appreciate the time and effort of contributors like you!

Legal & Licensing

This project has a split license whose details are contained here

Prerequisites

Before you start, make sure you have:

  • Read the README.md (best quickstart guide for using the project) and can build, install, and run the tests yourself from those instructions (from both the main and development branch). This is the assumed baseline for any issues, proposed features, or pull requests that you wish you contribute.
  • Are somewhat familiar with the KERI, ACDC, CESR standards and the KERI whitepapers. Jargon isn't always the best, but it does speed communication with maintainers whose time is often in short supply and appreciate clarity in all things. A very helpful website kerisse.org has been set up to ease this process if you don't necessarily have the time to read all of those things. However, an in depth knowledge will surely help if you are looking to make a lot of contributions.

How to Start Contributing

The KERI community welcomes all kinds of contributions.

For simple contributions like fixing typos sometimes you can just submit a naked PR with a title like "I'm fixing a spelling issue in x,y,z". If these PRs are small often times they'll just get merged without further review. Typos or fixing names that were mistakenly applied are human nature.

A really simple way to contribute is just to spread the word. Let people know about KERI, create a welcoming community to newcomers by actively participating and helping with what you know, and making cools things and talking about them is helpful to grow.

Issues and discussions are meant to be discussed, commented upon. Even a +1 to an issue that you're also experiencing can help the core maintainers decide where to focus their energies. Discussions can help provide clarity if things aren't exactly clear. Feel free to contribute (but also note the homework in PREREQUISITES, its frustrating for people to explain things that are already explained elsewhere).

However, this particular file is more about contributing code. The general principal in this (and all open source really) is if you can think of a way that things might be better, instead of just suggesting it or discussing it, often times its a good idea to do some work to show what/how/when an idea might look like or contributing code/scripts/tests/issues. Code >> discussion 9 times out of ten. Balanced of course with the caveat not to go off into the ivory tower for months and do lots of work before presenting your work and finding out that the community doesn't like it. Small prototypes/examples are often best. The rest of the details of contributing code are below.

Contribution Guidelines

Code Style/Conventions

PythonStyleGuide

Commit Message Guidelines

There are no hard and fast guidelines but it is helpful to: - Descriptive, to the point messages are ideal - Link to the issue you're trying to solve with a message of how the commit does or doesn't solve that issue. - Be sure to note important issues for checkpoint commits like "does not build" - Most importantly, the commit message should explain the WHY of all the code changes. When reviewing, reviewers will be confused if code changes for things you didn't list in the commit aren't there.

Branching Strategy

Branch from development, name your feature branches something like feature-name-of-my-feature and bugs something like bug-bug-name and link the github issue that you (or someone else) should have created for most non-trivial bugs/features. When you have fully implemented or fixed, submit a PR to WebOfTrust/keripy. If you need feedback it can also be appropriate to submit a draft PR to this repository and ask for comments.

Testing

See README.md. Always add tests if you fix a bug or add a feature. This should conform to the conventions of the repository (ie if you're fixing some issue in IPEX, put your tests with the tests for IPEX). If you're doing a greenfield implementation of something, even a few simple unit tests can provide clarity to future developers.

Process to Submit Changes

  1. Find and issue and let the developers on discord know you're working on it (and maybe comment on the issue to let people know you're picking it up).
  2. Work on issue
  3. Add tests
  4. Submit a PR to [WebOfTrust/keripy]
  5. Let maintainers know on discord in the appropriate channel
  6. Come to Thursday KERI development meeting to discuss if at all possible (sometimes its easier for maintainers to provide feedback directly rather than through async text, particularly if its a large or complex change).
  7. Iterate 2-6 if your change needs some fixes/updates

Reporting Bugs or Requesting Features

  • SEARCH FOR THE BUG OR FEATURE IN THE CURRENT ISSUES IN REPO. If it already exists, add a comment/script/test/+1/whatever there. Duplicates BAD.
  • If the bug/feature doesn't exist create an issue wherein you describe the bug, feature, or issue with as much detail as possible (but maybe not enough that you overload the reader with details).
  • Code snippets, scripts, or test cases should be added to the issue if possible. It helps with saving maintainers time and can drastically speed the development process.
  • Message in the appropriate discord channel to let people know about your bug/feature/issue, but remember that maintainers maintain at their own pace and discretion on issues of their choosing. Its best not to ping them more than once a week. As with all open source, if its an ultra critical bug/feature for you, cash bounties certainly incentivize people to pay attention and offer to help you directly.

Code of Conduct and Respect

From the discord channel

We are committed to providing a friendly, safe and welcoming environment for all, regardless of level of experience, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, nationality, or other similar characteristic.

Please avoid using overtly sexual aliases or other nicknames that might detract from a friendly, safe and welcoming environment for all.

Please be kind and courteous. There’s no need to be mean or rude.

Respect that people have differences of opinion and that every design or implementation choice carries a trade-off and numerous costs. There is seldom a right answer.

Please keep unstructured critique to a minimum. If you have solid ideas you want to experiment with, make a fork and see how it works.

We will exclude you from interaction if you insult, demean or harass anyone. That is not welcome behavior. We interpret the term “harassment” as including the definition in the Citizen Code of Conduct; if you have any lack of clarity about what might be included in that concept, please read their definition. In particular, we don’t tolerate behavior that excludes people in socially marginalized groups.

Private harassment is also unacceptable. No matter who you are, if you feel you have been or are being harassed or made uncomfortable by a community member, please contact one of the channel admins immediately. Whether you’re a regular contributor or a newcomer, we care about making this community a safe place for you and we’ve got your back.

Likewise any spamming, trolling, flaming, baiting or other attention-stealing behavior is not welcome. Attribution Adapted from the Rust Code of Conduct: https://www.rust-lang.org/policies/code-of-conduct

Getting Help

For questions or clarifications, reach out via: - Discord: [See KERI repo] (https://github.com/WebOfTrust/keri) - KERI Development Meetings: [https://github.com/WebOfTrust/keri#implementors-call] - ACDC Standards Meeting@TOIP (technically must be a member of ToIP to contribute): [https://github.com/WebOfTrust/keri#specification-call]

Acknowledgments

Thanks to all our wonderful contributors.

Additional Resources

  • Project Documentation and Search Engine
  • Related Projects
weboftrust-keripy-main/11 weboftrust-keripy-main repository prose file Apache-2.0 docs/keri_app.rst https://github.com/WebOfTrust/keripy/blob/main/docs/keri_app.rst WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/docs/keri_app.rst. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 1703

KERI App API

.. |str| replace:: str

keri.app.agenting

.. automodule:: keri.app.agenting :members:

keri.app.apping

.. automodule:: keri.app.apping :members:

keri.app.challenging

.. automodule:: keri.app.challenging :members:

keri.app.configing

.. automodule:: keri.app.configing :members:

keri.app.delegating

.. automodule:: keri.app.delegating :members:

keri.app.directing

.. automodule:: keri.app.directing :members:

keri.app.forwarding

.. automodule:: keri.app.forwarding :members:

keri.app.grouping

.. automodule:: keri.app.grouping :members:

keri.app.habbing

.. automodule:: keri.app.habbing :members:

keri.app.httping

.. automodule:: keri.app.httping :members:

keri.app.indirecting

.. automodule:: keri.app.indirecting :members:

keri.app.keeping

.. automodule:: keri.app.keeping :members:

keri.app.notifying

.. automodule:: keri.app.notifying :members:

keri.app.oobiing

.. automodule:: keri.app.oobiing :members:

keri.app.signaling

.. automodule:: keri.app.signaling :members:

keri.app.signing

.. automodule:: keri.app.signing :members:

keri.app.specing

.. automodule:: keri.app.specing :members:

keri.app.storing

.. automodule:: keri.app.storing :members:

keri.app.watching

.. automodule:: keri.app.watching :members:

weboftrust-keripy-main/12 weboftrust-keripy-main repository prose file Apache-2.0 docs/keri_core.rst https://github.com/WebOfTrust/keripy/blob/main/docs/keri_core.rst WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/docs/keri_core.rst. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 1053

KERI Core API

keri.core.coring

.. automodule:: keri.core.coring :members:

keri.core.counting

.. automodule:: keri.core.counting :members:

keri.core.eventing

.. automodule:: keri.core.eventing :members:

ker.core.indexing

.. automodule:: keri.core.indexing :members:

keri.core.parsing

.. automodule:: keri.core.parsing :members:

keri.core.routing

.. automodule:: keri.core.routing :members:

keri.core.scheming

.. automodule:: keri.core.scheming :members:

keri.core.signing

.. automodule:: keri.core.signing :members:

keri.core.annotating

.. automodule:: keri.core.annotating :members:

.. note:: The Streamer class was moved to :mod:keri.core.signing but remains importable via from keri.core import Streamer.

keri.core.structing

.. automodule:: keri.core.structing :members:

weboftrust-keripy-main/13 weboftrust-keripy-main repository prose file Apache-2.0 docs/keri_db.rst https://github.com/WebOfTrust/keripy/blob/main/docs/keri_db.rst WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/docs/keri_db.rst. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 505

KERI DB API

keri.db.basing

.. automodule:: keri.db.basing :members:

keri.db.dbing

.. automodule:: keri.db.dbing :members:

keri.db.escrowing

.. automodule:: keri.db.escrowing :members:

keri.db.koming

.. automodule:: keri.db.koming :members:

keri.db.migrations

.. automodule:: keri.db.migrations :members:

keri.db.subing

.. automodule:: keri.db.subing :members:

weboftrust-keripy-main/14 weboftrust-keripy-main repository prose file Apache-2.0 docs/keri_demo.rst https://github.com/WebOfTrust/keripy/blob/main/docs/keri_demo.rst WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/docs/keri_demo.rst. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 113

KERI Demo API

keri.demo.demoing

.. automodule:: keri.demo.demoing :members:

weboftrust-keripy-main/15 weboftrust-keripy-main repository prose file Apache-2.0 docs/keri_end.rst https://github.com/WebOfTrust/keripy/blob/main/docs/keri_end.rst WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/docs/keri_end.rst. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 189

KERI End API

keri.end.ending

.. automodule:: keri.end.ending :members:

keri.end.priming

.. automodule:: keri.end.priming :members:

weboftrust-keripy-main/16 weboftrust-keripy-main repository prose file Apache-2.0 docs/keri_help.rst https://github.com/WebOfTrust/keripy/blob/main/docs/keri_help.rst WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/docs/keri_help.rst. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 114

KERI Help API

keri.help.helping

.. automodule:: keri.help.helping :members:

weboftrust-keripy-main/17 weboftrust-keripy-main repository prose file Apache-2.0 docs/keri_peer.rst https://github.com/WebOfTrust/keripy/blob/main/docs/keri_peer.rst WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/docs/keri_peer.rst. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 123

KERI Peer API

keri.peer.exchanging

.. automodule:: keri.peer.exchanging :members:

weboftrust-keripy-main/18 weboftrust-keripy-main repository prose file Apache-2.0 docs/keri_vc.rst https://github.com/WebOfTrust/keripy/blob/main/docs/keri_vc.rst WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/docs/keri_vc.rst. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 322

KERI Verificable Credential API

keri.vc.protocoling

.. automodule:: keri.vc.protocoling :members:

keri.vc.proving

.. automodule:: keri.vc.proving :members:

keri.vc.walleting

.. automodule:: keri.vc.walleting :members:

weboftrust-keripy-main/19 weboftrust-keripy-main repository prose file Apache-2.0 docs/keri_vdr.rst https://github.com/WebOfTrust/keripy/blob/main/docs/keri_vdr.rst WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/docs/keri_vdr.rst. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 382

KERI VDR API

keri.vdr.credentialing

.. automodule:: keri.vdr.credentialing :members:

keri.vdr.eventing

.. automodule:: keri.vdr.eventing :members:

keri.vdr.verifying

.. automodule:: keri.vdr.verifying :members:

keri.vdr.viring

.. automodule:: keri.vdr.vdring :members:

weboftrust-keripy-main/20 weboftrust-keripy-main repository prose file Apache-2.0 docs/readme.rst https://github.com/WebOfTrust/keripy/blob/main/docs/readme.rst WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/docs/readme.rst. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 2865

.. role:: bash(code) :language: bash

================================================== Features ================================================== Key Event Receipt Infrastructure (KERI) is the first truly fully decentralized identity system.

Truly Decentralized Identity

<hr>

KERI is the first truly decentralized identity system. It is ledger-less which means it doesn’t need to use a ledger at all or ledger-portable which means that its identifiers are not locked to any given ledger and may switch as needed. In other words KERI identifiers are truly portable.

Supports GDPR Compliance

<hr>

KERI is inherently supportive of GDPR (global data protection rights) compliance. KERI provides non-intertwined identifier trust bases which means that a given identifier’s data may be erased and truly forgotten.

Self-Certifying Identifiers

<hr>

KERI has a decentralized secure root-of-trust based on cryptographic self-certifying identifiers. It uses hash chained data structures called Key Event Logs that enable ambient cryptographic verifiability. In other words, any log may be verified anywhere at anytime by anybody. It has separable control over shared data which means each entity is truly self-sovereign over their identifiers.

Scalability

<hr>

KERI is designed for high performance and scalability. It is compatible with data intensive event streaming and event sourcing applications.

Key Management Infrastructure

<hr>

One useful way of describing KERI is that it is a decentralized key management infrastructure based on key change events that supports both attestable key events and consensus based verification of key events.

Open Apache2

<hr>

Best of all KERI is open Apache2. It is a project working toward IETF standardization.

Installation

<hr>

Dependencies

Binaries ++++++++

python 3.9.1+ libsodium 1.0.18+

python packages +++++++++++++++ lmdb 0.98+ pysodium 0.7.5+ blake3 0.1.5+ msgpack 1.0.0+ simplejson 3.17.0+ cbor2 5.1.0+

.. code-block:: shell

$ pip3 install -U lmdb pysodium blake3 msgpack simplejson cbor2

or separately

.. code-block:: shell

$ pip3 install -U lmdb $ pip3 install -U pysodium $ pip3 install -U blake3 $ pip3 install -U msgpack $ pip3 install -U simplejson $ pip3 install -U cbor2

Development

<hr>

Setup

  • Ensure Python 3.9 is present along with venv and dev header files;
  • Setup virtual environment: :bash:python3 -m venv keripy
  • Activate virtual environment: :bash:source keripy/bin/activate
  • Setup dependencies: :bash:pip install -r requirements.txt

Testing

  • Install pytest: :bash:pip install pytest

  • Run the test suites:

.. code-block:: bash

pytest tests/ --ignore tests/demo/ pytest tests/demo/

weboftrust-keripy-main/24 weboftrust-keripy-main repository prose file Apache-2.0 ref/ChangeLog.md https://github.com/WebOfTrust/keripy/blob/main/ref/ChangeLog.md WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/ref/ChangeLog.md. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 10349

Change Log for keripy

2.0.0-dev6

*** peer.exchange has been replaced with a combination of either core.eventing.exchange or peer.specialExhange. peer.specialExchange supports the embeds and diger parameters and returns a tuple of (exn, atc) exn Serder instance and atc attachments bytearray. Whereas eventing.exchange just returns the exchange Serder instance.

*** peer.exchanging.exchange normalizing call signature with core.eventing.exchange so that all KERI message function call signatures are aligned. currently peer.exchanging.exchange uses a differe signature. So to better support v2 with backwards compat for v1 want one exchange function. parameters changes: date -> stamp, recipient->receiver payload->attributes No longer has embeds and diger this is for specialExchange return type is no longer tuple just SerderKERI

*** peer.exchanging.specialExchange now handles the special exchange with embeds and or diger use this for v1 compatibility with old exchange.

*** BaseHab and subclasses .incept alias for .make promoted to default and .make is alias. Future deprecate .make

*** Kever .init and .update refactored signature to use delsner and delsger instead of delnum (which was not per convention) and deldiger to better match new convention for Number and Diger but name indicates sequence number and said diger

Kevery.processEvent signature change

delnum is now delsner  short for delegating sequence number
deldiger is now delsger short for delegating said diger

app.habbing.BaseHab.makeOwnEvent has been changed to .msgOwnEvent because

it better fits what is does is to messagize its own event. .makeOwnEvent is now deprecated

app.habbing.BaseHab.makeOwnInception has been change to .msgOwnInception

because it better fits what is does is to messagize its own inception event. .makeOwnInception is now deprecated

app.habbing.BaseHab.makeOtherEvent has been changed to .msgOtherEvent because

it better fits what is does is to messagize some other event. .makeOtherEvent is now deprecated

core.eventing.messagize call signature changes: piplined parameter is replaced

with framed and the default is framed=False. This is because the Parser meaning of piplined has evolved whereas messagize no longer tracks that meansing so framed is now the accurated parameter. Added other parameters to make it support verison 2 BasHab methods that call messagize have pass through parameters with same semantics

OnSuber and OnIoDupSuber remap of method names

change method names to shadow super class methods to avoid confusion and reduce potential errors

WASM Support.

Added keri.db.webdbing.py with support for IndexedDB in wasm pyodide pyscript. as a plugin replacement for LMDB (see keri.db.webdbing.WebDBer)

2.0.0-dev5

Backwards breaking interface changes

Changes to call signatures that will break dependent libraries

keri.vdr subpackage

combined viring into eventing to remove hard circular import now that its a subpackage using init.py moved dataclasses to vdring as shared imports across vdr. fixed circular imports with agenting and app subpackage using dynamic imports

keri.db.subing

SuberBase.getItemIter and subclasses is changed to .getTopItemIter this is to clearly indicate that it iterates over the top branch given by keys and uses the topive parameter.

keri.db.koming

KomerBase.getItemIter and subclasses is changed to .getTopItemIter this is to clearly indicate that it iterates over the top branch given by keys and uses the topive parameter.

keri.db.dbing

Changed LMDBer.delval to LMDBer.remval

keri.core.scheming.py

Replaced deprecated jsonschema.RefResolver with referencing.Registry in CacheResolver.resolver(). The method now returns a referencing.Registry instance instead of a jsonschema.RefResolver instance. Requires jsonschema >= 4.18.0 and the referencing package. Users on older versions of jsonschema must upgrade. JSONSchema.verify_json() now passes registry= instead of resolver= to jsonschema.validate().

keri.core.routing.py

Changed Router.dispatch(self, serder, saider, ...) to dispatch(self, serder, diger, ...). Changed Router.processRouteNotFound(self, *, serder, saider, ...) to processRouteNotFound(self, *, serder, diger, ...). Changed Revery.processReply local variable from saider to diger.

keri.core.eventing.py

Changed Kevery.processReplyEndRole(self, *, serder, saider, ...) to processReplyEndRole(self, *, serder, diger, ...). Changed Kevery.processReplyLocScheme(self, *, serder, saider, ...) to processReplyLocScheme(self, *, serder, diger, ...). Changed Kevery.processReplyKeyStateNotice(self, *, serder, saider, ...) to processReplyKeyStateNotice(self, *, serder, diger, ...). Renamed local diger to ksr_diger in processReplyKeyStateNotice to avoid shadowing the parameter. Changed Kevery.processReplyAddWatched(self, *, serder, saider, ...) to processReplyAddWatched(self, *, serder, diger, ...).

keri.app.oobiing.py

Changed Oobiery.processReply(self, *, serder, saider, ...) to processReply(self, *, serder, diger, ...).

keri.vdr.eventing.py

Changed Tvy.processReplyRegistryTxnState(self, *, serder, saider, ...) to processReplyRegistryTxnState(self, *, serder, diger, ...). Changed Tvy.processReplyCredentialTxnState(self, *, serder, saider, ...) to processReplyCredentialTxnState(self, *, serder, diger, ...). Removed redundant diger = saider alias lines in both functions.

keri.db.escrowing.py

Changed Broker.processEscrowState dispatch call from processReply(saider=diger, ...) to processReply(diger=diger, ...).

keri.app.grouping.py

Changed complete(self, prefixer, seqner, saider=None) to complete(self, prefixer, number, diger=None). Renamed seqner and saider parameter to number and diger to match the actual type (Number, Diger) being passed. All callers functions in test_grouping.py are updated. Fixed stale docstring in complete(): saider (Saider) → diger (Diger). Renamed saiders/saider → digers/diger local variables in Counselor.get() (meids sub-DB returns Diger instances).

2.0.0-dev5

Backwards breaking interface changes

Changes to call signatures that will break dependent libraries

keri.app.delegating.py

Changed start(self, ghab, prefixer, seqner, saider) to start(self, ghab, prefixer, number, diger). Changed startCounselor(self, hab, prefixer, seqner, saider) to startCounselor(self, hab, prefixer, number, diger). Renamed seqner and saider parameter to number and diger to match the actual type (Number, Diger) being passed. All callers for both functions in test_grouping.py, confirm.py, incept.py, join.py, rotate.py credentialing.py and interact.py updated.

2.0.0-dev5

Backwards breaking interface changes

Changes to call signatures that will break dependent libraries

keri.app.delegating.py

Changed complete(self, prefixer, seqner, diger=None) to complete(self, prefixer, number, diger=None). Renamed seqner parameter to number to match the actual type (Number) being passed. All callers in rotate.py, incept.py, and grouping.py updated.

2.0.0-dev5

Backwards breaking interface changes

Changes to call signatures that will break dependent libraries

keri.core.eventing.Kevery.processEvent

Changed keyword parameter delseqner (Seqner) to delnum (Number) in the function signature and all internal call sites. External callers that previously passed delseqner must now pass delnum with a Number instance.

2.0.0-dev5

Backwards breaking interface changes

Changes to call signatures that will break dependent libraries

keri.core.eventing.py

Changed fetchTsgs(db, saider, snh) to fetchTsgs(db, diger, snh). Renamed saider parameter to diger to match the actual type (Diger) being passed. All callers in routing.py, habbing.py, and escrowing.py updated.

2.0.0-dev1

Backwards breaking interface changes

Changes to call signatures that will break dependent libraries

keri.help.helping.py

Changed nonStringIterable() to isNonStringIterable() Change nonStringSequence() to isNonStringSequence() Added Metaclasses NonStringIterable and NonStringSequence

keri.core.coring.py

Changed Pather class to support both relative and aboslute paths Now supports relative paths in Base64 using excape sequence. More thorough checks for valid paths. Supports both paths for pathed material and paths for routes and return routes in KERI messages. Init supports path as '/' delimited string that if otherwise the path parts are Based64 will compacting encode as StrB64 variable length. If not will encode as Bytes variable length. No longer is Pather a subclass of Bexter so .bext is no longer a property .path property returns a path string this is a breaking change .parts property returns a list of path parts as either relative or absolute depending on what the actual path expression .rparts property returns a list of path parts as a relative path On init relative (bool) False forces path to be absolute Relative True allows relative path if expressed as relative. On init pathive(bool) True forces B64 compliant path parts raises exception if not. False allows non B64 path parts.

Changed Dicter Class. made randomNonce a statice method. ._randomNonce instead of module method since only used inside Dicter Changed init parameter sad to dicter since more accurate.

keri.core.serdering.SerderACDC

Changed .regi property to .regid to avoid confusion with regd regk and other reg and to avoid the confusion of i meaning a AID, whereas regid is a said its an identifier for registry but not an aid. Since regd is already used to mean something else, we picked the regid which was not previously used anywhere.

keri.core.streaming now keri.core.annotating

Due to circular imports moved Streamer class to keri.core.signing and renamed streaming.py and test_streaming.py to annotating.py and test_annotating from keri.core import Streamer still works.

keri.core Tierage and Tiers

moved Tierage and Tiers defintions from keri.core.coring to keri.core.signing where they more naturally belong (not used in coring) from keri.core import Tiers still works

weboftrust-keripy-main/25 weboftrust-keripy-main repository prose file Apache-2.0 ref/CypherSuites.md https://github.com/WebOfTrust/keripy/blob/main/ref/CypherSuites.md WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/ref/CypherSuites.md. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 7485

Cypher Suites for KERI

Python Binding Types for Various Libraries

https://realpython.com/python-bindings-overview/

ctypes CFFI PyBind11 Cython

Crypto Support

https://medium.com/@joehonton/cipher-suites-demystified-ada2e97be9c9

Blake3 Hashing

Currently libsodium only supports blake2b but blake3 is on roadmap for libsodim 1.x

blake3-py

https://github.com/oconnor663/blake3-py

python bindings to the official rust implementation of blake3

Python bindings for the official Rust implementation of BLAKE3, based on PyO3. These bindings expose all the features of BLAKE3, including extendable output, keying, and multithreading.

Uses binary wheels

shell $ pip3 install blake3

Seed Stretching

libsodium cypto_pwhash is argon21d so don't need separate package but for future reference

argon2-cffi 19.2.0+

shell $ pip3 install -U argon2-cffi

Argon2

Argon2 with Libsodium pwhash

https://libsodium.gitbook.io/doc/password_hashing

Sodium's high-level crypto_pwhash_* API currently leverages the Argon2id function on all platforms. This can change at any point in time, but it is guaranteed that a given version of libsodium can verify all hashes produced by all previous versions, from any platform. Applications don't have to worry about backward compatibility.

https://github.com/hynek/argon2-cffi

pysodium python crypto_pwhash(outlen, passwd, salt, opslimit, memlimit, alg)

LibSodium Python Libraries

pysodium

https://github.com/stef/pysodium Barebones fast small ctypes binding

libnacl

https://github.com/saltstack/libnacl not as barebones but includes easy functions not in pysodium ctypes binding

pynacl

https://github.com/pyca/pynacl/ bigger more docs more utility functions Wheel on macos CFFI binding

csodium (obsolete)

https://github.com/ereOn/csodium Like pysodium but uses wheel to automatically compile libsodium not complete stopped dev 4 years ago

Python Libraries that Support conversion from Ed25519 to X25519

https://blog.filippo.io/using-ed25519-keys-for-encryption/

https://doc.libsodium.org/advanced/ed25519-curve25519

crypto_sign_ed25519_pk_to_curve25519 crypto_sign_ed25519_sk_to_curve25519

pysodium

pysodium/init.py

```python def crypto_sign_pk_to_box_pk(pk): if pk is None: raise ValueError if not (len(pk) == crypto_sign_PUBLICKEYBYTES): raise ValueError('Truncated public key') res = ctypes.create_string_buffer(crypto_box_PUBLICKEYBYTES) __check(sodium.crypto_sign_ed25519_pk_to_curve25519(ctypes.byref(res), pk)) return res.raw

def crypto_sign_sk_to_box_sk(sk): if sk is None: raise ValueError if not (len(sk) == crypto_sign_SECRETKEYBYTES): raise ValueError('Truncated secret key') res = ctypes.create_string_buffer(crypto_box_SECRETKEYBYTES) __check(sodium.crypto_sign_ed25519_sk_to_curve25519(ctypes.byref(res), sk)) return res.raw ```

libnacl

libnacl/init.py

``` python def crypto_sign_ed25519_pk_to_curve25519(ed25519_pk): ''' Convert an Ed25519 public key to a Curve25519 public key ''' if len(ed25519_pk) != crypto_sign_ed25519_PUBLICKEYBYTES: raise ValueError('Invalid public key')

curve25519_pk = ctypes.create_string_buffer(crypto_scalarmult_curve25519_BYTES)
ret = nacl.crypto_sign_ed25519_pk_to_curve25519(curve25519_pk, ed25519_pk)
if ret:
    raise CryptError('Failed to generate Curve25519 public key')
return curve25519_pk.raw

def crypto_sign_ed25519_sk_to_curve25519(ed25519_sk): ''' Convert an Ed25519 secret key to a Curve25519 secret key ''' if len(ed25519_sk) != crypto_sign_ed25519_SECRETKEYBYTES: raise ValueError('Invalid secret key')

curve25519_sk = ctypes.create_string_buffer(crypto_scalarmult_curve25519_BYTES)
ret = nacl.crypto_sign_ed25519_sk_to_curve25519(curve25519_sk, ed25519_sk)
if ret:
    raise CryptError('Failed to generate Curve25519 secret key')
return curve25519_sk.raw

```

pynacl

pynacl/src/nacl/bindings/init.py from nacl.bindings.crypto_sign import crypto_sign_ed25519_pk_to_curve25519, crypto_sign_ed25519_sk_to_curve25519,

def crypto_sign_ed25519_pk_to_curve25519(public_key_bytes): """ Converts a public Ed25519 key (encoded as bytes public_key_bytes) to a public Curve25519 key as bytes. Raises a ValueError if public_key_bytes is not of length crypto_sign_PUBLICKEYBYTES :param public_key_bytes: bytes :rtype: bytes """ if len(public_key_bytes) != crypto_sign_PUBLICKEYBYTES: raise exc.ValueError("Invalid curve public key")

curve_public_key_len = crypto_sign_curve25519_BYTES
curve_public_key = ffi.new("unsigned char[]", curve_public_key_len)

rc = lib.crypto_sign_ed25519_pk_to_curve25519(curve_public_key,
                                              public_key_bytes)
ensure(rc == 0,
       'Unexpected library error',
       raising=exc.RuntimeError)

return ffi.buffer(curve_public_key, curve_public_key_len)[:]

def crypto_sign_ed25519_sk_to_curve25519(secret_key_bytes): """ Converts a secret Ed25519 key (encoded as bytes secret_key_bytes) to a secret Curve25519 key as bytes. Raises a ValueError if secret_key_bytesis not of length crypto_sign_SECRETKEYBYTES :param secret_key_bytes: bytes :rtype: bytes """ if len(secret_key_bytes) != crypto_sign_SECRETKEYBYTES: raise exc.ValueError("Invalid curve secret key")

curve_secret_key_len = crypto_sign_curve25519_BYTES
curve_secret_key = ffi.new("unsigned char[]", curve_secret_key_len)

rc = lib.crypto_sign_ed25519_sk_to_curve25519(curve_secret_key,
                                              secret_key_bytes)
ensure(rc == 0,
       'Unexpected library error',
       raising=exc.RuntimeError)

return ffi.buffer(curve_secret_key, curve_secret_key_len)[:]

Encoding Support

JSON support

https://artem.krylysov.com/blog/2015/09/29/benchmark-python-json-libraries/ https://pythonspeed.com/articles/faster-json-library/

simplejson

most complete support but slower than ujsonn or rapidjson

shell $ pip3 install -U simplejson

ujson

fastest but not many options

shell $ pip install ujson

python-rapidjson

almost as fact as ujson but supports more options

msgpack

msgpack 1.0.0+ shell $ pip3 install -U msgpack

cbor

cbor2 5.1.0 https://pypi.org/project/cbor2/

shell $ pip3 install -U cbor2

Not sure if cbor2 uses libcbor or not

shell $ brew install libcbor

libcbor 0.7.0

ECDSA SHA2

Because ECDSA curve is linear may use the EDCSA curve directly without conversion for DH encryption. Exmaple is OpenSSH using ECDHE (eliptic curve Diffie Hellman Exchange) key exchange with SHA2 CHACHA20 POLY1305

https://tools.ietf.org/html/rfc5656

IANA name: TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 OpenSSL name: ECDHE-ECDSA-CHACHA20-POLY1305 GnuTLS name: TLS_ECDHE_ECDSA_CHACHA20_POLY1305 Hex code: 0xCC, 0xA9 TLS Version(s): TLS1.2 Protocol: Transport Layer Security (TLS) Key Exchange: Elliptic Curve Diffie-Hellman Ephemeral (ECDHE) Authentication: Elliptic Curve Digital Signature Algorithm (ECDSA) Encryption: ChaCha stream cipher and Poly1305 authenticator (CHACHA20 POLY1305) Hash: Secure Hash Algorithm 256 (SHA256) Included in RFC: RFC 7905 Machine-readable: application/json

weboftrust-keripy-main/26 weboftrust-keripy-main repository prose file Apache-2.0 ref/MultiHab.md https://github.com/WebOfTrust/keripy/blob/main/ref/MultiHab.md WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/ref/MultiHab.md. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 1333

Multi-Hab

MultiHab can consist of the following: - 1 or more local AIDs, 1 or more remote AIDs: GroupHab - 1 or more Signify Clients, 0 or more remote AIDs: SignifyHab

The key to implementing them all is allowing the had to incept, rotate and interact by accepting the Serder of the event and the signatures.

Helper methods are need to create the (icp, rot, ixn) events given the Verfers, Digers and all other parameters.

Helper methods are needed to parse the event.

Helper method needed to extract Merfers / Digers from smids and rmids

Signing the event only occurs when there are 1 or more local AIDs so we have to account for that in the larger group logic. So when event creation occurs, IF THERE ARE ANY LOCAL AIDs, THEY MUST ALSO SIGN THE EVENT

When you create a MultiHab you must be able to specify the consituents:

What if this was a Hab that just knows about verfers, merfers for inception and rotation to create the events.

Then a method to parse the event that will, before parsing, sign the event with any local AIDs that are present.

createEvent(merger, diger) -

parseEvent(serder, sigers) -> signs with local Habs if there

updateHabRecord()...

Allow for creation of the event by the lead that is either local or Signify client or other multisig AID

Start with SkelHab for just parse and sign event.

weboftrust-keripy-main/27 weboftrust-keripy-main repository prose file Apache-2.0 ref/MultisigIssuance.md https://github.com/WebOfTrust/keripy/blob/main/ref/MultisigIssuance.md WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/ref/MultisigIssuance.md. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 2114

Multisig Issuance

Multisig rotation must be extracted into a method outside of the Doer * This methods takes care of publishing the mid rotation event. * Or should the method return the mid rotation appended to the bytes? That way the multisig Doer can just witness them and the caller of Issue can deal with them. Caller won't care how many there are * No rotation parameters should be changed on the multisig identifier during a multisig rotation

Multisig interaction (signing) must also be a method

Modify Issuer.anchorMsg to call the multisig-enabled methods if appropriate

Issue credential endpoint handler must decide if its a multisig agent and send out exn messages to other participant(s) to let them know a credential must be signed. Token ring propagation or gossip protocol between participants.

How does ((2/3), (6/7)) propagation work so only the top three need to participate?

Initiator of protocol event should be responsible for gathering receipts and submitting final event when enough receipts have been received. Its exactly the same as gathering receipts from witnesses.

Once threshold is reached, the credential can be sent to Holder and the events submitted to witnesses.

Update multisig inception/rotation to follow the same procedure. The initiator of the inception/rotation is responsible for gathering all reciepts and propagating them, not the "first guy in the list"

Credential Issuance needs an escrow. And the receipts are processed against that escrow as they are received and when the credential meets its threshold, It is taken out of escrow and sent to the holder and the events sent to the witnesses. This way, the other participants are just receipting the credential, not worrying about processing it themselves. They just need to also pull the KEL and TEL events from witnesses when they are done.

Do we need to propagate the Credentials to all participants? Or can the originator of the credential be enough to hold on to it

Coming out of Escrow signals initiator to send events to Witnesses and other participants and Credential to Holder!!!!!

weboftrust-keripy-main/28 weboftrust-keripy-main repository prose file Apache-2.0 ref/Peer2PeerCredentials.md https://github.com/WebOfTrust/keripy/blob/main/ref/Peer2PeerCredentials.md WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/ref/Peer2PeerCredentials.md. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 12544

KERI Peer to Peer Communication / Credential Exchange Protocol

Introduction

This document proposes additions to the KERI protocol to facilitate peer to peer secure communications. It also introduces two enveloped protocols embedded in these new KERI messages for Credential Issuance and Presentation Exchange leveraging the https://identity.foundation/credential-manifest/ and https://identity. foundation/presentation-exchange/ data formats. Finally, CESR Proof Format for W3C Verifiable Credentials is defined for encoding and signing VCs.

KERI Peer to Peer Communication

KERI Message: exn for peer to peer exchanges.

Credential Offer exn Message

{ "v": "KERI10JSON00011c_", // KERI Version String "t": "exn", // peer to peer message ilk "dt": "2020-08-22T17:50:12.988921+00:00" "r": "/credential/offer" // resource with nested namespace "q": { "issuer": "did:keri:EEBp64Aw2rsjdJpAR0e2qCq3jX7q7gLld3LjAwZgaLXU" "output_descriptors: [ "EckOnHB11J4H9q16I3tN8DdpNXnCiP5QJQ7yvkWqTDdA" ], "format": { "cesr": { "proof_type": ["Ed25519Signature2018"] } } } //embedded credential_manifest like structure, may contain presentation_definition of requirements for fullfilment }-AABAA1o61PgMhwhi89FES_vwYeSbbWnVuELV_jv7Yv6f5zNiOLnj1ZZa4MW2c6Z_vZDt55QUnLaiaikE-d_ApsFEgCA // Count code for a couple: Senders FQ Identifier and signature or signatures

Credential Apply as exn Message

{ "v": "KERI10JSON00011c_", // KERI Version String "t": "exn", // peer to peer message ilk "dt": "2020-08-22T17:50:12.988921+00:00" "r": "/credential/apply" "q" { "issuer": "did:keri:EEBp64Aw2rsjdJpAR0e2qCq3jX7q7gLld3LjAwZgaLXU" "input_descriptors": [ "EckOnHB11J4H9q16I3tN8DdpNXnCiP5QJQ7yvkWqTDdA" ], "format": { "cesr": { "proof_type": ["Ed25519Signature2018"] } } } //embedded credential_submission, may contain credential_fullfilment responding to presentation_def above }-AABAA1o61PgMhwhi89FES_vwYeSbbWnVuELV_jv7Yv6f5zNiOLnj1ZZa4MW2c6Z_vZDt55QUnLaiaikE-d_ApsFEgCA // Count code for a couple: Senders FQ Identifier and signature or signatures

Credential Issue as exn Message

{ "v": "KERI10JSON00011c_", // KERI Version String "t": "exn", // peer to peer message ilk "dt": "2020-08-22T17:50:12.988921+00:00" "r": "/credential/issue" "q" { "vc" [ { "v": "KERI10JSON00011c_", //KERI Version String "i": "EeyJ0eXBlIjogWyJWZXJpZmlhYmxlQ3JlZGVudGlhbCI", // Identifier prefix of the VC "ri":"Es34H0HfRYPXLyFASh0VxCem2cls0yrx8mwRBJLHtOKQ" // Iss/Rev Registry identifier "t": "vc" "vc": { "type": [ "VerifiableCredential", "vLEIGLEIFCredential" ], "id": "did:keri:EeyJ0eXBlIjogWyJWZXJpZmlhYmxlQ3JlZGVudGlhbCI", "issuer": "did:keri:EchZLZUFqtBGRWMh3Ur_iKucjsrFcxU7AjfCPko9CkEA", //Identifier prefix of the issuer "issuanceDate": "2021-06-09T17:35:54.169967+00:00", "credentialSubject": { "id": "did:keri:did:keri:Efaavv0oadfghasdfn443fhbyyr4v", "lei": "254900OPPU84GM83MG36" }, "credentialSchema": { "id": "" "type": "" }, "credentialStatus": { "id": "", "type": "" } } // embedded verifiable credential }-AABAA1o61PgMhwhi89FES_vwYeSbbWnVuELV_jv7Yv6f5zNiOLnj1ZZa4MW2c6Z_vZDt55QUnLaiaikE-d_ApsFEgCA-GAB0AAAAAAAAAAAAAAAAAAAAABQEchZLZUFqtBGRWMh3Ur_iKucjsrFcxU7AjfCPko9CkEA ] //list of verifiable credentials } //embedded array of credentials }-AABAA1o61PgMhwhi89FES_vwYeSbbWnVuELV_jv7Yv6f5zNiOLnj1ZZa4MW2c6Z_vZDt55QUnLaiaikE-d_ApsFEgCA // Count code for a couple: Senders FQ Identifier and signature or signatures

JSON Schema for VC Template

{ "$id":"EckOnHB11J4H9q16I3tN8DdpNXnCiP5QJQ7yvkWqTDdA", "$schema":"http://json-schema.org/draft-07/schema#", "type":"object", "properties":{ "id":{ "type":"string" }, "type":{ "type":"array" }, "issuer":{ "type":"string" }, "issuanceDate":{ "type":"string", "format":"date-time" }, "credentialSubject":{ "type":"object" } } }

JSON Schema for vLEI

{ "$id":"EckOnHB11J4H9q16I3tN8DdpNXnCiP5QJQ7yvkWqTDdA", "$schema":"http://json-schema.org/draft-07/schema#", "type":"object", "properties":{ "id":{ "type":"string" }, "lei":{ "type":"string", "format":"lei" } } }

JSON Schema for Nested vLEI Verifiable Credential

{ "$id":"", "$schema":"http://json-schema.org/draft-07/schema#", "$template: "EckOnHB11J4H9q16I3tN8DdpNXnCiP5QJQ7yvkWqTDdA", "type":"object", "properties":{ "id":{ "type":"string" }, "type":{ "type":"array" }, "issuer":{ "type":"string" }, "issuanceDate":{ "type":"string", "format":"date-time" }, "credentialSubject":{ "type":"object" "ref": "EckOnHB11J4H9q16I3tN8DdpNXnCiP5QJQ7yvkWqTDdA" } } }

Presentation Exchange

Presentation Request as exn Message

{ "v": "KERI10JSON00011c_", // KERI Version String "t": "exn", // peer to peer message ilk "dt": "2020-08-22T17:50:12.988921+00:00" "r": "/presentation/request" "q" { "submission_requirements": [{ "name": "Proof of LEI", "rule": "pick", "count": 1, "from": "A" }] "input_descriptors": [ { "x":"EckOnHB11J4H9q16I3tN8DdpNXnCiP5QJQ7yvkWqTDdA", "group": ["A"], } ], "format": { "cesr": { "proof_type": ["Ed25519Signature2018"] } } } //embedded credential_submission }-AABAA1o61PgMhwhi89FES_vwYeSbbWnVuELV_jv7Yv6f5zNiOLnj1ZZa4MW2c6Z_vZDt55QUnLaiaikE-d_ApsFEgCA // Count code for a couple: Senders FQ Identifier and signature or signatures

Presentation Proof as exn Message

{ "v": "KERI10JSON00011c_", // KERI Version String "t": "exn", // peer to peer message ilk "dt": "2020-08-22T17:50:12.988921+00:00" "r": "/presentation/proof" "q" { "presentation_submission": { "id": "a30e3b91-fb77-4d22-95fa-871689c322e2", "definition_id": "32f54163-7166-48f1-93d8-ff217bdb0653", "descriptor_map": [ { "id": "gleif_vlei", "format": "cesr", "path": "$.verifiableCredential[0]" } ] }, "verifiableCredential": [ { "v": "KERI10JSON00011c_", //KERI Version String "i": "EeyJ0eXBlIjogWyJWZXJpZmlhYmxlQ3JlZGVudGlhbCI", // Identifier prefix of the VC "ri":"Es34H0HfRYPXLyFASh0VxCem2cls0yrx8mwRBJLHtOKQ" // Iss/Rev Registry identifier "t": "vc" "vc": { "type": [ "VerifiableCredential", "vLEIGLEIFCredential" ], "id": "did:keri:EeyJ0eXBlIjogWyJWZXJpZmlhYmxlQ3JlZGVudGlhbCI", "issuer": "did:keri:EchZLZUFqtBGRWMh3Ur_iKucjsrFcxU7AjfCPko9CkEA", //Identifier prefix of the issuer "issuanceDate": "2021-06-09T17:35:54.169967+00:00", "credentialSubject": { "id": "did:keri:did:keri:Efaavv0oadfghasdfn443fhbyyr4v", "lei": "254900OPPU84GM83MG36" } } // embedded verifiable credential }-VA0-FABE4YPqsEOaPNaZxVIbY-Gx2bJgP-c7AH_K7pEE-YfcI9E0AAAAAAAAAAAAAAAAAAAAAAAElHzHwX3V6itsD2Ksg_CNBbUNTBYzLYw-AxDNI7_ZmaI-AABAALK_6pkUjCx76CTE7pNrKlhC84ewgZbs-4ciTvLcxkwUaWX7ukpr55P9RtJhlHxdtz3kN0zfM0HrtFitKuPy3BA') } ] } //embedded verifiable_presentation - DOES HE NEED HIS OWN PROOF??? } //embedded credential_submission, may contain credential_fullfilment responding to presentation_def above }-AABAA1o61PgMhwhi89FES_vwYeSbbWnVuELV_jv7Yv6f5zNiOLnj1ZZa4MW2c6Z_vZDt55QUnLaiaikE-d_ApsFEgCA // Count code for a couple: Senders FQ Identifier and signature or signatures

CESR Proof Format for W3C Verifiable Credentials

Verifiable Credential with CESR Proof Format

json= { "x": "EZllThM1rLBSMZ_ozM1uAnFvSfC0N1jaQ42aKU5sCZ5Q", "d": { "type": [ "did:keri:EZllThM1rLBSMZ_ozM1uAnFvSfC0N1jaQ42aKU5sCZ5Q", // MUST be URI w/ machine readable type (SAID) ], "id": "did:keri:EeyJ0eXBlIjogWyJWZXJpZmlhYmxlQ3JlZGVudGlhbCI", "issuer": "did:keri:EchZLZUFqtBGRWMh3Ur_iKucjsrFcxU7AjfCPko9CkEA", //Identifier prefix of the issuer "issuanceDate": "2021-06-09T17:35:54.169967+00:00", "expirationDate": "2022-06-09T17:35:54.169967+00:00" "credentialSubject": { "id": "did:keri:Efaavv0oadfghasdfn443fhbyyr4v", "lei": "254900OPPU84GM83MG36" }, "credentialStatus": { "id": "did:keri:Es34H0HfRYPXLyFASh0VxCem2cls0yrx8mwRBJLHtOKQ", // Identifier of the TEL Registry "type": "KERICredentialRegistry" } } // embedded verifiable credential }-AABAA1o61PgMhwhi89FES_vwYeSbbWnVuELV_jv7Yv6f5zNiOLnj1ZZa4MW2c6Z_vZDt55QUnLaiaikE-d_ApsFEgCA-GAB0AAAAAAAAAAAAAAAAAAAAABQEchZLZUFqtBGRWMh3Ur_iKucjsrFcxU7AjfCPko9CkEA

Questions: 1. Where does the registry identifier belong... It is part of the Verification method and thus part of the proof, or can we leverage the credentialStatus field as defined in the VC spec? 2. Proof is the Signature and Source Seal triple attachment. This works if the i field is the issuer prefix otherwise we need a full event Seal attachment with the Controller's identifier prefix 3. Issuer is DID located inside the issuer field in the VC and also either the i or the ii 4. Attachment contains pre+sn+dig+ControllerIdxSigs

Verifiable Presentation with CESR Proof Format

Domain and Challege to avoid impersonation and replay attacks

{ "x": "EZllThM1rLBSMZ_ozM1uAnFvSfC0N1jaQ42aKU5sCZ5Q", "d": { "id": "did:keri:EeyJ0eXBlIjogWyJWZXJpZmlhYmxlQ3JlZGVudGlhbCI", "type": ["VerifiablePresentation", "vLEIGLEIFCredential"], "holder": "did:keri:Efaavv0oadfghasdfn443fhbyyr4v" "vc": [ { "x": "EZllThM1rLBSMZ_ozM1uAnFvSfC0N1jaQ42aKU5sCZ5Q", "d": { "type": [ "did:keri:EZllThM1rLBSMZ_ozM1uAnFvSfC0N1jaQ42aKU5sCZ5Q", // MUST be URI w/ machine readable type (SAID) ], "id": "did:keri:EeyJ0eXBlIjogWyJWZXJpZmlhYmxlQ3JlZGVudGlhbCI", "issuer": "did:keri:EchZLZUFqtBGRWMh3Ur_iKucjsrFcxU7AjfCPko9CkEA", //Identifier prefix of the issuer "issuanceDate": "2021-06-09T17:35:54.169967+00:00", "expirationDate": "2022-06-09T17:35:54.169967+00:00" "credentialSubject": { "id": "did:keri:Efaavv0oadfghasdfn443fhbyyr4v", "lei": "254900OPPU84GM83MG36" }, "credentialStatus": { "id": "did:keri:Es34H0HfRYPXLyFASh0VxCem2cls0yrx8mwRBJLHtOKQ", // Identifier of the TEL Registry "type": "KERICredentialRegistry" } } // embedded verifiable credential }-AABAA1o61PgMhwhi89FES_vwYeSbbWnVuELV_jv7Yv6f5zNiOLnj1ZZa4MW2c6Z_vZDt55QUnLaiaikE-d_ApsFEgCA-GAB0AAAAAAAAAAAAAAAAAAAAABQEchZLZUFqtBGRWMh3Ur_iKucjsrFcxU7AjfCPko9CkEA ] } // embedded verifiable presentation }-AABAA1o61PgMhwhi89FES_vwYeSbbWnVuELV_jv7Yv6f5zNiOLnj1ZZa4MW2c6Z_vZDt55QUnLaiaikE-d_ApsFEgCA-GAB0AAAAAAAAAAAAAAAAAAAAABQEchZLZUFqtBGRWMh3Ur_iKucjsrFcxU7AjfCPko9CkEA

weboftrust-keripy-main/29 weboftrust-keripy-main repository prose file Apache-2.0 ref/PythonStyleGuide.md https://github.com/WebOfTrust/keripy/blob/main/ref/PythonStyleGuide.md WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/ref/PythonStyleGuide.md. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 4792

Python Style Guide for keripy

The Python PEPs on style have many options or allowed variants. The purpose of this document is to select a single preferred style in every case. In general this guide follows PEP-8 but specifies styles where PEP-8 is silent and varies from PEP-8 in a couple of places namely camelCase versus underscore_case

Indentation 4 spaces (detab ie no tabs convert tabs to spaces)

Naming conventions:

alllowercase
ALLUPPERCASE
mixedCase lowerCamelCase
CapitalCamelCase UpperCamelCase
lower_case_with_underscores
UPPER_CASE_WITH_UNDERSCORES
Capitalized_With_Underscores
lowercasenounderscores
LeadingUnderscoreUpperCamelCase
leadingUnderscoreLowerCamelCase

Rules:

Python Standard Library methods and attributes are small case with underscores. startswith()

Python builtins are small case no underscores setattr()

Spaces between methods and top level functions: two 2

Spaces between Class Definitions: two 2

DocStrings: Triple double quotes. """ """

```python """If one line doc string then may be all on one line"""

""" If more than one line doc string then linefeed and start even with first string such as this string. Embedded strings use 'single quotes'. """

Format for code documentation in the the Google flavor of sphinx.ext.napolean format. See https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html and https://www.sphinx-doc.org/en/master/usage/extensions/example_google.html#example-google

Napoleon supports two styles of docstrings: Google and NumPy. The main difference between the two styles is that Google uses indentation to separate sections, whereas NumPy uses underlines. ``` Google style:

```python def func(arg1, arg2): """Summary line.

Extended description of function.

Args:
    arg1 (int): Description of arg1
    arg2 (str): Description of arg2

Returns:
    bool: Description of return value

"""
return True

```

Acronyms: When using underscores acronyms should be all uppercase if start uppercase or all lowercase if start lowercase http_send Send_HTTP

When using CapCamelCase or mixedCase the acronyms should be treated as words httpSend sendHttp

Local Variables and function parameters: lowerCamelCase

Any name that conflicts with python reserved word: add trailing underscore: Examples: id_, file_, Bork_

Module Names: all lower case. End name in 'ing' so when doing namespace know that first ref is module not class such as, behaving, clustering, functioning

Package Names: all lower case. Pithy and short but evocative

Class Names: CapCamelCase Examples: Person BigDogs

Exception Classes: CapCamelCase Example: StandardMuxError

Public Class Attributes, Class Methods, Static Methods: CapCamelCase Example: TotalInstances Storage

Private Class Attributes, Class Methods, Static Methods: LeadingUnderscoreUpperCamelCase, methods verbs, sequences plural nouns Example: _TotalInstances _Storage __Entries

Very Private Class Attributes, Class Methods, Static Methods (mangled with class name): leading double underscore CapCamelCase, methods verbs, sequences plural nouns Example: _TotalInstances __Storage __Entries

Public Instance Methods and Attributes: lowerCamelCase, Methods should be verbs, sequences should be plural nouns Examples: getName setStyle, display, first, last, itemCount, entities, books, data

Public Module Level Methods and Attributes: lowerCamelCase, Methods should be verbs, sequences should be plural nouns Examples: getName setStyle, display, first, last, itemCount, entities, books, data

Private Instance and Attributes (not exported with from import *``): leadingUnderscoreLowerCamelCase, Methods should be verbs, sequences plural nouns Examples:_getScore _setInternal _lastName _count _entries`

Private Module Level Methods and Attributes (not exported by from import *): leadingUnderscoreLowerCamelCase Examples:_dirtyBit

Very Private Instance Methods or Attributes (mangled with class name): double leading underscore with lowerCamelCase, methods verbs, sequences plural nouns Examples:__getMyName __displayMoney __creature __secretData __entries

Constants Module Level: UPPER_CASE_WITH_UNDERSCORES not meant to be changed should be numbers or strings Examples: MY_CONSTANT

Dynamic Global Variables (not Constants) Module Level: These are reserved for module level globals that may be changed in multiple places intentionally. Usually this is bad practice so special syntax is used to indicate such practice only when necessary. Capitalized_With_Underscores Examples: Bad_Practice REO_Lat_Lon_NE

weboftrust-keripy-main/294 weboftrust-keripy-main repository prose file Apache-2.0 src/keri/cli/readme.md https://github.com/WebOfTrust/keripy/blob/main/src/keri/cli/readme.md WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/src/keri/cli/readme.md. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 971

KLI

KERI CLI

A set of example commands which can be used to create a naive KERI demo. These commands were created to work for a GLIEF demo, use cases will vary.

Usage:

shell kli incept -n <name>

Create a new prefix with a human friendly identifier. Currently, uses all defaults for generating the prefix, but uses persistent storage at the defualt location. Will support configuration through a -f option.

shell kli rotate -n <name>

Performs a key rotation for the given human friendly identifier.

shell kli info -n <name>

Basic information about the prefix associated with the human friendly identifier.

shell kli purge -n <name> Remove any persisted databases, useful for clean up :)

shell kli sign -n <name> --text <foo> Signs an arbitrary string with the current key for the human friendly identifier.

shell kli issue -n <name> -dsi <id> --lei <GLEIF LEI>

Creates a signed VC, specific to the GLEIF demo.

weboftrust-keripy-main/30 weboftrust-keripy-main repository prose file Apache-2.0 ref/getting_started.md https://github.com/WebOfTrust/keripy/blob/main/ref/getting_started.md WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/ref/getting_started.md. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 21913

Getting Started

This guide is meant to be a brief introduction for how to use keripy. For a comprehensive overview of the protocol please refer to the whitepaper or view other KERI related resources on the KERI website.

Transferability

KERI supports both transferable identifiers and ephemeral(non transferable) identifiers.

Identifier Types

There are several types of identifiers in KERI: * Basic * Self-Addressing * Multi-Sig Self-Addressing * Delegated Self-Addressing

Basic

A basic self-certifying identifier includes a prefix that is composed of a Base-64 (URL safe) derivation code prepended to Base-64 encoding of a public digital signing key.

Inception

Non Transferable

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -------------------------------------------------------------------------- # -----------------------Non Transferable Identifiers----------------------- # --------------------------------------------------------------------------

# ---------------------Basic Non Transferable Identifier--------------------
salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, _, _, _ = mgr.incept(icount=1, ncount=0)

srdr = eventing.incept(keys=[verfers[0].qb64], code=coring.MtrDex.Ed25519)  # code marks this identifier as basic
print(srdr.raw.decode("utf-8"))
print()

```

Transferable

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -------------------------------------------------------------------------- # --------------------------Transferable Identifiers------------------------ # --------------------------------------------------------------------------

# -----------------------Basic Transferable Identifier----------------------
salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, digers, _, _ = mgr.incept(icount=1, ncount=1, transferable=True)

keys = [verfers[0].qb64]

srdr = eventing.incept(keys=keys, ndigs=[digers[0].qb64], code=coring.MtrDex.Ed25519)  # code marks this identifier as basic
print(srdr.raw.decode("utf-8"))
print()

```

Rotation

Non Transferable

In order to rotate, your identifier must be transferable. You cannot change a transferable identifier to a non transferable identifier after an inception event. You can however rotate to a null key(s) effectively abandoning your identifier.

Transferable

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -------------------------------------------------------------------------- # --------------------------Transferable Identifiers------------------------ # --------------------------------------------------------------------------

# -----------------------Basic Transferable Identifier----------------------
salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, digers, _, _ = mgr.incept(icount=1, ncount=1, transferable=True)

keys = [verfers[0].qb64]

srdr = eventing.incept(keys=keys, ndigs=[digers[0].qb64], code=coring.MtrDex.Ed25519)  # code marks this identifier as basic
print(srdr.raw.decode("utf-8"))
print()

# -------------------------------Basic Rotation-----------------------------
verfers, digers, _, _ = mgr.rotate(verfers[0].qb64)  # generate new keys

# create rotation event
identifier = srdr.pre
keys = [verfers[0].qb64]
icpDigest = srdr.saider.qb64
srdr = eventing.rotate(pre=identifier, keys=keys, dig=icpDigest, ndigs=[digers[0].qb64], sn=1)

print(srdr.raw.decode("utf-8"))
print()

```

Self-Addressing

A self addressing identifier allows inception configuration data to be included in the inception statement. The inception statement is cryptographically bound to the identifier by replacing the public key in the identifier prefix with a content digest (hash) of the inception statement and the incepting public key.

Inception

Non Transferable

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -------------------------------------------------------------------------- # -----------------------Non Transferable Identifiers----------------------- # --------------------------------------------------------------------------

# -----------------Self-Addressing Non Transferable Identifier--------------

salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, _, _, _ = mgr.incept(icount=1, ncount=0, transferable=False)  # set a non transferable derivation code

srdr = eventing.incept(keys=[verfers[0].qb64], code=coring.MtrDex.Blake3_256)  # code marks identifier as self-addressing
print(srdr.raw.decode("utf-8"))
print()

# ----------Abandoned Self-Addressing Identifier(Non Transferable)----------
# Has a transferable derivation code, but contains an empty pre-rotation key.  Essentially the identifier has been
# abandoned.  This example is for illustration purposes only you should never need to abandon a self-addressing
# identifier on inception.  Normally this is done with a rotation.
salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, _, _, _ = mgr.incept(icount=1, ncount=0, transferable=True)

srdr = eventing.incept(keys=[verfers[0].qb64], code=coring.MtrDex.Blake3_256)  # empty nxt i.e. abandoned
print(srdr.raw.decode("utf-8"))
print()

```

Transferable

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -------------------------------------------------------------------------- # --------------------------Transferable Identifiers------------------------ # --------------------------------------------------------------------------

# ------------------Self-Addressing Transferable Identifier-----------------
salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, digers, _, _ = mgr.incept(icount=1, ncount=1, transferable=True)

keys = [verfers[0].qb64]

srdr = eventing.incept(keys=keys, ndigs=[digers[0].qb64], code=coring.MtrDex.Blake3_256)  # code marks identifier as self-addressing
print(srdr.raw.decode("utf-8"))
print()

```

Rotation

Non Transferable

In order to rotate, your identifier must be transferable. You cannot change a transferable identifier to a non transferable identifier after an inception event. You can however rotate to a null key(s) effectively abandoning your identifier.

Transferable

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -------------------------------------------------------------------------- # --------------------------Transferable Identifiers------------------------ # --------------------------------------------------------------------------

# ------------------Self-Addressing Transferable Identifier-----------------
salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, digers, _, _ = mgr.incept(icount=1, ncount=1, transferable=True)

keys = [verfers[0].qb64]

srdr = eventing.incept(keys=keys, ndigs=[digers[0].qb64],
                       code=coring.MtrDex.Blake3_256)  # code marks identifier as self-addressing
print(srdr.raw.decode("utf-8"))
print()

# --------------------------Self-Addressing Rotation------------------------
verfers, digers, _, _ = mgr.rotate(verfers[0].qb64)  # generate new keys

# create rotation event
identifier = srdr.pre
keys = [verfers[0].qb64]
icpDigest = srdr.saider.qb64
srdr = eventing.rotate(pre=identifier, keys=keys, dig=icpDigest, ndigs=[digers[0].qb64], sn=1)

print(srdr.raw.decode("utf-8"))
print()

```

Multi-Sig Basic

This type is not supported by KERI

Multi-Sig Self-Addressing

Inception

Non Transferable

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -------------------------------------------------------------------------- # -----------------------Non Transferable Identifiers----------------------- # --------------------------------------------------------------------------

# ------------Self-Addressing Non Transferable Multisig Identifier----------
salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, _, _, _ = mgr.incept(icount=3, ncount=0, transferable=False)

srdr = eventing.incept(keys=[verfer.qb64 for verfer in verfers], code=coring.MtrDex.Blake3_256)  # code marks identifier as self-addressing
print(srdr.raw.decode("utf-8"))
print()

```

Transferable

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -------------------------------------------------------------------------- # --------------------------Transferable Identifiers------------------------ # --------------------------------------------------------------------------

# --------------Self-Addressing Transferable Multisig Identifier------------
salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, digers, _, _ = mgr.incept(icount=3, ncount=3, transferable=True)

keys = [verfer.qb64 for verfer in verfers]

srdr = eventing.incept(keys=keys, ndigs=[diger.qb64 for diger in digers], code=coring.MtrDex.Blake3_256)  # code marks identifier as self-addressing
print(srdr.raw.decode("utf-8"))
print()

```

Rotation

Non Transferable

In order to rotate, your identifier must be transferable. You cannot change a transferable identifier to a non transferable identifier after an inception event. You can however rotate to a null key(s) effectively abandoning your identifier.

Transferable

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -------------------------------------------------------------------------- # --------------------------Transferable Identifiers------------------------ # --------------------------------------------------------------------------

# --------------Self-Addressing Transferable Multisig Identifier------------
# ---------Self-Addressing Transferable Multisig Identifier Rotation--------
salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, digers, _, _ = mgr.incept(icount=3, ncount=3, transferable=True)

keys = [verfer.qb64 for verfer in verfers]

srdr = eventing.incept(keys=keys, ndigs=[diger.qb64 for diger in digers],
                       code=coring.MtrDex.Blake3_256)  # code marks identifier as self-addressing
print(srdr.raw.decode("utf-8"))
print()

# ---------Self-Addressing Transferable Multisig Identifier Rotation--------
verfers, digers, _, _ = mgr.rotate(verfers[0].qb64, count=3)  # generate 3 new keys

# create rotation event
identifier = srdr.pre
keys = [verfer.qb64 for verfer in verfers]
icpDigest = srdr.saider.qb64
srdr = eventing.rotate(pre=identifier, keys=keys, dig=icpDigest, ndigs=[digers[0].qb64], sn=1)

print(srdr.raw.decode("utf-8"))
print()

```

Delegated Basic

This type is not supported by KERI

Delegated Self-Addressing

Inception

Non Transferable
Transferable

Rotation

Non Transferable

In order to rotate, your identifier must be transferable. You cannot change a transferable identifier to a non transferable identifier after an inception event. You can however rotate to a null key(s) effectively abandoning your identifier.

Transferable

Message Types

There are currently two types of messages the KERI protocol uses Events and Receipts.

Events

Events contain information about a controllers identifier and it's current or past key state. See KID0003 for explanations of the different keys meanings. There are several types of event messages including:

  • inception json { "v":"KERI10JSON0000e6_", "i":"EsU9ZQwug7DS-GU040Ugj1t7p6Au14VkBOCJnPYabcas", "s":"0", "t":"icp", "kt":"1", "k":[ "Dpt7mGZ3y5UmhT1NLExb1IW8vMJ8ylQW3K44LfkTgAqE" ], "n":"Erpltchg7BUv21Qz3ZXhOhVu63m7S7YbPb21lSeGYd90", "wt":"0", "w":[], "c":[] }
  • rotation json { "v":"KERI10JSON000122_", "i":"EsU9ZQwug7DS-GU040Ugj1t7p6Au14VkBOCJnPYabcas", "s":"1", "t":"rot", "p":"Ey2pXEnaoQVwxA4jB6k0QH5G2Us-0juFL5hOAHAwIEkc", "kt":"1", "k":[ "D-HwiqmaETxls3vAVSh0xpXYTs94NUJX6juupWj_EgsA" ], "n":"ED6lKZwg-BWl_jlCrjosQkOEhqKD4BJnlqYqWmhqPhaU", "wt":"0", "wr":[], "wa":[], "a":[] }
  • delegated inception ```json

    * delegated rotationjson

    * interactionjson { "v":"KERI10JSON000098_", "i":"EsU9ZQwug7DS-GU040Ugj1t7p6Au14VkBOCJnPYabcas", "s":"2", "t":"ixn", "p":"EO7V6wDClWWiN_7sfGDTD8KsfRQaHyap6fz_O4CYvsek", "a":[] } ```

Receipts

Receipts are used to confirm and or prove that a witness or validator received an event message. The receipt is signed by the validator or witness and can be used to detect duplicity if the witness or validator ever tries to claim it never saw the event. There are two types of receipts: * Witness Receipts ```json

```
  • Validator Receipts json { "v":"KERI10JSON000105_", "i":"EsU9ZQwug7DS-GU040Ugj1t7p6Au14VkBOCJnPYabcas", "s":"2", "t":"vrc", "d":"EuCLxtdKdRgzzgBnPhTwFKz36u58DqQyMqhX5CUrurPE", "a":{ "i":"EBiIFxr_o1b4x1YR21PblAFpFG61qDghqFBDyVSOXYW0", "s":"0", "d":"ElsHFkbZQjRb7xHnuE-wyiarIZ9j-1CEQ89I0E3WevcE" } }

Modes

The KERI protocol has two operational modes, Direct Replay Mode(Direct Mode) and Indirect Replay Mode(Indirect Mode). This guide will dive into both modes.

Direct Mode

Direct mode is used to communicate directly with another entity without reliance on supporting infrastructure like witness and validators

Indirect Mode

Indirect mode needs supporting infrastructure like witness and validators to function securely. This mode supports all of the options shown under the direct mode heading as well as a few additional options.

Event Life Cycle

Creating An Inception Event Message

Creating an event message involves appending count code prefixes and signatures to an event object. There is a function that will handle all this for you called messagize(). ```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -----------------------Basic Transferable Identifier---------------------- salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, digers, _, _ = mgr.incept(icount=1, ncount=1)

keys = [verfers[0].qb64]
srdr = eventing.incept(keys=keys, ndigs=[digers[0].qb64], code=coring.MtrDex.Ed25519)
sigers = mgr.sign(ser=srdr.raw, verfers=verfers)

# Create the message
msg = eventing.messagize(srdr, sigers=sigers)
print(msg)
print()

```

Signing An Inception Event

In order for an event to be valid it must be signed. The Manager object can be used to sign an event. This will create signatures, but they are not yet attached to the event. See the section below for how to attach them to the event by creating an event message.

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -----------------------Basic Transferable Identifier---------------------- salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, digers, _, _ = mgr.incept(icount=1, ncount=1)

keys = [verfers[0].qb64]

srdr = eventing.incept(keys=keys, ndigs=[digers[0].qb64], code=coring.MtrDex.Ed25519)

# Create Signatures
sigers = mgr.sign(ser=srdr.raw, verfers=verfers)

```

Verifying An Inception Event Message

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.core.parsing as parsing import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -----------------------Basic Transferable Identifier---------------------- salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, digers, _, _ = mgr.incept(icount=1, ncount=1)

keys = [verfers[0].qb64]

srdr = eventing.incept(keys=keys, ndigs=[digers[0].qb64], code=coring.MtrDex.Ed25519)

sigers = mgr.sign(ser=srdr.raw, verfers=verfers)

# Create the message
msg = eventing.messagize(srdr, sigers=sigers)

# --------------------------------Validation--------------------------------
kevery = eventing.Kevery(db=db)
valid = True
try:
    parsing.Parser().parseOne(ims=msg, kvy=kevery)
except Exception:
    valid = False

print("Valid: {}".format(valid))
print()

```

Rotating Keys

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -----------------------Basic Transferable Identifier---------------------- salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, digers, _, _ = mgr.incept(icount=1, ncount=1, transferable=True)

keys = [verfers[0].qb64]

srdr = eventing.incept(keys=keys, ndigs=[digers[0].qb64], code=coring.MtrDex.Ed25519)  # code marks this identifier as basic

print(srdr.raw.decode("utf-8"))
print()

# -------------------------------Basic Rotation-----------------------------
verfers, digers, _, _ = mgr.rotate(verfers[0].qb64)  # generate new keys

# create rotation event
identifier = srdr.pre
keys = [verfers[0].qb64]
icpDigest = srdr.saider.qb64
srdr = eventing.rotate(pre=identifier, keys=keys, dig=icpDigest, ndigs=[digers[0].qb64], sn=1)  # Create rotation event

print(srdr.raw.decode("utf-8"))
print()

```

Interaction

Abandonment

Abandonment or revocation is a subset of rotation. KERI events always include a pre rotated key. To abandon an identifier a rotation event is created and the pre rotated key is set to an empty string or null.

```python import keri.core.eventing as eventing import keri.core.coring as coring import keri.app.keeping as keeping import keri.db.dbing as dbing

with dbing.openLMDB(name="edy") as db, keeping.openKS(name="edy") as kpr: # -----------------------Basic Transferable Identifier---------------------- salt = coring.Salter().qb64

# Init key pair manager
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, digers, _, _ = mgr.incept(icount=1, ncount=1, transferable=True)

keys = [verfers[0].qb64]

srdr = eventing.incept(keys=keys, ndigs=[digers[0].qb64], code=coring.MtrDex.Ed25519)  # code marks this identifier as basic

print(srdr.raw.decode("utf-8"))
print()

# ------------------------------Basic Abandonment---------------------------
verfers, digers, _, _ = mgr.rotate(verfers[0].qb64,
                                   count=0)  # grab inception next keys but generate no next keys for rotation

# create rotation event
identifier = srdr.pre
keys = [verfers[0].qb64]
icpDigest = srdr.saider.qb64
srdr = eventing.rotate(pre=identifier, keys=keys, dig=icpDigest, sn=1)  # nxt is empty i.e. abandoned

print(srdr.raw.decode("utf-8"))
print()

```

weboftrust-keripy-main/31 weboftrust-keripy-main repository prose file Apache-2.0 ref/naming.md https://github.com/WebOfTrust/keripy/blob/main/ref/naming.md WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/ref/naming.md. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 12075

Coding Conventions: Naming and Style guide

Python Style Guide

The Python PEPs on style have many options or allowed variants. The purpose of this document is to select a single preferred style in every case. In general this guide follows PEP-8 but specifies styles where PEP-8 is silent and varies from PEP-8 in a couple of places namely camelCase versus underscore_case. The latter (camelCase instead of underscore_case) is the most violated PEP-8 convention in the Python standard library. For example the well known logging and unittest packages use camelCase. Therefore, we are in good company. Because camelCase variables are equally readable but also more concise than underscore_case_, that improved conciseness contributes to shorter statement lengths which are themselves more readable. Readability trumps convention.

Indentation

4 spaces (detab ie no tabs convert tabs to spaces)

Naming Convention Labels:

These are used in the rules below.

alllowercase
ALLUPPERCASE
lowerCamelCase
UpperCamelCase
lower_case_with_underscores
UPPER_CASE_WITH_UNDERSCORES
Capitalized_With_Underscores
_LeadingUnderscoreUpperCamelCase
_leadingUnderscoreLowerCamelCase
__LeadingDoubleUnderscoreUpperCamelCase
__leadingDoubleUnderscoreLowerCamelCase

Rules

Python Standard Library methods and attributes

alllowercase startswith() In some cases may be lower_case_with_underscores

Python builtins

alllowercase no underscores setattr()

Vertical Spacing

Spaces between methods and top level functions: two 2

Spaces between Class Definitions: two 2

DocStrings

Triple double quotes. """ """

```python """If one line doc string then may be all on one line"""

"""If more than one line doc string then first line starts after triple quotes. Following lines outdent. Embedded strings use 'single quotes'. """

Format for code documentation in the the Google flavor of sphinx.ext.napolean format. See https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html and https://www.sphinx-doc.org/en/master/usage/extensions/example_google.html#example-google

The Google style uses indentation to separate sections. ``` Google style:

```python def func(arg1, arg2): """Summary line.

Extended description of function.

Args:
    arg1 (int): Description of arg1
    arg2 (str): Description of arg2

Returns:
    bool: Description of return value

"""
return True

```

Acronyms

When using underscores acronyms should be all uppercase if start uppercase, or all lowercase if start lowercase. http_send Send_HTTP

When using CapCamelCase or mixedCase the acronyms should be treated as words unless the acronym is the last word and then it may be either treated as a word or be in all UPPERCASE httpSend sendHttp sendHTTP

Local Variables and function parameters:

lowerCamelCase.

Any name that conflicts with python reserved word

add trailing underscore: Examples: id_, file_

Package Names:

alllowercase. Pithy and short but evocative.

Module Names

alllowercase. End name in 'ing' so can distinquish package and module references when namespacing. First ref is module not package variable such as: core.behaving, core.clustering

Public Module Level Class Instances Singletons

UpperCamelCase

Private Module Level Class Instances Singletons

_LeadingUnderscoreUpperCamelCase

Public Module Level Methods and Attributes:

lowerCamelCase. Methods use verbs. Attributes that are sequences use plural nouns. Examples: getName setStyle, display, first, last, itemCount, entities, books, data

Private Module Level Methods and Attributes (not exported by from import *):

_leadingUnderscoreLowerCamelCase. Methods use verbs. Attributes that are sequences use plural nouns. Examples: _dirtyBit

Constants Module Level:

UPPER_CASE_WITH_UNDERSCORES or ALLUPPERCASE Not meant to be changed should be numbers or strings. Examples: MY_CONSTANT, SOMECONSTANT

Dynamic Global Variables (not constants) Module Level:

Capitalized_With_Underscores. These are reserved for module level globals that may be changed in multiple places intentionally. Usually this is bad practice so special syntax is used to indicate such practice only when necessary. Examples: Bad_Practice REO_Lat_Lon_NE

Exception Classes:

UpperCamelCase. Example: StandardMuxError

Class Names:

UpperCamelCase. Examples: Person BigDogs

Public Class Attributes, Class Methods, Static Methods:

UpperCamelCase. Methods use verbs. Attributes that are sequences use plural nouns. Example: TotalInstances, Storage, Store, Redact

Private Class Attributes, Class Methods, Static Methods:

_LeadingUnderscoreUpperCamelCase, Methods use verbs. Attributes that are sequences use plural nouns. Example: _TotalInstances _Storage __Entries

Very Private Class Attributes, Class Methods, Static Methods (mangled with class name):

__LeadingDoubleUnderscoreUpperCamelCase. Methods use verbs. Attributes that are sequences use plural nouns. Example: __TotalInstances __Storage __Entries

Public Instance Methods and Attributes:

lowerCamelCase' Methods use verbs. Attributes that are sequences use plural nouns. Examples: getName setStyle, display, first, last, itemCount, entities, books, data

Private Instance and Attributes (not exported with from import ):

_leadingUnderscoreLowerCamelCase. Methods use verbs. Attributes that are sequences use plural nouns. Examples: _getScore _setInternal _lastName _count _entries

Very Private Instance Methods or Attributes (mangled with class name):

__leadingDoubleUnderscoreLowerCamelCase. Methods use verbs. Attributes that are sequences use plural nouns. Examples:__getMyName __displayMoney __creature __secretData __entries

Readability

The book C Elements of Style by Qualline used a quantitaive approach to measuring readability in code. It measured error rate in reading and understanding code as a function of style conventions. These include horizontal and veritical white space, line length, varible name length, code block demarcation, etc.

Results were that too much indentation and too little indentation both reduce readability. Ideal is 2, 3, or 4 space indentation. We use 4 because it is the python standard and too hard to fight uphill for the slightly more optimal 3.

Verticle white space matters. Code should have paragraphs. Balanced brackets, indendation and blank lines demarcate paragraphs

For example ```c void display(void) { int start;

start = -1;

if(start == -1) return; } ```

is more readable than

c void display(void){ int start; start = -1; if(start == -1) return; }

Line length matters. Which means variable length matters. Simple logic statments that wrap are no longer simple. Context may provide meaning. Scope and class Nesting may provide meaning.

Shorter evocative names are more readable than long descriptive names when composing code because the long names make the statements that use the variables too long to be easily readable.

aviary vs flyingBirdCage

aviary.bird vs flyingBirdCage.bird

hawk.wing.size vs hawkWingSize

Acronyms which are abbreviations that form pronounceable words may be

highly evocative. radar (RAdio Detecting And Ranging), laser (Light Amplification through Stimulated Emission and Radiation) keri (Key Event Reciept Infrastructure)

Evocative Semantic Naming

evocative -adjective tending to evoke: The perfume was evocative of spring.

evoke -verb (used with object), to call up or produce (memories, feelings, etc.): to evoke a memory. to elicit or draw forth: His comment evoked protests from the shocked listener

An evocative semanitic name is a name that calls up the meaning without having to explicity detail the meaning. Its a type of mneumonic that balances semantics with conciseness which balance improves overall readability and understanding.

aviary vs flyingBirdCage

Use English suffix composition rules to create pithy terse more consise names that are sufficiently evocative.

Suffix Mapping

Adjective describing module. What does the module enable one to do.

Verb is the deed or act

Object is actor doer

Place to keep track of or create Objects container or factory

doery actorery doerage actorage

of an Doer is a doery or doage or dodom or dohood

-er -or -eur -ster Agent one who does something brewer (Object Classes)

-ery a place for an actor to act factory brewery (Object Factories)

-ing action of running, wishing (Module Names)

-age state of acting actor to act brewerage

-dom state of doing acting kingdom

-hood state of being childhood

-ship quality of or state of rank of midship

-ize to make itemize

-izer Someone who makes one do itemizer

-ive having nature of active rotative inceptive

-acy -isy -ty quality of linty piracy clerisy

-ion -tion -sion act or state of action itemization

-y -ly like full of happening noisy monthly

patron

patroner

patronist

patronery

patronage

patrondom

patronship

patronacy

patronhood

patronize

patronish

patronive

patronlet

patronly

patrony

Rules for English suffixes

http://www.paulnoll.com/Books/Clear-English/English-suffixes-1.html http://www.prefixsuffix.com/rootchart.php

Suffix Meaning Examples Used

able, ible capable of, worthy agreeable, comfortable, credible

age act of or state of salvage, bondage

acy, isy quality hypocrisy, piracy

al, eal, ial on account of related to, action of judicial, official arrival, refusal

ance, ence act or fact of doing state of violence, dependence allowance, insurance

ant quality of one who defiant, expectant, reliant occupant, accountant

er, or, eur agent, one who author, baker, winner, dictator, chauffeur, worker

ed past jumped, baked

ery a place to practice of condition of nunnery, cannery surgery bravery, drudgery

dom state, condition of wisdom, kingdom, martyrdom

ent having the quality of different, dependent, innocent

en made of, to make woolen, wooden, darken

er degree of comparison harder, newer, older

est highest of comparison cleanest, hardest, softest

ful full of graceful, restful, faithful

-hood noun from noun group state of being boyhood, knighthood, womanhood

ible, ile, il capable of being digestible, responsible, docile, civil

ier, ior one who carrier, warrior

ify to make magnify, beautify, falsify

ic like, made of metallic, toxic, poetic

ing action of running, wishing

ion, sion, tion act or state of being confusion, correction, protection

ism fact of being communism, socialism

ish like childish, sheepish, foolish

ist a person who does artist, geologist

ity, ty state of majesty, chastity, humanity

itis inflammation of appendicitis, tonsillitis

ive having nature of attractive, active

ize to make pasteurize, motorize

less without motionless, careless, childless

let small starlet, eaglet

ly like, in a manner happening heavenly, remarkably, suddenly every absolutely, monthly

ment state or quality act of doing accomplishment, excitement placement, movement

meter device for measuring thermometer, barometer

ness state of blindness, kindness

ology study of geology, zoology, archaeology

ous, ious full of joyous, marvelous, furious

-ship noun from noun quality of state of rank of friendship, leadership lordship

-scope instrument for seeing telescope, microscope

-some like tiresome, lonesome

-tude noun from adjective state of altitude, latitude

-ty quality or state of liberty, majesty

-ward toward southward, forward

-y like, full of, diminutive: noisy, sooty, kitty

-ure noun from verb indicating act or office seizure prefecture

weboftrust-keripy-main/317 weboftrust-keripy-main repository prose file Apache-2.0 src/keri/demo/demo.md https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/demo.md WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/demo.md. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 10627

KERI Direct Mode

When installing KERI with pip3 it installs two demo scripts:

bash /usr/local/bin/keri_bob /usr/local/bin/keri_eve

Running both of these, each in its on shell (terminal) will run a simple demo that exchanging KERI event messages and receipt message or (chits) for transferable identifier prefixes.

The terminal console will print out the messages that are exchanged. "Bob" initiates the exchange once it connects to "Eve"

To exit each script just type in cntl-c in the respective terminal window or set a run time expiration when invoking each script.

For help run the script with -h or --help such as.

``` % keri_bob -h usage: keri_bob [-h] [-V] [-r REMOTE] [-l LOCAL] [-e EXPIRE] [-n NAME]

Runs KERI direct mode demo controller. Example: keri_bob -r 5621 -l 5620 --e 10.0'

optional arguments: -h, --help show this help message and exit -V, --version Prints out version of script runner. -r REMOTE, --remote REMOTE Remote port number the client connects to. Default is 5621. -l LOCAL, --local LOCAL Local port number the server listens on. Default is 5620. -e EXPIRE, --expire EXPIRE Expire time for demo. 0.0 means not expire. Default is 0.0. -n NAME, --name NAME Name of controller. Default is bob.

```

and

``` % keri_eve -h usage: keri_eve [-h] [-V] [-r REMOTE] [-l LOCAL] [-e EXPIRE] [-n NAME]

Runs KERI direct mode demo controller. Example: keri_eve -r 5620 -l 5621 --e 10.0

optional arguments: -h, --help show this help message and exit -V, --version Prints out version of script runner. -r REMOTE, --remote REMOTE Remote port number the client connects to. Default is 5621. -l LOCAL, --local LOCAL Local port number the server listens on. Default is 5620. -e EXPIRE, --expire EXPIRE Expire time for demo. 0.0 means not expire. Default is 0.0. -n NAME, --name NAME Name of controller. Default is eve.

```

To Run from Development Repo Directory

In order to run the demo commands directly from the development repository one must setup the shell PYTHONPATH environment variable to point to the keripy src directory that includes the keri package

.zsh

PYTHONPATH

export PYTHONPATH="..../keripy/src:$PYTHONPATH"

Then to run use shell command

% python3 -m keri.demo.demo_bob

Works. Where demo_bob is in ..../keripy/src/keri/demo/demo_bob.py

So to run bob and eve together. Open two shells one for each and point their TCP ports at each other.

Bob's tcp ports default to remote 5621 local 5620 Eve's tcp ports default to remote 5620 local 5621 Sam's tcp ports default to remote 5621 local 5620

so Bob and Eve or Sam and Eve work without changing ports

To change ports use the command line options -r or --remote -l or --local

Example

Bob's terminal window

```zsh % python3 -m keri.demo.demo_bob Direct Mode demo of bob as EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w on TCP port 5620 to port 5621.

EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w: connected to ('127.0.0.1', 5621).

EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w sent event: b'{"v":"KERI10JSON0000e6_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"icp","kt":"1","k":["DSuhyBcPZEZLK-fcw5tzHn2N46wRCG_ZOoeKtWTOunRA"],"n":"EPYuj8mq_PYYsoBKkzX1kxSPGYBWaIya3slgCOyOtlqU","wt":"0","w":[],"c":[]}-AABAAmDoPp9jDio1hznNDO-3T2KA_FUbY8f_qybT6_FqPAuf89e9AMDXP5wch6jvT4Ev4QRp8HqtTb9t2Y6_KJPYlBw'

EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w received: bytearray(b'{"v":"KERI10JSON0000e6_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"icp","kt":"1","k":["D8KY1sKmgyjAiUDdUBPNPyrSz_ad_Qf9yzhDNZlEKiMc"],"n":"EOWDAJvex5dZzDxeHBANyaIoUG3F4-ic81G6GwtnC4f4","wt":"0","w":[],"c":[]}-AABAAll_W0_FsjUyJnYokSNPqq7xdwIBs0ebq2eUez6RKNB-UG_y6fD0e6fb_nANvmNCWjsoFjWv3XP3ApXUabMgyBA{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"vrc","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb6S-RXeAqUKl8UuNwYpiaFARhMj-95elxmr7uNU8m7buVSPVLbTWcQYfI_04HoP_A_fvlU_b099fiEJyDSA2Cg')

EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w sent cue: {'pre': 'EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg', 'serder': <keri.core.coring.Serder object at 0x10b3d4a90>}

EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w sent chit: b'{"v":"KERI10JSON000105_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"vrc","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo","a":{"i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o"}}-AABAAZqxNTt_LDZnmwEIaJX0cK9VKkCGq1UieEx6881MKKOtlRirvs_4pzFgmw3aRwAaIM2XV0biQ7xHeOoXglluDCA'

EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w sent event: b'{"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"rot","p":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","kt":"1","k":["DVcuJOOJF1IE8svqEtrSuyQjGTd2HhfAkt9y2QkUtFJI"],"n":"E-dapdcC6XR1KWmWDsNl4J_OxcGxNZw1Xd95JH5a34fI","wt":"0","wr":[],"wa":[],"a":[]}-AABAAEuHTj2jo-QgGg1FP0tq_q2MjCeJnzYoJY1Iw2h4ov3J4ki82aHDWxYhxMiXX-E8b0vRDfr3-EB11ofd_zx3cBQ'

EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w received: bytearray(b'{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"vrc","d":"Enrq74_Q11S2vHx1gpK_46Ik5Q7Yy9K1zZ5BavqGDKnk","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb1BJLLTkcTlefF1DOPKiOixLgQqnqxRsqEqGaaADLNwQ-uDeb2nNTQBB6SeclaihimPg9QwLnulUbdgYxI5ADg')

EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w sent event: b'{"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"ixn","p":"Enrq74_Q11S2vHx1gpK_46Ik5Q7Yy9K1zZ5BavqGDKnk","a":[]}-AABAARxj7iqT5m3wQIPOfCPFkeGEw1j5QY-lXbRGaRSVxzW9SZIX-mXJfIjs7m6MlaYFEIJs3fiCWCj9JdUz0BHlRDA'

EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w received: bytearray(b'{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"vrc","d":"E-5RimdY_OWoreR-Z-Q5G81-I4tjASJCaP_MqkBbtM2w","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA71XY3Y7gt3FQ3RkRDN2JN5wsKVFSqxc55yBl3PecKEpSSn_tjjtKxhvZZgWtvUxHiaSt94h8huBZ0jVdWeM6DA')

```

Eve's terminal window

```zsh % python3 -m keri.demo.demo_bob Direct Mode demo of bob as EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w on TCP port 5620 to port 5621.

% python3 -m keri.demo.demo_eve Direct Mode demo of eve as EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg on TCP port 5621 to port 5620.

EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg: connected to ('127.0.0.1', 5620).

EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg received: bytearray(b'{"v":"KERI10JSON0000e6_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"icp","kt":"1","k":["DSuhyBcPZEZLK-fcw5tzHn2N46wRCG_ZOoeKtWTOunRA"],"n":"EPYuj8mq_PYYsoBKkzX1kxSPGYBWaIya3slgCOyOtlqU","wt":"0","w":[],"c":[]}-AABAAmDoPp9jDio1hznNDO-3T2KA_FUbY8f_qybT6_FqPAuf89e9AMDXP5wch6jvT4Ev4QRp8HqtTb9t2Y6_KJPYlBw')

EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg sent cue: {'pre': 'EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w', 'serder': <keri.core.coring.Serder object at 0x10717c790>}

EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg sent event: b'{"v":"KERI10JSON0000e6_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"icp","kt":"1","k":["D8KY1sKmgyjAiUDdUBPNPyrSz_ad_Qf9yzhDNZlEKiMc"],"n":"EOWDAJvex5dZzDxeHBANyaIoUG3F4-ic81G6GwtnC4f4","wt":"0","w":[],"c":[]}-AABAAll_W0_FsjUyJnYokSNPqq7xdwIBs0ebq2eUez6RKNB-UG_y6fD0e6fb_nANvmNCWjsoFjWv3XP3ApXUabMgyBA'

EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg sent chit: b'{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"vrc","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb6S-RXeAqUKl8UuNwYpiaFARhMj-95elxmr7uNU8m7buVSPVLbTWcQYfI_04HoP_A_fvlU_b099fiEJyDSA2Cg'

EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg received: bytearray(b'{"v":"KERI10JSON000105_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"vrc","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo","a":{"i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o"}}-AABAAZqxNTt_LDZnmwEIaJX0cK9VKkCGq1UieEx6881MKKOtlRirvs_4pzFgmw3aRwAaIM2XV0biQ7xHeOoXglluDCA')

EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg received: bytearray(b'{"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"rot","p":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","kt":"1","k":["DVcuJOOJF1IE8svqEtrSuyQjGTd2HhfAkt9y2QkUtFJI"],"n":"E-dapdcC6XR1KWmWDsNl4J_OxcGxNZw1Xd95JH5a34fI","wt":"0","wr":[],"wa":[],"a":[]}-AABAAEuHTj2jo-QgGg1FP0tq_q2MjCeJnzYoJY1Iw2h4ov3J4ki82aHDWxYhxMiXX-E8b0vRDfr3-EB11ofd_zx3cBQ')

EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg sent cue: {'pre': 'EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w', 'serder': <keri.core.coring.Serder object at 0x10717c880>}

EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg sent chit: b'{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"vrc","d":"Enrq74_Q11S2vHx1gpK_46Ik5Q7Yy9K1zZ5BavqGDKnk","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb1BJLLTkcTlefF1DOPKiOixLgQqnqxRsqEqGaaADLNwQ-uDeb2nNTQBB6SeclaihimPg9QwLnulUbdgYxI5ADg'

EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg received: bytearray(b'{"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"ixn","p":"Enrq74_Q11S2vHx1gpK_46Ik5Q7Yy9K1zZ5BavqGDKnk","a":[]}-AABAARxj7iqT5m3wQIPOfCPFkeGEw1j5QY-lXbRGaRSVxzW9SZIX-mXJfIjs7m6MlaYFEIJs3fiCWCj9JdUz0BHlRDA')

EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg sent cue: {'pre': 'EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w', 'serder': <keri.core.coring.Serder object at 0x10717c790>}

EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg sent chit: b'{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"vrc","d":"E-5RimdY_OWoreR-Z-Q5G81-I4tjASJCaP_MqkBbtM2w","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA71XY3Y7gt3FQ3RkRDN2JN5wsKVFSqxc55yBl3PecKEpSSn_tjjtKxhvZZgWtvUxHiaSt94h8huBZ0jVdWeM6DA'

```

weboftrust-keripy-main/32 weboftrust-keripy-main repository prose file Apache-2.0 ref/tel.md https://github.com/WebOfTrust/keripy/blob/main/ref/tel.md WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/ref/tel.md. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 17975

Transaction Event Logs / Public VC Registry

Introduction

The Transaction Event Log (TEL) is a hash linked data structure of transactions that can be used to track state. A Public Verifiable Credential Registry can be represented in several TELs to establish issuance or revocation state of a Verifiable Credential (VC). The KEL is used to establish control authority over the keys used to commit to the events of the TEL and sign the VC. The events of the TEL are used to establish the issuance or revocation state of the VCs issued by the controller of the identifier represented by the KEL. This document specifies a design for public VCs only. The use of a hash digest of the VC contents as the identifier of that VC or an attribute in a TEL event allows for correlation of uses of the VC.

Transaction Event Log

A KERI KEL can control a TEL by anchoring the TEL to key events of the KEL with the following:

  1. Create the inception event for the TEL with the TEL specific unique identifier.
  2. Generate a hash digest of the serialized content of the TEL inception event.
  3. Attach anchoring seals from the KEL events to the TEL events they are authorizing.
  4. Sign the KEL event as usual to commit to the digest of the serialized TEL event.

Any validator can cryptographically verify the authoritative state by validating the signatures of the referenced KEL. The TEL events do not have to be signed as the commitment to the event is in the form of the digest in the seal in the anchoring KEL event and the signatures on that event. Like KEL events, all TEL events have the fields i, s, and t. However, the s or sequence number field in TEL events represents the "clock" for that transaction set. Each transaction set can have its own "clock" (e.g. bitcoin block height, wall clock, etc) and is independent of the sequence number of the KEL events. In the case of the Verifiable Credential Registry, the s field is simply a monotonically increasing integer.

The events are anchored back to the KEL using Event Source Seals whose JSON representation is as follows.

{ "s": "3", "d": "ELvaU6Z-i0d8JJR2nmwyYAZAoTNZH3UfSVPzhzS6b5CM" }

For TEL events, this seal back to the KEL will be delivered as an attachment of event source seal triples in duple of (s, d).

-GAB 0AAAAAAAAAAAAAAAAAAAAAAw ELvaU6Z-i0d8JJR2nmwyYAZAoTNZH3UfSVPzhzS6b5CM

Event source seal attachment example (line feeds added for readability)

Verifiable Credential Registry

A Public Verifiable Credential Registry (Registry) is a form of a Verifiable Data Registry that tracks the issuance/revocation state of credentials issued by the controller of the KEL. Two types of TELs will be used for this purpose. The first type of TEL is the management TEL and will signal the creation of the Registry and track the list of Registrars that will act as Backers for the individual TELs for each VC. The second type of TEL is the VC TEL which will track the issued or revoked state of each VC and will contain a reference to it's corresponding management TEL.

The following events will be used to create and maintain the TELs for the Registry.

|Ilk|TEL|Name|Description| |---|---|---|---| |vcp| Management |Registry Inception Event | Inception statement for the Registry | |vrt| Management |Registry Rotation Event | Rotation event for updating Backers | |iss| VC | Simple Credential Issuance Event | Issue credential with no Backers | |rev| VC | Simple Credential Revocation Event | Revoke previously issued credential with no Backers | |bis| VC | Credential Issuance Event | Issue credential | |brv| VC | Credential Revocation Event | Revoke previously issued credential | |iis| VC | Simple Credential Issuance Event with VC Hash| Issue credential with no Backers, VC Hash as separate field | |irv| VC | Simple Credential Revocation Event with VC Hash| Revoke previously issued credential with no Backers, VC Hash as separate field | |ibs| VC | Credential Issuance Event with VC Hash | Issue credential, VC Hash as separate field | |ibr| VC | Credential Revocation Event with VC Hash | Revoke previously issued credential, VC Hash as separate field |

Management TEL

The state tracked by the Management TEL will be the list of Registrar identifiers that serve as backers for each TEL under its provenance. This list of Registrars can be rotated with events specific to this type of TEL. In this way, Registrar lists are analogous to Backer lists in KERI KELs. Additional metadata can be tracked in this TEL, for example references to Schema. The Management TEL will have two events: vcp for Registry inception and vrt for rotation of the list or Registrars. The events will reference the controlling identifier in the ii field and be anchored to the KEL with an event seal triple attachment.

The Registry specific identifier will be self-addressing (see below for definition) using its inception data for its derivation. This requires a commitment to the anchor in the controlling KEL and necessitates the event location seal be included in the event. The derived identifier is then set in the i field of the events in the management TEL.

Though it is possible for a given identifier KEL to issue multiple types of credentials, it is anticipated that there will be relatively few (usually one) Management TELs anchored to a given KEL. A more scalable approach to issuing multiple credential types from a single identifier would be to use delegated identifiers for the different types of credentials to be issued.

|Label|Description|Notes| |---|---|---| |v| version string | | |d| said of event | | |i| namespaced identifier of Registry | | |s| sequence number of event | | |t| message type of event | | |p| prior event digest | | |c| list of Configuration Traits/Modes | allows for config of no backer registry | |a| digest seal of attachment meta-data for registry | |ii| issuer identifier | | |vi| hash digest of VC contents | | |b| list of backer identifiers for credentials associated with this registry | | |bt| backer threshold | | |ba| list of backers to add (ordered backer set) | | |br| list of backers to remove (ordered backer set) | | |n| nonce to provide uniqueness if more than one registry identifier exists for a given issuer | |

Configuration

The simplest (and most common) case for Registries relies on the witnesses of the controlling KEL and their receipts of the KEL events instead of Registry specific backers. To accommodate this case, the c element is added to the management TEL inception event with the configuration option NB to specify that the Registry will never have backers configured in the management TEL. In this case, there will only be one event in the management TEL for this Registry and the simple events iss and rev will be used for "simple issue" and "simple revoke" respectively in the VC specific TELs. For these events, the ri field will be the simple identifier referencing the management TEL.

|Option|Description|Notes| |---|---|---| |NB| No Backers | No registry specific backers will be configured for this Registry |

Registry Inception Event

json { "v" : "KERI10JSON00016d_", "d" : "EOMBBz0AKgL1-n9OK5DAIQLM6Z1FHE35YGFUuveYiM1A", "i" : "ELh3eYC2W_Su1izlvm0xxw01n3XK8bdV2Zb09IqlXB7A", "ii": "EJJR2nmwyYAfSVPzhzS6b5CMZAoTNZH3ULvaU6Z-i0d8", "s" : "0", "t" : "vcp", "b" : ["BbIg_3-11d3PYxSInLN-Q9_T2axD6kkXd3XRgbGZTm6s"], "c" : [], "a" : { "d": "EEBp64Aw2rsjdJpAR0e2qCq3jX7q7gLld3LjAwZgaLXU" }, "n" : "AAd7Zfk6072acq_37bw29qiHOkG3-vErjQGdtjPRmVE_" }-GAB0AAAAAAAAAAAAAAAAAAAAABwEOWdT7a7fZwRz0jiZ0DJxZEM3vsNbLDPEUk-ODnif3O0

Registry inception event for establishing the list of Backers

json { "v" : "KERI10JSON00010a_", "d" : "EJwVS89RBfBNhX6PpAmpsssMSZDMW68FaYmEOSw8EFP6", "i" : "ELh3eYC2W_Su1izlvm0xxw01n3XK8bdV2Zb09IqlXB7A", "ii": "EJJR2nmwyYAfSVPzhzS6b5CMZAoTNZH3ULvaU6Z-i0d8", "s" : "0", "t" : "vcp", "b" : [], "c" : ["NB"], "n" : "AAd7Zfk6072acq_37bw29qiHOkG3-vErjQGdtjPRmVE_" }-GAB0AAAAAAAAAAAAAAAAAAAAABwEOWdT7a7fZwRz0jiZ0DJxZEM3vsNbLDPEUk-ODnif3O0

Registry inception event for "backer-less" configuration

Registry Rotation Event

json { "v" : "KERI10JSON000130_", "d" : "EL0dsWLeW88h1yruLnEC5_7TT4jIKRiCZjssVRWAQRTz", "i" : "ELh3eYC2W_Su1izlvm0xxw01n3XK8bdV2Zb09IqlXB7A", "p" : "EY2L3ycqK9645aEeQKP941xojSiuiHsw4Y6yTW-PmsBg", "s" : "1", "t" : "vrt", "ba" : ["BXhpfP_H41hw8f-LluTidLfXxmC4EPwaENHI6CuruE6g"], "br" : ["BbIg_3-11d3PYxSInLN-Q9_T2axD6kkXd3XRgbGZTm6s"] }-GAB0AAAAAAAAAAAAAAAAAAAAACQEOWdT7a7fZwRz0jiZ0DJxZEM3vsNbLDPEUk-ODnif3O0

Registrar rotation event updates the list of Backers

Verifiable Credential TELs

The binary state (issued or revoked) of each verifiable credential (VC) will be tracked in individual TELs associated with each VC. The state changes will be represented by 4 sets of 2 events: iss for simple VC issuance and rev for simple revocation, bis for the issuance of the VCs with backers and brv for revocation of the VCs with backers and corresponding events iis, irv and ibs, ibr to be used when the identifier of the VC is not the self-addressing identifier of the VC and that identifier must be included is the separate vi field in the event. The events will be anchored to the KEL with an event seal triple attachment signified by the grouping counter -e##.

Self Addressing Identifiers

The advantage of a content addressable identifier is that it is cryptographically bound to the contents. It provides a secure root-of-trust. Any cryptographic commitment to a content addressable identifier is functionally equivalent (given comparable cryptographic strength) to a cryptographic commitment to the content itself.

A self-addressing identifier is a special class content-addressable identifier that is also self-referential. The special class is distinguished by a special derivation method or process to generate the self-addressing identifier. This derivation method is determined by the combination of both a derivation code prefix included in the identifier and the context in which the identifier appears. The reason for a special derivation method is that a naive cryptographic content addressable identifier must not be self-referential, i.e. the identifier must not appear within the contents that it is identifying. This is because the naive cryptographic derivation process of a content addressable identifier is a cryptographic digest of the serialized content. Changing one bit of the serialization content will result in a different digest. A special derivation method or process is required.

Derivation Process

This process is as follows:

  • replace the value of the id field in the content that will hold the self-addressing identifier with a dummy string of the same length as the eventually derived self-addressing identifier
  • compute the digest of the content with the dummy value for the id field
  • prepend the derivation code to the digest and encode appropriately to create the final derived self-addressing identifier replace the dummy value with the self-addressing identifier

As long as any verifier recognizes the derivation method, the 'self-addressing` identifier is a cryptographically secure commitment to the contents in which it is embedded. It is a cryptographically verifiable self-referential content addressable identifier.

Because a self-addressing identifier is both self-referential and cryptographically bound to the contents it identifies, anyone can validate this binding if they follow the binding protocol outlined above.

To elaborate, this approach of deriving self-referential identifiers from the contents they identify, we call self-addressing. It allows a verifier to verify or re-derive the self-referential identifier given the contents it identifies. To clarify, a self-addressing identifier is different from a standard content address or content addressable identifier in that a standard content addressable identifier may not be included inside the contents it addresses. The standard content addressable identifier is computed on the finished immutable contents and therefore is not self-referential.

Self-Addressing Identifiers in a TEL

ii issuer identifier is the controller prefix is self-certifying and may be also self-addressing (but may not be) wrt to its inception event (For GLEIF TELS the issuer identifier must be self-addressing)

ri, i registry identifier is self-addressing wrt the registry inception event i VC identifier is self-addressing wrt to the VC itself

There are two options for including a cryptographic commitment to the VC in the TEL VC events. The identifier of the VC can self-addressing using the same technique KERI uses for self-addressing identifiers. The VC identifier can be created by padding the VC id field and taking a hash digest of the serialized contents of the VC. This form of self-addressing identifier can be used as the i field in the TEL iss, rev, bis and brv events and no other reference to the VC is required. When the identifier of the VC is derived from some other method, the TEL events iis, irv, ibs and ibr are used, and a hash digest of the contents of the VC is placed in the vi field.

The VC identifier can be namespaced using DID syntax. In this case, the VC identifier in the TEL events would be the method specific identifier of the full DID. For informational purposes, the fully qualified DID can be included as an attachment to the TEL events.

The list of backers needed to sign each VC TEL event is maintained by the management TEL. Since that list can change over time with the rot management events listed above, the non-simple VC events (bis, brv) must be anchored to the event in the management TEL at the point when the VC event is published with the ra field. This way, the backer signatures can be indexed into the proper list of backers at the time of issuance or revocation.

Credential Issuance/Revocation TEL

|Label|Description|Notes| |---|---|---| |v| version string | | |d| said of event | | |i| namespaced identifier of VC | | |s| sequence number of event | | |t| message type of event | | |dt| issuer system data/time in iso format | | |p| prior event digest | | |ri| registry identifier from management TEL | | |ra| registry anchor to management TEL | | |n| nonce for uniqueness | |

Simple Credential Issuance Event

json { "v" : "KERI10JSON000120_", "d" : "ECW3ieodNbpJAb-_KG2jJ-cZ_f_C7p0rj7OtckG-14vU", "i" : "Ezpq06UecHwzy-K9FpNoRxCJp2wIGM9u2Edk-PLMZ1H4", "s" : "0", "t" : "iss", "dt": "2021-05-27T19:16:50.750302+00:00", "ri": "ELh3eYC2W_Su1izlvm0xxw01n3XK8bdV2Zb09IqlXB7A", "n" : "AAd7Zfk6072acq_37bw29qiHOkG3-vErjQGdtjPRmVE_" }-GAB0AAAAAAAAAAAAAAAAAAAAAAwELvaU6Z-i0d8JJR2nmwyYAZAoTNZH3UfSVPzhzS6b5CM

Simple Credential Revocation Event

json { "v" : "KERI10JSON000153_", "d" : "EJRlvg9NB7a52AuQUMPBS3iIJqlUmeYpPguHVANkaZv5", "i" : "Ezpq06UecHwzy-K9FpNoRxCJp2wIGM9u2Edk-PLMZ1H4", "s" : "1", "t" : "rev", "dt": "2021-05-27T19:16:50.750302+00:00", "p" : "EY2L3ycqK9645aEeQKP941xojSiuiHsw4Y6yTW-PmsBg", "ri": "ELh3eYC2W_Su1izlvm0xxw01n3XK8bdV2Zb09IqlXB7A", "n" : "AAd7Zfk6072acq_37bw29qiHOkG3-vErjQGdtjPRmVE_" }-GAB0AAAAAAAAAAAAAAAAAAAAABAELvaU6Z-i0d8JJR2nmwyYAZAoTNZH3UfSVPzhzS6b5CM

Credential Issuance Event

json { "v" : "KERI10JSON000161_", "d" : "ELH85H7iZageLI6hUg0eVnvBGepKhnkw4J1PXVrZjsoX", "i" : "Ezpq06UecHwzy-K9FpNoRxCJp2wIGM9u2Edk-PLMZ1H4", "s" : "0", "t" : "bis", "dt": "2021-05-27T19:16:50.750302+00:00", "ra": { "i": "ELh3eYC2W_Su1izlvm0xxw01n3XK8bdV2Zb09IqlXB7A", "s": "2", "d": "Ezpq06UecHwzy-K9FpNoRxCJp2wIGM9u2Edk-PLMZ1H4" }, "n" : "AAd7Zfk6072acq_37bw29qiHOkG3-vErjQGdtjPRmVE_" }-GAB0AAAAAAAAAAAAAAAAAAAAAAwELvaU6Z-i0d8JJR2nmwyYAZAoTNZH3UfSVPzhzS6b5CM

Credential Revocation Event

json { "v" : "KERI10JSON000194_", "d" : "ECx_SICUfbWjKIqexdFMJ2Ic57ytw7xi3csX8PU16gMx", "i" : "Ezpq06UecHwzy-K9FpNoRxCJp2wIGM9u2Edk-PLMZ1H4", "s" : "1", "t" : "brv", "dt": "2021-05-27T19:16:50.750302+00:00", "p" : "EY2L3ycqK9645aEeQKP941xojSiuiHsw4Y6yTW-PmsBg", "ra": { "i": "ELh3eYC2W_Su1izlvm0xxw01n3XK8bdV2Zb09IqlXB7A", "s": "4", "d": "Ezpq06UecHwzy-K9FpNoRxCJp2wIGM9u2Edk-PLMZ1H4" }, "n" : "AAd7Zfk6072acq_37bw29qiHOkG3-vErjQGdtjPRmVE_" }-GAB0AAAAAAAAAAAAAAAAAAAAABAELvaU6Z-i0d8JJR2nmwyYAZAoTNZH3UfSVPzhzS6b5CM

Use Case

The Verifiable Legal Entity Identifier (vLEI) provides a lightweight, easy to understand use case for a Transaction Event Log as a Verifiable Credential Registry. Issuing a VC has been described above. Verification of a VC will start with the presentation of a vLEI VC as proof (all vLEI VCs are public and therefore proof presentation will include the entire vLEI VC). The verifier will extract the DID of the issuer from the VC, and calculate the hash digest of the serialized contents of the VC. By parsing the namespaced identifier of the VC, the verifier will perform the following steps:

  1. Retrieve the key state from the KERI did method (or appropriate DID method tunnel) using the controller identifier embedded in the VC identifier
  2. Retrieve and verify the KEL against the key state of the issuer
  3. Retrieve the management TEL using the Registry identifier embedded in the VC identifier and determine the Registrars to use to retrieve the VC TEL.
  4. Retrieve the VC TEL and calculate the issuance/revocation state of the VC from the events in the TEL.
  5. Using the keys from the KERI event to which the iss event is anchored, verify the signature on the VC.

Security Considerations

  1. To avoid DDoS attack by flooding an Endorser with TEL events that are not associated with any identifiers they are associated with, TEL events need to be placed in escrow until an anchoring KEL event is seen for the TEL identifier.
weboftrust-keripy-main/323 weboftrust-keripy-main repository prose file Apache-2.0 src/keri/demo/vectors/bob.2021-03-08_21-37-25_238349.txt https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/bob.2021-03-08_21-37-25_238349.txt WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/bob.2021-03-08_21-37-25_238349.txt. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 2864

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON0000e6_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"icp","kt":"1","k":["DSuhyBcPZEZLK-fcw5tzHn2N46wRCG_ZOoeKtWTOunRA"],"n":"EPYuj8mq_PYYsoBKkzX1kxSPGYBWaIya3slgCOyOtlqU","wt":"0","w":[],"c":[]}-AABAAmDoPp9jDio1hznNDO-3T2KA_FUbY8f_qybT6_FqPAuf89e9AMDXP5wch6jvT4Ev4QRp8HqtTb9t2Y6_KJPYlBw

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON0000e6_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"icp","kt":"1","k":["D8KY1sKmgyjAiUDdUBPNPyrSz_ad_Qf9yzhDNZlEKiMc"],"n":"EOWDAJvex5dZzDxeHBANyaIoUG3F4-ic81G6GwtnC4f4","wt":"0","w":[],"c":[]}-AABAAll_W0_FsjUyJnYokSNPqq7xdwIBs0ebq2eUez6RKNB-UG_y6fD0e6fb_nANvmNCWjsoFjWv3XP3ApXUabMgyBA{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"vrc","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb6S-RXeAqUKl8UuNwYpiaFARhMj-95elxmr7uNU8m7buVSPVLbTWcQYfI_04HoP_A_fvlU_b099fiEJyDSA2Cg

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"vrc","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo","a":{"i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o"}}-AABAAZqxNTt_LDZnmwEIaJX0cK9VKkCGq1UieEx6881MKKOtlRirvs_4pzFgmw3aRwAaIM2XV0biQ7xHeOoXglluDCA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"rot","p":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","kt":"1","k":["DVcuJOOJF1IE8svqEtrSuyQjGTd2HhfAkt9y2QkUtFJI"],"n":"E-dapdcC6XR1KWmWDsNl4J_OxcGxNZw1Xd95JH5a34fI","wt":"0","wr":[],"wa":[],"a":[]}-AABAAEuHTj2jo-QgGg1FP0tq_q2MjCeJnzYoJY1Iw2h4ov3J4ki82aHDWxYhxMiXX-E8b0vRDfr3-EB11ofd_zx3cBQ

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"vrc","d":"Enrq74_Q11S2vHx1gpK_46Ik5Q7Yy9K1zZ5BavqGDKnk","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb1BJLLTkcTlefF1DOPKiOixLgQqnqxRsqEqGaaADLNwQ-uDeb2nNTQBB6SeclaihimPg9QwLnulUbdgYxI5ADg

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"ixn","p":"Enrq74_Q11S2vHx1gpK_46Ik5Q7Yy9K1zZ5BavqGDKnk","a":[]}-AABAARxj7iqT5m3wQIPOfCPFkeGEw1j5QY-lXbRGaRSVxzW9SZIX-mXJfIjs7m6MlaYFEIJs3fiCWCj9JdUz0BHlRDA

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"vrc","d":"E-5RimdY_OWoreR-Z-Q5G81-I4tjASJCaP_MqkBbtM2w","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA71XY3Y7gt3FQ3RkRDN2JN5wsKVFSqxc55yBl3PecKEpSSn_tjjtKxhvZZgWtvUxHiaSt94h8huBZ0jVdWeM6DA

weboftrust-keripy-main/324 weboftrust-keripy-main repository prose file Apache-2.0 src/keri/demo/vectors/bob.2021-03-08_23-41-35_745844.txt https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/bob.2021-03-08_23-41-35_745844.txt WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/bob.2021-03-08_23-41-35_745844.txt. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 10873

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON0000e6_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"icp","kt":"1","k":["DSuhyBcPZEZLK-fcw5tzHn2N46wRCG_ZOoeKtWTOunRA"],"n":"EPYuj8mq_PYYsoBKkzX1kxSPGYBWaIya3slgCOyOtlqU","wt":"0","w":[],"c":[]}-AABAAmDoPp9jDio1hznNDO-3T2KA_FUbY8f_qybT6_FqPAuf89e9AMDXP5wch6jvT4Ev4QRp8HqtTb9t2Y6_KJPYlBw

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON0000e6_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"icp","kt":"1","k":["D8KY1sKmgyjAiUDdUBPNPyrSz_ad_Qf9yzhDNZlEKiMc"],"n":"EOWDAJvex5dZzDxeHBANyaIoUG3F4-ic81G6GwtnC4f4","wt":"0","w":[],"c":[]}-AABAAll_W0_FsjUyJnYokSNPqq7xdwIBs0ebq2eUez6RKNB-UG_y6fD0e6fb_nANvmNCWjsoFjWv3XP3ApXUabMgyBA{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"vrc","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb6S-RXeAqUKl8UuNwYpiaFARhMj-95elxmr7uNU8m7buVSPVLbTWcQYfI_04HoP_A_fvlU_b099fiEJyDSA2Cg

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"vrc","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo","a":{"i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o"}}-AABAAZqxNTt_LDZnmwEIaJX0cK9VKkCGq1UieEx6881MKKOtlRirvs_4pzFgmw3aRwAaIM2XV0biQ7xHeOoXglluDCA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"rot","p":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","kt":"1","k":["DVcuJOOJF1IE8svqEtrSuyQjGTd2HhfAkt9y2QkUtFJI"],"n":"E-dapdcC6XR1KWmWDsNl4J_OxcGxNZw1Xd95JH5a34fI","wt":"0","wr":[],"wa":[],"a":[]}-AABAAEuHTj2jo-QgGg1FP0tq_q2MjCeJnzYoJY1Iw2h4ov3J4ki82aHDWxYhxMiXX-E8b0vRDfr3-EB11ofd_zx3cBQ

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"vrc","d":"Enrq74_Q11S2vHx1gpK_46Ik5Q7Yy9K1zZ5BavqGDKnk","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb1BJLLTkcTlefF1DOPKiOixLgQqnqxRsqEqGaaADLNwQ-uDeb2nNTQBB6SeclaihimPg9QwLnulUbdgYxI5ADg

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"ixn","p":"Enrq74_Q11S2vHx1gpK_46Ik5Q7Yy9K1zZ5BavqGDKnk","a":[]}-AABAARxj7iqT5m3wQIPOfCPFkeGEw1j5QY-lXbRGaRSVxzW9SZIX-mXJfIjs7m6MlaYFEIJs3fiCWCj9JdUz0BHlRDA

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"vrc","d":"E-5RimdY_OWoreR-Z-Q5G81-I4tjASJCaP_MqkBbtM2w","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA71XY3Y7gt3FQ3RkRDN2JN5wsKVFSqxc55yBl3PecKEpSSn_tjjtKxhvZZgWtvUxHiaSt94h8huBZ0jVdWeM6DA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"d","t":"ixn","p":"E_w7-WcpRpNTbFLdZuSy8c8j5SPu0Np2LgAwO0NjTkXQ","a":[]}-AABAAfD51RkwgfKkXvcGV5e-eipIIZ4NkduelNc1flEAGBeoRRmsTWpGu5TFUY5cx1ZUmHGTtpR5Ijf-jK7mpwkOOCg

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"c","t":"rot","p":"Eqdk_Re0pxg0rEpUjhqaYGJBTwaPizWcNmXuj0McvRFM","kt":"1","k":["DGxCoXZfVg1DT9ra-Yl-AFcFxA5US5Al60mWBwJYBPz4"],"n":"ECGzdg6m_nWOnYVlQ1DTW50CHxrCm6IDnv7B7s1vrYTU","wt":"0","wr":[],"wa":[],"a":[]}-AABAAt8XcxIQYlyDaK0dOp-AM_6DTZbN0dXUQmHtGHnBbv5YYwMy8HswBEUBzvIjdtecTxwnyLUO5Eb_3uxDQ-Df7BQ

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"b","t":"rot","p":"E6y8QppzP0weX5yUx3qVCZPRG_cjpJ1jTzG-eBOsStTU","kt":"1","k":["DOedRyfIQe4Z-GNSlbgA8txIKyx4Li2tJ1S0Yhy7l2T8"],"n":"EuiVoq5iFTwRutHDNJHbIY43bBj3EKmk7_lmZJdPj-PU","wt":"0","wr":[],"wa":[],"a":[]}-AABAAFr141W-UprcyRaGN_fYootD2E7AGyg1TuzFqH1OBqMbyHFTIgxZEcGaB9eWnSj4xAXfZbqD28BKde02yb8LIAw

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"a","t":"rot","p":"EgabA7nkQwbawSw55s16SKwQcZnjERuEvFy17Zah0q7E","kt":"1","k":["DT1nEDepd6CSAMCE7NY_jlLdG6_mKUlKS_mW-2HJY1hg"],"n":"EZt3rYIvWZ3WuVankOuW34wSifHNx9tUjdaUImARVCyU","wt":"0","wr":[],"wa":[],"a":[]}-AABAAMy2xuiSbkOA2zgVAkVllgiEuBdKyPfYLY2aZw3__AhZItqy1Y2LHFB67llBzyHAFh1NqzgxEpwi0DLLLUXTUAw

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"9","t":"ixn","p":"EApt0lau2pQs4s_4rD7bogUqN_vR2PkP5IFuDXwhwHBY","a":[]}-AABAAI9DC3NryxfCFAZdeC2fcyYSqMUSXBZz-7nZC852B0bMXIunbGBoFLiYoamWk_vL5ppEbxqQcqSvDo4N_3PF9BA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"8","t":"rot","p":"Efa5Lqk0n2lvPyV-niwqlyFfYt8HHjSXixeyWzK1Fi0s","kt":"1","k":["DVjWcaNX2gCkHOjk6rkmqPBCxkRCqwIJ-3OjdYmMwxf4"],"n":"EpusdZwamtwTwqtwOenXWKQ0FpX9yWnq0XHlOEgQmss0","wt":"0","wr":[],"wa":[],"a":[]}-AABAAnrnmQKM3VT3KgCNi0JHL5EA5ZV6S9WbkovZbNYFTcMVOFGh9kP6uTqv9VVyKBfgBBeYUS6PXIi6cd5qELf4VAA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"7","t":"rot","p":"E6kv-VRuz-yJv0G3dQqlPDiJfgnChDa-7l3JLOJO08x8","kt":"1","k":["D4JDgo3WNSUpt-NG14Ni31_GCmrU0r38yo7kgDuyGkQM"],"n":"EvbWtNrsw7dfaWRiDMXcF6P90KM1gdfPhg7FWTIwD39c","wt":"0","wr":[],"wa":[],"a":[]}-AABAAWXNb8yIqu5CdRCdwapjY-pIixcwwPLJgUrMqnTBLbmWMFbbrn1bUIVSfFEtYbdJu3wd4D3TwK5TxBvQzmAuKDg

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"6","t":"ixn","p":"EfFPor2LFpwbaw6wQD12BTXFBgGEZ2SEMjX5q8hPQsaI","a":[]}-AABAAPtUj4bxqdQFs5kIFKbBV_3u0r97x-nIMEHQviOP6AcfkYjl4c_7C0HyW2yQhXfST8-T-DLgYW5Qob0ExYc3gBA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"5","t":"rot","p":"Ec9PD_3Fx7nfdjPTFBiFHs1rDsn_FFC-cJlyZXyy9Qd0","kt":"1","k":["D1kcBE7h0ImWW6_Sp7MQxGYSshZZz6XM7OiUE5DXm0dU"],"n":"EDs-qIrh79lTtoIz4K9q_vu7-avDc79YkNCfK49HpwQg","wt":"0","wr":[],"wa":[],"a":[]}-AABAA5LQUkDqCsS6cias5AKP36zbEUIVzhztel2qGvRkyC6vJWPYA3LV6fNVn36jHMO5WivQxNUDVKKEGFm2zHU7dDw

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"4","t":"rot","p":"EPM2CN8rmsp_QmoqFesMLL3Izw7lw4T59sh_brlBXMQU","kt":"1","k":["DKPE5eeJRzkRTMOoRGVd2m18o8fLqM2j9kaxLhV3x8AQ"],"n":"EhVTfJFfl6L0Z0432mDUxeaqB_hlWPJ2qUuzG95gEyJU","wt":"0","wr":[],"wa":[],"a":[]}-AABAAPX_4Bh80SClFIn0KAH55zYZbq25KYeyhIyTahE2H0JO6ctTACW5_Y1aOGVgoZbpU3lkAtCzfBK8Wl1Tjk_SbBA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"3","t":"rot","p":"E-5RimdY_OWoreR-Z-Q5G81-I4tjASJCaP_MqkBbtM2w","kt":"1","k":["DT1iAhBWCkvChxNWsby2J0pJyxBIxbAtbLA0Ljx-Grh8"],"n":"EKrLE2h2nh3ClyJNEjKaikHWT7G-ngimNpK-QgVQv9As","wt":"0","wr":[],"wa":[],"a":[]}-AABAA8oEOTjnbRmK8afyAIAV2--nYEiBTNt5TTSqv-sL60z-tGD4E70ym1vkhlCbtdQGqWGKzZme2FQHjpI_w7v8DCQ

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"3","t":"vrc","d":"EPM2CN8rmsp_QmoqFesMLL3Izw7lw4T59sh_brlBXMQU","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAZVEStGr9WVez68wbYhB7K4QzZ4xYDjAeWjDEraUgblT29RRDrPWjRcoOVJRH8ZJwM5-Y5SRNB55yu_9Z7N96Bw

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"4","t":"vrc","d":"Ec9PD_3Fx7nfdjPTFBiFHs1rDsn_FFC-cJlyZXyy9Qd0","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA5TfRSBd6rGkyT2xKx67pISPAw6BAIj2mDpyYQU4UyNtupI-ZZ38UXTxgAipMY1zWovM9ernVhFJScOdN9ekiCQ{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"5","t":"vrc","d":"EfFPor2LFpwbaw6wQD12BTXFBgGEZ2SEMjX5q8hPQsaI","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA4PHw95_UsIAly_715wahTQ8txGeGAFpFKWfF1C4sJ7xpgYwOI15-ts6KiIkiZYnZkVcbnooRG_ys305_OBqzBw{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"6","t":"vrc","d":"E6kv-VRuz-yJv0G3dQqlPDiJfgnChDa-7l3JLOJO08x8","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAUG20v_yCuFYlI9v4K_ikRxjP8GpdctMIVXcR6b4jEKBTQ-K_fpYCnD8WTHFUkcwGjl8NkUS0sOyE_Z1V-gM8DA{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"7","t":"vrc","d":"Efa5Lqk0n2lvPyV-niwqlyFfYt8HHjSXixeyWzK1Fi0s","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAEmx1u4BKeXqhbi9xMcXO2zQ5bpUXDhPXh_r7yuC41gHD0K0pYsF2XhcGlfueGNzTuTY7S-0Qo2OCi_j2iqAJBQ{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"8","t":"vrc","d":"EApt0lau2pQs4s_4rD7bogUqN_vR2PkP5IFuDXwhwHBY","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAw6uqKSUUiSqDsyRdKkvcVuZmPnIRLCT1l_ow4-ZIYUVHRg3CMskc1JTU3NO7MIRfglSRGFb6lb4DetHQ7w93Dw{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"9","t":"vrc","d":"EgabA7nkQwbawSw55s16SKwQcZnjERuEvFy17Zah0q7E","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAfBFMzc18Uts3lNNpZRRDdkm1ssFMu6o6fo3_8LJLBvOBq7eWzrviXslMkfyQ6jt4vkYkQDII-j5zWGJ7izh4Dg{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"a","t":"vrc","d":"E6y8QppzP0weX5yUx3qVCZPRG_cjpJ1jTzG-eBOsStTU","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAjXNFV6k2Vh29OhEOLLEec03Mx8fb5FKmeB6oJDLPcEa1BmG2CykSWo1bd7hA9qTRx0WhhjZDNNXm9trTtA_jCw{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"b","t":"vrc","d":"Eqdk_Re0pxg0rEpUjhqaYGJBTwaPizWcNmXuj0McvRFM","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAYnxG0thv6Xd2lAcMHGe4yI9I37ed0MpmqUjN72bDVUhcTMegpMQWs9NpV4G06-Nm1ZAdZzcEEIfc1ijztzobCg{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"c","t":"vrc","d":"E_w7-WcpRpNTbFLdZuSy8c8j5SPu0Np2LgAwO0NjTkXQ","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAidgjC0Uu1KOzxDcaCU_2oLcN4vzMiMVAAonahswSmo20ts17-YE0nOwvAqPEWCBTQV2Fv3V8KFy8sf5SbyYyAw{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"d","t":"vrc","d":"EuGtF8qIJ2C73Ur44YppdX9xBVwyXFJbaun2k4uLsCks","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAX6YxEtnv1W_F8_o-tKm_tX_YukfX5yq2h9Ii513kPqFSKdrdq3OCBWw7UiNsin5phz4ZdSmdNDHP4ycqzjP3Bw

weboftrust-keripy-main/325 weboftrust-keripy-main repository prose file Apache-2.0 src/keri/demo/vectors/eve.2021-03-08_21-37-25_262367.txt https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/eve.2021-03-08_21-37-25_262367.txt WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/eve.2021-03-08_21-37-25_262367.txt. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 2871

Rx ('127.0.0.1', 61102): {"v":"KERI10JSON0000e6_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"icp","kt":"1","k":["DSuhyBcPZEZLK-fcw5tzHn2N46wRCG_ZOoeKtWTOunRA"],"n":"EPYuj8mq_PYYsoBKkzX1kxSPGYBWaIya3slgCOyOtlqU","wt":"0","w":[],"c":[]}-AABAAmDoPp9jDio1hznNDO-3T2KA_FUbY8f_qybT6_FqPAuf89e9AMDXP5wch6jvT4Ev4QRp8HqtTb9t2Y6_KJPYlBw

Tx ('127.0.0.1', 61102): {"v":"KERI10JSON0000e6_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"icp","kt":"1","k":["D8KY1sKmgyjAiUDdUBPNPyrSz_ad_Qf9yzhDNZlEKiMc"],"n":"EOWDAJvex5dZzDxeHBANyaIoUG3F4-ic81G6GwtnC4f4","wt":"0","w":[],"c":[]}-AABAAll_W0_FsjUyJnYokSNPqq7xdwIBs0ebq2eUez6RKNB-UG_y6fD0e6fb_nANvmNCWjsoFjWv3XP3ApXUabMgyBA{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"vrc","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb6S-RXeAqUKl8UuNwYpiaFARhMj-95elxmr7uNU8m7buVSPVLbTWcQYfI_04HoP_A_fvlU_b099fiEJyDSA2Cg

Rx ('127.0.0.1', 61102): {"v":"KERI10JSON000105_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"vrc","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo","a":{"i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o"}}-AABAAZqxNTt_LDZnmwEIaJX0cK9VKkCGq1UieEx6881MKKOtlRirvs_4pzFgmw3aRwAaIM2XV0biQ7xHeOoXglluDCA

Rx ('127.0.0.1', 61102): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"rot","p":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","kt":"1","k":["DVcuJOOJF1IE8svqEtrSuyQjGTd2HhfAkt9y2QkUtFJI"],"n":"E-dapdcC6XR1KWmWDsNl4J_OxcGxNZw1Xd95JH5a34fI","wt":"0","wr":[],"wa":[],"a":[]}-AABAAEuHTj2jo-QgGg1FP0tq_q2MjCeJnzYoJY1Iw2h4ov3J4ki82aHDWxYhxMiXX-E8b0vRDfr3-EB11ofd_zx3cBQ

Tx ('127.0.0.1', 61102): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"vrc","d":"Enrq74_Q11S2vHx1gpK_46Ik5Q7Yy9K1zZ5BavqGDKnk","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb1BJLLTkcTlefF1DOPKiOixLgQqnqxRsqEqGaaADLNwQ-uDeb2nNTQBB6SeclaihimPg9QwLnulUbdgYxI5ADg

Rx ('127.0.0.1', 61102): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"ixn","p":"Enrq74_Q11S2vHx1gpK_46Ik5Q7Yy9K1zZ5BavqGDKnk","a":[]}-AABAARxj7iqT5m3wQIPOfCPFkeGEw1j5QY-lXbRGaRSVxzW9SZIX-mXJfIjs7m6MlaYFEIJs3fiCWCj9JdUz0BHlRDA

Tx ('127.0.0.1', 61102): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"vrc","d":"E-5RimdY_OWoreR-Z-Q5G81-I4tjASJCaP_MqkBbtM2w","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA71XY3Y7gt3FQ3RkRDN2JN5wsKVFSqxc55yBl3PecKEpSSn_tjjtKxhvZZgWtvUxHiaSt94h8huBZ0jVdWeM6DA

weboftrust-keripy-main/326 weboftrust-keripy-main repository prose file Apache-2.0 src/keri/demo/vectors/eve.2021-03-08_21-38-11_244687.txt https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/eve.2021-03-08_21-38-11_244687.txt WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/eve.2021-03-08_21-38-11_244687.txt. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 2871

Rx ('127.0.0.1', 61113): {"v":"KERI10JSON0000e6_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"icp","kt":"1","k":["DSuhyBcPZEZLK-fcw5tzHn2N46wRCG_ZOoeKtWTOunRA"],"n":"EPYuj8mq_PYYsoBKkzX1kxSPGYBWaIya3slgCOyOtlqU","wt":"0","w":[],"c":[]}-AABAAmDoPp9jDio1hznNDO-3T2KA_FUbY8f_qybT6_FqPAuf89e9AMDXP5wch6jvT4Ev4QRp8HqtTb9t2Y6_KJPYlBw

Tx ('127.0.0.1', 61113): {"v":"KERI10JSON0000e6_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"icp","kt":"1","k":["D8KY1sKmgyjAiUDdUBPNPyrSz_ad_Qf9yzhDNZlEKiMc"],"n":"EOWDAJvex5dZzDxeHBANyaIoUG3F4-ic81G6GwtnC4f4","wt":"0","w":[],"c":[]}-AABAAll_W0_FsjUyJnYokSNPqq7xdwIBs0ebq2eUez6RKNB-UG_y6fD0e6fb_nANvmNCWjsoFjWv3XP3ApXUabMgyBA{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"vrc","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb6S-RXeAqUKl8UuNwYpiaFARhMj-95elxmr7uNU8m7buVSPVLbTWcQYfI_04HoP_A_fvlU_b099fiEJyDSA2Cg

Rx ('127.0.0.1', 61113): {"v":"KERI10JSON000105_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"vrc","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo","a":{"i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o"}}-AABAAZqxNTt_LDZnmwEIaJX0cK9VKkCGq1UieEx6881MKKOtlRirvs_4pzFgmw3aRwAaIM2XV0biQ7xHeOoXglluDCA

Rx ('127.0.0.1', 61113): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"ixn","p":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":[]}-AABAAJp5cJcsiYANcHH5wDuyv_MzwxIu8NwDDKsQdal2gxUZFVQJS_PYnB2EDcGZCuUqwMhfthxRipygo3R2lhFFSDA

Tx ('127.0.0.1', 61113): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"vrc","d":"E6T3oCaDYM_L7ODpamYs7sCClqOK1YbJbPRnXmk5r8Js","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA-1gNMOwfLk4nvPNvugFGGVC54_PmFAzyTq5jnP01zjmw-csl8TYmknXuD2EwRAa49MFb2fCoo7F46vWqMz3NDA

Rx ('127.0.0.1', 61113): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"rot","p":"E6T3oCaDYM_L7ODpamYs7sCClqOK1YbJbPRnXmk5r8Js","kt":"1","k":["DVcuJOOJF1IE8svqEtrSuyQjGTd2HhfAkt9y2QkUtFJI"],"n":"E-dapdcC6XR1KWmWDsNl4J_OxcGxNZw1Xd95JH5a34fI","wt":"0","wr":[],"wa":[],"a":[]}-AABAA4xNEJF7xAYr4OO7Fht2cbmQAan1n_7-km7CagLIfZA5avjEJLl7XE7x8QcWcgS_4rrCGPRuyjtRmRlOF4Oq7Ag

Tx ('127.0.0.1', 61113): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"vrc","d":"EXCHktwBK5rYu9k00__7yKcEDqzFvxmCZ3Xq6cyuKDdc","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA8vws2rEnGtqiXZK4Zz0wj7Cy9byrGPu2h6tZ6yIR9MAfL1sKnb0rv5_3HF2OazuWpUylIAAgjEHvoiIZJR98AA

weboftrust-keripy-main/327 weboftrust-keripy-main repository prose file Apache-2.0 src/keri/demo/vectors/eve.2021-03-08_23-41-40_603809.txt https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/eve.2021-03-08_23-41-40_603809.txt WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/eve.2021-03-08_23-41-40_603809.txt. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 10893

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON0000e6_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"icp","kt":"1","k":["DSuhyBcPZEZLK-fcw5tzHn2N46wRCG_ZOoeKtWTOunRA"],"n":"EPYuj8mq_PYYsoBKkzX1kxSPGYBWaIya3slgCOyOtlqU","wt":"0","w":[],"c":[]}-AABAAmDoPp9jDio1hznNDO-3T2KA_FUbY8f_qybT6_FqPAuf89e9AMDXP5wch6jvT4Ev4QRp8HqtTb9t2Y6_KJPYlBw

Tx ('127.0.0.1', 51612): {"v":"KERI10JSON0000e6_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"icp","kt":"1","k":["D8KY1sKmgyjAiUDdUBPNPyrSz_ad_Qf9yzhDNZlEKiMc"],"n":"EOWDAJvex5dZzDxeHBANyaIoUG3F4-ic81G6GwtnC4f4","wt":"0","w":[],"c":[]}-AABAAll_W0_FsjUyJnYokSNPqq7xdwIBs0ebq2eUez6RKNB-UG_y6fD0e6fb_nANvmNCWjsoFjWv3XP3ApXUabMgyBA{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"vrc","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb6S-RXeAqUKl8UuNwYpiaFARhMj-95elxmr7uNU8m7buVSPVLbTWcQYfI_04HoP_A_fvlU_b099fiEJyDSA2Cg

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000105_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"vrc","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo","a":{"i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o"}}-AABAAZqxNTt_LDZnmwEIaJX0cK9VKkCGq1UieEx6881MKKOtlRirvs_4pzFgmw3aRwAaIM2XV0biQ7xHeOoXglluDCA

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"rot","p":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","kt":"1","k":["DVcuJOOJF1IE8svqEtrSuyQjGTd2HhfAkt9y2QkUtFJI"],"n":"E-dapdcC6XR1KWmWDsNl4J_OxcGxNZw1Xd95JH5a34fI","wt":"0","wr":[],"wa":[],"a":[]}-AABAAEuHTj2jo-QgGg1FP0tq_q2MjCeJnzYoJY1Iw2h4ov3J4ki82aHDWxYhxMiXX-E8b0vRDfr3-EB11ofd_zx3cBQ

Tx ('127.0.0.1', 51612): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"vrc","d":"Enrq74_Q11S2vHx1gpK_46Ik5Q7Yy9K1zZ5BavqGDKnk","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb1BJLLTkcTlefF1DOPKiOixLgQqnqxRsqEqGaaADLNwQ-uDeb2nNTQBB6SeclaihimPg9QwLnulUbdgYxI5ADg

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"ixn","p":"Enrq74_Q11S2vHx1gpK_46Ik5Q7Yy9K1zZ5BavqGDKnk","a":[]}-AABAARxj7iqT5m3wQIPOfCPFkeGEw1j5QY-lXbRGaRSVxzW9SZIX-mXJfIjs7m6MlaYFEIJs3fiCWCj9JdUz0BHlRDA

Tx ('127.0.0.1', 51612): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"vrc","d":"E-5RimdY_OWoreR-Z-Q5G81-I4tjASJCaP_MqkBbtM2w","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA71XY3Y7gt3FQ3RkRDN2JN5wsKVFSqxc55yBl3PecKEpSSn_tjjtKxhvZZgWtvUxHiaSt94h8huBZ0jVdWeM6DA

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"d","t":"ixn","p":"E_w7-WcpRpNTbFLdZuSy8c8j5SPu0Np2LgAwO0NjTkXQ","a":[]}-AABAAfD51RkwgfKkXvcGV5e-eipIIZ4NkduelNc1flEAGBeoRRmsTWpGu5TFUY5cx1ZUmHGTtpR5Ijf-jK7mpwkOOCg

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"c","t":"rot","p":"Eqdk_Re0pxg0rEpUjhqaYGJBTwaPizWcNmXuj0McvRFM","kt":"1","k":["DGxCoXZfVg1DT9ra-Yl-AFcFxA5US5Al60mWBwJYBPz4"],"n":"ECGzdg6m_nWOnYVlQ1DTW50CHxrCm6IDnv7B7s1vrYTU","wt":"0","wr":[],"wa":[],"a":[]}-AABAAt8XcxIQYlyDaK0dOp-AM_6DTZbN0dXUQmHtGHnBbv5YYwMy8HswBEUBzvIjdtecTxwnyLUO5Eb_3uxDQ-Df7BQ

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"b","t":"rot","p":"E6y8QppzP0weX5yUx3qVCZPRG_cjpJ1jTzG-eBOsStTU","kt":"1","k":["DOedRyfIQe4Z-GNSlbgA8txIKyx4Li2tJ1S0Yhy7l2T8"],"n":"EuiVoq5iFTwRutHDNJHbIY43bBj3EKmk7_lmZJdPj-PU","wt":"0","wr":[],"wa":[],"a":[]}-AABAAFr141W-UprcyRaGN_fYootD2E7AGyg1TuzFqH1OBqMbyHFTIgxZEcGaB9eWnSj4xAXfZbqD28BKde02yb8LIAw

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"a","t":"rot","p":"EgabA7nkQwbawSw55s16SKwQcZnjERuEvFy17Zah0q7E","kt":"1","k":["DT1nEDepd6CSAMCE7NY_jlLdG6_mKUlKS_mW-2HJY1hg"],"n":"EZt3rYIvWZ3WuVankOuW34wSifHNx9tUjdaUImARVCyU","wt":"0","wr":[],"wa":[],"a":[]}-AABAAMy2xuiSbkOA2zgVAkVllgiEuBdKyPfYLY2aZw3__AhZItqy1Y2LHFB67llBzyHAFh1NqzgxEpwi0DLLLUXTUAw

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"9","t":"ixn","p":"EApt0lau2pQs4s_4rD7bogUqN_vR2PkP5IFuDXwhwHBY","a":[]}-AABAAI9DC3NryxfCFAZdeC2fcyYSqMUSXBZz-7nZC852B0bMXIunbGBoFLiYoamWk_vL5ppEbxqQcqSvDo4N_3PF9BA

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"8","t":"rot","p":"Efa5Lqk0n2lvPyV-niwqlyFfYt8HHjSXixeyWzK1Fi0s","kt":"1","k":["DVjWcaNX2gCkHOjk6rkmqPBCxkRCqwIJ-3OjdYmMwxf4"],"n":"EpusdZwamtwTwqtwOenXWKQ0FpX9yWnq0XHlOEgQmss0","wt":"0","wr":[],"wa":[],"a":[]}-AABAAnrnmQKM3VT3KgCNi0JHL5EA5ZV6S9WbkovZbNYFTcMVOFGh9kP6uTqv9VVyKBfgBBeYUS6PXIi6cd5qELf4VAA

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"7","t":"rot","p":"E6kv-VRuz-yJv0G3dQqlPDiJfgnChDa-7l3JLOJO08x8","kt":"1","k":["D4JDgo3WNSUpt-NG14Ni31_GCmrU0r38yo7kgDuyGkQM"],"n":"EvbWtNrsw7dfaWRiDMXcF6P90KM1gdfPhg7FWTIwD39c","wt":"0","wr":[],"wa":[],"a":[]}-AABAAWXNb8yIqu5CdRCdwapjY-pIixcwwPLJgUrMqnTBLbmWMFbbrn1bUIVSfFEtYbdJu3wd4D3TwK5TxBvQzmAuKDg

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"6","t":"ixn","p":"EfFPor2LFpwbaw6wQD12BTXFBgGEZ2SEMjX5q8hPQsaI","a":[]}-AABAAPtUj4bxqdQFs5kIFKbBV_3u0r97x-nIMEHQviOP6AcfkYjl4c_7C0HyW2yQhXfST8-T-DLgYW5Qob0ExYc3gBA

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"5","t":"rot","p":"Ec9PD_3Fx7nfdjPTFBiFHs1rDsn_FFC-cJlyZXyy9Qd0","kt":"1","k":["D1kcBE7h0ImWW6_Sp7MQxGYSshZZz6XM7OiUE5DXm0dU"],"n":"EDs-qIrh79lTtoIz4K9q_vu7-avDc79YkNCfK49HpwQg","wt":"0","wr":[],"wa":[],"a":[]}-AABAA5LQUkDqCsS6cias5AKP36zbEUIVzhztel2qGvRkyC6vJWPYA3LV6fNVn36jHMO5WivQxNUDVKKEGFm2zHU7dDw

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"4","t":"rot","p":"EPM2CN8rmsp_QmoqFesMLL3Izw7lw4T59sh_brlBXMQU","kt":"1","k":["DKPE5eeJRzkRTMOoRGVd2m18o8fLqM2j9kaxLhV3x8AQ"],"n":"EhVTfJFfl6L0Z0432mDUxeaqB_hlWPJ2qUuzG95gEyJU","wt":"0","wr":[],"wa":[],"a":[]}-AABAAPX_4Bh80SClFIn0KAH55zYZbq25KYeyhIyTahE2H0JO6ctTACW5_Y1aOGVgoZbpU3lkAtCzfBK8Wl1Tjk_SbBA

Rx ('127.0.0.1', 51612): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"3","t":"rot","p":"E-5RimdY_OWoreR-Z-Q5G81-I4tjASJCaP_MqkBbtM2w","kt":"1","k":["DT1iAhBWCkvChxNWsby2J0pJyxBIxbAtbLA0Ljx-Grh8"],"n":"EKrLE2h2nh3ClyJNEjKaikHWT7G-ngimNpK-QgVQv9As","wt":"0","wr":[],"wa":[],"a":[]}-AABAA8oEOTjnbRmK8afyAIAV2--nYEiBTNt5TTSqv-sL60z-tGD4E70ym1vkhlCbtdQGqWGKzZme2FQHjpI_w7v8DCQ

Tx ('127.0.0.1', 51612): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"3","t":"vrc","d":"EPM2CN8rmsp_QmoqFesMLL3Izw7lw4T59sh_brlBXMQU","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAZVEStGr9WVez68wbYhB7K4QzZ4xYDjAeWjDEraUgblT29RRDrPWjRcoOVJRH8ZJwM5-Y5SRNB55yu_9Z7N96Bw

Tx ('127.0.0.1', 51612): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"4","t":"vrc","d":"Ec9PD_3Fx7nfdjPTFBiFHs1rDsn_FFC-cJlyZXyy9Qd0","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA5TfRSBd6rGkyT2xKx67pISPAw6BAIj2mDpyYQU4UyNtupI-ZZ38UXTxgAipMY1zWovM9ernVhFJScOdN9ekiCQ{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"5","t":"vrc","d":"EfFPor2LFpwbaw6wQD12BTXFBgGEZ2SEMjX5q8hPQsaI","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA4PHw95_UsIAly_715wahTQ8txGeGAFpFKWfF1C4sJ7xpgYwOI15-ts6KiIkiZYnZkVcbnooRG_ys305_OBqzBw{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"6","t":"vrc","d":"E6kv-VRuz-yJv0G3dQqlPDiJfgnChDa-7l3JLOJO08x8","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAUG20v_yCuFYlI9v4K_ikRxjP8GpdctMIVXcR6b4jEKBTQ-K_fpYCnD8WTHFUkcwGjl8NkUS0sOyE_Z1V-gM8DA{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"7","t":"vrc","d":"Efa5Lqk0n2lvPyV-niwqlyFfYt8HHjSXixeyWzK1Fi0s","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAEmx1u4BKeXqhbi9xMcXO2zQ5bpUXDhPXh_r7yuC41gHD0K0pYsF2XhcGlfueGNzTuTY7S-0Qo2OCi_j2iqAJBQ{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"8","t":"vrc","d":"EApt0lau2pQs4s_4rD7bogUqN_vR2PkP5IFuDXwhwHBY","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAw6uqKSUUiSqDsyRdKkvcVuZmPnIRLCT1l_ow4-ZIYUVHRg3CMskc1JTU3NO7MIRfglSRGFb6lb4DetHQ7w93Dw{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"9","t":"vrc","d":"EgabA7nkQwbawSw55s16SKwQcZnjERuEvFy17Zah0q7E","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAfBFMzc18Uts3lNNpZRRDdkm1ssFMu6o6fo3_8LJLBvOBq7eWzrviXslMkfyQ6jt4vkYkQDII-j5zWGJ7izh4Dg{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"a","t":"vrc","d":"E6y8QppzP0weX5yUx3qVCZPRG_cjpJ1jTzG-eBOsStTU","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAjXNFV6k2Vh29OhEOLLEec03Mx8fb5FKmeB6oJDLPcEa1BmG2CykSWo1bd7hA9qTRx0WhhjZDNNXm9trTtA_jCw{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"b","t":"vrc","d":"Eqdk_Re0pxg0rEpUjhqaYGJBTwaPizWcNmXuj0McvRFM","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAYnxG0thv6Xd2lAcMHGe4yI9I37ed0MpmqUjN72bDVUhcTMegpMQWs9NpV4G06-Nm1ZAdZzcEEIfc1ijztzobCg{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"c","t":"vrc","d":"E_w7-WcpRpNTbFLdZuSy8c8j5SPu0Np2LgAwO0NjTkXQ","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAidgjC0Uu1KOzxDcaCU_2oLcN4vzMiMVAAonahswSmo20ts17-YE0nOwvAqPEWCBTQV2Fv3V8KFy8sf5SbyYyAw{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"d","t":"vrc","d":"EuGtF8qIJ2C73Ur44YppdX9xBVwyXFJbaun2k4uLsCks","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAX6YxEtnv1W_F8_o-tKm_tX_YukfX5yq2h9Ii513kPqFSKdrdq3OCBWw7UiNsin5phz4ZdSmdNDHP4ycqzjP3Bw

weboftrust-keripy-main/328 weboftrust-keripy-main repository prose file Apache-2.0 src/keri/demo/vectors/eve.2021-03-08_23-52-55_318751.txt https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/eve.2021-03-08_23-52-55_318751.txt WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/eve.2021-03-08_23-52-55_318751.txt. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 9834

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON0000e6_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"icp","kt":"1","k":["DSuhyBcPZEZLK-fcw5tzHn2N46wRCG_ZOoeKtWTOunRA"],"n":"EPYuj8mq_PYYsoBKkzX1kxSPGYBWaIya3slgCOyOtlqU","wt":"0","w":[],"c":[]}-AABAAmDoPp9jDio1hznNDO-3T2KA_FUbY8f_qybT6_FqPAuf89e9AMDXP5wch6jvT4Ev4QRp8HqtTb9t2Y6_KJPYlBw

Tx ('127.0.0.1', 52117): {"v":"KERI10JSON0000e6_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"icp","kt":"1","k":["D8KY1sKmgyjAiUDdUBPNPyrSz_ad_Qf9yzhDNZlEKiMc"],"n":"EOWDAJvex5dZzDxeHBANyaIoUG3F4-ic81G6GwtnC4f4","wt":"0","w":[],"c":[]}-AABAAll_W0_FsjUyJnYokSNPqq7xdwIBs0ebq2eUez6RKNB-UG_y6fD0e6fb_nANvmNCWjsoFjWv3XP3ApXUabMgyBA{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"vrc","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb6S-RXeAqUKl8UuNwYpiaFARhMj-95elxmr7uNU8m7buVSPVLbTWcQYfI_04HoP_A_fvlU_b099fiEJyDSA2Cg

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON000105_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"vrc","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo","a":{"i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o"}}-AABAAZqxNTt_LDZnmwEIaJX0cK9VKkCGq1UieEx6881MKKOtlRirvs_4pzFgmw3aRwAaIM2XV0biQ7xHeOoXglluDCA

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"ixn","p":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":[]}-AABAAJp5cJcsiYANcHH5wDuyv_MzwxIu8NwDDKsQdal2gxUZFVQJS_PYnB2EDcGZCuUqwMhfthxRipygo3R2lhFFSDA

Tx ('127.0.0.1', 52117): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"vrc","d":"E6T3oCaDYM_L7ODpamYs7sCClqOK1YbJbPRnXmk5r8Js","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA-1gNMOwfLk4nvPNvugFGGVC54_PmFAzyTq5jnP01zjmw-csl8TYmknXuD2EwRAa49MFb2fCoo7F46vWqMz3NDA

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"rot","p":"E6T3oCaDYM_L7ODpamYs7sCClqOK1YbJbPRnXmk5r8Js","kt":"1","k":["DVcuJOOJF1IE8svqEtrSuyQjGTd2HhfAkt9y2QkUtFJI"],"n":"E-dapdcC6XR1KWmWDsNl4J_OxcGxNZw1Xd95JH5a34fI","wt":"0","wr":[],"wa":[],"a":[]}-AABAA4xNEJF7xAYr4OO7Fht2cbmQAan1n_7-km7CagLIfZA5avjEJLl7XE7x8QcWcgS_4rrCGPRuyjtRmRlOF4Oq7Ag

Tx ('127.0.0.1', 52117): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"vrc","d":"EXCHktwBK5rYu9k00__7yKcEDqzFvxmCZ3Xq6cyuKDdc","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA8vws2rEnGtqiXZK4Zz0wj7Cy9byrGPu2h6tZ6yIR9MAfL1sKnb0rv5_3HF2OazuWpUylIAAgjEHvoiIZJR98AA

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"3","t":"rot","p":"EXCHktwBK5rYu9k00__7yKcEDqzFvxmCZ3Xq6cyuKDdc","kt":"1","k":["DT1iAhBWCkvChxNWsby2J0pJyxBIxbAtbLA0Ljx-Grh8"],"n":"EKrLE2h2nh3ClyJNEjKaikHWT7G-ngimNpK-QgVQv9As","wt":"0","wr":[],"wa":[],"a":[]}-AABAAqqEqdibF-C6u4JEskhSYU5SoHuuRp5neWDpitBdaCoiW7B-LpID1lKWVZ-XkmZASVncttdXg8wQAmClppAkABQ

Tx ('127.0.0.1', 52117): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"3","t":"vrc","d":"EnxEgBlM2KMsoGezpySrCPjgQ9MQwqeKCjQy4ciE5O-8","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA7lqnQrPmhvHzxAHA0xaZKjzUVStxMeyZfvEvDpPFLE3BuZUu7Uig7lpu6Rkmyvcx0mCsLAJ7TxSxTYFBXOyzBg

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"4","t":"rot","p":"EnxEgBlM2KMsoGezpySrCPjgQ9MQwqeKCjQy4ciE5O-8","kt":"1","k":["DKPE5eeJRzkRTMOoRGVd2m18o8fLqM2j9kaxLhV3x8AQ"],"n":"EhVTfJFfl6L0Z0432mDUxeaqB_hlWPJ2qUuzG95gEyJU","wt":"0","wr":[],"wa":[],"a":[]}-AABAA_kNMrBU_96ccZQ75xssI-udqlnRkL7HHuvdF1gxV-VOPQtnWTweleCLxDbX8dUjF2JpCyf2QrbUy4ji1UqQlDg

Tx ('127.0.0.1', 52117): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"4","t":"vrc","d":"EeaFSTtkd_UJ_JUGp8okcTGZ7Sct0FtmcjjxvJuDQUqM","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAApk563QbgrwkZEgaUILHNoX-oavLEPImVvw6XKCBXrHd367_pt3u_Tm2RtmWTjnmbwVUHa_asLXgfoyEpBvWzCA

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"5","t":"rot","p":"EeaFSTtkd_UJ_JUGp8okcTGZ7Sct0FtmcjjxvJuDQUqM","kt":"1","k":["D1kcBE7h0ImWW6_Sp7MQxGYSshZZz6XM7OiUE5DXm0dU"],"n":"EDs-qIrh79lTtoIz4K9q_vu7-avDc79YkNCfK49HpwQg","wt":"0","wr":[],"wa":[],"a":[]}-AABAAQxiUKqpU58WAqBIhKWu2GvQ4Fy0BuY2hEPWSY6-xuaVBEdqyfOMBvpDU2C7fGyYREpgz1BZ7aEYoaIpjfU7aCw

Tx ('127.0.0.1', 52117): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"5","t":"vrc","d":"E3s7ZqAMy7FBYtVPXbdodYnKPbmqfxEgQJGZ2ahwaH8g","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAAtshSNtnZc4zM0clQJcrDQ5k_sAgzyRJH_haE90HMOkZhoWFOGBfFShOzNGh6su7fb2yX85t3va0EZoqo_n8Bw

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"6","t":"rot","p":"E3s7ZqAMy7FBYtVPXbdodYnKPbmqfxEgQJGZ2ahwaH8g","kt":"1","k":["D4JDgo3WNSUpt-NG14Ni31_GCmrU0r38yo7kgDuyGkQM"],"n":"EvbWtNrsw7dfaWRiDMXcF6P90KM1gdfPhg7FWTIwD39c","wt":"0","wr":[],"wa":[],"a":[]}-AABAAvfpXKdqtK9Sff3gQP2CHl1A5sQ12Bk9WROn8ZVzUqHxrSX-TWnsru547u2u4pKbnkFI385mBEK91hp95xOt-DA

Tx ('127.0.0.1', 52117): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"6","t":"vrc","d":"ERYxFPrDlZwuI2fQAbcqghi_oyVu-94BMYlNClb8v3BE","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAna8q3OBB1sKAy40QmgNHRENnF-1inxPKK9_dm5arFnBgaBFYA5W_WJwomnPsMdI9mYKoWMnEiT8gKfa9nLV1AA

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"7","t":"rot","p":"ERYxFPrDlZwuI2fQAbcqghi_oyVu-94BMYlNClb8v3BE","kt":"1","k":["DVjWcaNX2gCkHOjk6rkmqPBCxkRCqwIJ-3OjdYmMwxf4"],"n":"EpusdZwamtwTwqtwOenXWKQ0FpX9yWnq0XHlOEgQmss0","wt":"0","wr":[],"wa":[],"a":[]}-AABAApaT1oMkPCGMF0r0vI5asciNcewaT217lR7yzuWxnffixzhdvjD_FpjmroU4kAEpKTo9tLWiuzBxTYDN2ICHxBA

Tx ('127.0.0.1', 52117): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"7","t":"vrc","d":"ECL9tTKof5wF3kDN37_bDsL3C00GbvHUgoTyv2y_aOT8","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA0dkmxFEH9923G4haKnQYj6m7powuR9TLQiVPjHRgKxABE3Wm6q93YH5Z14iP8SGy5nLR_sR-ovygwWVihXs7CA

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"8","t":"ixn","p":"ECL9tTKof5wF3kDN37_bDsL3C00GbvHUgoTyv2y_aOT8","a":[]}-AABAAF6rk8xXVVOsNq-D_Y1UDi-jxwB_GGaoukE15teFtbzWi5yHSIok9RPysO-DFFlwXP5umM1c6eouONGfs4cLwBw

Tx ('127.0.0.1', 52117): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"8","t":"vrc","d":"E1PbAJo-30Zxwt6CtGFjqmB2RCtOevTAbW7eTBoi1Auc","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAYG6q0PyDMyjS6QA2SoSQFMWZ7LQWWvaQVjv-81UuQVautHC_76CVFj0pcy6fhhoX--g0uT6ZIJthmfeN-QdJAw

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"9","t":"rot","p":"E1PbAJo-30Zxwt6CtGFjqmB2RCtOevTAbW7eTBoi1Auc","kt":"1","k":["DT1nEDepd6CSAMCE7NY_jlLdG6_mKUlKS_mW-2HJY1hg"],"n":"En-DkYLkIkPFZUjtn0iqT1Ze3wO4BOYKygRmcm3DI3L0","wt":"0","wr":[],"wa":[],"a":[]}-AABAA46Pq4Kz663lzIy8szrgWhEXWMnkSFChj4N6bcqVc6osuR6K2FV4hVBMuPhwVciX7OjzT_26hqZOz9FB4ihA3Dg

Tx ('127.0.0.1', 52117): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"9","t":"vrc","d":"Ev6Hp_ZaM1qBXQaCfbj29qkPJMnfS0CUX__0nXZ0gwZo","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA7KJeeJkgXc1lzCJW4Ahe21aAR65qtuOPKBBEXsvWOSkrULAipIdn2PDIvdjn1VrqGPH9pDoor7qUXV4rjUv5Bw

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"a","t":"rot","p":"Ev6Hp_ZaM1qBXQaCfbj29qkPJMnfS0CUX__0nXZ0gwZo","kt":"1","k":["DXgt9QzP71t5kPqC7qIBF5Mwm2hRemkPvlDy4rZCYabM"],"n":"E95iFxPub6KV5jAgadydQPZQwVfO2OX1Vw_Ln8ZRQExg","wt":"0","wr":[],"wa":[],"a":[]}-AABAALCv2m-mMBs9eS7wufWJ8UY1SOw_gZ7jgmLxA1EH6siOUVc1LYaXnVBhUG0-JcCYY_XknATn_npHEvK4LvTLyAg

Tx ('127.0.0.1', 52117): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"a","t":"vrc","d":"E_heoz4Of8AMLbUeSVA4gN7AZBfTxnb1DS4GAEQpn5RQ","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAaaANwB_1im4nc74WVz8u0Vcl2IA1zrNm2eA_9FsRvUnqvgyZaFkTM2CHUAil3ib5B99uOaLAmQYNhHq2SDfpCQ

Rx ('127.0.0.1', 52117): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"b","t":"rot","p":"E_heoz4Of8AMLbUeSVA4gN7AZBfTxnb1DS4GAEQpn5RQ","kt":"1","k":["DnotwxXK7tGnkeBgSmIHfplztw4C-H5uEHUxSwYHhlHY"],"n":"EPrgfk9Jxnez37qVyiCZqR7Ev-M7XFKcjWum3_lVe7Nk","wt":"0","wr":[],"wa":[],"a":[]}-AABAA40KehLE7eYtrZZ0BXBKeOLft9ckoCB9EcAMHKEQ5vK_FeKAtKP8WyI0EHVb-jD-9HB3ak-anE7GjgEXTSlYRCw

Tx ('127.0.0.1', 52117): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"b","t":"vrc","d":"E-4tiyrNooh13qDSiBb64r39nBkazserD97_7qvc1U3g","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAO0wtemJUc2cZV4QLNsM_dGWbVqjWvCgoFeCKwJSflgoN1ykF-8cg0TSZTvhkFLgCCB4ZmX_KwR4cf88ltjFABA

weboftrust-keripy-main/329 weboftrust-keripy-main repository prose file Apache-2.0 src/keri/demo/vectors/sam.2021-03-08_21-38-11_220617.txt https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/sam.2021-03-08_21-38-11_220617.txt WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/sam.2021-03-08_21-38-11_220617.txt. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 2864

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON0000e6_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"icp","kt":"1","k":["DSuhyBcPZEZLK-fcw5tzHn2N46wRCG_ZOoeKtWTOunRA"],"n":"EPYuj8mq_PYYsoBKkzX1kxSPGYBWaIya3slgCOyOtlqU","wt":"0","w":[],"c":[]}-AABAAmDoPp9jDio1hznNDO-3T2KA_FUbY8f_qybT6_FqPAuf89e9AMDXP5wch6jvT4Ev4QRp8HqtTb9t2Y6_KJPYlBw

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON0000e6_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"icp","kt":"1","k":["D8KY1sKmgyjAiUDdUBPNPyrSz_ad_Qf9yzhDNZlEKiMc"],"n":"EOWDAJvex5dZzDxeHBANyaIoUG3F4-ic81G6GwtnC4f4","wt":"0","w":[],"c":[]}-AABAAll_W0_FsjUyJnYokSNPqq7xdwIBs0ebq2eUez6RKNB-UG_y6fD0e6fb_nANvmNCWjsoFjWv3XP3ApXUabMgyBA{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"vrc","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb6S-RXeAqUKl8UuNwYpiaFARhMj-95elxmr7uNU8m7buVSPVLbTWcQYfI_04HoP_A_fvlU_b099fiEJyDSA2Cg

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"vrc","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo","a":{"i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o"}}-AABAAZqxNTt_LDZnmwEIaJX0cK9VKkCGq1UieEx6881MKKOtlRirvs_4pzFgmw3aRwAaIM2XV0biQ7xHeOoXglluDCA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"ixn","p":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":[]}-AABAAJp5cJcsiYANcHH5wDuyv_MzwxIu8NwDDKsQdal2gxUZFVQJS_PYnB2EDcGZCuUqwMhfthxRipygo3R2lhFFSDA

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"vrc","d":"E6T3oCaDYM_L7ODpamYs7sCClqOK1YbJbPRnXmk5r8Js","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA-1gNMOwfLk4nvPNvugFGGVC54_PmFAzyTq5jnP01zjmw-csl8TYmknXuD2EwRAa49MFb2fCoo7F46vWqMz3NDA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"rot","p":"E6T3oCaDYM_L7ODpamYs7sCClqOK1YbJbPRnXmk5r8Js","kt":"1","k":["DVcuJOOJF1IE8svqEtrSuyQjGTd2HhfAkt9y2QkUtFJI"],"n":"E-dapdcC6XR1KWmWDsNl4J_OxcGxNZw1Xd95JH5a34fI","wt":"0","wr":[],"wa":[],"a":[]}-AABAA4xNEJF7xAYr4OO7Fht2cbmQAan1n_7-km7CagLIfZA5avjEJLl7XE7x8QcWcgS_4rrCGPRuyjtRmRlOF4Oq7Ag

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"vrc","d":"EXCHktwBK5rYu9k00__7yKcEDqzFvxmCZ3Xq6cyuKDdc","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA8vws2rEnGtqiXZK4Zz0wj7Cy9byrGPu2h6tZ6yIR9MAfL1sKnb0rv5_3HF2OazuWpUylIAAgjEHvoiIZJR98AA

weboftrust-keripy-main/330 weboftrust-keripy-main repository prose file Apache-2.0 src/keri/demo/vectors/sam.2021-03-08_23-52-46_400816.txt https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/sam.2021-03-08_23-52-46_400816.txt WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/src/keri/demo/vectors/sam.2021-03-08_23-52-46_400816.txt. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 9809

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON0000e6_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"icp","kt":"1","k":["DSuhyBcPZEZLK-fcw5tzHn2N46wRCG_ZOoeKtWTOunRA"],"n":"EPYuj8mq_PYYsoBKkzX1kxSPGYBWaIya3slgCOyOtlqU","wt":"0","w":[],"c":[]}-AABAAmDoPp9jDio1hznNDO-3T2KA_FUbY8f_qybT6_FqPAuf89e9AMDXP5wch6jvT4Ev4QRp8HqtTb9t2Y6_KJPYlBw

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON0000e6_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"icp","kt":"1","k":["D8KY1sKmgyjAiUDdUBPNPyrSz_ad_Qf9yzhDNZlEKiMc"],"n":"EOWDAJvex5dZzDxeHBANyaIoUG3F4-ic81G6GwtnC4f4","wt":"0","w":[],"c":[]}-AABAAll_W0_FsjUyJnYokSNPqq7xdwIBs0ebq2eUez6RKNB-UG_y6fD0e6fb_nANvmNCWjsoFjWv3XP3ApXUabMgyBA{"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","t":"vrc","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAb6S-RXeAqUKl8UuNwYpiaFARhMj-95elxmr7uNU8m7buVSPVLbTWcQYfI_04HoP_A_fvlU_b099fiEJyDSA2Cg

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","t":"vrc","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo","a":{"i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"0","d":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o"}}-AABAAZqxNTt_LDZnmwEIaJX0cK9VKkCGq1UieEx6881MKKOtlRirvs_4pzFgmw3aRwAaIM2XV0biQ7xHeOoXglluDCA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"ixn","p":"EEnwxEm5Bg5s5aTLsgQCNpubIYzwlvMwZIzdOM0Z3u7o","a":[]}-AABAAJp5cJcsiYANcHH5wDuyv_MzwxIu8NwDDKsQdal2gxUZFVQJS_PYnB2EDcGZCuUqwMhfthxRipygo3R2lhFFSDA

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"1","t":"vrc","d":"E6T3oCaDYM_L7ODpamYs7sCClqOK1YbJbPRnXmk5r8Js","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA-1gNMOwfLk4nvPNvugFGGVC54_PmFAzyTq5jnP01zjmw-csl8TYmknXuD2EwRAa49MFb2fCoo7F46vWqMz3NDA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"rot","p":"E6T3oCaDYM_L7ODpamYs7sCClqOK1YbJbPRnXmk5r8Js","kt":"1","k":["DVcuJOOJF1IE8svqEtrSuyQjGTd2HhfAkt9y2QkUtFJI"],"n":"E-dapdcC6XR1KWmWDsNl4J_OxcGxNZw1Xd95JH5a34fI","wt":"0","wr":[],"wa":[],"a":[]}-AABAA4xNEJF7xAYr4OO7Fht2cbmQAan1n_7-km7CagLIfZA5avjEJLl7XE7x8QcWcgS_4rrCGPRuyjtRmRlOF4Oq7Ag

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"2","t":"vrc","d":"EXCHktwBK5rYu9k00__7yKcEDqzFvxmCZ3Xq6cyuKDdc","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA8vws2rEnGtqiXZK4Zz0wj7Cy9byrGPu2h6tZ6yIR9MAfL1sKnb0rv5_3HF2OazuWpUylIAAgjEHvoiIZJR98AA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"3","t":"rot","p":"EXCHktwBK5rYu9k00__7yKcEDqzFvxmCZ3Xq6cyuKDdc","kt":"1","k":["DT1iAhBWCkvChxNWsby2J0pJyxBIxbAtbLA0Ljx-Grh8"],"n":"EKrLE2h2nh3ClyJNEjKaikHWT7G-ngimNpK-QgVQv9As","wt":"0","wr":[],"wa":[],"a":[]}-AABAAqqEqdibF-C6u4JEskhSYU5SoHuuRp5neWDpitBdaCoiW7B-LpID1lKWVZ-XkmZASVncttdXg8wQAmClppAkABQ

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"3","t":"vrc","d":"EnxEgBlM2KMsoGezpySrCPjgQ9MQwqeKCjQy4ciE5O-8","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA7lqnQrPmhvHzxAHA0xaZKjzUVStxMeyZfvEvDpPFLE3BuZUu7Uig7lpu6Rkmyvcx0mCsLAJ7TxSxTYFBXOyzBg

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"4","t":"rot","p":"EnxEgBlM2KMsoGezpySrCPjgQ9MQwqeKCjQy4ciE5O-8","kt":"1","k":["DKPE5eeJRzkRTMOoRGVd2m18o8fLqM2j9kaxLhV3x8AQ"],"n":"EhVTfJFfl6L0Z0432mDUxeaqB_hlWPJ2qUuzG95gEyJU","wt":"0","wr":[],"wa":[],"a":[]}-AABAA_kNMrBU_96ccZQ75xssI-udqlnRkL7HHuvdF1gxV-VOPQtnWTweleCLxDbX8dUjF2JpCyf2QrbUy4ji1UqQlDg

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"4","t":"vrc","d":"EeaFSTtkd_UJ_JUGp8okcTGZ7Sct0FtmcjjxvJuDQUqM","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAApk563QbgrwkZEgaUILHNoX-oavLEPImVvw6XKCBXrHd367_pt3u_Tm2RtmWTjnmbwVUHa_asLXgfoyEpBvWzCA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"5","t":"rot","p":"EeaFSTtkd_UJ_JUGp8okcTGZ7Sct0FtmcjjxvJuDQUqM","kt":"1","k":["D1kcBE7h0ImWW6_Sp7MQxGYSshZZz6XM7OiUE5DXm0dU"],"n":"EDs-qIrh79lTtoIz4K9q_vu7-avDc79YkNCfK49HpwQg","wt":"0","wr":[],"wa":[],"a":[]}-AABAAQxiUKqpU58WAqBIhKWu2GvQ4Fy0BuY2hEPWSY6-xuaVBEdqyfOMBvpDU2C7fGyYREpgz1BZ7aEYoaIpjfU7aCw

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"5","t":"vrc","d":"E3s7ZqAMy7FBYtVPXbdodYnKPbmqfxEgQJGZ2ahwaH8g","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAAtshSNtnZc4zM0clQJcrDQ5k_sAgzyRJH_haE90HMOkZhoWFOGBfFShOzNGh6su7fb2yX85t3va0EZoqo_n8Bw

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"6","t":"rot","p":"E3s7ZqAMy7FBYtVPXbdodYnKPbmqfxEgQJGZ2ahwaH8g","kt":"1","k":["D4JDgo3WNSUpt-NG14Ni31_GCmrU0r38yo7kgDuyGkQM"],"n":"EvbWtNrsw7dfaWRiDMXcF6P90KM1gdfPhg7FWTIwD39c","wt":"0","wr":[],"wa":[],"a":[]}-AABAAvfpXKdqtK9Sff3gQP2CHl1A5sQ12Bk9WROn8ZVzUqHxrSX-TWnsru547u2u4pKbnkFI385mBEK91hp95xOt-DA

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"6","t":"vrc","d":"ERYxFPrDlZwuI2fQAbcqghi_oyVu-94BMYlNClb8v3BE","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAna8q3OBB1sKAy40QmgNHRENnF-1inxPKK9_dm5arFnBgaBFYA5W_WJwomnPsMdI9mYKoWMnEiT8gKfa9nLV1AA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"7","t":"rot","p":"ERYxFPrDlZwuI2fQAbcqghi_oyVu-94BMYlNClb8v3BE","kt":"1","k":["DVjWcaNX2gCkHOjk6rkmqPBCxkRCqwIJ-3OjdYmMwxf4"],"n":"EpusdZwamtwTwqtwOenXWKQ0FpX9yWnq0XHlOEgQmss0","wt":"0","wr":[],"wa":[],"a":[]}-AABAApaT1oMkPCGMF0r0vI5asciNcewaT217lR7yzuWxnffixzhdvjD_FpjmroU4kAEpKTo9tLWiuzBxTYDN2ICHxBA

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"7","t":"vrc","d":"ECL9tTKof5wF3kDN37_bDsL3C00GbvHUgoTyv2y_aOT8","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA0dkmxFEH9923G4haKnQYj6m7powuR9TLQiVPjHRgKxABE3Wm6q93YH5Z14iP8SGy5nLR_sR-ovygwWVihXs7CA

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000098_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"8","t":"ixn","p":"ECL9tTKof5wF3kDN37_bDsL3C00GbvHUgoTyv2y_aOT8","a":[]}-AABAAF6rk8xXVVOsNq-D_Y1UDi-jxwB_GGaoukE15teFtbzWi5yHSIok9RPysO-DFFlwXP5umM1c6eouONGfs4cLwBw

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"8","t":"vrc","d":"E1PbAJo-30Zxwt6CtGFjqmB2RCtOevTAbW7eTBoi1Auc","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAYG6q0PyDMyjS6QA2SoSQFMWZ7LQWWvaQVjv-81UuQVautHC_76CVFj0pcy6fhhoX--g0uT6ZIJthmfeN-QdJAw

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"9","t":"rot","p":"E1PbAJo-30Zxwt6CtGFjqmB2RCtOevTAbW7eTBoi1Auc","kt":"1","k":["DT1nEDepd6CSAMCE7NY_jlLdG6_mKUlKS_mW-2HJY1hg"],"n":"En-DkYLkIkPFZUjtn0iqT1Ze3wO4BOYKygRmcm3DI3L0","wt":"0","wr":[],"wa":[],"a":[]}-AABAA46Pq4Kz663lzIy8szrgWhEXWMnkSFChj4N6bcqVc6osuR6K2FV4hVBMuPhwVciX7OjzT_26hqZOz9FB4ihA3Dg

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"9","t":"vrc","d":"Ev6Hp_ZaM1qBXQaCfbj29qkPJMnfS0CUX__0nXZ0gwZo","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAA7KJeeJkgXc1lzCJW4Ahe21aAR65qtuOPKBBEXsvWOSkrULAipIdn2PDIvdjn1VrqGPH9pDoor7qUXV4rjUv5Bw

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"a","t":"rot","p":"Ev6Hp_ZaM1qBXQaCfbj29qkPJMnfS0CUX__0nXZ0gwZo","kt":"1","k":["DXgt9QzP71t5kPqC7qIBF5Mwm2hRemkPvlDy4rZCYabM"],"n":"E95iFxPub6KV5jAgadydQPZQwVfO2OX1Vw_Ln8ZRQExg","wt":"0","wr":[],"wa":[],"a":[]}-AABAALCv2m-mMBs9eS7wufWJ8UY1SOw_gZ7jgmLxA1EH6siOUVc1LYaXnVBhUG0-JcCYY_XknATn_npHEvK4LvTLyAg

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"a","t":"vrc","d":"E_heoz4Of8AMLbUeSVA4gN7AZBfTxnb1DS4GAEQpn5RQ","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAaaANwB_1im4nc74WVz8u0Vcl2IA1zrNm2eA_9FsRvUnqvgyZaFkTM2CHUAil3ib5B99uOaLAmQYNhHq2SDfpCQ

Tx ('127.0.0.1', 5621): {"v":"KERI10JSON000122_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"b","t":"rot","p":"E_heoz4Of8AMLbUeSVA4gN7AZBfTxnb1DS4GAEQpn5RQ","kt":"1","k":["DnotwxXK7tGnkeBgSmIHfplztw4C-H5uEHUxSwYHhlHY"],"n":"EPrgfk9Jxnez37qVyiCZqR7Ev-M7XFKcjWum3_lVe7Nk","wt":"0","wr":[],"wa":[],"a":[]}-AABAA40KehLE7eYtrZZ0BXBKeOLft9ckoCB9EcAMHKEQ5vK_FeKAtKP8WyI0EHVb-jD-9HB3ak-anE7GjgEXTSlYRCw

Rx ('127.0.0.1', 5621): {"v":"KERI10JSON000105_","i":"EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w","s":"b","t":"vrc","d":"E-4tiyrNooh13qDSiBb64r39nBkazserD97_7qvc1U3g","a":{"i":"EpDA1n-WiBA0A8YOqnKrB-wWQYYC49i5zY_qrIZIicQg","s":"0","d":"EGFSGYH2BjtKwX1osO0ZvLw98nuuo3lMkveRoPIJzupo"}}-AABAAO0wtemJUc2cZV4QLNsM_dGWbVqjWvCgoFeCKwJSflgoN1ykF-8cg0TSZTvhkFLgCCB4ZmX_KwR4cf88ltjFABA

weboftrust-keripy-main/336 weboftrust-keripy-main repository prose file Apache-2.0 src/keri/end/static/robots.txt https://github.com/WebOfTrust/keripy/blob/main/src/keri/end/static/robots.txt WebOfTrust / keripy-main, https://github.com/WebOfTrust/keripy/blob/main/src/keri/end/static/robots.txt. Licensed under the Apache License 2.0; the license and any notices are in the repository. Found through KERISSE. 31

robotstxt.org

User-agent: *

Advanced export

JSON shape: default, array, newline-delimited, object

CSV options:

CREATE TABLE document_text (id TEXT PRIMARY KEY, source_id TEXT, kind TEXT, license TEXT, title TEXT, url TEXT,
        credit TEXT, chars INTEGER, text TEXT);
Powered by Datasette · Queries took 2698.068ms