<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jayesh Kathale</title>
    <description>The latest articles on DEV Community by Jayesh Kathale (@jashk120).</description>
    <link>https://dev.to/jashk120</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2029277%2F9b96615c-8f21-4a0c-80dd-71ad1fef43d3.png</url>
      <title>DEV Community: Jayesh Kathale</title>
      <link>https://dev.to/jashk120</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jashk120"/>
    <language>en</language>
    <item>
      <title>I Read the DID and VC Specs So You Don't Have To</title>
      <dc:creator>Jayesh Kathale</dc:creator>
      <pubDate>Mon, 04 May 2026 06:35:43 +0000</pubDate>
      <link>https://dev.to/jashk120/i-read-the-did-and-vc-specs-so-you-dont-have-to-1ldb</link>
      <guid>https://dev.to/jashk120/i-read-the-did-and-vc-specs-so-you-dont-have-to-1ldb</guid>
      <description>&lt;p&gt;You don't own your Twitter username. The company does. If the platform shuts down tomorrow, that identity is gone — you can recreate it somewhere else, but it's not the same. Your followers, your history, your reputation — tied to a string that a corporation controls.&lt;/p&gt;

&lt;p&gt;This is a common but mostly ignored problem. And it applies to more than social media. Your GitHub account, your email, your developer identity — all of it lives on servers you don't control, owned by companies that can revoke access, change the rules, or simply disappear.&lt;/p&gt;

&lt;p&gt;DIDs — Decentralized Identifiers — fix this by giving you a cryptographic identifier that you control. No company in the middle. No account to get banned. Just a keypair that's yours.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is a DID?
&lt;/h2&gt;

&lt;p&gt;A DID is just a string. Three parts: the scheme (&lt;code&gt;did&lt;/code&gt;), the method (&lt;code&gt;example&lt;/code&gt;, &lt;code&gt;hedera&lt;/code&gt;, &lt;code&gt;key&lt;/code&gt;), and a unique identifier. Like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1uiwca32awvi6rydnu8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1uiwca32awvi6rydnu8.png" alt="DID structure" width="500" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The method tells you &lt;em&gt;where&lt;/em&gt; this DID lives and &lt;em&gt;how&lt;/em&gt; to look it up. &lt;code&gt;did:hedera:mainnet:abc123&lt;/code&gt; lives on Hedera. &lt;code&gt;did:key:abc123&lt;/code&gt; is self-contained in the string itself. Different methods, same concept.&lt;/p&gt;

&lt;p&gt;The string alone is useless. What matters is what it &lt;em&gt;resolves to&lt;/em&gt; — the DID Document. Think of resolution like DNS: you put in a domain name, you get back an IP address. You put in a DID, you get back a document describing who controls it.&lt;/p&gt;

&lt;p&gt;That document looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"did:example:123456789abcdefghi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"authentication"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Multikey"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"controller"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"did:example:123456789abcdefghi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"publicKeyMultibase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"z6MkmM42vxfqZQsv4..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;authentication&lt;/code&gt; field is the important part. It says: &lt;em&gt;"whoever holds the private key matching this public key controls this DID."&lt;/em&gt; That's your proof of ownership — not a password, not a company's database. A cryptographic keypair you hold.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verifiable Credentials — a digital passport
&lt;/h2&gt;

&lt;p&gt;A VC is simply a verified claim about you — issued, signed, and portable.&lt;/p&gt;

&lt;p&gt;Think of a passport. The government (issuer) says "this person is a citizen of this country" and stamps it with their authority. You (holder) carry it. The border officer (verifier) checks it.&lt;/p&gt;

&lt;p&gt;VCs work the same way, just digital:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issuer&lt;/strong&gt; — any entity that makes a claim about you. In Hiero's case, Heka issues a VC saying "this GitHub account owns this GPG key."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holder&lt;/strong&gt; — you. The VC lives in your wallet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifier&lt;/strong&gt; — whoever needs to check the claim. In Hiero, the GitHub App verifies your VC when you open a PR.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key difference from a real passport — nobody needs to call the government to verify it. The issuer's signature is enough. Fully offline, fully cryptographic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verifiable Presentations&lt;/strong&gt; are what you send to a verifier. You take your VC, wrap it, and sign it yourself. This proves two things at once — the issuer made this claim, and you are the one presenting it right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  DID/VC vs existing GitHub/GPG verification
&lt;/h2&gt;

