{"id":19571592,"url":"https://github.com/block-core/blockcore-did-method","last_synced_at":"2026-03-19T10:34:14.120Z","repository":{"id":63722719,"uuid":"291560799","full_name":"block-core/blockcore-did-method","owner":"block-core","description":"Blockcore DID Method specification","archived":false,"fork":false,"pushed_at":"2020-08-30T23:33:05.000Z","size":4,"stargazers_count":0,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-07T18:35:53.494Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/block-core.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-08-30T22:16:35.000Z","updated_at":"2022-11-24T14:55:10.000Z","dependencies_parsed_at":"2022-11-24T18:32:29.928Z","dependency_job_id":null,"html_url":"https://github.com/block-core/blockcore-did-method","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/block-core/blockcore-did-method","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/block-core%2Fblockcore-did-method","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/block-core%2Fblockcore-did-method/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/block-core%2Fblockcore-did-method/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/block-core%2Fblockcore-did-method/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/block-core","download_url":"https://codeload.github.com/block-core/blockcore-did-method/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/block-core%2Fblockcore-did-method/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29954962,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-28T22:53:01.873Z","status":"ssl_error","status_checked_at":"2026-02-28T22:52:50.699Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-11T06:19:23.913Z","updated_at":"2026-02-28T23:31:47.201Z","avatar_url":"https://github.com/block-core.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://user-images.githubusercontent.com/5221349/72841405-93c2ce80-3c96-11ea-844b-3e1ff782b1ae.png\" height=\"100\" alt=\"Blockcore\" /\u003e\n  \u003c/p\u003e\n  \u003ch3 align=\"center\"\u003e\n    Blockcore Identity\n  \u003c/h3\u003e\n  \u003cp align=\"center\"\u003e\n    Blockcore DID Method specification\n  \u003c/p\u003e\n\u003c/p\u003e\n\n# Blockcore DID Method specification\n\nVersion: 0.0.1\n\n[DID Specification Registries](https://w3c.github.io/did-spec-registries/#did-methods)\n\n## Summary\n\nDecentralized identifiers (DIDs) are a new type of identifiers that enables verifiable, self-sovereign digital identity. Blockcore supports decentralized identities through the Blockcore Storage feature.\n\nThis specification describes how the Blockcore Identity framework aligns with the DID specification and how the Blockcore Universal Resolver works.\n\nThis specification conforms to the requirements specified in the [DIDs specification](https://www.w3.org/TR/did-core/) currently published by the W3C Credentials Community Group.\n\nThe Blockcore Identity registry is a permissionless and borderless runtime for identities.\n\n## Blockcore DID Method Name\n\nThe namestring that shall identify this DID method is: `is`.\n\nA DID that uses this method **MUST** begin with the following prefix: `did:is`. Per this DID specification, this string **MUST** be in lowercase.\n\nThe remainder of the DID, after the prefix, can either be additional sub-prefix or the profile identifier.\n\n## Profile Identifier / KeyID\n\nThe profile identifier is derived as an P2PKH address (e.g. like Bitcoin address) with the [prefix](https://en.bitcoin.it/wiki/List_of_address_prefixes) of pubkey address of 55 (P, uppercase P) and script address of 117 (p, lowercase p).\n\nThis means that the latter part of the identifier always starts with capital `P`.\n\n## Example\n\nA valid Blockcore DID might be:\n\n```\ndid:is:PLBNc1Ph6whu1vbQGEuRywTTHCEnfDDuXh\n```\n\n## Hierarchical Deterministic Key Generation\n\nThe keys used for Blockcore Identity is based upon the same scheme such as regular wallets. You can generate unique private keys for each of your identities and manually manage them, or you can rely on a HD scheme ([BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)).\n\nThe [BIP44 prefix](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki) for Blockcore Identity derived keys is 302. This is up for revision before finalization of the implementation.\n\nKeys used for Blockcore Identity only supports secp256k1 algorithm, identifies as \"ES256K\" in the JOSE libraries.\n\n## Operations\n\nThe following methods is available for publishing, updating and deleting an Blockcore Identity.\n\nBlockcore Identities resides on all public and private Blockcore-based blockchain nodes that has the Blockcore Storage feature enabled. The Blockcore Identities are cross-chain compatible across all Blockcore-derived blockchains.\n\n### Create (Register)\n\nYou can create identities in any programming language, and it relies on open standards to create and sign the identity profile documents.\n\nFoundations for the runtime is Javascript Object Signing and Encryption (JOSE), which allows cross-platform signed documents (JSON Web Signature).\n\nBlockcore provides these libraries to help simplify the creation of identities:\n\n* [Blockcore Javascript Object Signing and Encryption (JOSE) for .NET](https://github.com/block-core/blockcore-jose)\n\n* [Blockcore Message](https://github.com/block-core/blockcore-message), Library that helps signing messages in the browser.\n\nStep by step guide:\n\n1. Create your identity JSON structure according to the latest schema.\n1. Encode the JSON structure using JSON Web Signature. This is a JWT with a signature attached.\n1. Publish the JWT using the latest API method, either on local Blockcore node or public public (also known as Blockcore Hub).\n\nExample of signed [JWS](https://tools.ietf.org/html/rfc7515):\n```\neyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QiLCJraWQiOiJQTEJOYzFQaDZ3aHUxdmJRR0V1Unl3VFRIQ0VuZkREdVhoIn0.eyJpZGVudGlmaWVyIjoiZGlkOmlzOlBMQk5jMVBoNndodTF2YlFHRXVSeXdUVEhDRW5mRER1WGgiLCJpYXQiOjE1OTg4MDMxODA0MzgsIkB0eXBlIjoiaWRlbnRpdHkiLCJAc3RhdGUiOjAsIm5hbWUiOm51bGwsInNob3J0bmFtZSI6bnVsbCwiYWxpYXMiOm51bGwsInRpdGxlIjpudWxsLCJlbWFpbCI6bnVsbCwidXJsIjpudWxsLCJpbWFnZSI6bnVsbCwiaHVicyI6bnVsbH0.HwQuFSNgMLJuHUaBY0edliaY0FJHD9O4hpSYabAd3y2KNBuR1ChAO9IpvikJNDHIyYgmWjqj8Kt2IgK3hwM4VBM\n```\n\nThe token can be decoded using web sites such as https://jwt.ms/.\n\nThe above token decodes to the following:\n\n```\n{\n  \"alg\": \"ES256K\",\n  \"typ\": \"JWT\",\n  \"kid\": \"PLBNc1Ph6whu1vbQGEuRywTTHCEnfDDuXh\"\n}.{\n  \"identifier\": \"did:is:PLBNc1Ph6whu1vbQGEuRywTTHCEnfDDuXh\",\n  \"iat\": 1598803180438,\n  \"@type\": \"identity\",\n  \"@state\": 0,\n  \"name\": null,\n  \"shortname\": null,\n  \"alias\": null,\n  \"title\": null,\n  \"email\": null,\n  \"url\": null,\n  \"image\": null,\n  \"hubs\": null\n}.[Signature]\n```\n\nThe only required parts of the identity profile is the `identifier`. Users (and machines) can have a public profile of only the identifier and no other metadata attached.\n\n### Read (Resolver)\n\nBlockcore DID's associated DID document (also known as Identity Profile) can be looked up using the REST API of a node or a hub.\n\nBlockcore hosts a public hub that can be used to publish and read identities.\n\nhttps://www.did.is/\n\nExample of result from REST API:\n\n```\n{\n  \"id\": \"did:is:PLBNc1Ph6whu1vbQGEuRywTTHCEnfDDuXh\",\n  \"version\": 4,\n  \"header\": \"eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QiLCJraWQiOiJQTEJOYzFQaDZ3aHUxdmJRR0V1Unl3VFRIQ0VuZkREdVhoIn0\",\n  \"payload\": \"eyJpZGVudGlmaWVyIjoiZGlkOmlzOlBMQk5jMVBoNndodTF2YlFHRXVSeXdUVEhDRW5mRER1WGgiLCJpYXQiOjE1OTg4MDMxODA0MzgsIkB0eXBlIjoiaWRlbnRpdHkiLCJAc3RhdGUiOjAsIm5hbWUiOm51bGwsInNob3J0bmFtZSI6bnVsbCwiYWxpYXMiOm51bGwsInRpdGxlIjpudWxsLCJlbWFpbCI6bnVsbCwidXJsIjpudWxsLCJpbWFnZSI6bnVsbCwiaHVicyI6bnVsbH0\",\n  \"signature\": \"HwQuFSNgMLJuHUaBY0edliaY0FJHD9O4hpSYabAd3y2KNBuR1ChAO9IpvikJNDHIyYgmWjqj8Kt2IgK3hwM4VBM\",\n  \"content\": \n  {\n    \"identifier\": \"did:is:PLBNc1Ph6whu1vbQGEuRywTTHCEnfDDuXh\",\n    \"type\": \"identity\",\n    \"state\": 0,\n    \"timestamp\": \"1598803180438\"\n  }\n}\n```\n\nTo validate this result, the header, payload and signature must be combined with an `.` seperator. Use one of the .NET or JavaScript libraries provided by Blockcore, or another JOSE-library.\n\n### Update (Replace)\n\nThe identities on Blockcore Identity registry is always upsert, meaning that there are no difference between new created identities and updates.\n\nThere is one requirement for an update to succeed, and that is for the \"iat\" timestamp field to be updated with a higher value.\n\n### Delete (Replace/Revoke)\n\nDeleting an identity is similar to create/update, but all fields should be set to null and the `@state` must be set to 999.\n\nKnown states:\n\n- 0: Active Identity Profile\n- 999: Deleted Identity Profile\n\nA deleted identity can be recreated at a later time. It is left empty in the registry to avoid older nodes coming online, re-adding the identity to the decentralized node storage.\n\n## Security and Privacy Considerations\n\nThere are no limits to the amount of identity profiles that a user can create. This means they can improve their privacy by acting under different identities for different purposes.\n\nYour identities can easily be correlated by a node, so don't expect identities in the same wallet to be completely sepearate.\n\nThe private key used to sign the identities, has the same security as Bitcoin and Blockcore-based blockchain wallet addresses.\n\nIdentities that are published to nodes, can potentially be stored forever. Delete of an identity is only a request to nodes to remove the information, a node can potentially archieve and index all published identities.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblock-core%2Fblockcore-did-method","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblock-core%2Fblockcore-did-method","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblock-core%2Fblockcore-did-method/lists"}