Ana i├žeri─če ge├ž

Attestation ­čôť

Bu k─▒s─▒mda Attester rol├╝ndeki bireyimiz ­čĽÁ´ŞĆÔÇŹÔÖé´ŞĆ Credential'─▒ i┼čleyecek ve ┼ču i┼člemleri yapacakt─▒r:

  • Attest et ­čľő´ŞĆ veya reddet ÔŁî
  • Zincir ├╝zerinde attestation bilgisini depola ­čôŽ
Attestation neydi hat─▒rlayal─▒m ­čĄö
  • Merkezi olmayan bir mimaride, daha az g├╝ven ile ge├žerlilik sa─člayabiliriz. ­čîÉ Azalan g├╝ven ile ge├žerlili─či sa─člamak i├žin bir do─črulama sistemi gereklidir. KILT'te, bunu Tastik Etmeler (Attestations) arac─▒l─▒─č─▒yla ger├žekle┼čtiriyoruz. Ôťů

  • Tastik Etmeler, genellikle g├╝venilir bir onaylay─▒c─▒ (attester) taraf─▒ndan ger├žekle┼čtirilen, bir iddian─▒n (claim) i├žindeki verilerin ge├žerlili─čini kan─▒tlama veya onaylama eylemini i├žerir. ­čöŹ­čĹŹ

Credential Attest Etme ­čľŐ´ŞĆÔÇő

attestCredential fonksiyonu Attester'─▒n DID'sini kendi i├žerisine almaktad─▒r. ­čôî T├╝m belgeler haz─▒r oldu─čunda Claimer'dan elde etti─čimiz credential'─▒ attest edebiliriz. ­čôŁ Bu credential zincire eklendi─činden revoke edilene kadar ge├žerli say─▒lmaktad─▒r. ­čöŚ­čöĺ

Nedir bu Revoke?

KILT SDK, halka a├ž─▒k kimlik bilgileriyle ilgili baz─▒ s├╝per i┼člevlere sahip. ­čÜÇ

  • Kimlik Bilgilerini ─░ptal Etme ve Kald─▒rma ­čÜź­čôť: Kimlik bilgisi tan─▒mlay─▒c─▒s─▒, halka a├ž─▒k kimlik bilgileri ├╝zerinde bir├žok i┼člem yapmak i├žin kahraman─▒m─▒z! ­čŽŞÔÇŹÔÖé´ŞĆ Baz─▒ durumlarda, bir kimlik bilgisini iptal ederken zincirde b─▒rakmak isteyebiliriz. Ancak bazen de, "Hadi bu kimlik bilgisini hem iptal edelim hem de kald─▒ral─▒m!" diyebiliriz. ─░lk durumda, depozito geri gelmez ├ž├╝nk├╝ kimlik bilgisi h├ól├ó zincirde. Ama ikincisinde, t├╝m bilgi silinir ve depozito geri d├Âner! ­čĺŞ

  • Bir Kimlik Bilgisini ─░ptal Etmeme ­čöä: E─čer bir kimlik bilgisini iptal ettik ama zincirden kald─▒rmad─▒ysak, onu tekrar canland─▒rabiliriz! ­čî▒ ├ľrne─čin, bir s├╝r├╝c├╝ belgesi bir s├╝reli─čine "ask─▒ya al─▒nd─▒" olarak i┼čaretlenebilir ama sonra tekrar aktif hale getirilebilir. ­čÜŚ­čĺĘ

  • Depozitoyu Geri Almak ­čĺ░: ┼×imdi, bu k─▒s─▒m ilgin├ž! ­čĄô T├╝m bu i┼člemler i├žin genellikle kimlik bilgisi onaylay─▒c─▒s─▒na ihtiya├ž duyar─▒z. Ancak, bir kimlik bilgisini kald─▒rmak ve depozitoyu geri almak i├žin bu kural─▒ bir kenara b─▒rakabiliriz. Bu i┼člemde sadece depozitoyu ├Âdeyen ki┼čiye ihtiya├ž vard─▒r. ­čÄë

─░├že Aktar─▒lan Mod├╝ller ve FonksiyonlarÔÇő

