Skip to main content

Building Web3 Decentralized Applications (dApps)

danger

TODO: Do something more interesting with on-chain. Also, not tested; assume nothing works

Introduction

In this tutorial, we will guide you through building a decentralized application (dApp) that utilizes Veramo for identity management. We will cover the basics of dApp development and how to integrate Veramo into your project.

Steps

Prerequisites

Before you begin, follow the prerequisites for installation and configuration instructions.

1. Set Up a New dApp Project

Initialize a new dApp project using a framework like React:

npx create-react-app my-dapp
cd my-dapp

Install Veramo and necessary plugins:

npm install @veramo/core @veramo/credential-w3c @veramo/data-store @veramo/did-jwt @veramo/key-manager @veramo/did-comm

2. Configure Veramo Agent

Create a veramo-agent.js file to configure the Veramo agent:

import { createAgent } from "@veramo/core";
import { KeyManager } from "@veramo/key-manager";
import { DIDManager } from "@veramo/did-manager";
import { DIDResolverPlugin } from "@veramo/did-resolver";
import { CredentialIssuer } from "@veramo/credential-w3c";
import { DataStore, DataStoreORM } from "@veramo/data-store";
import { DIDComm } from "@veramo/did-comm";

export const agent = createAgent({
plugins: [
new KeyManager(),
new DIDManager(),
new DIDResolverPlugin(),
new CredentialIssuer(),
new DataStore(),
new DataStoreORM(),
new DIDComm(),
],
});

3. Create and Manage DIDs in Your dApp

Add functionality to create and manage DIDs in your React components:

import React, { useState } from "react";
import { agent } from "./veramo-agent";

function App() {
const [did, setDid] = useState(null);

const createDid = async () => {
const newDid = await agent.didManagerCreate({ alias: "my-did" });
setDid(newDid);
};

return (
<div>
<h1>My dApp</h1>
<button onClick={createDid}>Create DID</button>
{did && <p>Your DID: {did.did}</p>}
</div>
);
}

export default App;

4. Issue and Verify Credentials

Add functionality to issue and verify credentials:

function App() {
const [did, setDid] = useState(null);
const [credential, setCredential] = useState(null);
const [verificationResult, setVerificationResult] = useState(null);

const createDid = async () => {
const newDid = await agent.didManagerCreate({ alias: "my-did" });
setDid(newDid);
};

const issueCredential = async () => {
const newCredential = await agent.createVerifiableCredential({
credential: {
issuer: { id: did.did },
credentialSubject: { id: did.did, name: "Alice" },
type: ["VerifiableCredential"],
"@context": ["https://www.w3.org/2018/credentials/v1"],
},
proofFormat: "jwt",
});
setCredential(newCredential);
};

const verifyCredential = async () => {
const result = await agent.verifyCredential({ credential });
setVerificationResult(result);
};

return (
<div>
<h1>My dApp</h1>
<button onClick={createDid}>Create DID</button>
{did && <p>Your DID: {did.did}</p>}
<button onClick={issueCredential}>Issue Credential</button>
{credential && <p>Credential: {JSON.stringify(credential)}</p>}
<button onClick={verifyCredential}>Verify Credential</button>
{verificationResult && (
<p>Verification Result: {JSON.stringify(verificationResult)}</p>
)}
</div>
);
}

export default App;