{"action":"created","comment":{"url":"https://api.github.com/repos/hyperledger/indy-node/pulls/comments/165503994","pull_request_review_id":93426694,"id":165503994,"diff_hunk":"@@ -0,0 +1,507 @@\n+# Anoncreds Design\n+Here you can find the requirements and design for Anoncreds workflow (including revocation).\n+\n+* [Anoncreds Link](#anoncreds-links)\n+* [Requirements](#requirements)\n+* [Technical goals](#technical-goals)\n+* [Referencing Schema and CredDef in Credentials and Proofs](#referencing-schema-and-creddef-in-credentials-and-proofs)\n+* [How Prover and Verifier get keys for Credentials and Proofs](#how-prover-and-verifier-get-keys-for-credentials-and-proofs)\n+* [Timestamp Support in State](#timestamp-support-in-state)\n+* [Changes in Anoncreds Protocol](#changes-in-anoncreds-protocol)\n+* [SCHEMA](#schema)\n+* [CRED_DEF](#cred_def)\n+* [REVOC_REG_DEF](#revoc_reg_def)\n+* [REVOC_REG](#revoc_reg)\n+\n+### Anoncreds Links\n+\n+Anoncreds protocol links:\n+- [Anoncreds Sequence Diagram](https://github.com/hyperledger/indy-sdk/blob/master/doc/libindy-anoncreds.svg)\n+- [Anoncreds Protocol Math](https://github.com/hyperledger/indy-crypto/blob/master/libindy-crypto/docs/AnonCred.pdf)\n+- [Anoncreds Protocol Crypto API](https://github.com/hyperledger/indy-crypto/blob/master/libindy-crypto/docs/anoncreds-design.md)\n+\n+### Requirements\n+1. Creation of Schemas:\n+    1. Schema Issuer needs to be able to create multiple schemas by the same issuer DID.\n+    1. Schema Issuer needs to be able to evolve existing schema adding new attributes.\n+    1. We need to keep reputation for Schema's Issuer DID.\n+    1. We should not have any semver assumptions for Schema's version by the Ledger.\n+1. Creation of Cred Def:\n+    1. CredDef Issuer may not be the same as Schema issuer.\n+    1. CredDef Issuer needs to be able to create multiple CredDefs by the same issuer DID.\n+    1. CredDef Issuer needs to be able to create multiple CredDefs for the same Schema by the same issuer DID.\n+    1. We need to keep reputation for CredDef's Issuer DID.\n+1. Creation of Revocation entities (Def and Registry):\n+    1. RevocRegDef Issuer may not be the same as Schema Issuer and CredDef issuer. \n+    1. RevocRegDef Issuer needs to be able to create multiple RevocRegDefs for the same issuer DID.\n+    1. RevocRegDef Issuer needs to be able to create multiple RevocRegDef for the same CredDef by the same issuer DID.\n+    1. We need to keep reputation for RevocRegDef's Issuer DID.\n+1. Referencing Schema/CredDef/RevocRegDef:\n+    1. Prover needs to know what CredDef (public keys), Schema and RevocRegDef \n+    were used for issuing the credential.  \n+    1. Verifier needs to know what CredDef (public keys), Schema and RevocRegDef \n+    were used for issuing the credential from the proof.\n+1. <b>Keys rotation</b>:\n+    1. Issuer needs to be able to rotate the keys and issue new credentials with the new keys.\n+    1. Issuer needs to be able to rotate the keys using the same Issuer DID.\n+1. <b>Validity of already issued credentials when key is compromised</b>: \n+    1. If the Issuer's key is compromised and the issuer suspects that it's compromised \n+    from the very beginning, then the Issuer should be able to rotate the key so that all issued credentials\n+    becomes invalid.\n+    All new credentials issued after rotation should be verifiable against the new key.\n+    1. If the Issuer published a key at time A, and at time C he realised that the key was compromised at time B (A < B < C), \n+    then the Issuer should be able to rotate the key so that all credentials\n+    issued before time B can be successfully verified using old key, and\n+    all credentials issued between B and C becomes invalid.\n+    All new credentials issued after C should be verifiable against the new key.\n+    1. The Issuer needs to be able to rotate the keys multiple times. Requirement 5.ii must be true for each key rotation.  \n+1. <b>Revocation</b>\n+    1. Verifier needs to be able to Verify that the credential is not revoked at the current time\n+    (the time when proof request is created).\n+    1. Verifier needs to be able to Verify that the credential is not revoked at the given time (any time in the past).       \n+1. Querying\n+    1. One needs to be able to get all CRED_DEFs created by the given Issuer DID.\n+    1. One needs to be able to get all SCHEMAs created by the given Issuer DID.\n+    1. One needs to be able to get all SCHEMAs with the given name created by the given Issuer DID.\n+    1. One needs to be able to get all SCHEMAs with the given name and version created by the given Issuer DID.\n+    1. One needs to be able to get all REVOC_REG_DEFs created by the given Issuer DID.\n+    1. One needs to be able to get all REVOC_REG_DEFs created by the given Issuer DID for the given CRED_DEF.    \n+\n+### Technical goals\n+* Define how Schemas, CreDefs and RevocRegDefs are identified (seqNo, UUID, primary key tuples?)\n+* Define how to deal with Requirements 6.\n+* Define Revocation-related transactions and necessary changes in indy-node.\n+\n+\n+### Referencing Schema and CredDef in Credentials and Proofs\n+* Schema is referenced by unique `SchemaUUID`.\n+    * Created for each new Schema.\n+    * This is different from Schema Issuer DID (DID used to send `SCHEMA` txn) which can be the same for \n+    any number of Schemas.\n+* CredDef is referenced by unique `CredDefUUID`.\n+    * Created for each new CredDef.\n+    * This is different from CredDef Issuer DID (DID used to send `CRED_DEF` txn) which can be the same for \n+    any number of CredDef.\n+* RevocRegDef and RevocReg are referenced by unique `RevocRegDefUUID`.\n+    * Created for each new RevocRegDef.\n+    * Used to update RevocReg.\n+    * This is different from RevocRegDef Issuer DID (DID used to send `REVOC_REG_DEF` txn) which can be the same for \n+    any number of RevocRegDef.\n+* Each `UUID` can be considered as a global UUID within the Ledger.\n+The Ledger can guarantee that malicious party can not change/break existing entity \n+defined by a UUID by \n+and checking if there is an entity with the given UUID already existent, plus\n+checking the ownership when modifying existing entities (only the issuer who created en entity with the given UUID can modify it). \n+\n+      \n+### How Prover and Verifier get keys for Credentials and Proofs\n+* Proofs and credentials come with `schemaUUID`, `credDefUUID`, `revocDefUUID`.\n+* Also there can be `issuanceTime` attribute in each credential (which can be disclosed in the proof).\n+* Prover/Verifier looks up SCHEMA using `GET_SCHEMA(schemaUUID)` request to the ledger\n+* Prover/Verifier looks up CRED_DEF using `GET_CRED_DEF(credDefUUID, issuanceTime)` request to the ledger\n+* Prover/Verifier looks up REVOC_REG_DEF using `GET_REVOC_REG_DEF(revocDefUUID, issuanceTime)` request to the ledger\n+* Prover looks up REVOC_REG to update the witness for the given `timestamp` \n+ using `GET_REVOC_REG(revocDefUUID, timestamp)` request to the ledger\n+* Verifies looks up REVOC_REG to get accumulator value for the given `timestamp`  \n+ using `GET_REVOC_REG(revocDefUUID, timestamp)` request to the ledger\n+* Prover and Verifier should look up REVOC_REG by the same `timestamp` when generating and verifying the proof.\n+\n+### Timestamp Support in State\n+\n+We need to have a generic way to get the State at the given time.\n+- State Trie allows to go to the past, that is given the root hash, get the state with this root.\n+- We may have a mapping of each State update (timestamp) to the corresponding root.\n+- We need to find a data structure that can help us to find the nearest state timestamp (to get the root) for the given","path":"design/anoncreds.md","position":114,"original_position":114,"commit_id":"498c7775641c0287d9c16257c4f769217bca1e00","original_commit_id":"498c7775641c0287d9c16257c4f769217bca1e00","user":{"login":"lovesh","id":3115401,"avatar_url":"https://avatars0.githubusercontent.com/u/3115401?v=4","gravatar_id":"","url":"https://api.github.com/users/lovesh","html_url":"https://github.com/lovesh","followers_url":"https://api.github.com/users/lovesh/followers","following_url":"https://api.github.com/users/lovesh/following{/other_user}","gists_url":"https://api.github.com/users/lovesh/gists{/gist_id}","starred_url":"https://api.github.com/users/lovesh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lovesh/subscriptions","organizations_url":"https://api.github.com/users/lovesh/orgs","repos_url":"https://api.github.com/users/lovesh/repos","events_url":"https://api.github.com/users/lovesh/events{/privacy}","received_events_url":"https://api.github.com/users/lovesh/received_events","type":"User","site_admin":false},"body":"Leveldb and Rocksdb keep the keys sorted so you can keep the timestamp as a key (part of key, use a custom comparator)  and the value for that key is the key in trie","created_at":"2018-02-01T22:11:36Z","updated_at":"2018-02-01T22:29:33Z","html_url":"https://github.com/hyperledger/indy-node/pull/547#discussion_r165503994","pull_request_url":"https://api.github.com/repos/hyperledger/indy-node/pulls/547","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/hyperledger/indy-node/pulls/comments/165503994"},"html":{"href":"https://github.com/hyperledger/indy-node/pull/547#discussion_r165503994"},"pull_request":{"href":"https://api.github.com/repos/hyperledger/indy-node/pulls/547"}}},"pull_request":{"url":"https://api.github.com/repos/hyperledger/indy-node/pulls/547","id":166541193,"html_url":"https://github.com/hyperledger/indy-node/pull/547","diff_url":"https://github.com/hyperledger/indy-node/pull/547.diff","patch_url":"https://github.com/hyperledger/indy-node/pull/547.patch","issue_url":"https://api.github.com/repos/hyperledger/indy-node/issues/547","number":547,"state":"open","locked":false,"title":"INDY-680, IS-515: Anoncreds design","user":{"login":"ashcherbakov","id":21102430,"avatar_url":"https://avatars1.githubusercontent.com/u/21102430?v=4","gravatar_id":"","url":"https://api.github.com/users/ashcherbakov","html_url":"https://github.com/ashcherbakov","followers_url":"https://api.github.com/users/ashcherbakov/followers","following_url":"https://api.github.com/users/ashcherbakov/following{/other_user}","gists_url":"https://api.github.com/users/ashcherbakov/gists{/gist_id}","starred_url":"https://api.github.com/users/ashcherbakov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ashcherbakov/subscriptions","organizations_url":"https://api.github.com/users/ashcherbakov/orgs","repos_url":"https://api.github.com/users/ashcherbakov/repos","events_url":"https://api.github.com/users/ashcherbakov/events{/privacy}","received_events_url":"https://api.github.com/users/ashcherbakov/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-02-01T13:47:04Z","updated_at":"2018-02-01T22:29:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"81bad14a4386c7a729aa651e18004b6785cf0bb3","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"milestone":null,"commits_url":"https://api.github.com/repos/hyperledger/indy-node/pulls/547/commits","review_comments_url":"https://api.github.com/repos/hyperledger/indy-node/pulls/547/comments","review_comment_url":"https://api.github.com/repos/hyperledger/indy-node/pulls/comments{/number}","comments_url":"https://api.github.com/repos/hyperledger/indy-node/issues/547/comments","statuses_url":"https://api.github.com/repos/hyperledger/indy-node/statuses/498c7775641c0287d9c16257c4f769217bca1e00","head":{"label":"hyperledger:anoncreds-design","ref":"anoncreds-design","sha":"498c7775641c0287d9c16257c4f769217bca1e00","user":{"login":"hyperledger","id":7657900,"avatar_url":"https://avatars2.githubusercontent.com/u/7657900?v=4","gravatar_id":"","url":"https://api.github.com/users/hyperledger","html_url":"https://github.com/hyperledger","followers_url":"https://api.github.com/users/hyperledger/followers","following_url":"https://api.github.com/users/hyperledger/following{/other_user}","gists_url":"https://api.github.com/users/hyperledger/gists{/gist_id}","starred_url":"https://api.github.com/users/hyperledger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyperledger/subscriptions","organizations_url":"https://api.github.com/users/hyperledger/orgs","repos_url":"https://api.github.com/users/hyperledger/repos","events_url":"https://api.github.com/users/hyperledger/events{/privacy}","received_events_url":"https://api.github.com/users/hyperledger/received_events","type":"Organization","site_admin":false},"repo":{"id":77021566,"name":"indy-node","full_name":"hyperledger/indy-node","owner":{"login":"hyperledger","id":7657900,"avatar_url":"https://avatars2.githubusercontent.com/u/7657900?v=4","gravatar_id":"","url":"https://api.github.com/users/hyperledger","html_url":"https://github.com/hyperledger","followers_url":"https://api.github.com/users/hyperledger/followers","following_url":"https://api.github.com/users/hyperledger/following{/other_user}","gists_url":"https://api.github.com/users/hyperledger/gists{/gist_id}","starred_url":"https://api.github.com/users/hyperledger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyperledger/subscriptions","organizations_url":"https://api.github.com/users/hyperledger/orgs","repos_url":"https://api.github.com/users/hyperledger/repos","events_url":"https://api.github.com/users/hyperledger/events{/privacy}","received_events_url":"https://api.github.com/users/hyperledger/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/hyperledger/indy-node","description":"Indy Node","fork":false,"url":"https://api.github.com/repos/hyperledger/indy-node","forks_url":"https://api.github.com/repos/hyperledger/indy-node/forks","keys_url":"https://api.github.com/repos/hyperledger/indy-node/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hyperledger/indy-node/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hyperledger/indy-node/teams","hooks_url":"https://api.github.com/repos/hyperledger/indy-node/hooks","issue_events_url":"https://api.github.com/repos/hyperledger/indy-node/issues/events{/number}","events_url":"https://api.github.com/repos/hyperledger/indy-node/events","assignees_url":"https://api.github.com/repos/hyperledger/indy-node/assignees{/user}","branches_url":"https://api.github.com/repos/hyperledger/indy-node/branches{/branch}","tags_url":"https://api.github.com/repos/hyperledger/indy-node/tags","blobs_url":"https://api.github.com/repos/hyperledger/indy-node/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hyperledger/indy-node/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hyperledger/indy-node/git/refs{/sha}","trees_url":"https://api.github.com/repos/hyperledger/indy-node/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hyperledger/indy-node/statuses/{sha}","languages_url":"https://api.github.com/repos/hyperledger/indy-node/languages","stargazers_url":"https://api.github.com/repos/hyperledger/indy-node/stargazers","contributors_url":"https://api.github.com/repos/hyperledger/indy-node/contributors","subscribers_url":"https://api.github.com/repos/hyperledger/indy-node/subscribers","subscription_url":"https://api.github.com/repos/hyperledger/indy-node/subscription","commits_url":"https://api.github.com/repos/hyperledger/indy-node/commits{/sha}","git_commits_url":"https://api.github.com/repos/hyperledger/indy-node/git/commits{/sha}","comments_url":"https://api.github.com/repos/hyperledger/indy-node/comments{/number}","issue_comment_url":"https://api.github.com/repos/hyperledger/indy-node/issues/comments{/number}","contents_url":"https://api.github.com/repos/hyperledger/indy-node/contents/{+path}","compare_url":"https://api.github.com/repos/hyperledger/indy-node/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hyperledger/indy-node/merges","archive_url":"https://api.github.com/repos/hyperledger/indy-node/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hyperledger/indy-node/downloads","issues_url":"https://api.github.com/repos/hyperledger/indy-node/issues{/number}","pulls_url":"https://api.github.com/repos/hyperledger/indy-node/pulls{/number}","milestones_url":"https://api.github.com/repos/hyperledger/indy-node/milestones{/number}","notifications_url":"https://api.github.com/repos/hyperledger/indy-node/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hyperledger/indy-node/labels{/name}","releases_url":"https://api.github.com/repos/hyperledger/indy-node/releases{/id}","deployments_url":"https://api.github.com/repos/hyperledger/indy-node/deployments","created_at":"2016-12-21T05:45:04Z","updated_at":"2018-02-01T15:07:05Z","pushed_at":"2018-02-01T19:26:16Z","git_url":"git://github.com/hyperledger/indy-node.git","ssh_url":"git@github.com:hyperledger/indy-node.git","clone_url":"https://github.com/hyperledger/indy-node.git","svn_url":"https://github.com/hyperledger/indy-node","homepage":"","size":7904,"stargazers_count":85,"watchers_count":85,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":111,"mirror_url":null,"archived":false,"open_issues_count":8,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":111,"open_issues":8,"watchers":85,"default_branch":"master"}},"base":{"label":"hyperledger:master","ref":"master","sha":"ca5c492e17c642d3583419c6c4b3507a8dda6835","user":{"login":"hyperledger","id":7657900,"avatar_url":"https://avatars2.githubusercontent.com/u/7657900?v=4","gravatar_id":"","url":"https://api.github.com/users/hyperledger","html_url":"https://github.com/hyperledger","followers_url":"https://api.github.com/users/hyperledger/followers","following_url":"https://api.github.com/users/hyperledger/following{/other_user}","gists_url":"https://api.github.com/users/hyperledger/gists{/gist_id}","starred_url":"https://api.github.com/users/hyperledger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyperledger/subscriptions","organizations_url":"https://api.github.com/users/hyperledger/orgs","repos_url":"https://api.github.com/users/hyperledger/repos","events_url":"https://api.github.com/users/hyperledger/events{/privacy}","received_events_url":"https://api.github.com/users/hyperledger/received_events","type":"Organization","site_admin":false},"repo":{"id":77021566,"name":"indy-node","full_name":"hyperledger/indy-node","owner":{"login":"hyperledger","id":7657900,"avatar_url":"https://avatars2.githubusercontent.com/u/7657900?v=4","gravatar_id":"","url":"https://api.github.com/users/hyperledger","html_url":"https://github.com/hyperledger","followers_url":"https://api.github.com/users/hyperledger/followers","following_url":"https://api.github.com/users/hyperledger/following{/other_user}","gists_url":"https://api.github.com/users/hyperledger/gists{/gist_id}","starred_url":"https://api.github.com/users/hyperledger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyperledger/subscriptions","organizations_url":"https://api.github.com/users/hyperledger/orgs","repos_url":"https://api.github.com/users/hyperledger/repos","events_url":"https://api.github.com/users/hyperledger/events{/privacy}","received_events_url":"https://api.github.com/users/hyperledger/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/hyperledger/indy-node","description":"Indy Node","fork":false,"url":"https://api.github.com/repos/hyperledger/indy-node","forks_url":"https://api.github.com/repos/hyperledger/indy-node/forks","keys_url":"https://api.github.com/repos/hyperledger/indy-node/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hyperledger/indy-node/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hyperledger/indy-node/teams","hooks_url":"https://api.github.com/repos/hyperledger/indy-node/hooks","issue_events_url":"https://api.github.com/repos/hyperledger/indy-node/issues/events{/number}","events_url":"https://api.github.com/repos/hyperledger/indy-node/events","assignees_url":"https://api.github.com/repos/hyperledger/indy-node/assignees{/user}","branches_url":"https://api.github.com/repos/hyperledger/indy-node/branches{/branch}","tags_url":"https://api.github.com/repos/hyperledger/indy-node/tags","blobs_url":"https://api.github.com/repos/hyperledger/indy-node/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hyperledger/indy-node/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hyperledger/indy-node/git/refs{/sha}","trees_url":"https://api.github.com/repos/hyperledger/indy-node/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hyperledger/indy-node/statuses/{sha}","languages_url":"https://api.github.com/repos/hyperledger/indy-node/languages","stargazers_url":"https://api.github.com/repos/hyperledger/indy-node/stargazers","contributors_url":"https://api.github.com/repos/hyperledger/indy-node/contributors","subscribers_url":"https://api.github.com/repos/hyperledger/indy-node/subscribers","subscription_url":"https://api.github.com/repos/hyperledger/indy-node/subscription","commits_url":"https://api.github.com/repos/hyperledger/indy-node/commits{/sha}","git_commits_url":"https://api.github.com/repos/hyperledger/indy-node/git/commits{/sha}","comments_url":"https://api.github.com/repos/hyperledger/indy-node/comments{/number}","issue_comment_url":"https://api.github.com/repos/hyperledger/indy-node/issues/comments{/number}","contents_url":"https://api.github.com/repos/hyperledger/indy-node/contents/{+path}","compare_url":"https://api.github.com/repos/hyperledger/indy-node/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hyperledger/indy-node/merges","archive_url":"https://api.github.com/repos/hyperledger/indy-node/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hyperledger/indy-node/downloads","issues_url":"https://api.github.com/repos/hyperledger/indy-node/issues{/number}","pulls_url":"https://api.github.com/repos/hyperledger/indy-node/pulls{/number}","milestones_url":"https://api.github.com/repos/hyperledger/indy-node/milestones{/number}","notifications_url":"https://api.github.com/repos/hyperledger/indy-node/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hyperledger/indy-node/labels{/name}","releases_url":"https://api.github.com/repos/hyperledger/indy-node/releases{/id}","deployments_url":"https://api.github.com/repos/hyperledger/indy-node/deployments","created_at":"2016-12-21T05:45:04Z","updated_at":"2018-02-01T15:07:05Z","pushed_at":"2018-02-01T19:26:16Z","git_url":"git://github.com/hyperledger/indy-node.git","ssh_url":"git@github.com:hyperledger/indy-node.git","clone_url":"https://github.com/hyperledger/indy-node.git","svn_url":"https://github.com/hyperledger/indy-node","homepage":"","size":7904,"stargazers_count":85,"watchers_count":85,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":111,"mirror_url":null,"archived":false,"open_issues_count":8,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":111,"open_issues":8,"watchers":85,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/hyperledger/indy-node/pulls/547"},"html":{"href":"https://github.com/hyperledger/indy-node/pull/547"},"issue":{"href":"https://api.github.com/repos/hyperledger/indy-node/issues/547"},"comments":{"href":"https://api.github.com/repos/hyperledger/indy-node/issues/547/comments"},"review_comments":{"href":"https://api.github.com/repos/hyperledger/indy-node/pulls/547/comments"},"review_comment":{"href":"https://api.github.com/repos/hyperledger/indy-node/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/hyperledger/indy-node/pulls/547/commits"},"statuses":{"href":"https://api.github.com/repos/hyperledger/indy-node/statuses/498c7775641c0287d9c16257c4f769217bca1e00"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"lovesh"}}