Lewati ke isi

Layanan Kredensial

Modul Credential menyediakan alat untuk membuat, menerbitkan, mencabut, dan mengelola Kredensial yang Dapat Diverifikasi (VC) di blockchain IDCHAIN. Ini menyederhanakan proses penerbitan kredensial sesuai W3C yang terkait dengan DID dan Skema Dokumen UID.

Ringkasan

Layanan Kredensial memungkinkan pengembang untuk:

  • Minta pengesahan (siapkan kredensial yang tidak ditandatangani untuk ditandatangani oleh pengesahan).
  • Keluarkan kredensial (tanda tangani dan simpan secara on-chain).
  • Cabut kredensial (tandai sebagai tidak valid).
  • Kelola ID kredensial dan berinteraksi dengan publicCredentials.

Semua kredensial yang dikeluarkan mengikuti format VC IDCHAIN ​​(UidCredentialV1) untuk interoperabilitas di seluruh aplikasi.

Referensi API

Minta Pengesahan

Credential.requestAttestation(claimerDid, uidDocument, content, attesterDid): Janji<UnsignedVc>

Membuat Kredensial Dapat Diverifikasi (VC) yang tidak ditandatangani untuk pengklaim, siap untuk ditandatangani oleh penguji.

Parameter:

  • claimerDid (Uid): DID URI subjek kredensial (pengguna/pengklaim).
  • uidDocument (IUidDocument): Dokumen skema untuk kredensial.
  • content (object): Bidang data untuk subjek kredensial.
  • attesterDid (Uid): DID URI attester (penerbit).

Pengembalian:

  • UnsignedVc: Objek kredensial yang dapat diverifikasi tanpa bukti.

Contoh:

const unsignedVc = await Credential.requestAttestation(
  userDid.uri,
  schema,
  {
    NIK: "123456789",
    Nama: "John Doe",
    TTL: "2001-01-01",
    status: "Married by choice",
  },
  attesterDid.uri
);
console.log("Unsigned Credential:", unsignedVc);

Mengeluarkan Pengesahan

Credential.issueAttestation(credential, submitterDid, submitterAccount): Promise<VerifiableCredential>

Menandatangani dan menerbitkan Kredensial yang Dapat Diverifikasi pada blockchain.

Parameter:

  • credential (UnsignedVc): Kredensial yang tidak ditandatangani untuk diterbitkan.
  • submitterDid (UidDocument): Dokumen DID attester.
  • submitterAccount (UidKeyringPair): Akun Blockchain diotorisasi untuk ditandatangani.

Pengembalian:

  • VerifiableCredential: Kredensial yang ditandatangani sepenuhnya dan dapat diverifikasi.

Contoh:

const vc = await Credential.issueAttestation(
  unsignedVc,
  attesterDid,
  accountAttester
);
console.log("Issued Credential:", vc);

Cabut Kredensial

Credential.revokeCredential(verifier, verifierAccount, credential): Promise<VerifiableCredential>

Menandai kredensial sebagai dicabut di blockchain.

Parameter:

  • verifier (UidDocument): DID Dokumen pencabut (penerbit).
  • verifierAccount (UidKeyringPair): Akun Blockchain dari verifikator.
  • credential (Kredensial yang Dapat Diverifikasi): Kredensial yang akan dicabut.

Pengembalian:

  • VerifiableCredential: Kredensial yang diperbarui dengan status dicabut.

lemparan:

  • Error("Gagal mencabut kredensial: ...") jika operasi rantai gagal.

Contoh:

await Credential.revokeCredential(attesterDid, accountAttester, vc);
console.log("Credential revoked");

Cabut Kredensial Berdasarkan ID

Credential.revokeCredentialById(verifier, verifierAccount, credentialID): Janji<VerifyingCredential>

Menandai kredensial sebagai dicabut di blockchain.

Parameter:

  • verifier (UidDocument): DID Dokumen pencabut (penerbit).
  • verifierAccount (UidKeyringPair): Akun Blockchain dari verifikator.
  • credentialID (idchain:${string}): dapat diperoleh dari credentialStatus dari verifiedCredential

Pengembalian:

  • VerifiableCredential: Kredensial yang diperbarui dengan status dicabut.

lemparan:

  • Error("Gagal mencabut kredensial: ...") jika operasi rantai gagal.

Contoh:

await Credential.revokeCredentialById(attesterDid, accountAttester, `idchain:${...}`);
console.log("Credential revoked");

Contoh Penggunaan Lengkap

import {
  Credential,
  UidDocumentSchema,
  AccountService,
  DidService,
  fromProperties,
  Uid,
  UidDocument,
} from "@idchain-sdk";

async function issueAndRevokeCredential() {
  // Hasilkan akun dan DID
  const { mnemonic: attesterMnemonic, account: attester } =
    await AccountService.generateAccount();
  const { mnemonic: userMnemonic, account: user } =
    await AccountService.generateAccount();

  const attesterDid = await DidService.createDidAttester(
    attester,
    {
      authentication: { publicKey: attester.publicKey, type: "ed25519" },
      keyAgreement: { publicKey: attester.publicKey, type: "x25519" },
      assertionMethod: { publicKey: attester.publicKey, type: "ed25519" },
      capabilityDelegation: { publicKey: attester.publicKey, type: "ed25519" },
    },
    async ({ data }) => ({
      keyType: "ed25519",
      signature: attester.sign(data),
    })
  );

  const userDidInfo = await DidService.createDidClaimer(
    user,
    {
      authentication: { publicKey: user.publicKey, type: "ed25519" },
    },
    async ({ data }) => ({
      keyType: "ed25519",
      signature: user.sign(data),
    })
  );

  // Membuat dan menyimpan skema
  const schema = fromProperties(
    "KTP Schema",
    {
      NIK: { type: "string" },
      Nama: { type: "string" },
      TTL: { type: "string" },
      status: { type: "string" },
    },
    "V1"
  );
  await UidDocumentSchema.storeSchema(attester, attesterDid.uri, schema);

  // Minta kredensial
  const unsignedVc = await Credential.requestAttestation(
    userDidInfo.document.uri as Uid,
    schema,
    { NIK: "987654321", Nama: "Alice", TTL: "1998-05-10", status: "Single" },
    attesterDid.uri as Uid
  );

  // Terbitkan kredensial
  const vc = await Credential.issueAttestation(
    unsignedVc,
    attesterDid as UidDocument,
    attester
  );
  console.log("Credential issued:", vc);

  // Cabut kredensial
  await Credential.revokeCredential(attesterDid as UidDocument, attester, vc);
  console.log("Credential revoked");
}

Penanganan Kesalahan

  • Kegagalan pencabutan: Melempar dengan rincian dari blockchain (misalnya, jika hash kredensial tidak valid).
  • DID yang belum terselesaikan: Setiap operasi DID (diterbitkan atau dicabut) akan gagal jika DID tidak dapat diselesaikan.
  • Kesalahan tanda tangan: Akan muncul jika signersForDid tidak dapat menghasilkan tanda tangan yang valid.

Modul Terkait