attestCredential.ts
import { config as envConfig } from 'dotenv'
import * as Kilt from '@kiltprotocol/sdk-js'
import { generateAccount } from './generateAccount'
import { generateCredential } from '../claimer/generateCredential'
import { generateKeypairs } from './generateKeypairs'
import { generateLightDid } from '../claimer/generateLightDid'

─░lk olarak paketlerimiz i├žeri ekleyerek ba┼člar─▒z. Bu paketler daha ├Âncesinde de kulland─▒─č─▒m─▒z paketler olmaktad─▒r. S─▒ras─▒yla incelenecek olunursa:

  • dotenv: Ortam de─či┼čkenlerini y├╝klemek i├žin kullan─▒l─▒r.
  • Kilt: KILT protokol├╝ SDK's─▒.
  • Di─čer fonksiyonlar: Daha ├Ânce tan─▒mlanm─▒┼č yard─▒mc─▒ fonksiyonlar.

attestCredential FonksiyonuÔÇő

Bu fonksiyon, bir kimlik bilgisini (credential) onaylamak i├žin kullan─▒l─▒r. Onaylama i┼člemi, kimlik bilgisinin do─črulu─čunu blockchain'e yazarak ger├žekle┼čtirilir.

attestCredential.ts
export async function attestCredential(
attesterAccount: Kilt.KiltKeyringPair,
attesterDid: Kilt.DidUri,
credential: Kilt.ICredential,
signCallback: Kilt.SignExtrinsicCallback
): Promise<void> {
// ...
}

Paketlerimizi ekledi─čimize g├Âre Attestation i┼člemini ger├žekle┼čtirece─čimiz fonksiyonlar─▒ tan─▒mlayabiliriz. Bunlardan ilki attestCredential() fonksiyonu olacakt─▒r. Bu fonksiyon i├žerisine 4 adet parametre alacak ve bir Promise d├Ând├╝recektir. ─░├žerisine ald─▒─č─▒ parametrelere teker teker bak─▒lacak olunursa:

  • attesterAccount: Attester'─▒n hesap anahtar ├žifti (secret, public)
  • attesterDid: Attester'─▒n DID'si.
  • credential: Onaylanacak credential.
  • signCallback: ─░┼člemi imzalamak i├žin kullan─▒lacak geri ├ža─č─▒r─▒m fonksiyonu.

API Ba─člant─▒s─▒ÔÇő

attestCredential.ts
const api = Kilt.ConfigService.get('api')

Fonksiyonun i├žerisine girdi─čimizde ilk olarak api ba─člant─▒s─▒ yaparak KILT-SDK'yi kodumuza ba─člamam─▒z gerekmektedir.

CType ve Root Hash AlmaÔÇő

attestCredential.ts
const { cTypeHash, claimHash } = Kilt.Attestation.fromCredentialAndDid(
credential,
attesterDid
)

Attestation i┼člemini art─▒k Attestation.fromCredentialAndDid() fonksiyonu ile ger├žekle┼čtirebiliriz. Bu fonksiyon i├žerisine attest etmek istedi─čimiz credential'─▒ ve attesterDid'sini almaktad─▒r. ├ç─▒kt─▒ olarak zincire kaydetmek i├žin ihtiyac─▒m─▒z olan Hash de─čerlerini bize sa─člamaktad─▒r.

─░┼člem Olu┼čturma ve YetkilendirmeÔÇő

attestCredential.ts
const tx = api.tx.attestation.add(claimHash, cTypeHash, null)
const extrinsic = await Kilt.Did.authorizeTx(
attesterDid,
tx,
signCallback,
attesterAccount.address
)

Blokzincirde neredeyse her i┼člemi ger├žekle┼čtirmek i├žin o i┼člemin transferini ger├žekle┼čtirmek gerekmektedir. attestation i┼člemi de istisna de─čildir. Yapt─▒─č─▒m─▒z attestation i┼člemini kaydetmek ve zincire yazmak i├žin transfer format─▒na ├ževirmemiz gerekmektedir. Bu i┼člem i├žin s─▒ras─▒yla:

  • api.tx.attestation.add(...): Yeni bir onaylama i┼člemi olu┼čturur. ─░├žerisine bir ├Ânceki sat─▒rda olu┼čturdu─čumuz attestation hash de─čerlerini al─▒r.
  • Kilt.Did.authorizeTx(...): Olu┼čturulan i┼člemi yetkilendirir. Bu yetkilendirmeyi attesterDid sayesinde yapar.

