Attestation Talebi 🎉
Bu bölümde, Claim
ve Credential
oluşturacağız. Ancak, oluşturduğumuz bu Credential
şu an için sadece bir kağıt parçası gibi. 📜 Neden mi? Çünkü Validator
'lar için bu bilginin güvenilir olabilmesi için bir Attester
tarafından onaylanmış olması gerekiyor! 🤝
KILT, herkesin katılabileceği bir parti gibi! 🎉 Herkes veya her şey bir claim
oluşturabilir ve attest
edebilir. Ancak, burada dikkat etmemiz gereken bir şey var: Eğer bir Validator
bir Attester
'a güvenmiyorsa, o credential
sadece bir kağıt parçasıdır! 🙅♀️
📝 Claim Oluşturma 📝
Daha önce oluşturduğumuz light DID
, ctype
ve Claimer
'ın sağladığı bilgilerle, sanki bir yemek tarifi oluşturur gibi bir Claim
objesi oluşturacağız. 🍲
Öncesinde, CTypes'ı bir yemek tarifi gibi düşünebiliriz; ne yapmamız gerektiğini bize söyler. 📑🍲
Peki ya bu tarifi uyguladıktan sonra ne olur? Yemek tarifi olarak mı kalır? Hayır, tabii ki! 🙅♂️ O zaman bir yemek olur! 🍲
Aynı şekilde, CType'ı istediğimiz bilgilerle doldurduğumuzda, bu bir
Claim
olur.Claim
ler,Credential
lere benzer ama henüz birAttester
tarafından onaylanmamışlardır. 📝🔐Attester
'lar bu süreçte kritik bir rol oynarlar, tıpkı bir yemek yarışmasında jüri üyeleri gibi! 🤩 OnlarCredential
'i inceleyip onaylayıp onaylamayacaklarını belirlerler. ✅KILT, herkesin bir şeyler iddia edebileceği, hatta kendileri hakkında bile, açık bir sistemdir. 🌍 Ancak, bir
Claim
yalnızca birAttester
tarafından onaylandıysa güvenilir olabilir. Yani,Verifier
'lar belirli durumlar için farklıAttester
'lara güvenebilirler. 🔍🔒
Paketlerin Eklenmesi
import * as Kilt from '@kiltprotocol/sdk-js'
Paketleri dosyamıza eklerken ilk olarak gerekli tek paketin KILT-SDK
olduğunu fark edebiliriz. Claim'ler diğer formatlara göre basit bir yapıya sahip olduğu için tek başına yeterli olacaktır.
createClaim
Fonksiyonu
export function createClaim(
lightDid: Kilt.DidUri,
ctype: Kilt.ICType,
content: Kilt.IClaim['contents']
): Kilt.IClaim {
Dosya içerisinde Claim
'in yaratılması için gerekli fonksiyonu kurabiliriz. Bu fonksiyon içerisine 3 adet parametre almaktadır. Bu parametreler bakılacak olunursa:
lightDid: Kilt.DidUri
: Light DID'nin URI'si. Bu, iddianın kim tarafından oluşturulduğunu belirtir.ctype: Kilt.ICType
: İddianın hangi CType'a (Claim Type) uyduğunu belirtir. Yani, bu iddia hangi "form şablonu"nu kullanıyor?content: Kilt.IClaim['contents']
: İddianın içeriği, yani doldurulmuş formdaki bilgiler.
TypeScript dilinde :
karakteri, bir değişkenin, parametrenin veya fonksiyonun dönüş tipinin ne olacağını belirtmek için kullanılır. Bu, tip güvenliği sağlar ve kodun daha anlaşılır olmasına yardımcı olur.
Örneğin, createClaim
fonksiyonunun tanımında:
export function createClaim(
lightDid: Kilt.DidUri,
ctype: Kilt.ICType,
content: Kilt.IClaim['contents']
): Kilt.IClaim {
lightDid: Kilt.DidUri
: BuradalightDid
adlı parametrenin tipininKilt.DidUri
olacağını belirtiyoruz.ctype: Kilt.ICType
:ctype
parametresinin tipininKilt.ICType
olacağını belirtiyoruz.content: Kilt.IClaim['contents']
:content
parametresinin tipininKilt.IClaim['contents']
olacağını belirtiyoruz.): Kilt.IClaim {
: Fonksiyonun döndüreceği değerin tipininKilt.IClaim
olacağını belirtiyoruz.
Bu tür belirtimleri, kodunuzun daha güvenli ve anlaşılır olmasını sağlar. Örneğin, birisi bu fonksiyonu kullanırken yanlış bir tipde bir değer göndermeye çalışırsa, TypeScript bu hatayı derleme aşamasında yakalar. Bu da hataların erken teşhis edilmesine ve düzeltilmesine yardımcı olur.
İddia Oluşturma
Fonksiyonun parametrelerini belirttikten sonra içerisine girerek işlevimizi oluşturabiliriz. Bu işlem claim
oluşturma eylemi olacaktır.
const claim = Kilt.Claim.fromCTypeAndClaimContents(ctype, content, lightDid)
claim
oluşturulurken Kilt.Claim.fromCTypeAndClaimContents()
fonksiyonu çağırılır ve içerisine parametreler girilerek claim
adında bir değişken oluşturulur.
Claim'in Döndürülmesi
return claim
Son olarak, oluşturulan iddia nesnesi döndürülür.
Eğer kodun tamamını bir arada görmemiz gerekirse:
import * as Kilt from '@kiltprotocol/sdk-js'
// Create a Claim object from light DID, CType and given content.
export function createClaim(
lightDid: Kilt.DidUri,
ctype: Kilt.ICType,
content: Kilt.IClaim['contents']
): Kilt.IClaim {
const claim = Kilt.Claim.fromCTypeAndClaimContents(ctype, content, lightDid)
return claim
}
Bu kod parçası, bir claim
oluşturmanın temelini atmaktadır. claim
oluşturulduktan sonra, bu iddiayı bir "Attester" (Onaylayıcı) onaylayabilir ve daha sonra bir "Verifier" (Doğrulayıcı) tarafından doğrulanabilir.
Credential Oluşturma
Oluşturduğumuz Claim'in attest
olmasını istediğimiz için bir Credential
inşa edebiliriz. Bu işlemi gerçekleştirmek için generateCredential
fonksiyonunu kullanabiliriz. Bu Credential gerekli olan tüm bilgileri içerecektir. Bu sayede Attester
belgeyi attest
edebilecektir.
Paketlerin Eklenmesi
import { config as envConfig } from 'dotenv'
import * as Kilt from '@kiltprotocol/sdk-js'
import { createClaim } from './createClaim'
import { generateLightDid } from './generateLightDid'
import { getCtypeSchema } from '../attester/ctypeSchema'
Paketlerin içeriklerine bakacak olursak:
dotenv
: Ortam değişkenlerini yüklemek için kullanılır.Kilt
: KILT protokolü SDK'sı.createClaim
,generateLightDid
,getCtypeSchema
: Önceki kod parçalarında tanımlanmış yardımcı fonksiyonlar.
generateCredential
Fonksiyonu
export function generateCredential(
claimerDid: Kilt.DidUri,
claimAttributes: Kilt.IClaim['contents']
): Kilt.ICredential {
Credential oluşturmak için gerekli fonksiyonumuzu yazarak işe başlayabiliriz. Bu fonksiyon içerisine 2 adet parametre alacaktır. Çıktı olarak Kilt.ICredential
türünde bir çıktı verecektir. Parametrelere teker teker bakmamız gerekirse:
claimerDid
: Claimer'ın oluşturduğu Light DID'yi içerisine alır.claimAttributes
: İddia edilen niteliklerin listesini içerir.
Claim ve CType'ı Oluşturma
const ctype = getCtypeSchema()
const claim = createClaim(claimerDid, ctype, claimAttributes)
Hem ctype
'ı hemde claim
'i oluşturma kodunu yazmıştık ve dosyamıza import etmiştik. Şimdi de bu fonksiyonları kullanarak ilk olarak CType şemasını elde edip sonrasında claim
değerini oluşturma fonksiyonunu çağırabiliriz. Yani sırasıyla:
getCtypeSchema()
: Önceden tanımlanmış bir CType şeması getirir.createClaim()
: Belirtilen CType ve özniteliklerle bir iddia (Claim
) oluşturur.
Credential oluşturma
console.log('Claimer -> create request')
return Kilt.Credential.fromClaim(claim)
Oluşturduğumuz fonksiyonun çıktısı olarak kısacık ama güzel bir Credential.fromClaim()
kodumuzu çalıştırarak Claim
üzerinden Credential
'i yani kimlik belgemizi oluşturabiliriz.
Ana Kod Bloğu
Bu kısımda dosya tek başına çalıştırılırsa gerçekleşecek işlemler verilmiştir.
if (require.main === module) {
.
.
.
})()
}
Yukarıda da ifade edildiği gibi if
yapısı ile kodun tek başına çalışıp çalışmadığı kontrol edilir.
envConfig()
Bu fonksiyon ile .env
dosyasındaki ortam değişkenlerini kod içerisine ekleriz.
try {
.
.
.
} catch (e) {
console.log('Error while building credential')
throw e
}
Fonksiyonun çalışması için bir try
catch
yapısı kurulur. Eğer işlemlerde bir hata bulunursa hata kullanıcıya log
yapısı ile ekrana yazdırılır.
Artık try
yapısı içerisinde credential
yapısı kurulabilir.
await Kilt.init()
Try yapısı içerisine girdiğimizde credential
oluşturmak için Kilt.init
yapısı ile KILT SDK'yi proje içerisine ekleyebiliriz.
Mnemonik Anahtarı Al
const claimerDidMnemonic = process.env.CLAIMER_DID_MNEMONIC as string
Ortam değişkenlerinden CLAIMER_DID_MNEMONIC
'i alır ve bir string olarak saklar.
Light DID Oluşturma
const claimerDid = generateLightDid(claimerDidMnemonic)
Daha önce diğer kod dosyasında tanımlamış olduğumuz generateLightDid
fonksiyonunu kullanarak, mnemonikten bir light DID
oluşturur.
Credential'ı Yaratmak
const request = generateCredential(claimerDid.uri,
{ age: 21,
name: 'Aybars Göktuğ Ayan'
})
console.log('⚠️ ./claimer/_credential.json dosyasına kaydet ⚠️\n\n')
console.log(JSON.stringify(request, null, 2))
Son olarak generateCredential
fonksiyonu ile claim
'i doldurup credential
formatına getiririz. Bu fonksiyon, oluşturulan DID ve belirtilen nitelikler (age
ve name
) ile bir credential oluşturur. Sonrasında oluşturulan kimlik bilgisini JSON formatında konsola yazdırır.
Kodun tamamına bakacak olursak:
import { config as envConfig } from 'dotenv'
import * as Kilt from '@kiltprotocol/sdk-js'
import { createClaim } from './createClaim'
import { generateLightDid } from './generateLightDid'
import { getCtypeSchema } from '../attester/ctypeSchema'
export function generateCredential(
claimerDid: Kilt.DidUri,
claimAttributes: Kilt.IClaim['contents']
): Kilt.ICredential {
// Create claim.
const ctype = getCtypeSchema()
const claim = createClaim(claimerDid, ctype, claimAttributes)
// Create credential and request attestation.
console.log('Claimer -> create request')
return Kilt.Credential.fromClaim(claim)
}
// Don't execute if this is imported by another file.
if (require.main === module) {
;(async () => {
envConfig()
try {
await Kilt.init()
const claimerDidMnemonic = process.env.CLAIMER_DID_MNEMONIC as string
const claimerDid = generateLightDid(claimerDidMnemonic)
const request = generateCredential(claimerDid.uri, {
age: 21,
name: 'Aybars Göktuğ Ayan'
})
console.log(
'⚠️ save this to ./claimer/_credential.json for testing ⚠️\n\n'
)
console.log(JSON.stringify(request, null, 2))
} catch (e) {
console.log('Error while building credential')
throw e
}
})()
}
Sırasıyla inceleyecek olursak:
- Paketleri ekleriz.
- Claim oluştururuz
- Claim ile Credential oluştururuz ve zincire kaydederiz.
Programı çalıştırmak
Yazdığımız birbirine bağlı 2 kodu çalıştırmak için kilt-rocks
klasöründe olduğumuza emin olduktan sonra alt kısımdaki kodu çalıştırabiliriz.
yarn ts-node claimer/generateCredential.ts
Attestation'lar Attester
'lar tarafından onaylandıktan sonra zincir üzerine kaydedilirler. Bu işlem bir depozito gerektirir. Her Credential birbirinden özeldir. Test yaparken genel olarak credential
'ları depolayıp yeniden kullanıma sokarak birden fazla attestation
işleminin önüne geçmiş oluruz.
Bu belgeyi kaydetmek için ./claimer/_credential.json
konumunda bir dosya oluşturup içerisine bilgileri yazabiliriz. Hatta bu credential
'ı arkadaşlarınız ile paylaşıp onların kullanmasını da sağlayabilirsiniz.
Evet, artık Claimer
olarak Claim
oluşturduk ve bu Claim
içerisinden credential
oluşturduk. Şimdi attester'ı tamamlayarak credential
'ı attest edelim.