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;