─░┼člemi Blockchain'e G├ÂndermeÔÇő

attestCredential.ts
console.log('Attester -> create attestation...')
await Kilt.Blockchain.signAndSubmitTx(extrinsic, attesterAccount)

Son olarak yetkilendirilmi┼č i┼člemi attester hesab─▒ imzalar ve blokzincire g├Ânderir.

Bu ┼čekilde attestCredential fonksiyonu kimlik bilgisini onaylar ve bu onay─▒ blockchain'e yazar.

attestingFlow FonksiyonuÔÇő

Bu fonksiyon, kimlik bilgisi olu┼čturma ve onaylama i┼člemlerini bir araya getirir. ─░┼čte fonksiyonun ana hatlar─▒:

attestCredential.ts
export async function attestingFlow(
claimerDid: Kilt.DidUri,
attesterAccount: Kilt.KiltKeyringPair,
attesterDid: Kilt.DidUri,
signCallback: Kilt.SignExtrinsicCallback
): Promise<Kilt.ICredential> {
// ...
}

Yukar─▒da da g├Âr├╝ld├╝─č├╝ ├╝zere attestCredential fonksiyonuna benzer bir yap─▒ sunulmu┼čtur. Bu asenkron fonksiyon, attestCredential fonksiyonunu kullanarak bir kimlik bilgisini onaylar ve onaylanm─▒┼č kimlik bilgisini d├Ând├╝r├╝r.

  • claimerDid: ─░ddia sahibinin (claimer) DID'si.
  • attesterAccount ve attesterDid: Onaylay─▒c─▒n─▒n hesap ve DID bilgileri.
  • signCallback: ─░┼člemi imzalamak i├žin kullan─▒lacak geri ├ža─č─▒r─▒m fonksiyonu.

Kimlik Bilgisi Olu┼čturmaÔÇő

Fonksiyonun i├žerisine girildi─činde hem credential olu┼čturabilir hemde bu Credential'─▒ onaylamak i├žin attestCredential fonksiyonu ├ža─č─▒rabiliriz.

attestCredential.ts
const credential = generateCredential(claimerDid, {
age: 19,
name: 'G├Âktu─č Ayan'
})

─░lk olarak, generateCredential fonksiyonu ile bir kimlik bilgisi olu┼čturulur. Bu kimlik bilgisi, iddia sahibinin DID'ini (claimerDid) ve iddia i├žeri─čini (age: 19, name: 'G├Âktu─č Ayan') al─▒r.

Kimlik Bilgisini OnaylamaÔÇő

attestCredential.ts
await attestCredential(attesterAccount, attesterDid, credential, signCallback)

attestCredential fonksiyonu ├ža─čr─▒l─▒r ve kimlik bilgisi onaylan─▒r. Bu ad─▒mda, onaylay─▒c─▒n─▒n hesap bilgileri ve DID'ini, olu┼čturulan kimlik bilgisi ve imza callback fonksiyonu parametre olarak verilir.

Kimlik Bilgisini D├Ând├╝rmeÔÇő

attestCredential.ts
return credential

Onaylanm─▒┼č kimlik bilgisi d├Ând├╝r├╝l├╝r.

Bu fonksiyon, bir kimlik bilgisinin nas─▒l olu┼čturulaca─č─▒n─▒ ve onaylanaca─č─▒n─▒ ad─▒m ad─▒m g├Âsterir. Genellikle, bir kullan─▒c─▒ aray├╝z├╝ veya API ├╝zerinden bu t├╝r i┼člemler tetiklenir.

─░ki Fonksiyon Neden Yazd─▒k Ya?

attestCredential Fonksiyonu

Bu fonksiyon, bir kimlik bilgisini (credential) onaylamak i├žin kullan─▒l─▒r. Yani, bu fonksiyon bir kimlik bilgisini al─▒r ve onu blockchain'e yazarak onaylar. Bu, kimlik bilgisinin do─črulu─čunu kesinle┼čtirmek i├žin gereklidir. Bu fonksiyon genellikle bir onaylay─▒c─▒ (attester) taraf─▒ndan ├ža─čr─▒l─▒r.

