From 7637d7202748143b6bbc7b0fe4408ca37a9d3163 Mon Sep 17 00:00:00 2001 From: Michael Boyd Date: Sat, 30 Oct 2021 09:59:51 -0700 Subject: [PATCH 01/12] first --- docs/index.md | 2 -- docs/reference/services/trust-registry.md | 29 ++++++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/docs/index.md b/docs/index.md index 2a140ed98..1bed235f7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,8 +8,6 @@ Verifiable Credentials transform credentials, licenses, passes, and certificates They require no centralized authority or proprietary technology to use - verifiable credentials are built on interoperable standards designed to be open, privacy-preserving, and distributed like the internet itself. Hundreds of organizations of all sizes and industries use Trinsic’s infrastructure and tools to instantly verify information about individuals with technology instead of paper. -<<<<<<< HEAD -======= ## Available SDKs diff --git a/docs/reference/services/trust-registry.md b/docs/reference/services/trust-registry.md index 2b374d833..6e23f46f9 100644 --- a/docs/reference/services/trust-registry.md +++ b/docs/reference/services/trust-registry.md @@ -1,15 +1,38 @@ # Trust Registry ## Overview +Trust Registries are a way for verifiers to know if an issuer can be trusted. +This is a simple registry that allows a provider to register an issue or a verifier +They can then check the issuer or verifier by querying the registry -## Specification +## Specification +The trust registry spec is here (https://github.com/trustoverip/tswg-trust-registry-tf) ## API Reference - +```bash +trinsic trust-registry check-issuer \ + --egf http://hl7.org/fhir \ + --credential-type https://w3id.org/vaccination#VaccinationCertificate \ + --did did:example:fabre +trinsic trust-registry register-issuer \ + --egf http://hl7.org/fhir \ + --credential-type https://w3id.org/vaccination#VaccinationCertificate \ + --did did:example:fabre +trinsic trust-registry unregister-issuer \ + --egf http://hl7.org/fhir \ + --credential-type https://w3id.org/vaccination#VaccinationCertificate \ + --did did:example:fabre +``` ### Ecosystem Governance Framework +An ecosystem governance framework is useful because it provides a good basis for verifying issuers and verifiers. +It's a json-ld document that lists the issuers and verifiers. +These issuers and verifiers are identified by a decentralized identifier. +The governance framework is signified by an identifier as well. +this can be used to represent the governance framework outside in the credential that it comes in. ### Register Issuers and Verifiers ### Check Authoritative Status -### Offline Registry File \ No newline at end of file +### Offline Registry File + From 5c4330b6525d9b9601742f13c031d5fe3a9c2d4b Mon Sep 17 00:00:00 2001 From: Michael Boyd Date: Sat, 30 Oct 2021 11:46:06 -0700 Subject: [PATCH 02/12] added credential templates docs --- cli/src/cli.yaml | 4 +- docs/concepts/index.md | 3 + docs/reference/services/provider-service.md | 2 +- docs/reference/services/template-service.md | 144 +++++++++++++ docs/reference/services/trust-registry.md | 217 +++++++++++++++++--- docs/reference/services/wallet-service.md | 35 +++- dotnet/Trinsic.Tests/Tests.cs | 14 +- mkdocs.yml | 2 +- 8 files changed, 390 insertions(+), 31 deletions(-) create mode 100644 docs/reference/services/template-service.md diff --git a/cli/src/cli.yaml b/cli/src/cli.yaml index e1483ed1c..9c5182e20 100644 --- a/cli/src/cli.yaml +++ b/cli/src/cli.yaml @@ -346,10 +346,10 @@ subcommands: - invitation_status: about: "Check invitation status" version: "0.1" - - create_credential_template: + - create-credential-template: about: "Create credential template" version: "0.1" - - list_credential_templates: + - list-credential-templates: about: "List credential templates" version: "0.1" - trust-registry: diff --git a/docs/concepts/index.md b/docs/concepts/index.md index 912268e5c..b48f547fb 100644 --- a/docs/concepts/index.md +++ b/docs/concepts/index.md @@ -5,6 +5,9 @@ There are many ways that decentralized identity can be used beyond just customer ## Wallets Wallets can be thought of a little like an email inbox. Wallets exist to send, receive and store credentials. Wallets can be hosted by anyone. Each wallet can only be accessed by a set of keys stored on devices. +Wallets represent a user's identity. They manage an identity for an individual. +Trinsic has a wallet that is built to be eventually interoperable with other identity wallets that exist. + ## Credentials Organizations and governments across the world have converged on a digital identity document standard called Verifiable Credentials. diff --git a/docs/reference/services/provider-service.md b/docs/reference/services/provider-service.md index c20ded18e..83fb32df2 100644 --- a/docs/reference/services/provider-service.md +++ b/docs/reference/services/provider-service.md @@ -59,4 +59,4 @@ In Trinsic Ecosystems, participants can be Individuals or Organizations. This di response = await provider_service.invite_participant(request) ``` -The `invitationId` in the response contains the security code that users must supply when creating their wallet. If using email method in onboarding, they will receive this code in their email. +The `invitationId` in the response contains the security code that users must supply when creating their wallet. If using email method in onboarding, they will receive this code in their email. \ No newline at end of file diff --git a/docs/reference/services/template-service.md b/docs/reference/services/template-service.md new file mode 100644 index 000000000..482a50dbd --- /dev/null +++ b/docs/reference/services/template-service.md @@ -0,0 +1,144 @@ +# Template Service + +## Credential Templates + +Credential Templates are json templates that help issuers save context when issuing credentials. + +When issuing a credential through Trinsic, it's as simple as adding the attributes to the credential template and then issuing it. + +These credential templates can be shared between issuers in an ecosystem. + +### Contexts + +A template is a saved JSON-LD schema that is used to define/create credentials and verification. + +## API Reference + +### Get Credential Template + +=== "Trinsic CLI" + ```bash + + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` +=== "Ruby" + ```ruby + + ``` + +### Search + +=== "Trinsic CLI" + ```bash + + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` + +=== "Ruby" + ```ruby + + ``` + +### Update + +=== "Trinsic CLI" + ```bash + + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` +=== "Ruby" + ```ruby + + ``` + +### Delete + +=== "Trinsic CLI" + ```bash + + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` diff --git a/docs/reference/services/trust-registry.md b/docs/reference/services/trust-registry.md index 6e23f46f9..2be10ef57 100644 --- a/docs/reference/services/trust-registry.md +++ b/docs/reference/services/trust-registry.md @@ -1,38 +1,205 @@ # Trust Registry ## Overview -Trust Registries are a way for verifiers to know if an issuer can be trusted. -This is a simple registry that allows a provider to register an issue or a verifier -They can then check the issuer or verifier by querying the registry +In many real-world credential exchange scenarios, a credential holder or verifier has the question “How do I know the issuer of this credential is trustworthy?” +Credential holders may also be uneasy about sharing information with a verifier if trust in the verifier has not been established. + +These problems can be solved by having a trusted third party vouch for the trustworthiness of a credential exchange participant. + +A trust registry is a list of authorized issuers and verifiers in the ecosystem and the types of credentials and passes they are authorized to issue and verify. + + ## Specification -The trust registry spec is here (https://github.com/trustoverip/tswg-trust-registry-tf) +The Trust over IP Foundation has a specification for a interoperable trust registry. +This defined an API interface so that trust registries can be queried in the same way. +Our implementation is based off of this [trust registry spec](https://github.com/trustoverip/tswg-trust-registry-tf). + ## API Reference -```bash -trinsic trust-registry check-issuer \ - --egf http://hl7.org/fhir \ - --credential-type https://w3id.org/vaccination#VaccinationCertificate \ - --did did:example:fabre -trinsic trust-registry register-issuer \ - --egf http://hl7.org/fhir \ - --credential-type https://w3id.org/vaccination#VaccinationCertificate \ - --did did:example:fabre -trinsic trust-registry unregister-issuer \ - --egf http://hl7.org/fhir \ - --credential-type https://w3id.org/vaccination#VaccinationCertificate \ - --did did:example:fabre -``` -### Ecosystem Governance Framework -An ecosystem governance framework is useful because it provides a good basis for verifying issuers and verifiers. -It's a json-ld document that lists the issuers and verifiers. -These issuers and verifiers are identified by a decentralized identifier. -The governance framework is signified by an identifier as well. -this can be used to represent the governance framework outside in the credential that it comes in. +### Create a Ecosystem Governance Framework +An ecosystem governance framework is useful because it provides a good basis for verifying issuers and verifiers. It's a json-ld document that lists the issuers and verifiers. These issuers and verifiers are identified by a decentralized identifier. The governance framework is signified by an identifier as well. This can be used to represent the governance framework outside in the credential that it comes in. + +=== "Trinsic CLI" + ```bash + + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` ### Register Issuers and Verifiers +Each entity on the governance framework, whether an issuer or a verifier, is represented by a decentralized identifier. These entities are registered to either issue or verify specific credential types. A credential type is represented as a fully qualified `type` URI, of the kind found in a JSON-LD Verifiable Credential. +Finally, each entity must be registered on a specific governance framework. + +=== "Trinsic CLI" + ```bash + trinsic trust-registry register-issuer \ + --egf http://hl7.org/fhir \ + --credential-type https://w3id.org/vaccination#VaccinationCertificate \ + --did did:example:fabre + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` + +### Unregister Issuers and Verifiers +To unregister an entity, include the credential type, the did, and the ecosystem governance framework. The credential type will be unregistered from that issuer. + +=== "Trinsic CLI" + ```bash + trinsic trust-registry unregister-issuer \ + --egf http://hl7.org/fhir \ + --credential-type https://w3id.org/vaccination#VaccinationCertificate \ + --did did:example:fabre + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` ### Check Authoritative Status +Check the status of an issuer for a credential type within a given governance framework. Returns all historical data for the given input parameter. + +=== "Trinsic CLI" + ```bash + trinsic trust-registry check-issuer \ + --egf http://hl7.org/fhir \ + --credential-type https://w3id.org/vaccination#VaccinationCertificate \ + --did did:example:fabre + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` + +### Search +Search the registry for authoritative issuer and verifiers using a custom query in a SQL format. + +=== "Trinsic CLI" + ```bash + + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` +### Cache Offline Registry File +Search the registry for authoritative issuer and verifiers using a custom query in a SQL format. + +=== "Trinsic CLI" + ```bash + + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` -### Offline Registry File +=== "Python" + ```python + + ``` +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` \ No newline at end of file diff --git a/docs/reference/services/wallet-service.md b/docs/reference/services/wallet-service.md index 6ba830a95..92623ec4d 100644 --- a/docs/reference/services/wallet-service.md +++ b/docs/reference/services/wallet-service.md @@ -8,7 +8,7 @@ Wallets can be created directly by the user or through an invitation by the ecos ### Create wallet directly -To create a wallet directly without invitation, use the following methods. These methods return secure profile data that should be stored in a safe place. The profile is used to authenticate the wallet service with the cloud provider. Read more details and recommendations in the [Security Profiles](/reference/setup/#authorization) page. +To create a wallet directly without an invitation, use the following methods. These methods return secure profile data that should be stored in a safe place. The profile is used to authenticate the wallet service with the cloud provider. Read more details and recommendations in the [Security Profiles](/reference/setup/#authorization) page. === "Trinsic CLI" ```bash @@ -218,6 +218,39 @@ The wallet service supports signing data using [BBS+ Signatures :material-open-i The output of this method will be a signed JSON document using BBS+ Signature Suite 2020. This document is not automatically stored in the wallet when issued. You need to call the [insert record](#insert-record) separately if you'd like to store a copy of this document. +## Issue Credential from Template + + +=== "Trinsic CLI" + ```bash + + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` +=== "Ruby" + ```ruby + + ``` ## Create Proof Wallets allow data to be shared between parties in a secure manner, using a technique called [Zero Knowledge Proofs](/faq/#what-are-zero-knowledge-proofs). Trinsic Ecosystems uses the BBS+ Signature Proof scheme to allow data to be selectively disclosed to the requesting party. This allows users to share only the requested subset of data, instead the entire document. diff --git a/dotnet/Trinsic.Tests/Tests.cs b/dotnet/Trinsic.Tests/Tests.cs index 5efe9d786..3c64f7458 100644 --- a/dotnet/Trinsic.Tests/Tests.cs +++ b/dotnet/Trinsic.Tests/Tests.cs @@ -46,7 +46,7 @@ public void TestParseURL(string url, bool isValid) else Assert.NotNull(ServiceBase.CreateChannelIfNeeded(url)); } - + [Fact] public async Task TestWalletService() { @@ -102,5 +102,17 @@ public async Task TestWalletService() _testOutputHelper.WriteLine($"Verification result: {valid}"); Assert.True(valid); } + + // TODO - Create trust registry unit test and then add commands to documentation reference + [Fact] + public void TestTrustRegistry() + { + //Given + + //When + + //Then + } + } } \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index f8408085e..4d3663966 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -72,7 +72,7 @@ markdown_extensions: - pymdownx.details - toc: permalink: true - toc_depth: 2 + toc_depth: 3 - abbr extra_javascript: From 9ef4696f64c70d9ce0a5826d3e872fbedebaa414 Mon Sep 17 00:00:00 2001 From: Michael Boyd Date: Sat, 30 Oct 2021 11:49:39 -0700 Subject: [PATCH 03/12] consolidated to provider service --- docs/reference/services/provider-service.md | 141 ++++++++++++++++++- docs/reference/services/template-service.md | 144 -------------------- 2 files changed, 140 insertions(+), 145 deletions(-) delete mode 100644 docs/reference/services/template-service.md diff --git a/docs/reference/services/provider-service.md b/docs/reference/services/provider-service.md index 83fb32df2..8af19b452 100644 --- a/docs/reference/services/provider-service.md +++ b/docs/reference/services/provider-service.md @@ -59,4 +59,143 @@ In Trinsic Ecosystems, participants can be Individuals or Organizations. This di response = await provider_service.invite_participant(request) ``` -The `invitationId` in the response contains the security code that users must supply when creating their wallet. If using email method in onboarding, they will receive this code in their email. \ No newline at end of file +The `invitationId` in the response contains the security code that users must supply when creating their wallet. If using email method in onboarding, they will receive this code in their email. + +## Credential Templates + +Credential Templates are json templates that help issuers save context when issuing credentials. + +When issuing a credential through Trinsic, it's as simple as adding the attributes to the credential template and then issuing it. + +These credential templates can be shared between issuers in an ecosystem. + +A template is a saved JSON-LD schema that is used to define/create credentials and verification. + +### Get + +=== "Trinsic CLI" + ```bash + + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` +=== "Ruby" + ```ruby + + ``` + +### Search + +=== "Trinsic CLI" + ```bash + + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` + +=== "Ruby" + ```ruby + + ``` + +### Update + +=== "Trinsic CLI" + ```bash + + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` +=== "Ruby" + ```ruby + + ``` + +### Delete + +=== "Trinsic CLI" + ```bash + + ``` +=== "TypeScript" + ```typescript + + ``` +=== "C#" + ```csharp + + ``` + +=== "Python" + ```python + + ``` + +=== "Go" + ```golang + + ``` +=== "Java" + ```java + + ``` diff --git a/docs/reference/services/template-service.md b/docs/reference/services/template-service.md deleted file mode 100644 index 482a50dbd..000000000 --- a/docs/reference/services/template-service.md +++ /dev/null @@ -1,144 +0,0 @@ -# Template Service - -## Credential Templates - -Credential Templates are json templates that help issuers save context when issuing credentials. - -When issuing a credential through Trinsic, it's as simple as adding the attributes to the credential template and then issuing it. - -These credential templates can be shared between issuers in an ecosystem. - -### Contexts - -A template is a saved JSON-LD schema that is used to define/create credentials and verification. - -## API Reference - -### Get Credential Template - -=== "Trinsic CLI" - ```bash - - ``` -=== "TypeScript" - ```typescript - - ``` -=== "C#" - ```csharp - - ``` - -=== "Python" - ```python - - ``` - -=== "Go" - ```golang - - ``` -=== "Java" - ```java - - ``` -=== "Ruby" - ```ruby - - ``` - -### Search - -=== "Trinsic CLI" - ```bash - - ``` -=== "TypeScript" - ```typescript - - ``` -=== "C#" - ```csharp - - ``` - -=== "Python" - ```python - - ``` - -=== "Go" - ```golang - - ``` -=== "Java" - ```java - - ``` - -=== "Ruby" - ```ruby - - ``` - -### Update - -=== "Trinsic CLI" - ```bash - - ``` -=== "TypeScript" - ```typescript - - ``` -=== "C#" - ```csharp - - ``` - -=== "Python" - ```python - - ``` - -=== "Go" - ```golang - - ``` -=== "Java" - ```java - - ``` -=== "Ruby" - ```ruby - - ``` - -### Delete - -=== "Trinsic CLI" - ```bash - - ``` -=== "TypeScript" - ```typescript - - ``` -=== "C#" - ```csharp - - ``` - -=== "Python" - ```python - - ``` - -=== "Go" - ```golang - - ``` -=== "Java" - ```java - - ``` From c72b6dfec3c8c3b1f90a8dc4a95e1c98f9e544c7 Mon Sep 17 00:00:00 2001 From: Michael Boyd Date: Sat, 30 Oct 2021 15:37:35 -0700 Subject: [PATCH 04/12] new outline of structure --- docs/_static/extra.css | 4 +++ docs/concepts/index.md | 19 +--------- docs/concepts/what-is-trinsic.md | 9 +++++ docs/index.md | 59 +++++++++++++++----------------- mkdocs.yml | 39 ++++++++++++++------- 5 files changed, 68 insertions(+), 62 deletions(-) create mode 100644 docs/concepts/what-is-trinsic.md diff --git a/docs/_static/extra.css b/docs/_static/extra.css index 7d4499612..6cfd93894 100644 --- a/docs/_static/extra.css +++ b/docs/_static/extra.css @@ -1,3 +1,7 @@ +h1, h2, h3 { + font-weight: 800; +} + .md-header { /* background-color: #333; */ box-shadow: none !important; diff --git a/docs/concepts/index.md b/docs/concepts/index.md index b48f547fb..e7b84726b 100644 --- a/docs/concepts/index.md +++ b/docs/concepts/index.md @@ -44,21 +44,4 @@ Next: Choose your language - [Node](../walkthrough/vaccination-node.md) - [C#](../walkthrough/vaccination-net.md) - [Python](../walkthrough/vaccination-python.md) - - [Browser](../walkthrough/vaccination-browser.md) - -## Available SDKs - -- [x] [C#](./walkthrough/vaccination-net.md) - - [x] Xamarin (iOS, Android) - - [x] .NET Core (MacOS, Windows, Linux) -- [x] TypeScript/JS - - [x] [Node.js](./walkthrough/vaccination-node.md) - - [x] [Browser](./walkthrough/vaccination-browser.md) -- [x] Python - -## Up Next -- [ ] Objective C (iOS) -- [ ] Java/Kotlin (Android) -- [ ] React Native -- [ ] Rust -- [ ] Go \ No newline at end of file + - [Browser](../walkthrough/vaccination-browser.md) \ No newline at end of file diff --git a/docs/concepts/what-is-trinsic.md b/docs/concepts/what-is-trinsic.md new file mode 100644 index 000000000..e6c740e19 --- /dev/null +++ b/docs/concepts/what-is-trinsic.md @@ -0,0 +1,9 @@ +# What is Trinsic? + +Trinsic is a developer platform to exchange verifiable credentials. + +Verifiable Credentials transform credentials, licenses, passes, and certificates into a W3C standard format that can be exchanged digitally and verified instantly. Unlike a paper document or html form, when information from a verifiable credential is shared, it can be instantly proven to be authentic. + +They require no centralized authority or proprietary technology to use - verifiable credentials are built on interoperable standards designed to be open, privacy-preserving, and distributed like the internet itself. + +Hundreds of organizations of all sizes and industries use Trinsic’s infrastructure and tools to instantly verify information about individuals with technology instead of paper. \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 1bed235f7..7ed407d6d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,31 +1,28 @@ -# Introduction - -## Welcome to Trinsic -Trinsic is a developer platform to exchange verifiable credentials. - -Verifiable Credentials transform credentials, licenses, passes, and certificates into a W3C standard format that can be exchanged digitally and verified instantly. Unlike a paper document or html form, when information from a verifiable credential is shared, it can be instantly proven to be authentic. - -They require no centralized authority or proprietary technology to use - verifiable credentials are built on interoperable standards designed to be open, privacy-preserving, and distributed like the internet itself. - -Hundreds of organizations of all sizes and industries use Trinsic’s infrastructure and tools to instantly verify information about individuals with technology instead of paper. - -## Available SDKs - -- [x] [C#](./walkthrough/vaccination-net.md) - - [x] Mobile (Xamarin, MAUI) - - [x] .NET Core (MacOS, Windows, Linux) - - [ ] Web Assembly (Blazor) -- [x] TypeScript/JS - - [x] [Node.js](./walkthrough/vaccination-node.md) - - [x] [Browser](./walkthrough/vaccination-browser.md) -- [x] Python -- [x] Go -- [x] Rust -- [x] Swift (iOS) -- [x] Java/Kotlin (Android) - -## Up Next - -- [ ] React Native - -Next: [Learn the Concepts](./concepts/index.md) +--- +hide: + - toc +--- +# Trinsic Docs +### Share data and authenticate individuals anywhere. + +## Quickstart +Get up and running in the language of your choice or interact with Trinsic through your terminal. + +[:octicons-terminal-16: **Use the CLI**](#) +### Server-side SDKs +[:material-nodejs: Node](#){ .md-button .md-button--primary } +[:material-language-python: Python](#){ .md-button .md-button--primary} +[:material-menu: Go](#){ .md-button .md-button--primary} +[:material-language-ruby: Ruby](#){ .md-button .md-button--primary} +[:material-language-java: Java](#){ .md-button .md-button--primary} +[:material-microsoft: .NET](#){ .md-button .md-button--primary} + +### Client-side SDKs +[:material-android: Android](#){ .md-button} +[:material-apple: iOS](#){ .md-button} +[:fontawesome-brands-js-square: Web](#){ .md-button} + +## Learn about +If you're still new to self-sovereign identity, continue reading to get a better idea about verifiable credentials. We'll learn about the concepts of digital identity, verifiable credentials, and how Trinsic lets you use these powerful tools in your applications. + +[**:octicons-info-16: What is Trinsic?**](./concepts/what-is-trinsic.md) diff --git a/mkdocs.yml b/mkdocs.yml index 4d3663966..347f2593b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -6,24 +6,37 @@ repo_name: trinsic-id/sdk site_url: https://ecosystems-docs-alpha.trinsic.id nav: - Overview: index.md - - Concepts: concepts/index.md - - Start Building: - - CLI: walkthrough/vaccination-cli.md - - Node: walkthrough/vaccination-node.md - - Web: walkthrough/vaccination-browser.md - - C#: walkthrough/vaccination-net.md - - Python: walkthrough/vaccination-python.md + - Get Started: early-adopter.md + - Community: https://join.slack.com/t/trinsiccommunity/shared_invite/zt-pcsdy7kn-h4vtdPEpqQUlmirU8FFzSQ + - Support: support.md + - Learn: + - Introduction: concepts/index.md + - Credentials: concepts/credentials.md + - Presentations: concepts/presentations.md + - Ecosystems: concepts/ecosystems.md + - Trinsic's Platform: concepts/what-is-trinsic.md + - Underlying Tech: concepts/tech.md + - Security: concepts/security.md + - Build: + - CLI: cli/index.md + - Node: node/index.md + - C#: csharp/index.md + - Python: python/index.md + - Ruby: ruby/index.md + - Go: go/index.md + - Java: java/index.md + - Web: web/index.md + - iOS: ios/index.md + - Android: android/index.md - Reference: - Setup: reference/setup/index.md - Wallet Service: reference/services/wallet-service.md - Provider Service: reference/services/provider-service.md - Trust Registry: reference/services/trust-registry.md - - Support: - - Join Slack Community: https://join.slack.com/t/trinsiccommunity/shared_invite/zt-pcsdy7kn-h4vtdPEpqQUlmirU8FFzSQ - - Contribute on Github: https://github.com/trinsic-id - - Email us: mailto:support@trinsic.id - - What's Next: - - Join Trinsic Ecosystems: early-adopter.md + - Resources: + - Roadmap: roadmap.md + - Changelog: changelog.md + - Github: https://github.com/trinsic-id theme: name: material logo: _static/logo-title.svg From 0be68043c2fb5e6ff22c025987212d28dd199fc6 Mon Sep 17 00:00:00 2001 From: Michael Boyd Date: Sat, 30 Oct 2021 16:26:12 -0700 Subject: [PATCH 05/12] changed intro --- docs/index.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/index.md b/docs/index.md index 7ed407d6d..914cff772 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,7 +3,11 @@ hide: - toc --- # Trinsic Docs -### Share data and authenticate individuals anywhere. + +### Issue and verify universally-accepted digital credentials. +Online it's impossible to prove your legal name, age, or anything else about your identity - but in person, it's easy as long as you have the right paperwork. + +Trinsic provides an SDK to issue and verify universally-accepted digital credentials so that anywhere people go online or in-person, they can simply tap their phone, prove who they are, and get what they need. ## Quickstart Get up and running in the language of your choice or interact with Trinsic through your terminal. @@ -22,7 +26,6 @@ Get up and running in the language of your choice or interact with Trinsic throu [:material-apple: iOS](#){ .md-button} [:fontawesome-brands-js-square: Web](#){ .md-button} -## Learn about -If you're still new to self-sovereign identity, continue reading to get a better idea about verifiable credentials. We'll learn about the concepts of digital identity, verifiable credentials, and how Trinsic lets you use these powerful tools in your applications. +## Learn More +If you're new to verifiable credentials, continue reading on the next page to get a better idea about how they can be used. -[**:octicons-info-16: What is Trinsic?**](./concepts/what-is-trinsic.md) From 7271c1b4d374fe86036937cac5a2823ec6506e19 Mon Sep 17 00:00:00 2001 From: Michael Boyd Date: Sat, 30 Oct 2021 17:45:51 -0700 Subject: [PATCH 06/12] split out concepts --- docs/_static/images/trust-triangle.png | Bin 0 -> 142733 bytes docs/concepts/credentials.md | 12 +++++ docs/concepts/ecosystems.md | 10 ++++ docs/concepts/index.md | 49 +++--------------- docs/concepts/passes.md | 3 ++ docs/concepts/tech.md | 14 +++++ .../{what-is-trinsic.md => trinsic.md} | 0 docs/concepts/wallets.md | 7 +++ docs/early-adopter.md | 11 ++-- docs/reference/services/wallet-service.md | 2 +- docs/support.md | 7 +++ mkdocs.yml | 24 ++++----- 12 files changed, 79 insertions(+), 60 deletions(-) create mode 100644 docs/_static/images/trust-triangle.png create mode 100644 docs/concepts/credentials.md create mode 100644 docs/concepts/ecosystems.md create mode 100644 docs/concepts/passes.md create mode 100644 docs/concepts/tech.md rename docs/concepts/{what-is-trinsic.md => trinsic.md} (100%) create mode 100644 docs/concepts/wallets.md create mode 100644 docs/support.md diff --git a/docs/_static/images/trust-triangle.png b/docs/_static/images/trust-triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..eea4882f025f50aa6b057125e963a9828fe1c6ad GIT binary patch literal 142733 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 z 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'h_^r_{T?|JvxhOVsPUUHzy#d4Iip+UUWIIO-U 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�%k+m{oC#ivpFoY89$Qt{^5tPpZEVRqvN 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%0D1%z5Q)dk(GqK$+Ui71@yh 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 literal 0 HcmV?d00001 diff --git a/docs/concepts/credentials.md b/docs/concepts/credentials.md new file mode 100644 index 000000000..4e08b62cc --- /dev/null +++ b/docs/concepts/credentials.md @@ -0,0 +1,12 @@ +# Credentials +Organizations and governments across the world have converged on a digital identity document standard called Verifiable Credentials. + +Trinsic's platform covers the full credential lifecycle. Our tools help you create, issue, verify, revoke, and store these credentials. These pieces are meant to be modular and interoperable. + +Verifiable Credentials are a way of representing documents online that make them interoperable and instantly verifiable. In its technical sense, a credential is a set of one or more cryptographically verifiable assertions about a subject made by an entity. + +Just like passports and drivers licenses today have interoperability components like their barcode, credentials have the same feature but are built into the internet itself, and can be used anywhere it is supported. Our tools let you choose to support the standard. By following the verifiable credential standard, your organization can issue digital documents that can be verified anywhere. + +For a technical deep dive, refer to the [Verifiable Credentials Data Model](https://w3c.github.io/vc-data-model) + +[:octicons-info-24: Learn More](./credentials.md) \ No newline at end of file diff --git a/docs/concepts/ecosystems.md b/docs/concepts/ecosystems.md new file mode 100644 index 000000000..0ece8ed2c --- /dev/null +++ b/docs/concepts/ecosystems.md @@ -0,0 +1,10 @@ +# Ecosystems + +Exchanging credentials often requires many different participants to all communicate and collaborate. Aligning standards and incentives is challenging. + +We've made it simple to create an ecosystem of participants to all exchange credentials. + +## Ecosystem Governance Framework + +## Potential Scenarios + diff --git a/docs/concepts/index.md b/docs/concepts/index.md index e7b84726b..c99bf6ac5 100644 --- a/docs/concepts/index.md +++ b/docs/concepts/index.md @@ -1,47 +1,14 @@ -# Concepts -Trinsic is a set of tools and infrastructure that enables decentralized identity for individuals and organizations. - -There are many ways that decentralized identity can be used beyond just customer login. This enables digital identity verification anywhere. In person, online, even offline. - -## Wallets -Wallets can be thought of a little like an email inbox. Wallets exist to send, receive and store credentials. Wallets can be hosted by anyone. Each wallet can only be accessed by a set of keys stored on devices. -Wallets represent a user's identity. They manage an identity for an individual. -Trinsic has a wallet that is built to be eventually interoperable with other identity wallets that exist. - - -## Credentials -Organizations and governments across the world have converged on a digital identity document standard called Verifiable Credentials. - -Trinsic's platform covers the full credential lifecycle. Our tools help you create, issue, verify, revoke, and store these credentials. These pieces are meant to be modular and interoperable. - -Verifiable Credentials are a way of representing documents online that make them interoperable and instantly verifiable. In its technical sense, a credential is a set of one or more cryptographically verifiable assertions about a subject made by an entity. +# What is Trinsic? +![Trust Triangle](/_static/images/trust-triangle.png) -Just like passports and drivers licenses today have interoperability components like their barcode, credentials have the same feature but are built into the internet itself, and can be used anywhere it is supported. Our tools let you choose to support the standard. By following the verifiable credential standard, your organization can issue digital documents that can be verified anywhere. +Trinsic is a developer platform to exchange verifiable credentials. -For a technical deep dive, refer to the [Verifiable Credentials Data Model](https://w3c.github.io/vc-data-model) +Verifiable Credentials transform credentials, licenses, passes, and certificates into a W3C standard format that can be exchanged digitally and verified instantly. Unlike a paper document or html form, when information from a verifiable credential is shared, it can be instantly proven to be authentic. -## Passes -Passes are documents generated from one or more credentials that contain only the information required to be verified. They can be generated in advance or in real-time. Passes minimize the information about you that is shared with third parties. +They require no centralized authority or proprietary technology to use - verifiable credentials are built on interoperable standards designed to be open, privacy-preserving, and distributed like the internet itself. -## Underlying Tech +Hundreds of organizations of all sizes and industries use Trinsic’s infrastructure and tools to instantly verify information about individuals with technology instead of paper. -### Linked Data -When we consider credentials getting exchanged online far and wide, a problem starts to occur - how does everyone know what every else means when they show a credential? To the rescue comes Linked Data, a format for representing structured data with self-contained descriptors of that data. - -"Linked data is to spreadsheets and databases what the web of hypertext documents is to word processor files" - [W3C Wiki on Linked Data](https://www.w3.org/wiki/LinkedData) - -### Decentralized Identifiers -Taken from the [Verifiable Credential Data Model](https://w3c.github.io/vc-data-model/#dfn-decentralized-identifiers), a decentralized identifier is "a portable URL-based identifier, also known as a DID, associated with an entity. These identifiers are most often used in a verifiable credential and are associated with subjects such that a verifiable credential itself can be easily ported from one repository to another without the need to reissue the credential. An example of a DID is `did:example:123456abcdef`" - -### Zero Knowledge Proofs -One of the most exciting qualities of verifiable credentials are their ability to minimize the data shared about you when you prove who you are. The classic example is showing your driver's license in a bar. While a human bouncer may forget all the revealing information on your driver's license, a computerized bouncer that scans your driver's license never forgets any information. With zero knowledge proofs, you can choose specific information from your credentials to share with verifiers. - -These are enabled through a [BBS+ Signature specification](https://w3c-ccg.github.io/ldp-bbs2020/). - -Next: Choose your language +Trinsic is a set of tools and infrastructure that enables decentralized identity for individuals and organizations. - - [CLI](../walkthrough/vaccination-cli.md) - - [Node](../walkthrough/vaccination-node.md) - - [C#](../walkthrough/vaccination-net.md) - - [Python](../walkthrough/vaccination-python.md) - - [Browser](../walkthrough/vaccination-browser.md) \ No newline at end of file +There are many ways that decentralized identity can be used beyond just customer login. This enables digital identity verification anywhere. In person, online, even offline. \ No newline at end of file diff --git a/docs/concepts/passes.md b/docs/concepts/passes.md new file mode 100644 index 000000000..600eea6fc --- /dev/null +++ b/docs/concepts/passes.md @@ -0,0 +1,3 @@ +# Passes +Passes are documents generated from one or more credentials that contain only the information required to be verified. They can be generated in advance or in real-time. Passes minimize the information about you that is shared with third parties. +[:octicons-info-24: Learn More](./passes.md) diff --git a/docs/concepts/tech.md b/docs/concepts/tech.md new file mode 100644 index 000000000..1c1a95bfb --- /dev/null +++ b/docs/concepts/tech.md @@ -0,0 +1,14 @@ +# Underlying Tech + +## Linked Data +When we consider credentials getting exchanged online far and wide, a problem starts to occur - how does everyone know what every else means when they show a credential? To the rescue comes Linked Data, a format for representing structured data with self-contained descriptors of that data. + +"Linked data is to spreadsheets and databases what the web of hypertext documents is to word processor files" - [W3C Wiki on Linked Data](https://www.w3.org/wiki/LinkedData) + +## Decentralized Identifiers +Taken from the [Verifiable Credential Data Model](https://w3c.github.io/vc-data-model/#dfn-decentralized-identifiers), a decentralized identifier is "a portable URL-based identifier, also known as a DID, associated with an entity. These identifiers are most often used in a verifiable credential and are associated with subjects such that a verifiable credential itself can be easily ported from one repository to another without the need to reissue the credential. An example of a DID is `did:example:123456abcdef`" + +## Zero Knowledge Proofs +One of the most exciting qualities of verifiable credentials are their ability to minimize the data shared about you when you prove who you are. The classic example is showing your driver's license in a bar. While a human bouncer may forget all the revealing information on your driver's license, a computerized bouncer that scans your driver's license never forgets any information. With zero knowledge proofs, you can choose specific information from your credentials to share with verifiers. + +These are enabled through a [BBS+ Signature specification](https://w3c-ccg.github.io/ldp-bbs2020/). \ No newline at end of file diff --git a/docs/concepts/what-is-trinsic.md b/docs/concepts/trinsic.md similarity index 100% rename from docs/concepts/what-is-trinsic.md rename to docs/concepts/trinsic.md diff --git a/docs/concepts/wallets.md b/docs/concepts/wallets.md new file mode 100644 index 000000000..8d2bebc8c --- /dev/null +++ b/docs/concepts/wallets.md @@ -0,0 +1,7 @@ +# Wallets + +Wallets can be thought of a little like an email inbox. Wallets exist to send, receive and store credentials. Wallets can be hosted by anyone. Each wallet can only be accessed by a set of keys stored on devices. +Wallets represent a user's identity. They manage an identity for an individual. +Trinsic has a wallet that is built to be eventually interoperable with other identity wallets that exist. + +[:octicons-info-24: Learn More](./wallets.md) \ No newline at end of file diff --git a/docs/early-adopter.md b/docs/early-adopter.md index 99643f7ec..50d3d7258 100644 --- a/docs/early-adopter.md +++ b/docs/early-adopter.md @@ -1,9 +1,8 @@ -# Introducing Trinsic Ecosystems +# Introducing Trinsic v2 +For development teams ready to integrate verifiable credentials for an industry or use case, Trinsic v2 has been built specifically for you. We're currently in beta with a small group of customers. -For organizations ready to deploy verifiable credentials into a complex industry or use case, Trinsic has prepared tools to help you do so. +If you'd like to experiment with our SDKs, please reach out! Simply fill out the form below, and we'll get in touch. -To learn more about Trinsic Ecosystems, read our announcement about it: +
-[Announcing Trinsic Ecosystems](https://trinsic.id/introducing-trinsic-ecosystems/) - -
\ No newline at end of file +To learn more about Trinsic v2, read our [announcement](https://trinsic.id/introducing-trinsic-ecosystems/), and continue exploring our docs. \ No newline at end of file diff --git a/docs/reference/services/wallet-service.md b/docs/reference/services/wallet-service.md index 92623ec4d..088a2056f 100644 --- a/docs/reference/services/wallet-service.md +++ b/docs/reference/services/wallet-service.md @@ -1,6 +1,6 @@ # Wallet Service -The wallet service is the main interface for interacting with a cloud wallet. The service endpoints are designed to closely match the recommendations of the [Universal Wallet 2020 :material-open-in-new:](https://w3c-ccg.github.io/universal-wallet-interop-spec/){target=_blank} specficiation by W3C CCG. The service exposes a gRPC interface and a set of data contracts as described in the specification. Our intention with this design is to bring it closer to interoperability as more implementations of this wallet appear in production. +The wallet service is the main interface for interacting with a cloud wallet. The service endpoints are designed to closely match the recommendations of the [Universal Wallet 2020 :material-open-in-new:](https://w3c-ccg.github.io/universal-wallet-interop-spec/){target=_blank} specification by W3C Community Credentials Group. The service exposes a gRPC interface and a set of data contracts as described in the specification. Our intention with this design is to bring it closer to interoperability as more implementations of this wallet appear in production. ## Create Wallet diff --git a/docs/support.md b/docs/support.md new file mode 100644 index 000000000..5228ca99a --- /dev/null +++ b/docs/support.md @@ -0,0 +1,7 @@ +# Have a Question? + +Normally, the best way to ask quick questions is through the [Trinsic Community slack channel](https://join.slack.com/t/trinsiccommunity/shared_invite/zt-pcsdy7kn-h4vtdPEpqQUlmirU8FFzSQ). + +If you have a bug to report, please report it on the Github issues on our SDK. Contributions and additions to this docs site are always welcome. + +Finally, if you're interested in getting in touch with the team for any other reason, contact us at [support@trinsic.id](mailto:support@trinsic.id). We treat any feedback as gold. diff --git a/mkdocs.yml b/mkdocs.yml index 347f2593b..c6a571f6a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -5,18 +5,10 @@ edit_uri: edit/main/docs/ repo_name: trinsic-id/sdk site_url: https://ecosystems-docs-alpha.trinsic.id nav: - - Overview: index.md - - Get Started: early-adopter.md - - Community: https://join.slack.com/t/trinsiccommunity/shared_invite/zt-pcsdy7kn-h4vtdPEpqQUlmirU8FFzSQ - - Support: support.md - - Learn: - - Introduction: concepts/index.md - - Credentials: concepts/credentials.md - - Presentations: concepts/presentations.md - - Ecosystems: concepts/ecosystems.md - - Trinsic's Platform: concepts/what-is-trinsic.md - - Underlying Tech: concepts/tech.md - - Security: concepts/security.md + - Welcome: index.md + - Join the Beta: early-adopter.md + - Join the Community: https://join.slack.com/t/trinsiccommunity/shared_invite/zt-pcsdy7kn-h4vtdPEpqQUlmirU8FFzSQ + - Have a Question?: support.md - Build: - CLI: cli/index.md - Node: node/index.md @@ -28,6 +20,14 @@ nav: - Web: web/index.md - iOS: ios/index.md - Android: android/index.md + - Learn: + - Introduction: concepts/index.md + - Wallets: concepts/wallets.md + - Credentials: concepts/credentials.md + - Passes: concepts/passes.md + - Ecosystems: concepts/ecosystems.md + - Security: concepts/security.md + - Underlying Tech: concepts/tech.md - Reference: - Setup: reference/setup/index.md - Wallet Service: reference/services/wallet-service.md From ecf9d60cded0ff07df823e70eedf9f8d1ab34edc Mon Sep 17 00:00:00 2001 From: Michael Boyd Date: Sat, 30 Oct 2021 17:57:40 -0700 Subject: [PATCH 07/12] added sdk specific repos --- docs/build/android/index.md | 0 docs/build/cli/index.md | 0 docs/{walkthrough => build/cli}/vaccination-cli.md | 0 docs/build/dotnet/index.md | 0 docs/{walkthrough => build/dotnet}/vaccination-net.md | 0 docs/build/go/index.md | 0 docs/build/ios/index.md | 0 docs/build/java/index.md | 0 docs/build/node/index.md | 0 docs/{walkthrough => build/node}/vaccination-node.md | 0 docs/build/python/index.md | 0 docs/{walkthrough => build/python}/vaccination-python.md | 0 docs/build/ruby/index.md | 0 docs/build/web/index.md | 0 .../vaccination-browser.md => build/web/vaccination-web.md} | 0 docs/{concepts => learn}/credentials.md | 0 docs/{concepts => learn}/ecosystems.md | 0 docs/{concepts => learn}/index.md | 0 docs/{concepts => learn}/passes.md | 0 docs/{concepts => learn}/tech.md | 0 docs/{concepts => learn}/trinsic.md | 0 docs/{concepts => learn}/wallets.md | 0 docs/{walkthrough => }/snippets/intro-infrastructure.md | 0 docs/{walkthrough => }/snippets/intro-use-case.md | 0 24 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/build/android/index.md create mode 100644 docs/build/cli/index.md rename docs/{walkthrough => build/cli}/vaccination-cli.md (100%) create mode 100644 docs/build/dotnet/index.md rename docs/{walkthrough => build/dotnet}/vaccination-net.md (100%) create mode 100644 docs/build/go/index.md create mode 100644 docs/build/ios/index.md create mode 100644 docs/build/java/index.md create mode 100644 docs/build/node/index.md rename docs/{walkthrough => build/node}/vaccination-node.md (100%) create mode 100644 docs/build/python/index.md rename docs/{walkthrough => build/python}/vaccination-python.md (100%) create mode 100644 docs/build/ruby/index.md create mode 100644 docs/build/web/index.md rename docs/{walkthrough/vaccination-browser.md => build/web/vaccination-web.md} (100%) rename docs/{concepts => learn}/credentials.md (100%) rename docs/{concepts => learn}/ecosystems.md (100%) rename docs/{concepts => learn}/index.md (100%) rename docs/{concepts => learn}/passes.md (100%) rename docs/{concepts => learn}/tech.md (100%) rename docs/{concepts => learn}/trinsic.md (100%) rename docs/{concepts => learn}/wallets.md (100%) rename docs/{walkthrough => }/snippets/intro-infrastructure.md (100%) rename docs/{walkthrough => }/snippets/intro-use-case.md (100%) diff --git a/docs/build/android/index.md b/docs/build/android/index.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/build/cli/index.md b/docs/build/cli/index.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/walkthrough/vaccination-cli.md b/docs/build/cli/vaccination-cli.md similarity index 100% rename from docs/walkthrough/vaccination-cli.md rename to docs/build/cli/vaccination-cli.md diff --git a/docs/build/dotnet/index.md b/docs/build/dotnet/index.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/walkthrough/vaccination-net.md b/docs/build/dotnet/vaccination-net.md similarity index 100% rename from docs/walkthrough/vaccination-net.md rename to docs/build/dotnet/vaccination-net.md diff --git a/docs/build/go/index.md b/docs/build/go/index.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/build/ios/index.md b/docs/build/ios/index.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/build/java/index.md b/docs/build/java/index.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/build/node/index.md b/docs/build/node/index.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/walkthrough/vaccination-node.md b/docs/build/node/vaccination-node.md similarity index 100% rename from docs/walkthrough/vaccination-node.md rename to docs/build/node/vaccination-node.md diff --git a/docs/build/python/index.md b/docs/build/python/index.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/walkthrough/vaccination-python.md b/docs/build/python/vaccination-python.md similarity index 100% rename from docs/walkthrough/vaccination-python.md rename to docs/build/python/vaccination-python.md diff --git a/docs/build/ruby/index.md b/docs/build/ruby/index.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/build/web/index.md b/docs/build/web/index.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/walkthrough/vaccination-browser.md b/docs/build/web/vaccination-web.md similarity index 100% rename from docs/walkthrough/vaccination-browser.md rename to docs/build/web/vaccination-web.md diff --git a/docs/concepts/credentials.md b/docs/learn/credentials.md similarity index 100% rename from docs/concepts/credentials.md rename to docs/learn/credentials.md diff --git a/docs/concepts/ecosystems.md b/docs/learn/ecosystems.md similarity index 100% rename from docs/concepts/ecosystems.md rename to docs/learn/ecosystems.md diff --git a/docs/concepts/index.md b/docs/learn/index.md similarity index 100% rename from docs/concepts/index.md rename to docs/learn/index.md diff --git a/docs/concepts/passes.md b/docs/learn/passes.md similarity index 100% rename from docs/concepts/passes.md rename to docs/learn/passes.md diff --git a/docs/concepts/tech.md b/docs/learn/tech.md similarity index 100% rename from docs/concepts/tech.md rename to docs/learn/tech.md diff --git a/docs/concepts/trinsic.md b/docs/learn/trinsic.md similarity index 100% rename from docs/concepts/trinsic.md rename to docs/learn/trinsic.md diff --git a/docs/concepts/wallets.md b/docs/learn/wallets.md similarity index 100% rename from docs/concepts/wallets.md rename to docs/learn/wallets.md diff --git a/docs/walkthrough/snippets/intro-infrastructure.md b/docs/snippets/intro-infrastructure.md similarity index 100% rename from docs/walkthrough/snippets/intro-infrastructure.md rename to docs/snippets/intro-infrastructure.md diff --git a/docs/walkthrough/snippets/intro-use-case.md b/docs/snippets/intro-use-case.md similarity index 100% rename from docs/walkthrough/snippets/intro-use-case.md rename to docs/snippets/intro-use-case.md From c9f89ba5a1db12274d3ab2f350ce47914b8d8716 Mon Sep 17 00:00:00 2001 From: Michael Boyd Date: Sat, 30 Oct 2021 18:00:03 -0700 Subject: [PATCH 08/12] updated nav --- mkdocs.yml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index c6a571f6a..f3165047e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -10,24 +10,24 @@ nav: - Join the Community: https://join.slack.com/t/trinsiccommunity/shared_invite/zt-pcsdy7kn-h4vtdPEpqQUlmirU8FFzSQ - Have a Question?: support.md - Build: - - CLI: cli/index.md - - Node: node/index.md - - C#: csharp/index.md - - Python: python/index.md - - Ruby: ruby/index.md - - Go: go/index.md - - Java: java/index.md - - Web: web/index.md - - iOS: ios/index.md - - Android: android/index.md + - CLI: build/cli/index.md + - Node: build/node/index.md + - C#: build/dotnet/index.md + - Python: build/python/index.md + - Ruby: build/ruby/index.md + - Go: build/go/index.md + - Java: build/java/index.md + - Web: build/web/index.md + - iOS: build/ios/index.md + - Android: build/android/index.md - Learn: - - Introduction: concepts/index.md - - Wallets: concepts/wallets.md - - Credentials: concepts/credentials.md - - Passes: concepts/passes.md - - Ecosystems: concepts/ecosystems.md - - Security: concepts/security.md - - Underlying Tech: concepts/tech.md + - Introduction: learn/index.md + - Wallets: learn/wallets.md + - Credentials: learn/credentials.md + - Passes: learn/passes.md + - Ecosystems: learn/ecosystems.md + - Security: learn/security.md + - Underlying Tech: learn/tech.md - Reference: - Setup: reference/setup/index.md - Wallet Service: reference/services/wallet-service.md From 70a0c7fbac1139168955b82553b3d39b4ab6f825 Mon Sep 17 00:00:00 2001 From: Michael Boyd Date: Sun, 31 Oct 2021 10:13:26 -0700 Subject: [PATCH 09/12] added new structure to docs --- docs/android/index.md | 13 ++ docs/build/android/index.md | 0 docs/build/cli/index.md | 0 docs/build/dotnet/index.md | 0 docs/build/go/index.md | 0 docs/build/ios/index.md | 0 docs/build/java/index.md | 0 docs/build/node/index.md | 0 docs/build/python/index.md | 0 docs/build/ruby/index.md | 0 docs/build/web/index.md | 0 docs/cli/index.md | 72 +++++++++ docs/{build => }/cli/vaccination-cli.md | 29 +--- docs/dotnet/index.md | 40 +++++ docs/{build => }/dotnet/vaccination-net.md | 4 +- docs/go/index.md | 13 ++ docs/index.md | 22 +-- docs/ios/index.md | 13 ++ docs/java/index.md | 13 ++ docs/learn/security.md | 7 + docs/node/index.md | 38 +++++ docs/{build => }/node/vaccination-node.md | 0 docs/python/index.md | 13 ++ docs/{build => }/python/vaccination-python.md | 0 .../reference/{setup/profiles.md => index.md} | 13 +- docs/reference/setup/configuration.md | 83 ---------- docs/reference/setup/index.md | 143 ------------------ .../setup/installation/install-cli.md | 13 -- .../setup/installation/install-net.md | 14 -- .../setup/installation/install-node.md | 6 - docs/ruby/index.md | 13 ++ docs/web/index.md | 23 +++ docs/{build => }/web/vaccination-web.md | 0 mkdocs.yml | 36 ++--- 34 files changed, 302 insertions(+), 319 deletions(-) create mode 100644 docs/android/index.md delete mode 100644 docs/build/android/index.md delete mode 100644 docs/build/cli/index.md delete mode 100644 docs/build/dotnet/index.md delete mode 100644 docs/build/go/index.md delete mode 100644 docs/build/ios/index.md delete mode 100644 docs/build/java/index.md delete mode 100644 docs/build/node/index.md delete mode 100644 docs/build/python/index.md delete mode 100644 docs/build/ruby/index.md delete mode 100644 docs/build/web/index.md create mode 100644 docs/cli/index.md rename docs/{build => }/cli/vaccination-cli.md (84%) create mode 100644 docs/dotnet/index.md rename docs/{build => }/dotnet/vaccination-net.md (98%) create mode 100644 docs/go/index.md create mode 100644 docs/ios/index.md create mode 100644 docs/java/index.md create mode 100644 docs/learn/security.md create mode 100644 docs/node/index.md rename docs/{build => }/node/vaccination-node.md (100%) create mode 100644 docs/python/index.md rename docs/{build => }/python/vaccination-python.md (100%) rename docs/reference/{setup/profiles.md => index.md} (82%) delete mode 100644 docs/reference/setup/configuration.md delete mode 100644 docs/reference/setup/index.md delete mode 100644 docs/reference/setup/installation/install-cli.md delete mode 100644 docs/reference/setup/installation/install-net.md delete mode 100644 docs/reference/setup/installation/install-node.md create mode 100644 docs/ruby/index.md create mode 100644 docs/web/index.md rename docs/{build => }/web/vaccination-web.md (100%) diff --git a/docs/android/index.md b/docs/android/index.md new file mode 100644 index 000000000..4670ff5dc --- /dev/null +++ b/docs/android/index.md @@ -0,0 +1,13 @@ +# The Trinsic Java / Android SDK + +The Trinsic Java / Android SDK makes it easy to interact with the Trinsic API from any Java application. The most recent version of the library can be found on ____. You can find the SDKs source on [Github](https://github.com/trinsic-id/sdk/java). + +## Installation +TODO + +## Configuration +TODO + +## Next Steps +TODO + diff --git a/docs/build/android/index.md b/docs/build/android/index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/build/cli/index.md b/docs/build/cli/index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/build/dotnet/index.md b/docs/build/dotnet/index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/build/go/index.md b/docs/build/go/index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/build/ios/index.md b/docs/build/ios/index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/build/java/index.md b/docs/build/java/index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/build/node/index.md b/docs/build/node/index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/build/python/index.md b/docs/build/python/index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/build/ruby/index.md b/docs/build/ruby/index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/build/web/index.md b/docs/build/web/index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/cli/index.md b/docs/cli/index.md new file mode 100644 index 000000000..860082b1c --- /dev/null +++ b/docs/cli/index.md @@ -0,0 +1,72 @@ +# The Trinsic CLI + +The Trinsic CLI makes it easy to interact with the Trinsic API from your terminal. The Trinsic CLI also supports linux development environment. You can build the CLI from source on [Github](https://github.com/trinsic-id/sdk/cli). + + +## Installation + +The CLI can be installed directly using the Cargo tool. This requires the [Rustup toolchain :material-open-in-new:](https://www.rust-lang.org/tools/install){target=_blank} installed on your system. + +Once installed, run this command in terminal: + +```bash +cargo install --git https://github.com/trinsic-id/sdk.git --branch main +``` + +To verify that the CLI has been installed successfully, try running: + +```bash +trinsic --help +``` + +## Configuration + +The CLI stores its configuration in the user's home directory in `~/.trinsic/`. This directory contains the main configuration file `config.toml` and all the profile data. + +### Show Configuration + +To print the current configuration file in the terminal use: + +```bash +trinsic config --show +``` + +Typical configuration file may look like this: + +```toml +[server] +address = "http://localhost:5000/" + +[profile] +default = "my_profile" +``` + +### Update Configuration Entry + +To change the configuration values, use the `config` subcommand with the attribute and it's value. + +```bash +trinsic config +``` + +The following attributes are currently supported: + +`server-address` +: Updates the default server address the CLI communicates + + ```bash + trinsic config --server-address https://example.com/ + ``` + +`profile-default` +: Updates the default profile used with the CLI + + ```bash + trinsic config --profile-default alice + ``` + +## Next Steps + +Once the CLI is installed and configured, you're ready to start building! We recommend going through the [walkthrough](./vaccination-cli.md) next. If you're ready to dive into building your ecosystem, check out our [API Reference](/reference/index.md) + +[Start Walkthrough](./vaccination-cli.md){ .md-button .md-button--primary } [Explore API](/reference/index.md){ .md-button } diff --git a/docs/build/cli/vaccination-cli.md b/docs/cli/vaccination-cli.md similarity index 84% rename from docs/build/cli/vaccination-cli.md rename to docs/cli/vaccination-cli.md index 8b46fe810..f3d8fd078 100644 --- a/docs/build/cli/vaccination-cli.md +++ b/docs/cli/vaccination-cli.md @@ -3,35 +3,10 @@ It can be challenging to understand how verifiable credentials work until you see some examples. This walkthrough will show how a vaccination card might be issued, held, and proven using verifiable credentials with the Trinsic CLI. It assumes no prior knowledge to decentralized identity. --8<---- -walkthrough/snippets/intro-infrastructure.md -walkthrough/snippets/intro-use-case.md +/snippets/intro-infrastructure.md +/snippets/intro-use-case.md --8<---- -## Install Trinsic CLI - ---8<-- "setup/installation/install-cli.md" - -If you're here to just go through the walkthrough, check out our [Gitpod cloud environment](https://gitpod.io/#https://github.com/trinsic-id/sdk) for easy installation (You'll have to create a free account with gitpod). - -To install the CLI locally, clone our sdk github repo and compile the SDK -```bash -git clone https://github.com/trinsic-id/sdk.git - -cd sdk/cli - -cargo install --path . -``` - -Once installed, configure the CLI's server address to your Ecosystem: - -=== "Trinsic CLI" - - ```bash - trinsic config --server-address https://example.com - ``` - -!!! note - Reference: [Configuration with CLI](../reference/setup/index.md#configuration-with-cli) ## Meet Allison diff --git a/docs/dotnet/index.md b/docs/dotnet/index.md new file mode 100644 index 000000000..8f4981827 --- /dev/null +++ b/docs/dotnet/index.md @@ -0,0 +1,40 @@ +# The Trinsic C# / .NET SDK +The Trinsic C# / .NET SDK makes it easy to interact with the Trinsic API from your .NET application. The most recent version of the library can be found on NuGet. The Trinsic SDK supports .NET applications written in C#, VB.NET, and F# that utilize any supported version of .NET Core. You can also find the SDKs source on [Github](https://github.com/trinsic-id/sdk/dotnet). + +## Installation +Install the packages directly from [Nuget.org :material-open-in-new:](https://www.nuget.org/packages/Trinsic){target=_blank} + +=== "Package Manager" + ``` + PM> Install-Package Trinsic + ``` +=== ".NET CLI" + ``` + > dotnet add package Trinsic + ``` +=== "PackageReference" + ``` + + ``` + +## Configuration + +```csharp +using Trinsic; + +// Set the server address +var service = new WalletService("https://example.com"); + +// Create new profile or import an existing one +var myProfile = await service.CreateWallet(); + +// Set the profile to be used with authorization pipeline +service.SetProfile(myProfile); +``` + +## Next Steps + +Once the CLI is installed and configured, you're ready to start building! We recommend going through the [walkthrough](./vaccination-net.md) next. If you're ready to dive into building your ecosystem, check out our [API Reference](/reference/index.md) + +[Start Walkthrough](./vaccination-net.md){ .md-button .md-button--primary } [Explore API](/reference/index.md){ .md-button } + diff --git a/docs/build/dotnet/vaccination-net.md b/docs/dotnet/vaccination-net.md similarity index 98% rename from docs/build/dotnet/vaccination-net.md rename to docs/dotnet/vaccination-net.md index 2b7597d1d..5042583cc 100644 --- a/docs/build/dotnet/vaccination-net.md +++ b/docs/dotnet/vaccination-net.md @@ -1,8 +1,8 @@ # Vaccination Use Case for .NET Core --8<---- -walkthrough/snippets/intro-infrastructure.md -walkthrough/snippets/intro-use-case.md +/snippets/intro-infrastructure.md +/snippets/intro-use-case.md --8<---- ## Technical requirements diff --git a/docs/go/index.md b/docs/go/index.md new file mode 100644 index 000000000..2c2278445 --- /dev/null +++ b/docs/go/index.md @@ -0,0 +1,13 @@ +# The Trinsic Go SDK + +The Trinsic Go SDK makes it easy to interact with the Trinsic API from any Go application. The most recent version of the library can be found on ____. You can find the SDKs source on [Github](https://github.com/trinsic-id/sdk/go). + +## Installation +TODO + +## Configuration +TODO + +## Next Steps +TODO + diff --git a/docs/index.md b/docs/index.md index 914cff772..8adc6e40b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -12,20 +12,20 @@ Trinsic provides an SDK to issue and verify universally-accepted digital credent ## Quickstart Get up and running in the language of your choice or interact with Trinsic through your terminal. -[:octicons-terminal-16: **Use the CLI**](#) +[:octicons-terminal-16: **Use the CLI**](cli/index.md) ### Server-side SDKs -[:material-nodejs: Node](#){ .md-button .md-button--primary } -[:material-language-python: Python](#){ .md-button .md-button--primary} -[:material-menu: Go](#){ .md-button .md-button--primary} -[:material-language-ruby: Ruby](#){ .md-button .md-button--primary} -[:material-language-java: Java](#){ .md-button .md-button--primary} -[:material-microsoft: .NET](#){ .md-button .md-button--primary} +[:material-nodejs: Node](node/index.md){ .md-button .md-button--primary } +[:material-language-python: Python](python/index.md){ .md-button .md-button--primary } +[:material-menu: Go](go/index.md){ .md-button .md-button--primary} +[:material-language-ruby: Ruby](ruby/index.md){ .md-button .md-button--primary } +[:material-language-java: Java](java/index.md){ .md-button .md-button--primary } +[:material-microsoft: .NET](dotnet/index.md){ .md-button .md-button--primary } ### Client-side SDKs -[:material-android: Android](#){ .md-button} -[:material-apple: iOS](#){ .md-button} -[:fontawesome-brands-js-square: Web](#){ .md-button} +[:material-android: Android](android/index.md){ .md-button } +[:material-apple: iOS](ios/index.md){ .md-button } +[:fontawesome-brands-js-square: Web](web/index.md){ .md-button } ## Learn More -If you're new to verifiable credentials, continue reading on the next page to get a better idea about how they can be used. +If you're new to verifiable credentials, continue reading in the [**Learn**](learn/index.md) to understand more about the concepts. diff --git a/docs/ios/index.md b/docs/ios/index.md new file mode 100644 index 000000000..95cc97de2 --- /dev/null +++ b/docs/ios/index.md @@ -0,0 +1,13 @@ +# The Trinsic Swift SDK + +The Trinsic Swift SDK makes it easy to interact with the Trinsic API from any iOS application. The most recent version of the library can be found on ____. You can find the SDKs source on [Github](https://github.com/trinsic-id/sdk/swift). + +## Installation +TODO + +## Configuration +TODO + +## Next Steps +TODO + diff --git a/docs/java/index.md b/docs/java/index.md new file mode 100644 index 000000000..a42983064 --- /dev/null +++ b/docs/java/index.md @@ -0,0 +1,13 @@ +# The Trinsic Java SDK + +The Trinsic Java SDK makes it easy to interact with the Trinsic API from any Java application. The most recent version of the library can be found on ____. You can find the SDKs source on [Github](https://github.com/trinsic-id/sdk/java). + +## Installation +TODO + +## Configuration +TODO + +## Next Steps +TODO + diff --git a/docs/learn/security.md b/docs/learn/security.md new file mode 100644 index 000000000..e4bc6712b --- /dev/null +++ b/docs/learn/security.md @@ -0,0 +1,7 @@ +# Trinsic's Security + +TODO + +All keys kept in HSMs. + +Authorization done with blinded secrets \ No newline at end of file diff --git a/docs/node/index.md b/docs/node/index.md new file mode 100644 index 000000000..91228c8fd --- /dev/null +++ b/docs/node/index.md @@ -0,0 +1,38 @@ +# The Trinsic Javascript / Node SDK + +The Trinsic Node SDK makes it easy to interact with the Trinsic API from any backend javascript application. The most recent version of the library can be found on ____. You can find the SDKs source on [Github](https://github.com/trinsic-id/sdk/java). + + + +## Installation +Install the package for Node from [npmjs.com :material-open-in-new:](https://www.npmjs.com/package/@trinsic/trinsic){target=_blank} + +=== "Install" + ```bash + npm i @trinsic/trinsic + ``` + +## Configuration + +When using the SDK in your code, you can pass parameters to the default service constructors and use the provided methods to set different active profiles. + +```typescript +import { WalletService } from '@trinsic/trinsic'; + +// Set the server address +const service = new WalletService("https://example.com"); + +// Create new profile or import an existing one +const myProfile = await service.createWallet(); + +// Set the profile to be used with authorization pipeline +service.setProfile(myProfile); +``` + +## Next Steps + +Once the SDK is installed and configured, you're ready to start building! We recommend going through the [walkthrough](./vaccination-node.md) next. If you're ready to dive into building your ecosystem, check out our [API Reference](/reference/index.md) + +[Start Walkthrough](./vaccination-node.md){ .md-button .md-button--primary } [Explore API](/reference/index.md){ .md-button } + + diff --git a/docs/build/node/vaccination-node.md b/docs/node/vaccination-node.md similarity index 100% rename from docs/build/node/vaccination-node.md rename to docs/node/vaccination-node.md diff --git a/docs/python/index.md b/docs/python/index.md new file mode 100644 index 000000000..70d9958b5 --- /dev/null +++ b/docs/python/index.md @@ -0,0 +1,13 @@ +# The Trinsic Python SDK + +The Trinsic Python SDK makes it easy to interact with the Trinsic API from any Python application. The most recent version of the library can be found on ____. You can find the SDKs source on [Github](https://github.com/trinsic-id/sdk/python). + +## Installation +TODO + +## Configuration +TODO + +## Next Steps +TODO + diff --git a/docs/build/python/vaccination-python.md b/docs/python/vaccination-python.md similarity index 100% rename from docs/build/python/vaccination-python.md rename to docs/python/vaccination-python.md diff --git a/docs/reference/setup/profiles.md b/docs/reference/index.md similarity index 82% rename from docs/reference/setup/profiles.md rename to docs/reference/index.md index 7771a8630..00ee2a4ae 100644 --- a/docs/reference/setup/profiles.md +++ b/docs/reference/index.md @@ -1,9 +1,16 @@ +# Overview -# Security Profiles / Authorization +## Use one of the SDKs + +If you are ready to begin integrating the SDK, make sure you have an SDK installed and configured. You can install each SDK by following the instructions in each page under **Build** in the sidebar. + +When using the SDK, you can pass parameters to the default service constructors and use the provided methods to set different active profiles. + +## Authorization Trinsic Ecosystems uses authenticated access for accessing personal data. This is implemented using [Authorization Capabilities for Linked Data :material-open-in-new:](https://w3c-ccg.github.io/zcap-ld/){target=_blank} (ZCAP-LD for short). Zcaps provide a secure way for linked data systems to grant and express authority utilizing the object capability model. Our wallet capabilities are represented as linked data objects which are signed with Linked Data Proofs. LD Proofs represent the core technology of the way we share and exchange authentic data with others. -## Profile Data Format +### Profile Data Format Security Profiles are represented as a protobuf message that contains details about the connecting device to the remote cloud wallet. These are sensitive details that contain private key data, and must always be stored in a secure storage. The details of this data contract are expressed with this proto message. @@ -36,3 +43,5 @@ message WalletProfile { This profile is always stored in its binary form using the protobuf native serialization. A profile is created by using the [Create Wallet](/reference/services/wallet-service/#create-wallet) functionality in the SDK. + + diff --git a/docs/reference/setup/configuration.md b/docs/reference/setup/configuration.md deleted file mode 100644 index 4a63a2797..000000000 --- a/docs/reference/setup/configuration.md +++ /dev/null @@ -1,83 +0,0 @@ -## Configuration - -Trinsic SDK contains minimal configuration. This configuration is stored differently, depending on what package is used. - -### Configuration with CLI - -The CLI stores it's configuration in the user's home directory, typically in `~/.trinsic/`. This directory contains the main configuration file `config.toml` and all the profile data. - -### Show Configuration - -To print the current configuration file in the terminal use: - -```bash -trinsic config --show -``` - -Typical configuration file may look like this: - -```toml -[server] -address = "http://localhost:5000/" - -[profile] -default = "my_profile" -``` - -### Update Configuration Entry - -To change the configuration values, use the `config` subcommand with the attribute and it's value. - -```bash -trinsic config -``` - -The following attributes are currently supported: - -`server-address` -: Updates the default server address the CLI communicates - - ```bash - trinsic config --server-address https://example.com/ - ``` - -`profile-default` -: Updates the default profile used with the CLI - - ```bash - trinsic config --profile-default alice - ``` - -### Configuration with SDK - -When using the SDK in your code, you can pass parameters to the default service constructors and use the provided methods to set different active profiles. - -=== "TypeScript" - - ```typescript - import { WalletService } from '@trinsic/trinsic'; - - // Set the server address - const service = new WalletService("https://example.com"); - - // Create new profile or import an existing one - const myProfile = await service.createWallet(); - - // Set the profile to be used with authorization pipeline - service.setProfile(myProfile); - ``` - -=== "C#" - - ```csharp - using Trinsic; - - // Set the server address - var service = new WalletService("https://example.com"); - - // Create new profile or import an existing one - var myProfile = await service.CreateWallet(); - - // Set the profile to be used with authorization pipeline - service.SetProfile(myProfile); - ``` \ No newline at end of file diff --git a/docs/reference/setup/index.md b/docs/reference/setup/index.md deleted file mode 100644 index b4fccff3d..000000000 --- a/docs/reference/setup/index.md +++ /dev/null @@ -1,143 +0,0 @@ -# Setup -## Installation - -If you are ready to begin integrating the SDK into an existing project, make sure you have an SDK installed. -We currently provide a CLI, TypeScript, and C# SDKs for local development. - -If you're here to just go through the walkthrough, check out our [Gitpod cloud environment](https://gitpod.io/#https://github.com/trinsic-id/sdk) for easy installation (You'll have to create a free account with gitpod). - -=== "Trinsic CLI" - - --8<-- "setup/installation/install-cli.md" - -=== "TypeScript" - - --8<-- "setup/installation/install-node.md" - -=== "C#" - - --8<-- "setup/installation/install-net.md" - -## Authorization - -Trinsic Ecosystems uses authenticated access for accessing personal data. This is implemented using [Authorization Capabilities for Linked Data :material-open-in-new:](https://w3c-ccg.github.io/zcap-ld/){target=_blank} (ZCAP-LD for short). Zcaps provide a secure way for linked data systems to grant and express authority utilizing the object capability model. Our wallet capabilities are represented as linked data objects which are signed with Linked Data Proofs. LD Proofs represent the core technology of the way we share and exchange authentic data with others. - -### Profile Data Format - -Security Profiles are represented as a protobuf message that contains details about the connecting device to the remote cloud wallet. These are sensitive details that contain private key data, and must always be stored in a secure storage. The details of this data contract are expressed with this proto message. - -```proto -message WalletProfile { - google.protobuf.Struct did_document = 1; - string wallet_id = 2; - string invoker = 3; - string capability = 4; - bytes invoker_jwk = 5; -} -``` - -`did_document` -: contains the DID Document generated by the device that will be used to access the remote wallet. Each device/profile will have a unique DID Document. The DID method used in this document is `did:key`. - -`wallet_id` -: represents the remote wallet identifier that this profile has been granted access. - -`invoker` -: represents the specific key in the DID Document that was granted capability authorization. - -`capability` -: represents the unique identifier of the z-cap that the `invoker` is allowed to access. - -`invoker_jwk` -: represents the key of the invoker in JWK format. This key is already present in the DID Document, we simply store it here in JWK format for convenience. - ---- - -This profile is always stored in its binary form using the protobuf native serialization. A profile is created by using the [Create Wallet](/reference/services/wallet-service/#create-wallet) functionality in the SDK. - - - -## Configuration - -Trinsic SDK contains minimal configuration. This configuration is stored differently, depending on what package is used. - -### Configuration with CLI - -The CLI stores it's configuration in the user's home directory, typically in `~/.trinsic/`. This directory contains the main configuration file `config.toml` and all the profile data. - -### Show Configuration - -To print the current configuration file in the terminal use: - -```bash -trinsic config --show -``` - -Typical configuration file may look like this: - -```toml -[server] -address = "http://localhost:5000/" - -[profile] -default = "my_profile" -``` - -### Update Configuration Entry - -To change the configuration values, use the `config` subcommand with the attribute and it's value. - -```bash -trinsic config -``` - -The following attributes are currently supported: - -`server-address` -: Updates the default server address the CLI communicates - - ```bash - trinsic config --server-address https://example.com/ - ``` - -`profile-default` -: Updates the default profile used with the CLI - - ```bash - trinsic config --profile-default alice - ``` - -### Configuration with SDK - -When using the SDK in your code, you can pass parameters to the default service constructors and use the provided methods to set different active profiles. - -=== "TypeScript" - - ```typescript - import { WalletService } from '@trinsic/trinsic'; - - // Set the server address - const service = new WalletService("https://example.com"); - - // Create new profile or import an existing one - const myProfile = await service.createWallet(); - - // Set the profile to be used with authorization pipeline - service.setProfile(myProfile); - ``` - -=== "C#" - - ```csharp - using Trinsic; - - // Set the server address - var service = new WalletService("https://example.com"); - - // Create new profile or import an existing one - var myProfile = await service.CreateWallet(); - - // Set the profile to be used with authorization pipeline - service.SetProfile(myProfile); - ``` - diff --git a/docs/reference/setup/installation/install-cli.md b/docs/reference/setup/installation/install-cli.md deleted file mode 100644 index 3cf933cdd..000000000 --- a/docs/reference/setup/installation/install-cli.md +++ /dev/null @@ -1,13 +0,0 @@ -The CLI can be installed directly using the Cargo tool. This requires the [Rustup toolchain :material-open-in-new:](https://www.rust-lang.org/tools/install){target=_blank} installed on your system. - -Once installed, run this command in terminal: - -```bash -cargo install --git https://github.com/trinsic-id/sdk.git --branch main -``` - -To verify that the CLI has been installed successfully, try running: - -```bash -trinsic --help -``` \ No newline at end of file diff --git a/docs/reference/setup/installation/install-net.md b/docs/reference/setup/installation/install-net.md deleted file mode 100644 index 0d1054813..000000000 --- a/docs/reference/setup/installation/install-net.md +++ /dev/null @@ -1,14 +0,0 @@ -Install the packages directly from [Nuget.org :material-open-in-new:](https://www.nuget.org/packages/Trinsic){target=_blank} - -=== "Package Manager" - ``` - PM> Install-Package Trinsic - ``` -=== ".NET CLI" - ``` - > dotnet add package Trinsic - ``` -=== "PackageReference" - ``` - - ``` diff --git a/docs/reference/setup/installation/install-node.md b/docs/reference/setup/installation/install-node.md deleted file mode 100644 index c3d00977d..000000000 --- a/docs/reference/setup/installation/install-node.md +++ /dev/null @@ -1,6 +0,0 @@ -Install the package for Node or Browser from [npmjs.com :material-open-in-new:](https://www.npmjs.com/package/@trinsic/trinsic){target=_blank} - -=== "Install" - ```bash - npm i @trinsic/trinsic - ``` \ No newline at end of file diff --git a/docs/ruby/index.md b/docs/ruby/index.md new file mode 100644 index 000000000..8baf6fe81 --- /dev/null +++ b/docs/ruby/index.md @@ -0,0 +1,13 @@ +# The Trinsic Ruby SDK + +The Trinsic Ruby SDK makes it easy to interact with the Trinsic API from any Ruby application. The most recent version of the library can be found on ____. You can find the SDKs source on [Github](https://github.com/trinsic-id/sdk/ruby). + +## Installation +TODO + +## Configuration +TODO + +## Next Steps +TODO + diff --git a/docs/web/index.md b/docs/web/index.md new file mode 100644 index 000000000..697ef61ab --- /dev/null +++ b/docs/web/index.md @@ -0,0 +1,23 @@ +# The Trinsic Javascript / Web SDK + +The Trinsic Web SDK makes it easy to interact with the Trinsic API from any client-side web application. The most recent version of the library can be found on ____. You can find the SDKs source on [Github](https://github.com/trinsic-id/sdk/web). + +## Installation +Install the package for Node or Browser from [npmjs.com :material-open-in-new:](https://www.npmjs.com/package/@trinsic/trinsic){target=_blank} + +=== "Install" + ```bash + npm i @trinsic/trinsic + ``` + +## Configuration +TODO + +## Next Steps + +Once the SDK is installed and configured, you're ready to start building! We recommend going through the [walkthrough](./vaccination-web.md) next. If you're ready to dive into building your ecosystem, check out our [API Reference](/reference/index.md) + +[Start Walkthrough](./vaccination-web.md){ .md-button .md-button--primary } [Explore API](/reference/index.md){ .md-button } + + + diff --git a/docs/build/web/vaccination-web.md b/docs/web/vaccination-web.md similarity index 100% rename from docs/build/web/vaccination-web.md rename to docs/web/vaccination-web.md diff --git a/mkdocs.yml b/mkdocs.yml index f3165047e..aeb50408d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -5,37 +5,37 @@ edit_uri: edit/main/docs/ repo_name: trinsic-id/sdk site_url: https://ecosystems-docs-alpha.trinsic.id nav: - - Welcome: index.md + - Welcome!: index.md - Join the Beta: early-adopter.md - - Join the Community: https://join.slack.com/t/trinsiccommunity/shared_invite/zt-pcsdy7kn-h4vtdPEpqQUlmirU8FFzSQ - - Have a Question?: support.md + - Ask a Question: support.md - Build: - - CLI: build/cli/index.md - - Node: build/node/index.md - - C#: build/dotnet/index.md - - Python: build/python/index.md - - Ruby: build/ruby/index.md - - Go: build/go/index.md - - Java: build/java/index.md - - Web: build/web/index.md - - iOS: build/ios/index.md - - Android: build/android/index.md + - CLI: cli/index.md + - Node: node/index.md + - C#: dotnet/index.md + - Python: python/index.md + - Ruby: ruby/index.md + - Go: go/index.md + - Java: java/index.md + - Web: web/index.md + - iOS: ios/index.md + - Android: android/index.md - Learn: - Introduction: learn/index.md - Wallets: learn/wallets.md - Credentials: learn/credentials.md - Passes: learn/passes.md - Ecosystems: learn/ecosystems.md - - Security: learn/security.md + # - Security: learn/security.md TODO - Underlying Tech: learn/tech.md - Reference: - - Setup: reference/setup/index.md + - Overview: reference/index.md - Wallet Service: reference/services/wallet-service.md - Provider Service: reference/services/provider-service.md - - Trust Registry: reference/services/trust-registry.md + - Trust Registry Service: reference/services/trust-registry.md - Resources: - - Roadmap: roadmap.md - - Changelog: changelog.md + - Join the Community: https://join.slack.com/t/trinsiccommunity/shared_invite/zt-pcsdy7kn-h4vtdPEpqQUlmirU8FFzSQ + # - Roadmap: roadmap.md TODO + # - Changelog: changelog.md TODO - Github: https://github.com/trinsic-id theme: name: material From 6928536ae69d42e110be5e2a85cad93520b32422 Mon Sep 17 00:00:00 2001 From: Michael Boyd Date: Sun, 31 Oct 2021 10:21:39 -0700 Subject: [PATCH 10/12] minor updates and typos --- docs/dotnet/vaccination-net.md | 2 +- docs/node/vaccination-node.md | 6 +++--- docs/python/vaccination-python.md | 2 +- docs/reference/services/trust-registry.md | 24 +++++++++++++++++++++++ docs/reference/services/wallet-service.md | 2 +- docs/web/vaccination-web.md | 2 +- 6 files changed, 31 insertions(+), 7 deletions(-) diff --git a/docs/dotnet/vaccination-net.md b/docs/dotnet/vaccination-net.md index 5042583cc..d896d8092 100644 --- a/docs/dotnet/vaccination-net.md +++ b/docs/dotnet/vaccination-net.md @@ -65,7 +65,7 @@ File.WriteAllBytes("allison.bin", allison.ToByteString().ToByteArray()); var allison = WalletProfile.Parser.ParseFrom(File.ReadAllBytes("allison.bin")); ``` -Read more about [security profiles](/reference/setup/#authorization) and authentication. +Read more about [security profiles](/reference/#authorization) and authentication. ## Certificate issuance diff --git a/docs/node/vaccination-node.md b/docs/node/vaccination-node.md index e9878e812..690ebd53e 100644 --- a/docs/node/vaccination-node.md +++ b/docs/node/vaccination-node.md @@ -1,8 +1,8 @@ # Vaccination Use Case for Node.js --8<---- -walkthrough/snippets/intro-infrastructure.md -walkthrough/snippets/intro-use-case.md +snippets/intro-infrastructure.md +snippets/intro-use-case.md --8<---- ## Technical requirements @@ -63,7 +63,7 @@ let allison = WalletProfile.deserializeBinary(profile); !!! note "Loading Profiles" In order to load a profile from a saved file you'll need to install google-protobuf with `npm i google-protobuf` in order to use the Struct class and convert the DID Document from JavaScript to the protobuf form. -Read more about [security profiles](../reference/setup/index.md#authorization) and authentication. +Read more about [security profiles](/reference/index.md#authorization) and authentication. ## Certificate issuance diff --git a/docs/python/vaccination-python.md b/docs/python/vaccination-python.md index 3ea266926..d8ef781b7 100644 --- a/docs/python/vaccination-python.md +++ b/docs/python/vaccination-python.md @@ -42,7 +42,7 @@ If you would like to save the profile for future use, you can simply export the File.WriteAllBytes("allison.bin", allison.ToByteString().ToByteArray()); ``` -Read more about [security profiles](../reference/setup/index.md#authorization) and authentication. +Read more about [security profiles](../reference/index.md#authorization) and authentication. ## Certificate issuance diff --git a/docs/reference/services/trust-registry.md b/docs/reference/services/trust-registry.md index 2be10ef57..9f5c6d52e 100644 --- a/docs/reference/services/trust-registry.md +++ b/docs/reference/services/trust-registry.md @@ -45,6 +45,10 @@ An ecosystem governance framework is useful because it provides a good basis for === "Java" ```java + ``` +=== "Ruby" + ```ruby + ``` ### Register Issuers and Verifiers Each entity on the governance framework, whether an issuer or a verifier, is represented by a decentralized identifier. These entities are registered to either issue or verify specific credential types. A credential type is represented as a fully qualified `type` URI, of the kind found in a JSON-LD Verifiable Credential. @@ -78,6 +82,10 @@ Finally, each entity must be registered on a specific governance framework. === "Java" ```java + ``` +=== "Ruby" + ```ruby + ``` ### Unregister Issuers and Verifiers @@ -111,6 +119,10 @@ To unregister an entity, include the credential type, the did, and the ecosystem === "Java" ```java + ``` +=== "Ruby" + ```ruby + ``` ### Check Authoritative Status Check the status of an issuer for a credential type within a given governance framework. Returns all historical data for the given input parameter. @@ -143,6 +155,10 @@ Check the status of an issuer for a credential type within a given governance fr === "Java" ```java + ``` +=== "Ruby" + ```ruby + ``` ### Search @@ -173,6 +189,10 @@ Search the registry for authoritative issuer and verifiers using a custom query === "Java" ```java + ``` +=== "Ruby" + ```ruby + ``` ### Cache Offline Registry File Search the registry for authoritative issuer and verifiers using a custom query in a SQL format. @@ -202,4 +222,8 @@ Search the registry for authoritative issuer and verifiers using a custom query === "Java" ```java + ``` +=== "Ruby" + ```ruby + ``` \ No newline at end of file diff --git a/docs/reference/services/wallet-service.md b/docs/reference/services/wallet-service.md index 088a2056f..b127fb672 100644 --- a/docs/reference/services/wallet-service.md +++ b/docs/reference/services/wallet-service.md @@ -8,7 +8,7 @@ Wallets can be created directly by the user or through an invitation by the ecos ### Create wallet directly -To create a wallet directly without an invitation, use the following methods. These methods return secure profile data that should be stored in a safe place. The profile is used to authenticate the wallet service with the cloud provider. Read more details and recommendations in the [Security Profiles](/reference/setup/#authorization) page. +To create a wallet directly without an invitation, use the following methods. These methods return secure profile data that should be stored in a safe place. The profile is used to authenticate the wallet service with the cloud provider. Read more details and recommendations in the [Security Profiles](/reference/#authorization) page. === "Trinsic CLI" ```bash diff --git a/docs/web/vaccination-web.md b/docs/web/vaccination-web.md index dde5bf97f..87b074b6c 100644 --- a/docs/web/vaccination-web.md +++ b/docs/web/vaccination-web.md @@ -114,7 +114,7 @@ let allison = WalletProfile.deserializeBinary(localStorage.getItem("allison.bin" !!! note "Loading Profiles" In order to load a profile from a saved file you'll need to install google-protobuf with `npm i google-protobuf` in order to use the Struct class and convert the DID Document from JavaScript to the protobuf form. -Read more about [security profiles](../reference/setup/index.md/profiles) and authentication. +Read more about [security profiles](../reference/index.md/profiles) and authentication. ## Certificate issuance From 6abae440e33a6085f972dea00cad5c0ba7d44a64 Mon Sep 17 00:00:00 2001 From: Michael Boyd Date: Sun, 31 Oct 2021 12:56:12 -0700 Subject: [PATCH 11/12] add basic trust registry commands --- docs/cli/index.md | 3 +- docs/index.md | 39 +++++++++++++-------- docs/learn/credentials.md | 1 - docs/learn/passes.md | 2 +- docs/learn/wallets.md | 4 +-- docs/node/index.md | 5 +-- docs/python/index.md | 20 ++++++++--- docs/python/vaccination-python.md | 14 ++++---- docs/reference/index.md | 2 -- docs/reference/services/provider-service.md | 2 +- docs/reference/services/trust-registry.md | 8 ++--- docs/snippets/buttons.md | 1 + docs/web/index.md | 4 +-- mkdocs.yml | 24 ++++++------- 14 files changed, 71 insertions(+), 58 deletions(-) create mode 100644 docs/snippets/buttons.md diff --git a/docs/cli/index.md b/docs/cli/index.md index 860082b1c..ea3edd0a5 100644 --- a/docs/cli/index.md +++ b/docs/cli/index.md @@ -1,6 +1,6 @@ # The Trinsic CLI -The Trinsic CLI makes it easy to interact with the Trinsic API from your terminal. The Trinsic CLI also supports linux development environment. You can build the CLI from source on [Github](https://github.com/trinsic-id/sdk/cli). +The Trinsic CLI makes it easy to interact with the Trinsic API from your terminal. The Trinsic CLI also supports linux development environment. You can build the CLI from source on [Github](https://github.com/trinsic-id/sdk/cli). It contains all the commands of the other SDKs, but makes them interactive. ## Installation @@ -70,3 +70,4 @@ The following attributes are currently supported: Once the CLI is installed and configured, you're ready to start building! We recommend going through the [walkthrough](./vaccination-cli.md) next. If you're ready to dive into building your ecosystem, check out our [API Reference](/reference/index.md) [Start Walkthrough](./vaccination-cli.md){ .md-button .md-button--primary } [Explore API](/reference/index.md){ .md-button } + diff --git a/docs/index.md b/docs/index.md index 8adc6e40b..e80b513cb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,30 +2,39 @@ hide: - toc --- -# Trinsic Docs +# Trinsic Documentation +## Issue and verify universally-accepted digital credentials. +Learn how to issue and verify universally-accepted digital credentials so that anywhere people go online or in-person, they can simply tap their phone, prove who they are, and get what they need. -### Issue and verify universally-accepted digital credentials. -Online it's impossible to prove your legal name, age, or anything else about your identity - but in person, it's easy as long as you have the right paperwork. +[**Get started with Trinsic**](learn/index.md) - Learn about Trinsic, work through a basic implementation, plan a full implementation and learn about our tools you can use. -Trinsic provides an SDK to issue and verify universally-accepted digital credentials so that anywhere people go online or in-person, they can simply tap their phone, prove who they are, and get what they need. - -## Quickstart +[**Join the Beta**](early-adopter.md) - Our platform is still in beta. While our docs are public, you'll need a special environment to start using Trinsic at this time. We're excited to help you! Please contact us and we'll help you get started. +## Connect your app to Trinsic Get up and running in the language of your choice or interact with Trinsic through your terminal. [:octicons-terminal-16: **Use the CLI**](cli/index.md) ### Server-side SDKs [:material-nodejs: Node](node/index.md){ .md-button .md-button--primary } [:material-language-python: Python](python/index.md){ .md-button .md-button--primary } -[:material-menu: Go](go/index.md){ .md-button .md-button--primary} -[:material-language-ruby: Ruby](ruby/index.md){ .md-button .md-button--primary } -[:material-language-java: Java](java/index.md){ .md-button .md-button--primary } [:material-microsoft: .NET](dotnet/index.md){ .md-button .md-button--primary } - ### Client-side SDKs -[:material-android: Android](android/index.md){ .md-button } -[:material-apple: iOS](ios/index.md){ .md-button } -[:fontawesome-brands-js-square: Web](web/index.md){ .md-button } -## Learn More -If you're new to verifiable credentials, continue reading in the [**Learn**](learn/index.md) to understand more about the concepts. +[:fontawesome-brands-js-square: Web](web/index.md){ .md-button .md-button--primary } + +### Coming Soon + +[:material-menu: Go](#){ .md-button } +[:material-language-ruby: Ruby](#){ .md-button } +[:material-language-java: Java](#){ .md-button } +[:material-android: Android](#){ .md-button } +[:material-apple: iOS](#){ .md-button } + + + + + +## Additional Resources +[**Join the Community**](https://join.slack.com/t/trinsiccommunity/shared_invite/zt-pcsdy7kn-h4vtdPEpqQUlmirU8FFzSQ) - We have a growing community on Slack of people who are building with Trinsic. Join to ask questions and participate in our community events. + +[**Follow our progress on Github**](https://github.com/trinsic-id) - Most of our work is done in the open. We love to collaborate with developers and are always open to feedback. diff --git a/docs/learn/credentials.md b/docs/learn/credentials.md index 4e08b62cc..8bd677319 100644 --- a/docs/learn/credentials.md +++ b/docs/learn/credentials.md @@ -9,4 +9,3 @@ Just like passports and drivers licenses today have interoperability components For a technical deep dive, refer to the [Verifiable Credentials Data Model](https://w3c.github.io/vc-data-model) -[:octicons-info-24: Learn More](./credentials.md) \ No newline at end of file diff --git a/docs/learn/passes.md b/docs/learn/passes.md index 600eea6fc..a96fe3278 100644 --- a/docs/learn/passes.md +++ b/docs/learn/passes.md @@ -1,3 +1,3 @@ # Passes Passes are documents generated from one or more credentials that contain only the information required to be verified. They can be generated in advance or in real-time. Passes minimize the information about you that is shared with third parties. -[:octicons-info-24: Learn More](./passes.md) + diff --git a/docs/learn/wallets.md b/docs/learn/wallets.md index 8d2bebc8c..5b1c61df4 100644 --- a/docs/learn/wallets.md +++ b/docs/learn/wallets.md @@ -2,6 +2,4 @@ Wallets can be thought of a little like an email inbox. Wallets exist to send, receive and store credentials. Wallets can be hosted by anyone. Each wallet can only be accessed by a set of keys stored on devices. Wallets represent a user's identity. They manage an identity for an individual. -Trinsic has a wallet that is built to be eventually interoperable with other identity wallets that exist. - -[:octicons-info-24: Learn More](./wallets.md) \ No newline at end of file +Trinsic has a wallet that is built to be eventually interoperable with other identity wallets that exist. \ No newline at end of file diff --git a/docs/node/index.md b/docs/node/index.md index 91228c8fd..6c1fa1341 100644 --- a/docs/node/index.md +++ b/docs/node/index.md @@ -1,9 +1,6 @@ # The Trinsic Javascript / Node SDK -The Trinsic Node SDK makes it easy to interact with the Trinsic API from any backend javascript application. The most recent version of the library can be found on ____. You can find the SDKs source on [Github](https://github.com/trinsic-id/sdk/java). - - - +The Trinsic Node SDK makes it easy to interact with the Trinsic API from any backend javascript application. The most recent version of the library can be found on npm. You can find the SDKs source on [Github](https://github.com/trinsic-id/sdk/java). ## Installation Install the package for Node from [npmjs.com :material-open-in-new:](https://www.npmjs.com/package/@trinsic/trinsic){target=_blank} diff --git a/docs/python/index.md b/docs/python/index.md index 70d9958b5..d1fbe7852 100644 --- a/docs/python/index.md +++ b/docs/python/index.md @@ -1,13 +1,25 @@ # The Trinsic Python SDK -The Trinsic Python SDK makes it easy to interact with the Trinsic API from any Python application. The most recent version of the library can be found on ____. You can find the SDKs source on [Github](https://github.com/trinsic-id/sdk/python). +The Trinsic Python SDK makes it easy to interact with the Trinsic API from any Python application. The most recent version of the library can be found on PyPi. You can find the SDKs source on [Github](https://github.com/trinsic-id/sdk/python). ## Installation -TODO +```bash +pip install trinsic-sdk +``` ## Configuration -TODO + +Create a reference to the wallet service that points to your ecosystem service. You should have received this URL with your ecosystem setup. + +```python +from trinsic.services import WalletService, create_channel_if_needed, ProviderService + +server_address = '' +wallet_service = WalletService(server_address) +``` ## Next Steps -TODO +Once the SDK is installed and configured, you're ready to start building! We recommend going through the [walkthrough](./vaccination-python.md) next. If you're ready to dive into building your ecosystem, check out our [API Reference](/reference/index.md) + +[Start Walkthrough](./vaccination-python.md){ .md-button .md-button--primary } [Explore API](/reference/index.md){ .md-button } diff --git a/docs/python/vaccination-python.md b/docs/python/vaccination-python.md index d8ef781b7..34bf71e73 100644 --- a/docs/python/vaccination-python.md +++ b/docs/python/vaccination-python.md @@ -1,8 +1,8 @@ # Walkthrough for Python --8<---- -walkthrough/snippets/intro-infrastructure.md -walkthrough/snippets/intro-use-case.md +/snippets/intro-infrastructure.md +/snippets/intro-use-case.md --8<---- ## Technical requirements @@ -13,7 +13,7 @@ You can run this example on your local machine, or you can use our Gitpod setup Clone this sdk repository: -In this project, we'll be following along the `trinsic_service_demo` +In this project, we'll be following along the `test_trinsic_services` ## Configure services @@ -28,7 +28,7 @@ wallet_service = WalletService(server_address) ## Setup wallet profiles Let's create three different profiles, each pointing to a separate wallet. Since we are using a single console app for this demo, we will simply set the active profile before each interaction to designate which actor is currently taking action. -To create a new wallet profile, we use the [Create Wallet](/reference/services/wallet-service/#create-wallet) feature. +To create a new wallet profile, we use the [Create Wallet](../reference/services/wallet-service/#create-wallet) feature. ```python allison = await wallet_service.create_wallet() @@ -93,7 +93,7 @@ At this point, the clinic can send the signed credential to Allison using any av ## Store certificate in personal wallet -Allison can store this credential in her cloud wallet, simply by calling the [Insert Item](/reference/services/wallet-service/#insert-record) function. +Allison can store this credential in her cloud wallet, simply by calling the [Insert Item](../reference/services/wallet-service/#insert-record) function. ```python wallet_service.set_profile(allison) @@ -132,7 +132,7 @@ Let's save this request in a file named `vaccination-certificate-frame.jsonld` This request asks Allison to provide proof of valid vaccination certificate, including the `issuer`, `batchNumber`and `countryOfVaccination` fields. -Allison can use the [Create Proof](/reference/services/wallet-service/#create-proof) functions to build a proof that will share only the requested fields. +Allison can use the [Create Proof](../reference/services/wallet-service/#create-proof) functions to build a proof that will share only the requested fields. ```python def vaccine_cert_frame_path(self) -> str: @@ -146,7 +146,7 @@ credential_proof = await wallet_service.create_proof(document_id=item_id, reveal ## Verification -Allison shares the proof of credential she created with the airline. The airline can now use [Verify Proof](/reference/services/wallet-service/#verify-proof) functions to check the validity of the proof. +Allison shares the proof of credential she created with the airline. The airline can now use [Verify Proof](../reference/services/wallet-service/#verify-proof) functions to check the validity of the proof. ```python wallet_service.set_profile(airline) diff --git a/docs/reference/index.md b/docs/reference/index.md index 00ee2a4ae..8fe91d071 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -1,7 +1,5 @@ # Overview -## Use one of the SDKs - If you are ready to begin integrating the SDK, make sure you have an SDK installed and configured. You can install each SDK by following the instructions in each page under **Build** in the sidebar. When using the SDK, you can pass parameters to the default service constructors and use the provided methods to set different active profiles. diff --git a/docs/reference/services/provider-service.md b/docs/reference/services/provider-service.md index 8af19b452..9807ad8a0 100644 --- a/docs/reference/services/provider-service.md +++ b/docs/reference/services/provider-service.md @@ -9,7 +9,7 @@ This service helps ecosystem providers with data management and onboarding. This Users can be onboarded as participants in the ecosystem by sending an invitation and a security code. This code can be sent directly through them using existing platforms or via email, SMS, etc. When users accept this invitation, they should do so using the service methods as described in [creating wallet with provider invitation](/reference/services/wallet-service/#create-wallet-with-provider-invitation) -In Trinsic Ecosystems, participants can be Individuals or Organizations. This distinction is important, as providers have the ability to apply restrictions on what functionalities can be invoked by these participants. Additonally, Organizations have the ability to write their DID Document to a public ledger. Currently, the supported ledger is Sovrin, with ION and Element still in development. +In Trinsic Ecosystems, participants can be Individuals or Organizations. This distinction is important, as providers have the ability to apply restrictions on what functionalities can be invoked by these participants. Additionally, Organizations have the ability to write their DID Document to a public ledger. Currently, the supported ledger is Sovrin, with ION and Element still in development. === "Trinsic CLI" ```bash diff --git a/docs/reference/services/trust-registry.md b/docs/reference/services/trust-registry.md index 9f5c6d52e..693b919a3 100644 --- a/docs/reference/services/trust-registry.md +++ b/docs/reference/services/trust-registry.md @@ -1,6 +1,5 @@ # Trust Registry -## Overview In many real-world credential exchange scenarios, a credential holder or verifier has the question “How do I know the issuer of this credential is trustworthy?” Credential holders may also be uneasy about sharing information with a verifier if trust in the verifier has not been established. @@ -22,7 +21,7 @@ An ecosystem governance framework is useful because it provides a good basis for === "Trinsic CLI" ```bash - + trinsic trust-registry register-efg ``` === "TypeScript" ```typescript @@ -166,7 +165,7 @@ Search the registry for authoritative issuer and verifiers using a custom query === "Trinsic CLI" ```bash - + trinsic trust-registry search --query ``` === "TypeScript" ```typescript @@ -195,11 +194,10 @@ Search the registry for authoritative issuer and verifiers using a custom query ``` ### Cache Offline Registry File -Search the registry for authoritative issuer and verifiers using a custom query in a SQL format. === "Trinsic CLI" ```bash - + trinsic trust-registry download ``` === "TypeScript" ```typescript diff --git a/docs/snippets/buttons.md b/docs/snippets/buttons.md new file mode 100644 index 000000000..b7831ed99 --- /dev/null +++ b/docs/snippets/buttons.md @@ -0,0 +1 @@ +[:octicons-info-24: Learn More](#) \ No newline at end of file diff --git a/docs/web/index.md b/docs/web/index.md index 697ef61ab..6ec373ecd 100644 --- a/docs/web/index.md +++ b/docs/web/index.md @@ -15,9 +15,9 @@ TODO ## Next Steps -Once the SDK is installed and configured, you're ready to start building! We recommend going through the [walkthrough](./vaccination-web.md) next. If you're ready to dive into building your ecosystem, check out our [API Reference](/reference/index.md) +Once the SDK is installed and configured, you're ready to start building! We recommend going through the [walkthrough](./vaccination-web.md) next. If you're ready to dive into building your ecosystem, check out our [API Reference](reference/index.md) -[Start Walkthrough](./vaccination-web.md){ .md-button .md-button--primary } [Explore API](/reference/index.md){ .md-button } +[Start Walkthrough](./vaccination-web.md){ .md-button .md-button--primary } [Explore API](reference/index.md){ .md-button } diff --git a/mkdocs.yml b/mkdocs.yml index aeb50408d..fa15f1456 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -8,17 +8,6 @@ nav: - Welcome!: index.md - Join the Beta: early-adopter.md - Ask a Question: support.md - - Build: - - CLI: cli/index.md - - Node: node/index.md - - C#: dotnet/index.md - - Python: python/index.md - - Ruby: ruby/index.md - - Go: go/index.md - - Java: java/index.md - - Web: web/index.md - - iOS: ios/index.md - - Android: android/index.md - Learn: - Introduction: learn/index.md - Wallets: learn/wallets.md @@ -27,12 +16,23 @@ nav: - Ecosystems: learn/ecosystems.md # - Security: learn/security.md TODO - Underlying Tech: learn/tech.md + - Build: + - Trinsic CLI: cli/index.md + - Node: node/index.md + - C#: dotnet/index.md + - Python: python/index.md + # - Ruby: ruby/index.md + # - Go: go/index.md + # - Java: java/index.md + # - Web: web/index.md + # - iOS: ios/index.md + # - Android: android/index.md - Reference: - Overview: reference/index.md - Wallet Service: reference/services/wallet-service.md - Provider Service: reference/services/provider-service.md - Trust Registry Service: reference/services/trust-registry.md - - Resources: + - External Resources: - Join the Community: https://join.slack.com/t/trinsiccommunity/shared_invite/zt-pcsdy7kn-h4vtdPEpqQUlmirU8FFzSQ # - Roadmap: roadmap.md TODO # - Changelog: changelog.md TODO From 970821b917d1f331001c51444be7b797ab1128dd Mon Sep 17 00:00:00 2001 From: Michael Boyd Date: Sun, 31 Oct 2021 13:11:08 -0700 Subject: [PATCH 12/12] change header --- docs/cli/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cli/index.md b/docs/cli/index.md index 5a2a21e05..e85047be1 100644 --- a/docs/cli/index.md +++ b/docs/cli/index.md @@ -5,14 +5,14 @@ The Trinsic CLI makes it easy to interact with the Trinsic API from your termina ## Installation The CLI can be installed directly as binary or built from source. -## Using Homebrew for MacOS and Linux +### Using Homebrew for MacOS and Linux ``` brew tap trinsic-id/trinsic brew install trinsic ``` -## From source using the Rust toolchain +### From source using the Rust toolchain This requires the [Rustup toolchain :material-open-in-new:](https://www.rust-lang.org/tools/install){target=_blank} installed on your system.