<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Sergey's Ramblings</title>
        <link>https://paragraph.com/@ukstv</link>
        <description>undefined</description>
        <lastBuildDate>Mon, 06 Apr 2026 16:59:42 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Sergey's Ramblings</title>
            <url>https://storage.googleapis.com/papyrus_images/7ff76b68772e8a7f1a12eccb008f5bc2</url>
            <link>https://paragraph.com/@ukstv</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Composing non-generative DIDs]]></title>
            <link>https://paragraph.com/@ukstv/composing-non-generative-dids</link>
            <guid>6mmJeMHwOGCjSSZcmhB6</guid>
            <pubDate>Wed, 07 Jun 2023 17:03:35 GMT</pubDate>
            <description><![CDATA[Couple of weeks ago Joel Thorstensson published a post called "Generative DID Maximalism". At the time of publication, there are 167 DID methods avail...]]></description>
            <content:encoded><![CDATA[<figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8c52651928bd5327413111d1a92a08f4.jpg" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAASCAIAAAC1qksFAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoklEQVR4nM1UTShEURj97r1vRiNmhkbGz4qF1CzUDBEbksUrfxsjG5SEkJH5Kz9Z2FpIKQtlp2RJFmRhwYJsKFmJhJQiWVg4+uZNI3Yz7ymnuzqdd875bt+7RP8IQpJUfIS03Fr8NhWSSYvciQ9JraTG2zjibRrRSvxMMW8+Q3Bx5fXpqw+hF8SAKBB6gb56rxVWpgTm3D0V/ceIA51br77hlbLgbOvGYxToO4LKL0/IMp5D8pfNSxdxoGX5kkgzvJSraOCMp2lcPE3IpKn6Y7cIA65AG3P2LBJS2HL6TpgcvTYzhFRE5PZ3Tb4h/Inynvkkmeirr9+EgdAzXP7OlDjdADbK8emhZ0x9oPcYMtvNXW12IgrENiLAxBOcVa2ZBhjXnVs0fIXJN85wVutMaxoRBfcQAYYuoZzelDjDIWpntuPA4DmUu5SItOLK4C7G73hf6+Z2UrKMkNyZwva1d7e/K8nZnN37vLUdm6/S4TJR/ztGCa3A+JsNr/rpw4aFA2HPtcKdIX69RcrTIFS2RU8FGfhhJJRD2PN+chbjL73TxRerWn+rIcsJIgAAAABJRU5ErkJggg==" nextheight="2532" nextwidth="4500" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Couple of weeks ago Joel Thorstensson published a post called <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out dont-break-out" href="https://www.stigmergic.org/posts/generative-did-maximalism/">"Generative DID Maximalism"</a>. At the time of publication, there are 167 DID methods available. We could reasonably assume, there will be more: one for every major brand, like Adobe or Facebook. Joel reasonably notices that most of the methods require quite heavy machinery to run, which does not play well with the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out dont-break-out" href="https://www.w3.org/TR/did-core/#design-goals"><u>stated goals</u></a> of DID ecosystem. That plainly makes various DID methods not interoperable, in a sense that a DID-powered application would have to spend extensive resources (blockchain nodes, indexers, databases, data retrieval APIs, etc) to support all of the DID methods.</p><p>The blog post suggests we focus purely on generative DID methods, i.e. the ones that do not require external software to resolve and do not support mutability, and compose them using a revocation registry to make a user's DID mutable.</p><p>The question still remains on what to do with other ~160 DID methods, let's call them non-generative or NG. What if a user got stuck with some proprietary or heavy method, and still would like to get access to an application that supports generative DID methods only? To make the situation more concrete, let's consider Alice who is given <em>did:ng:alice</em>. She would like to make a Ceramic stream, which for trust reasons, only support generative DIDs, like <em>did:key</em> or <em>did:pkh</em>. How can we make that happen?</p><p>Let's play the situation. Alice authors a stream as <em>did:ng:alice</em>. That fails, as there is no resolver for <em>did:ng</em> on Ceramic nodes. Okay, let Alice have a blockchain account which maps to <em>did:pkh</em>. She authors a stream using <em>did:pkh</em>, but there is no link to <em>did:ng:alice</em>. That's sad. Let's delegate a capability for the action from <em>did:ng:alice</em> to <em>did:pkh</em> she owns. Again, in the process of checking the capability, we'd need to resolve <em>did:ng:alice</em>, which does not work. Back to square one. If only we could somehow prove that <em>did:ng:alice</em> is the same entity as <em>did:pkh</em>: <em>did:pkh</em> → <em>did:ng:alice</em>.</p><p>To solve that we'd need to have a sort of link between <em>did:pkh</em> and <em>did:ng:alice</em>. I know of two ways to do that: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out dont-break-out" href="https://www.w3.org/TR/vc-data-model-2.0/">Verifiable Credentials</a> (or VC) and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out dont-break-out" href="http://attest.sh/"><u>attestations</u></a> (however they are implemented). They are more or less equivalent for our purposes, so let's call both an attestation. That way the link would look <em>did:pkh</em> → attestation → <em>did:ng:alice</em>. If we trust the attester, we trust the link.</p><p>Here I get flashbacks to various discussions around trust in Verifiable Credentials realm. Let's say we have an application that gates some content just to people who has &gt;100 Twitter followers. A user presents a credential. Formally, the credential is valid: well-formed and properly signed. What if it was issued by a malicious actor, and the user is a bot having 0 followers? The answer I get usually is, well, the app should maintain a list of trusted issuers. Seems like a yet another interoperability nightmare, unacceptable for a decentralized network.</p><p>One idea that I have to resolve that conundrum is a DAO. Yes, a thing that is not in vogue anymore. What if we could form a DAO around an attestation schema? Every DAO participant claims to truthfully issue attestations, and provides a stake. If they are found guilty by issuing a false attestation, the stake gets burned. What gets changed from an application perspective then? Instead of maintaining a list of trusted issuers, it'll have a single self-maintained source of truth if an issuer can be trusted.</p><p>So, let's do a recap of the scheme. A user acquires a non-generative DID A, which she accepts as her online persona. Then she opens an application which allows you to log in with an ephemeral generative DID. When logging in she uses an ephemeral generative DID B (generate just in time) accompanied with a proof link A → B. Now the app knows that the user is DID B, and not DID A, and could interact with a proper entity, not an ephemeral one.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/35eabc0ad4f12d5ab8a4a817f6d6d74f.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAJCAIAAADcu7ldAAAACXBIWXMAAC4jAAAuIwF4pT92AAABhUlEQVR4nJWSIbPrIBCF+Q3vipqKmNia6Jr+jpr8hChUTU0V6qooTBUqCrUKtQqFQqHWoVAo7pSdm+m8mTfz+qkkE/ZwzlnR/g+t9TiOSqn2IaK1Zq0NIfzrDyLCjlIKABAxxviBgPf+crlIKYkodkII3ntEzB3nXGvNGJNSMsbUWr33KaW/BtVaS4dP5Zz5VVhrea7urOtqrfXeb9vGSiklAIgxeu9jjADAqvUNNkpEpZR3sZTSS4BvN8/zOI7TNBljiOi7o5RCRAAgotZaztlai4jWWp7F7Ea3bfv683U4HOZ5LqUQ0UtAa3273ZZlkVLO8/x4PIwx9/tddpxzAMCZ5JwBwDlnrT2fz+KX6/UKAFrr0+k0juMwDNM0LcsSQhAcxbIs/FUIIaWstT6fT9chIgAIISBiCIHdsInj8TgMgxBiXdecc0qJiDgfruEVkTGGdyN0YoycCXdTStlLjjFu21ZKQcS95L0DfuDoSyl7PYKluCJmXwM+mVJyzrED3q6P1vQHhdG4eC2TVK0AAAAASUVORK5CYII=" nextheight="1070" nextwidth="3683" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>While general scheme is clear, few issues remain. First, now it is generally assumed, that identification (i.e. asking for the users's account) happens independently of authentication (i.e. asking for the signature to prove ownership of the account). We as an industry would have to adopt something like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out dont-break-out" href="https://chainagnostic.org/CAIPs/caip-222"><u>CAIP-222</u></a> in a wallet to allow the user present herself as she wishes. Second, I guess, request of the attestation should be a part of the user flow: the wallet should get the attestation and present it to the application, and that should be invisible to the user.</p><p></p><p>Photo by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out dont-break-out" href="https://unsplash.com/@benjaminsweet?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Ben Sweet</a> on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out dont-break-out" href="https://unsplash.com/photos/2LowviVHZ-E?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>]]></content:encoded>
            <author>ukstv@newsletter.paragraph.com (Sergey Ukustov)</author>
            <category>did</category>
            <category>authentication</category>
            <category>identity</category>
        </item>
    </channel>
</rss>