attestingFlow Fonksiyonu

Bu fonksiyon, kimlik bilgisinin onaylanmas─▒ i├žin gereken t├╝m ad─▒mlar─▒ i├žerir. ─░lk olarak, bir kimlik bilgisi olu┼čturur (generateCredential fonksiyonu ile). Daha sonra, bu kimlik bilgisini attestCredential fonksiyonu ile onaylar. Bu, genellikle bir uygulama ak─▒┼č─▒ i├žinde, ├Ârne─čin bir kullan─▒c─▒ aray├╝z├╝ ├╝zerinden, ger├žekle┼čir.

alternative text

Neden ─░kisine de ─░htiya├ž Duyuyoruz?

  1. Mod├╝lerlik ve Yeniden Kullan─▒labilirlik: attestCredential fonksiyonu, sadece kimlik bilgilerini onaylamak i├žin kullan─▒l─▒r. Bu, farkl─▒ senaryolarda veya farkl─▒ uygulama ak─▒┼člar─▒nda yeniden kullan─▒labilir. ├ľrne─čin, farkl─▒ t├╝rdeki kimlik bilgilerini onaylamak i├žin kullan─▒labilir.

  2. ─░┼č Ak─▒┼č─▒ Y├Ânetimi: attestingFlow fonksiyonu, bir kimlik bilgisinin olu┼čturulmas─▒ndan onaylanmas─▒na kadar olan t├╝m s├╝reci y├Ânetir. Bu, uygulaman─▒n daha karma┼č─▒k i┼č ak─▒┼člar─▒n─▒ kolayca y├Ânetebilmesini sa─člar.

  3. Esneklik: Her iki fonksiyon da farkl─▒ ihtiya├žlar i├žin tasarlanm─▒┼čt─▒r. attestCredential daha d├╝┼č├╝k seviyeli bir i┼člevsellik sa─člarken, attestingFlow daha y├╝ksek seviyeli bir i┼č ak─▒┼č─▒ sa─člar. Bu sayede, geli┼čtiriciler ihtiyaca g├Âre daha esnek bir ┼čekilde kod yazabilirler.

  4. Okunabilirlik ve Bak─▒m: Kodun par├žalara ayr─▒lmas─▒, kodun daha okunabilir ve bak─▒m─▒n─▒n daha kolay olmas─▒n─▒ sa─člar. ├ľrne─čin, kimlik bilgilerini onaylama ile ilgili bir sorun oldu─čunda, bu sorunu ├ž├Âzmek i├žin sadece attestCredential fonksiyonuna odaklanabiliriz.

Bu nedenlerle, her iki fonksiyona da ihtiya├ž duyulmaktad─▒r.

Ana Kod Blo─čuÔÇő

attestCredential.ts
if (require.main === module) {
;(async () => {
// ...
})()
}

Bu kod blo─ču, bu dosya do─črudan ├žal─▒┼čt─▒r─▒ld─▒─č─▒nda y├╝r├╝t├╝lecek kodu i├žerir. Ortam de─či┼čkenlerini y├╝kler, KILT ile ba─člant─▒ kurar ve attestingFlow fonksiyonunu ├ža─č─▒r─▒r.

Her ┼čey bir arada

Ehliyet kemerlerinizi ba─člay─▒n DID'leri olu┼čturmaktan Credential attest etmeye bir├žok i┼člem yapaca─č─▒z. Bu i┼člemlerin kodlar─▒n─▒ zaten yazm─▒┼čt─▒k ┼čimdi ├žal─▒┼čt─▒rmak kald─▒!

Ortam De─či┼čkenlerini Y├╝klemeÔÇő

attestCredential.ts
envConfig()

Bu sat─▒r, .env dosyas─▒ndaki ortam de─či┼čkenlerini y├╝kler.

Try Catch Yap─▒s─▒ KurmaÔÇő

attestCredential.ts
    try {
.
.
.
} catch (e) {
console.log('Error while going throw attesting workflow')
throw e
}