&lt;p&gt;The existing GPG approach signs your commits with a private key. &lt;br&gt;
GitHub shows a "Verified" badge if the signing key matches the key &lt;br&gt;
you've uploaded to your account. Simple, and it works — until it doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where GPG falls short:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Key distribution is manual and fragile. You upload your public key 
to GitHub with no standard way to discover or verify it elsewhere.&lt;/li&gt;
&lt;li&gt;Identity is still GitHub-anchored. You're trusting GitHub to store 
your key and verify against it. GitHub is still the trust root.&lt;/li&gt;
&lt;li&gt;AI agents can generate a GPG key, upload it to a fake GitHub 
account, and pass all verification checks. The badge means 
"signed by a key on this account" — not "signed by a real human."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What DID/VC adds:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The trust root moves off GitHub. Heka issues a VC binding your &lt;br&gt;
GitHub account to a DID anchored on Hedera — so verification &lt;br&gt;
doesn't depend on GitHub's database.&lt;/p&gt;

&lt;p&gt;Revocation is built into the model. A compromised credential can &lt;br&gt;
be revoked at the issuer level without touching GitHub at all.&lt;/p&gt;

&lt;p&gt;The same DID works across platforms — not just GitHub. Your &lt;br&gt;
identity is portable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest caveat:&lt;/strong&gt; this raises the bar, it doesn't eliminate &lt;br&gt;
the problem. A sophisticated attacker who compromises Heka or the &lt;br&gt;
issuance flow breaks everything. The trust root shifts — it doesn't &lt;br&gt;
disappear.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Real Example — Hiero Contributor Verification
&lt;/h2&gt;

&lt;p&gt;This isn't theoretical. The &lt;a href="https://github.com/hiero-ledger" rel="noopener noreferrer"&gt;Hiero open source ecosystem&lt;/a&gt; is building exactly this for GitHub contributor identity, using the &lt;a href="https://github.com/hiero-ledger/heka-identity-platform" rel="noopener noreferrer"&gt;Heka Identity Platform&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Onboarding flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You log in with GitHub&lt;/li&gt;
&lt;li&gt;Heka creates a wallet and a DID for you&lt;/li&gt;
&lt;li&gt;You link your GPG key to that DID&lt;/li&gt;
&lt;li&gt;Heka issues a VC: &lt;em&gt;"this GitHub account owns this GPG key"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Done — your identity is now verifiable without Heka being involved in every check&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Verification flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You open a pull request&lt;/li&gt;
&lt;li&gt;A GitHub App webhook fires&lt;/li&gt;
&lt;li&gt;The App resolves your DID and retrieves your DID document&lt;/li&gt;
&lt;li&gt;It checks your Verifiable Presentation&lt;/li&gt;
&lt;li&gt;Reports pass or fail as a GitHub status check&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I've been exploring this codebase as part of applying for the LFDT mentorship program and built a stub GitHub App that demonstrates the verification flow: &lt;a href="https://github.com/Jashk120/hiero-contributor-verify" rel="noopener noreferrer"&gt;hiero-contributor-verify&lt;/a&gt;. Currently uses stub data but testnet integration is coming.&lt;/p&gt;




&lt;h2&gt;
  
  
  The parts I simplified
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Key loss&lt;/strong&gt; — if you lose the private key, the DID is gone. The problem shifts from platform custody to key management. Recovery requires building rotation logic on top.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Revocation&lt;/strong&gt; — "fully offline" was misleading. Revocation checks often require online registries or status lists. Freshness is non-trivial.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;"No middleman" is overstated&lt;/strong&gt; — &lt;code&gt;did:hedera&lt;/code&gt; still depends on Hedera's network and governance. You're shifting infrastructure trust, not eliminating it. And Heka as a central issuer means the system layers cryptographic verification on top of existing centralized identity — which is useful, but different from the pitch.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/TR/did-1.1/" rel="noopener noreferrer"&gt;W3C DID Spec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/TR/vc-data-model-2.0/" rel="noopener noreferrer"&gt;W3C VC Data Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hashgraph/did-method/blob/master/hedera-did-method-specification.md" rel="noopener noreferrer"&gt;Hedera DID Method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hiero-ledger/heka-identity-platform" rel="noopener noreferrer"&gt;Heka Identity Platform&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>blockchain</category>
      <category>privacy</category>
      <category>security</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