T├╝m i┼člemleri fonksiyonlar i├žerisinde hata olmas─▒na kar┼č─▒n try catch yap─▒s─▒ i├žinde olu┼čturaca─č─▒z. Yazaca─č─▒m─▒z kodlar try k─▒s─▒m─▒ i├žerisinde yer alacak herhangi bir hata catch fonksiyonuna tak─▒l─▒p hata verecektir.

KILT'a Ba─članmaÔÇő

attestCredential.ts
await Kilt.connect(process.env.WSS_ADDRESS as string)

Bu sat─▒r, KILT protokol├╝ne ba─član─▒r. Ba─člant─▒ adresi .env dosyas─▒ndan al─▒n─▒r. KILT'in test a─č─▒na ba─članaca─č─▒z.

Attester Hesab─▒n─▒ Olu┼čturmaÔÇő

attestCredential.ts
const attesterAccountMnemonic = process.env.ATTESTER_ACCOUNT_MNEMONIC as string
const { account: attesterAccount } = generateAccount(attesterAccountMnemonic)

Bu sat─▒rlar, ortam de─či┼čkenlerinden al─▒nan bir mnemonik kullanarak bir Attester hesab─▒ olu┼čturur. generateAccount fonksiyonunu daha ├Ânce birlikte yazm─▒┼čt─▒k.

Attester DID Olu┼čturmaÔÇő

attestCredential.ts
const attesterDidMnemonic = process.env.ATTESTER_DID_MNEMONIC as string
const { authentication, assertionMethod } = generateKeypairs(attesterDidMnemonic)
const attesterDidUri = Kilt.Did.getFullDidUriFromKey(authentication)

Bu sat─▒rlar, bir Attester DID olu┼čturmak i├žin kullan─▒l─▒r. Ayn─▒ ┼čekilde generateKeypairs'─▒ da DID olu┼čtururken yazm─▒┼čt─▒k.

Claimer DID Olu┼čturmaÔÇő

attestCredential.ts
const claimerDidMnemonic = process.env.CLAIMER_DID_MNEMONIC as string
const claimerDid = await generateLightDid(claimerDidMnemonic)

Bu sat─▒rlar, bir Claimer DID olu┼čturmak i├žin kullan─▒l─▒r. Bu sefer Light DID kullanaca─č─▒z.

Kimlik Bilgisi Olu┼čturma ve OnaylamaÔÇő

attestCredential.ts
const credential = await attestingFlow(
claimerDid.uri,
attesterAccount,
attesterDidUri,
async ({ data }) => ({
signature: assertionMethod.sign(data),
keyType: assertionMethod.type
})
)

Bu sat─▒r kimlik bilgisi olu┼čturma ve onaylama i┼č ak─▒┼č─▒n─▒ ba┼člat─▒r. Kulland─▒─č─▒ fonksiyon bir ├Ânceki tan─▒mlad─▒─č─▒m─▒z fonksiyon olan attestingFlow fonksiyonudur.

Sonu├žlar─▒ Yazd─▒rmaÔÇő

attestCredential.ts
console.log('The claimer build their credential and now has to store it.')
console.log('Add the following to your .env file. ')
console.log(`CLAIMER_CREDENTIAL='${JSON.stringify(credential)}'`)

Bu sat─▒rlar, olu┼čturulan kimlik bilgisini yazd─▒r─▒r ve kullan─▒c─▒n─▒n bu bilgiyi .env dosyas─▒na eklemesi gerekti─čini belirtir.

Genel bir bak─▒┼č ve fonksiyonlar─▒n i┼člevi

Hadi Koda genel bir bak─▒┼č yaparak ne i┼če yarad─▒─č─▒n─▒ ├ž├Âzmeye ├žal─▒┼čal─▒m.

attestCredential.ts
import { config as envConfig } from 'dotenv'

import * as Kilt from '@kiltprotocol/sdk-js'

import { generateAccount } from './generateAccount'
import { generateCredential } from '../claimer/generateCredential'
import { generateKeypairs } from './generateKeypairs'
import { generateLightDid } from '../claimer/generateLightDid'

export async function attestCredential(
attesterAccount: Kilt.KiltKeyringPair,
attesterDid: Kilt.DidUri,
credential: Kilt.ICredential,
signCallback: Kilt.SignExtrinsicCallback
): Promise<void> {
const api = Kilt.ConfigService.get('api')

// Get CType and root hash from the provided credential.
const { cTypeHash, claimHash } = Kilt.Attestation.fromCredentialAndDid(
credential,
attesterDid
)

// Create the tx and authorize it.
const tx = api.tx.attestation.add(claimHash, cTypeHash, null)
const extrinsic = await Kilt.Did.authorizeTx(
attesterDid,
tx,
signCallback,
attesterAccount.address
)

// Submit the tx to write the attestation to the chain.
console.log('Attester -> create attestation...')
await Kilt.Blockchain.signAndSubmitTx(extrinsic, attesterAccount)
}

export async function attestingFlow(
claimerDid: Kilt.DidUri,
attesterAccount: Kilt.KiltKeyringPair,
attesterDid: Kilt.DidUri,
signCallback: Kilt.SignExtrinsicCallback
): Promise<Kilt.ICredential> {
// First the claimer.
const credential = generateCredential(claimerDid, {
age: 27,
name: 'Mia Musterfrau'
})

// ... send the request to the attester

// The attester checks the attributes and attests the provided credential.
await attestCredential(attesterAccount, attesterDid, credential, signCallback)

// Return the generated credential.
return credential
}

// Don't execute if this is imported by another file.
if (require.main === module) {
;(async () => {
envConfig()

try {
await Kilt.connect(process.env.WSS_ADDRESS as string)

const attesterAccountMnemonic = process.env
.ATTESTER_ACCOUNT_MNEMONIC as string
const { account: attesterAccount } = generateAccount(
attesterAccountMnemonic
)

const attesterDidMnemonic = process.env.ATTESTER_DID_MNEMONIC as string
const { authentication, assertionMethod } =
generateKeypairs(attesterDidMnemonic)
const attesterDidUri = Kilt.Did.getFullDidUriFromKey(authentication)

const claimerDidMnemonic = process.env.CLAIMER_DID_MNEMONIC as string
const claimerDid = await generateLightDid(claimerDidMnemonic)

const credential = await attestingFlow(
claimerDid.uri,
attesterAccount,
attesterDidUri,
async ({ data }) => ({
signature: assertionMethod.sign(data),
keyType: assertionMethod.type
})
)
console.log('The claimer build their credential and now has to store it.')
console.log('Add the following to your .env file. ')
console.log(`CLAIMER_CREDENTIAL='${JSON.stringify(credential)}'`)
} catch (e) {
console.log('Error while going throw attesting workflow')
throw e
}
})()
}

Bu kod i├žerisindeki attestingFlow fonksiyonu t├╝m i┼čleyi┼či ba┼čtan sona bizlere g├Âstermektedir.

  • ─░lk olarak Claimer bir credential olu┼čturur ve Attester'a g├Ânderir.
  • Attester bu credential i├žerisindeki bilgilerin do─črulu─čunu kontrol eder.
  • Do─črulu─čunu kontrol ettikten sonra red eder veya onaylar. E─čer onaylarsa zincire yazar.
  • Zincire yazd─▒ktan sonra Claimer art─▒k t├╝m belgeleri istedi─či zaman verifier ile payla┼čabilir.

Kodu ├çal─▒┼čt─▒ral─▒m!ÔÇő

Kodu ├žal─▒┼čt─▒rmak i├žin terminalde kilt-rocks klas├Âr├╝nde bulundu─čumuza emin olduktan sonra alt k─▒s─▒mdaki kodu ├žal─▒┼čt─▒rabiliriz:

yarn ts-node attester/attestCredential.ts
ipucu

Art─▒k olu┼čan Credential'─▒ kopyalay─▒p Verifier'lar ile payla┼čmak i├žin kullanabilirsin

Helal Olsun be

Attester olarak yapman gereken i┼člemler tamamland─▒. Ba┼čar─▒l─▒ bir ┼čekilde credential olu┼čturdun ve bu attestation hash de─čerini zincire yazd─▒n.

Art─▒k Verifier ile devam etmeye haz─▒rs─▒n.