Chialisp Belgeleri

Chialisp, akıllı sözleşme yetenekleriyle fonları zorlamak ve serbest bırakmak için güçlü ve güvenli bir LISP benzeri dildir. Bu web sitesi, Chialisp, CLVM ve koşul dili hakkında bilgi edinmek için birleştirilmiş bir yerdir.

İşte bir örnek:

(mod (password new_puzhash amount)
  (defconstant CREATE_COIN 51)

  (if (= (sha256 password) (q . 0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824))
    (list (list CREATE_COIN new_puzhash amount))
    (x)
  )
)

Download Chialisp 0.4 in tar.gz format

1-CLVM Temelleri

CLVM, Chia ağı tarafından kullanılan ChiaLisp’in derlenmiş, minimal sürümüdür. Operatörlerin tamamı burada belgelenmiştir

Bu kılavuz, dilin temellerini kapsayacak ve programların yapısına bir giriş görevi görecektir. Clvm_tools’un bir sürümünü çalıştırarak takip edebilmelisiniz .

Cons Boxes(Eksi Kutuları)

ChiaLisp, Cons Boxes ve atomlardan oluşturulmuştur . Cons kutusu, bir çift ChiaLisp nesnesi olarak tanımlanır. Cons Box öğeler bir atom veya başka bir cons Box olabilir.

Cons kutuları, bir ile ayrılan iki öğe ile bir parantez olarak temsil edilir .

 Örneğin:

(200 . "hello")

("hello" . ("world" . "!!!"))

Yasal cons kutularıdır, ancak aşağıdakiler değildir.

(200 . 300 . 400)

Listeler

Listeler parantez içine alınır ve listedeki her giriş, değerler arasında nokta olmaksızın tek aralıklıdır. Listeler, çok yönlü olduklarından eksiler kutularından çok daha yaygın olarak kullanılmaktadır.

(200 300 "hello" "world")

Ayrıca listeleri iç içe yerleştirebilirsiniz.

("hello" ("nested" "list") ("world"))

Bir listenin, boş bir atomda sonlandırılan ardışık kutuların bir temsilidir (). Aşağıdaki ifadeler eşittir:

(200 . (300 . (400 . ())))

(200 300 400)

Atomlar

Atomlar ya gerçek ikili bloblar ya da değişkenlerdir. Bir program aslında sadece lehçe notasyonlu bir listedir .

ChiaLisp’te atom türlerinin ayırt edilmesi yoktur. Bu, bu (100 0x65 0x68656c6c6f)ve (0x64 101 'hello')eşdeğer listeler anlamına gelir . Ancak dahili olarak, bloblar operatöre bağlı olarak birkaç farklı şekilde yorumlanabilir. Bunu daha sonra daha ayrıntılı olarak ele alacağız.

Matematik

ChiaLisp’te kayan nokta numaraları için destek yoktur, sadece tamsayılar. Dahili olarak tamsayılar, 256 bitlik işaretli tamsayılar olarak yorumlanır.

Matematik operatörleri *+ve -.

$ brun '(- (q . 6) (q . 5))' '()'
1

$ brun '(* (q . 2) (q . 4) (q . 5))' '()'
40

$ brun '(+ (q . 10) (q . 20) (q . 30) (q . 40))' '()'
100

Yukarıdaki çarpma örneğinin listede ikiden fazla parametre aldığını fark etmiş olabilirsiniz. Bunun nedeni, birçok operatörün değişken sayıda parametre alabilmesidir. + ve * değişmeli olduğundan parametrelerin sırası önemli değildir. Değişmeli olmayan işlemler için, (- (q 100) (q 30) (q 20) (q 5))ile eşdeğerdir (- (q 100) (+ (q 30) (q 20) (q 5))). Benzer şekilde (/ 120 5 4 2)eşdeğerdir (/ 120 (* 5 4 2)).

Negatif değerler için de destek var.

$ brun '(- (q . 5) (q . 7))' '()'
-2


$ brun '(+ (q . 3) (q . -8))' '()'
-5

Onaltılık sayıları kullanmak için önek olarak bunların önüne 0x koymanız yeterlidir 

$ brun '(+ (q . 0x000a) (q . 0x000b))' '()'
21

Son matematiksel işleç, diğer dillerde == ile benzer şekilde hareket eden eşittir.

$ brun '(= (q . 5) (q . 6))' '()'
()

$ brun '(= (q . 5) (q . 5))' '()'
1

Yukarıda görebileceğiniz gibi, bu dil bazı verileri boole değerleri olarak yorumlar.

Boole’lar

Bu dilde boş bir liste olarak () değerlendirilir FalseTrue Dahili True olarak ile temsil edilmesine rağmen başka herhangi bir değer 1 değerlendirilir .

$ brun '(= (q . 100) (q . 90))'
()

$ brun '(= (q . 100) (q . 100))'
1

Bu kuralın istisnası 0 çünkü 0 tam olarak aynıdır ().

$ brun '(= (q . 0) ())' '()'
1

$ brun '(+ (q 70) ())' '()'
70

Akış kontrolü

i Operatör halini alır (i A B C)ve bir if ifadesinin gibi davranan Buna değerlendirir B eğer A Doğru ve C aksi.

$ brun '(i (q . 0) (q . 70) (q . 80))' '()'
80

$ brun '(i (q . 1) (q . 70) (q . 80))' '()'
70

$ brun '(i (q . 12) (q . 70) (q . 80))' '()'
70

$ brun '(i (q . ()) (q . 70) (q . 80))' '()'
80

Her iki unutmayın B ve C sadece tüm subexpressions gibi, hevesle değerlendirilir. Değerlendirmeyi koşul sonrasına ertelemek için B ve C alıntı yapılmalı (ile q) ve ardından ile değerlendirilmelidir (a).

$ brun '(a (i (q . 0) (q . (x (q . 1337) )) (q . 1)) ())'

Şimdi, listeler ve programlar hakkında daha fazla açıklama yapmak için iyi bir zaman gibi görünüyor.

Listeler ve Programlar

Liste, parantez içindeki bir veya daha fazla öğenin boşlukla ayrılmış, sıralı herhangi bir grubudur. Örneğin: (70 80 90 100)(0xf00dbabe 48 "hello")ve (90) tüm geçerli listeleri vardır.

Listeler, gibi başka listeler bile içerebilir ("list" "list" ("sublist" "sublist" ("sub-sublist")) "list").

Programlar, CLVM kullanılarak değerlendirilebilen listelerin bir alt kümesidir.

Bir listenin geçerli bir program olması için:

  • 1. Listedeki ilk öğe geçerli bir operatör olmalıdır
  • 2. İlkinden sonraki her öğe geçerli bir program olmalıdır

Bu nedenle, değişmez değerler ve program dışı listeler kullanılarak alıntı yapılmalıdır q .

Programlar, program dışı listeler içerebilir, ancak bunlar aynı zamanda alıntılanmalıdır, örneğin:

$ brun '(q . (80 90 100))' '()'
(80 90 100)

Ve artık programların içinde programlara sahip olabileceğimizi bildiğimize göre, aşağıdaki gibi programlar oluşturabiliriz:

$ brun '(i (= (q . 50) (q . 50)) (+ (q . 40) (q . 30)) (q . 20))' '()'
70

ChiaLisp’teki programlar bu şekilde inşa edilme eğilimindedir. Daha küçük programlar, daha büyük bir program oluşturmak için bir araya getirilir. Programlarınızı, eşleşen parantezlerle bir düzenleyicide oluşturmanız önerilir!

Operatörleri Listeleme

f geçilen listedeki ilk öğeyi döndürür.

$ brun '(f (q . (80 90 100)))' '()'
80

r bir listedeki ilk öğe dışındaki her öğeyi döndürür.

$ brun '(r (q . (80 90 100)))' '()'
(90 100)

c bir öğeyi listenin başına ekler

$ brun '(c (q . 70) (q . (80 90 100)))' '()'
(70 80 90 100)

Ve bir listeden istediğimiz herhangi bir öğeye erişmek veya bunları değiştirmek için bunların kombinasyonlarını kullanabiliriz:

$ brun '(c (q . 100) (r (q . (60 110 120))))' '()'
(100 110 120)

$ brun '(f (r (r (q . (100 110 120 130 140)))))' '()'
120

Çözümler ve Ortam Değişkenleri

Şimdiye kadar programlarımızda herhangi bir girdi veya değişken yoktu, ancak ChiaLisp, bir çözümden geçirilen bir tür değişkeni destekliyor.

ChiaLisp bağlamının bir bulmaca programı ile madeni paraları kilitlemede kullanım için olduğunu hatırlamak önemlidir. Bu, bulmacaya bazı bilgileri aktarabilmemiz gerektiği anlamına gelir.

Çözüm, bulmacaya aktarılan değerlerin bir listesidir. Çözüm ile referans alınabilir 1.

$ brun '1' '("this" "is the" "solution")'
("this" "is the" "solution")

$ brun '(f 1)' '(80 90 100 110)'
80

$ brun '(r 1)' '(80 90 100 110)'
(90 100 110)

Ve listelerin de iç içe yerleştirilebileceğini unutmayın.

$ brun '(f (f (r 1)))' '((70 80) (90 100) (110 120))'
90

$ run '(f (f (r 1)))' '((70 80) ((91 92 93 94 95) 100) (110 120))'
(91 92 93 94 95)

Bu ortam değişkenleri, diğer tüm operatörlerle kombinasyon halinde kullanılabilir.

$ run '(+ (f 1) (q 5))' '(10)'
15

$ run '(* (f 1) (f 1))' '(10)'
100

Bu program, ikinci değişkenin birinci değişkenin karesine eşit olup olmadığını kontrol eder.

$ run '(= (f (r 1)) (* (f 1) (f 1)))' '(5 25)'
1

$ run '(= (f (r 1)) (* (f 1) (f 1)))' '(5 30)'
()

Tam Sayılarla Çevresel Değişkenlere Erişim

Yukarıdaki örneklerde run, daha brun düşük seviyeli dil yerine daha yüksek seviyeli dili kullanıyorduk . Bunun nedeni, alt düzey CLVM dilinde minimalizm uğruna, çözüme değerlendirilmiş tamsayılarla hitap etmemizdir.

Çağırma 1, ağacın köküne erişir ve tüm çözüm listesini döndürür.

$ brun '1' '("example" "data" "for" "test")'
("example" "data" "for" "test")

Bundan sonra, bir ikili ağacı tahmin edebilirsiniz f ve r her bir düğüm numaralandırılır.

$ brun '2' '("example" "data" "for" "test")'
"example"

$ brun '3' '("example" "data" "for" "test")'
("data" "for" "test")

Ve bu, listelerin içinde de listeler olduğunda çalışmak üzere tasarlanmıştır.

$ brun '4' '(("deeper" "example") "data" "for" "test")'
"deeper"

$ brun '5' '(("deeper" "example") "data" "for" "test")'
"data"

$ brun '6' '(("deeper" "example") "data" "for" "test")'
("example")

2 – Madeni Paralar, Harcamalar ve Cüzdanlar

Kılavuzun bu bölümü, bir program içindeki bir programı değerlendirmeyi, ChiaLisp’in Chia ağındaki işlemler ve madeni paralarla nasıl ilişkili olduğunu ve ChiaLisp kullanarak akıllı işlemler oluşturmak için bazı teknikleri kapsayacaktır.

Madeni paralar

Bir madeni para kimliği 3 parça bilgiden oluşturulmuştur.

  1. Ebeveyninin kimliği
  2. Bulmacasının karması (AKA bulmaca karması)
  3. Değeri olan miktar

Bir madeni para kimliği oluşturmak için sırayla birleştirilmiş bu 3 bilginin karmasını almanız yeterlidir.

coinID == sha256(parent_ID + puzzlehash + amount)

Bu, bir madeni paranın bulmacasının ve miktarının onun içsel parçaları olduğu anlamına gelir. Bir jeton bulmacasını veya miktarını değiştiremezsiniz, sadece jeton harcayabilirsiniz.

Bir madalyonun gövdesi de bu 3 bilgi parçasından oluşur, ancak hash edilmek yerine tam olarak saklanır. Bir madeni parayı tanımlayan gerçek kod şu şekildedir:

class Coin:
    parent_coin_info: "CoinName"
    puzzle_hash: ProgramHash
    amount: uint64

Harcama

Bir bozuk para harcadığınızda onu yok edersiniz. Bir bulmacanın davranışı harcanırken madeni paranın değeri ile ne yapılacağını belirlemediği sürece, madeni paranın değeri de harcamada yok olur.

Bir jeton harcamak için 3 parça bilgiye (ve isteğe bağlı bir 4’üne) ihtiyacınız var.

  1. Madeni paranın kimliği
  2. Madeni paranın bulmacasının tam kaynağı
  3. Madeni paranın bulmacasına bir çözüm
  4. (İSTEĞE BAĞLI) Toplu imza adı verilen, birlikte gruplanmış bir imza koleksiyonu

Bulmacanın ve çözümün 1. bölümde anlattığımızla aynı olduğunu unutmayın, ancak bulmacanın madalyonun içinde zaten saklanmış olması ve herhangi birinin bir çözüm sunabilmesi dışında.

Ağ / defter-sim’in madeni para sahipliği kavramı yoktur, herkes ağda herhangi bir jeton harcamayı deneyebilir. Madeni paraların çalınmasını veya istenmeyen şekillerde harcanmasını önlemek bulmacalara kalmıştır.

Bir madeni para için çözüm sunabilecek biri varsa, bir madeni paraya nasıl “sahip” olunabileceğini merak ediyorsunuzdur. Kılavuzun bir sonraki bölümünün sonunda, umarım netleşir.

Pratikte Bulmacalar ve Çözümler

Şimdiye kadar 1. bölümde , bazı sonuçları değerlendirecek ChiaLisp programlarını ele aldık. İlk bölümün madeni parayı kilitlemeye adanmış bir bulmacayı temsil ettiğini ve ikinci bölümün herkesin sunabileceği bir çözüm olduğunu unutmayın:

$ brun '(+ 2 5)' '(40 50)'
90

$ brun '(c (q 800) 1)' '("some data" 0xdeadbeef)'
(800 "some data" 0xdeadbeef)

Bunlar birbirinden ayrı eğlenceli alıştırmalardır, ancak bu format, bir madeni paranın harcandığında nasıl davranması gerektiğine dair blok zinciri ağına talimatlar iletmek için kullanılabilir. Bu, bir değerlendirmenin sonucunun bir İşlem Kodları listesi olmasıyla yapılabilir .

İşlem Kodları

İşlem Kodları iki kategoriye ayrılmıştır: “bu harcama yalnızca X ise geçerlidir” ve “bu harcama geçerliyse X ise” .

Biçimleri ve davranışları ile birlikte OpCode‘ların tam listesi.

  • AGG_SIG_UNSAFE – [49] – (49 0xpubkey 0xmessage) : Bu harcama, yalnızca ekli toplu imza verilen mesajın verilen genel anahtarından bir imza içeriyorsa geçerlidir. Bu güvensiz olarak etiketlenir, çünkü bir mesajı bir kez imzalarsanız, bu imzayı gerektiren diğer paralarınız da potansiyel olarak kilidi açılabilir. Madeni para kimliğinin getirdiği doğal entropi nedeniyle AGG_SIG_ME’yi kullanmak muhtemelen daha iyidir.
  • AGG_SIG_ME – [50] – (50 0xpubkey 0xmessage) : Bu harcama, yalnızca ekli toplu imza, madeni para kimliğiyle birleştirilmiş bu mesajın belirtilen genel anahtarından bir imza içeriyorsa geçerlidir.
  • CREATE_COIN – [51] – (51 0xpuzzlehash amount) : Bu harcama geçerliyse, verilen bulmaca karması ve miktarla yeni bir jeton oluşturun.
  • ASSERT_FEE – [52] – (52 amount) : Bu harcama, yalnızca bu işlemde açıkça ücret olarak kullanılacak tutara eşit kullanılmamış değer varsa geçerlidir .
  • CREATE_COIN_ANNOUNCEMENT – [60] – (60 message) : Bu harcama geçerliyse, bu, onu oluşturan paraya bağlı bir ID ile geçici bir duyuru oluşturur. Diğer kripto paralar daha sonra bir blok içinde madeni paralar arası iletişim için bir duyuru bulunduğunu iddia edebilir.
  • ASSERT_COIN_ANNOUNCEMENT – [61] – (61 0xannouncementID) : Bu harcama, yalnızca bu blokta duyuru kimliği ile eşleşen bir duyuru varsa geçerlidir. Duyuru kimliği, duyurulan madalyonun madeni para kimliği ile birleştirilmiş olarak duyurulan mesajın karmasıdır announcementID == sha256(coinID + message).
  • CREATE_PUZZLE_ANNOUNCEMENT – [62] – (62 message) : Bu harcama geçerliyse, onu oluşturan bulmacaya bağlı bir ID ile geçici bir duyuru oluşturur. Diğer kripto paralar daha sonra bir blok içinde madeni paralar arası iletişim için bir duyuru bulunduğunu iddia edebilir.
  • ASSERT_PUZZLE_ANNOUNCEMENT – [63] – (63 0xannouncementID) : Bu harcama, yalnızca bu blokta duyuru kimliği ile eşleşen bir duyuru varsa geçerlidir. Duyuru kimliği, onu duyuran madalyonun bulmaca karması ile birleştirilmiş olarak duyurulan mesajdır announcementID == sha256(puzzle_hash + message).
  • ASSERT_MY_COIN_ID – [70] – (70 0xcoinID) : Bu harcama, yalnızca sunulan jeton kimliği, bu bulmacayı içeren madalyonun kimliği ile tamamen aynı ise geçerlidir.
  • ASSERT_MY_PARENT_ID – [71] – (71 0xparentID) : Bu harcama, yalnızca sunulan ana jeton bilgisi, bu bulmacayı içeren madalyonun ana jeton bilgisi ile tamamen aynı ise geçerlidir.
  • ASSERT_MY_PUZZLE_HASH – [72] – (72 0xpuzzlehash) : Bu harcama, yalnızca sunulan bulmaca karması, bu bulmacayı içeren madalyonun karma bulmaca karması ile tamamen aynıysa geçerlidir.
  • ASSERT_MY_AMOUNT – [73] – (73 0xamount) : Bu harcama, yalnızca sunulan miktar bu bulmacayı içeren jeton miktarı ile tamamen aynı ise geçerlidir.
  • ASSERT_SECONDS_RELATIVE – [80] – (80 seconds) : Bu harcama, yalnızca bu jetonun oluşturulmasından bu yana verilen süre geçmişse geçerlidir.
  • ASSERT_SECONDS_ABSOLUTE – [81] – (81 time) : Bu harcama yalnızca bu bloktaki zaman damgası belirtilen zaman damgasından büyükse geçerlidir.
  • ASSERT_HEIGHT_RELATIVE – [82] – (82 block_age) : Bu harcama, yalnızca bu jeton yaratıldıktan sonra belirtilen sayıda blok geçmişse geçerlidir.
  • ASSERT_HEIGHT_ABSOLUTE – [83] – (83 block_height) : Bu harcama yalnızca verilen block_height’a ulaşıldığında geçerlidir.

Koşullar, aşağıdaki formdaki liste listesi olarak döndürülür:

((51 0xabcd1234 200) (50 0x1234abcd) (53 0xdeadbeef))

Unutmayın: Bu, bir bulmacanın bir çözümle birlikte sunulduğunda değerlendirmesi gereken şeydir, böylece tam düğüm / defter-sim onu ​​anlayabilir.

Bunun pratikte nasıl kullanıldığını göstermek için birkaç örnek bulmaca ve çözüm oluşturalım.

Örnek 1: Parola Kilitli Para

Parolayı bildiği sürece herkes tarafından harcanabilecek bir jeton oluşturalım.

Bunu uygulamak için, bulmacaya işlenmiş şifrenin karma değerine sahip oluruz ve doğru şifre ile sunulursa, bulmaca, çözümde verilen bir bulmaca karmasıyla yeni bir madeni para oluşturma talimatlarını döndürecektir. Aşağıdaki örnek için parola, karma değeri 0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 olan “merhaba” dir. Yukarıdaki madalyonun uygulaması şu şekilde olacaktır:

(i (= (sha256 2) (q 0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824)) (c (q . 51) (c 5 (c (q . 100) ()))) (q "wrong password"))

Bu program (sha256 ), çözümdeki ilk öğenin hash 2 değerini ile birlikte alır ve bu değeri önceden kaydedilmiş olanla karşılaştırır. Parola doğruysa, (c (q . 51) (c 5 (c (q . 100) (q ())))hangi olarak değerlendirilir (51 0xmynewpuzzlehash 100). Unutmayın, 51 çözümde sunulan bulmaca karmasını kullanarak yeni bir madeni para oluşturmak için İşlem Kodu ve 5 eşdeğeridir (f (r 1)).

Şifre yanlışsa, “yanlış şifre” dizesini döndürecektir.

Bunun çözümü için formatın olarak biçimlendirilmesi bekleniyor (password newpuzzlehash). Unutmayın, madeni paranın kimliğini ve bulmaca kodunu bildikleri sürece herkes bu parayı harcamaya çalışabilir.

Clvm_tools kullanarak test edelim.

$ brun '(i (= (sha256 2) (q 0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824)) (c (c (q 51) (c 5 (c (q 100) (q ())))) (q ())) (q "wrong password"))' '("let_me_in" 0xdeadbeef)'
"wrong password"

$ brun '(i (= (sha256 2) (q 0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824)) (c (q 51) (c 5 (c (q 100) (q ())))) (q "wrong password"))' '("incorrect" 0xdeadbeef)'
"wrong password"

$ brun '(i (= (sha256 2) (q 0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824)) (c (q 51) (c 5 (c (q 100) (q ())))) (q "wrong password"))' '("hello" 0xdeadbeef)'
((51 0xdeadbeef 100))

Bu tam bir akıllı işlem olmadan önce yapmamız gereken son bir değişiklik var.

Bir harcamayı geçersiz kılmak istiyorsanız, kullanarak bir istisna oluşturmalısınız x. Aksi takdirde, herhangi bir İşlem Kodunu iade etmeyen geçerli bir harcamanız vardır ve bu, madeni paramızı yok eder ve yeni bir tane oluşturmaz! Bu nedenle, başarısızlık koşulunu değiştirmemiz gerekiyor, (x (q . "wrong password"))bu da işlemin başarısız olduğu ve madeni paranın harcanmadığı anlamına gelir.

Eğer bunu yapıyorsak, o zaman (i A B C)kalıbı da olarak değiştirmeliyiz (a (i A (q . B) (q . C)) 1). Bunun nedeni 3. bölümde açıklanmıştır . Şimdilik neden diye endişelenmeyin.

İşte tamamlanmış parola korumalı jetonumuz:

(a (i (= (sha256 2) (q . 0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824)) (q . (c (c (q . 51) (c 5 (c (q . 100) ()))) ())) (q . (x (q . "wrong password")))) 1)

Clvm_tools kullanarak test edelim:

$ brun '(a (i (= (sha256 2) (q . 0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824)) (q . (c (c (q . 51) (c 5 (c (q . 100) ()))) ())) (q . (x (q . "wrong password")))) 1)' '("let_me_in" 0xdeadbeef)'
FAIL: clvm raise ("wrong password")

$ brun '(a (i (= (sha256 2) (q . 0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824)) (q . (c (c (q . 51) (c 5 (c (q . 100) ()))) ())) (q . (x (q . "wrong password")))) 1)' '("hello" 0xdeadbeef)'
((51 0xdeadbeef 100))

Bulmacadan ve Çözümden İşlem Kodları Oluşturma

Gönderen ve harcayan arasındaki güç dengesini düşünmek için bir dakikanızı ayıralım. Bunu ifade etmenin başka bir yolu da “çözümün çıktı üzerinde ne kadar kontrole sahip olması gerekir?”

Aşağıdaki bulmacayı kullanarak bir bozuk parayı kilitlediğimizi varsayalım:

(q . ((51 0x365bdd80582fcc2e4868076ab9f24b482a1f83f6d88fd795c362c43544380e7a 100)))

Hangi çözümün geçildiğine bakılmaksızın, bu bulmaca her zaman 0x365bdd80582fcc2e4868076ab9f24b482a1f83f6d88fd795c362c43544380e7a ve miktar 100 ile yeni bir para oluşturma talimatlarını döndürecektir.

$ brun '(q . ((51 0x365bdd80582fcc2e4868076ab9f24b482a1f83f6d88fd795c362c43544380e7a 100)))' '(80 90 "hello")'
((51 0x365bdd80582fcc2e4868076ab9f24b482a1f83f6d88fd795c362c43544380e7a 100))

$ brun '(q . ((51 0x365bdd80582fcc2e4868076ab9f24b482a1f83f6d88fd795c362c43544380e7a 100)))' '("it doesn't matter what we put here")'
((51 0x365bdd80582fcc2e4868076ab9f24b482a1f83f6d88fd795c362c43544380e7a 100))

Bu örnekte madeni parayı harcamanın sonucu tamamen bulmacadan belirlenir. Madeni paranın harcamasını herkes başlatabilse bile, madeni parayı kilitleyen kişi, çözümün hiçbir önemi olmadığı için madeni paranın harcanma şeklindeki tüm güce sahiptir.

Tersine, aşağıdaki bulmacayla kilitlenmiş bir bozuk parayı ele alalım:

1

Bu örnek biraz tuhaf görünebilir, çünkü çoğu ChiaLisp programı listedir ve bu sadece bir atomdur, ancak yine de geçerli bir programdır. Bu bulmaca basitçe tüm çözümü blok zincirine döndürür. Bunu güç ve kontrol açısından düşünebilirsiniz. Madeni parayı kilitleyen kişi, tüm gücü çözümü sağlayan kişiye vermiştir.

$ brun '1' '((51 0xf00dbabe 50) (51 0xfadeddab 50))'
((51 0xf00dbabe 50) (51 0xfadeddab 50))

$ brun '1' '((51 0xf00dbabe 75) (51 0xfadeddab 15) (51 0x1234abcd 10))'
((51 0xf00dbabe 75) (51 0xfadeddab 15) (51 0x1234abcd 10))

Bu durumda, herkes sadece parayı harcamakla kalmaz, istediği gibi harcayabilir! Bu güç dengesi, ChiaLisp’te bulmacaların nasıl tasarlandığını belirler.

Örneğin, harcayanın çıktıyı seçmesine izin veren, ancak tek bir şartla bir bulmaca oluşturalım.

  (c (q . (51 0xcafef00d 200)) 1)

Bu, harcayanın çözüm yoluyla istediği tüm koşulları ve İşlem Kodlarını iade etmesine izin verir, ancak her zaman bulmaca karması 0xcafef00d ve 200 değeriyle bir para oluşturma koşulu ekler.

$ brun '(c (q . (51 0xcafef00d 200)) 1)' '((51 0xf00dbabe 75) (51 0xfadeddab 15) (51 0x1234abcd 10))'
((51 0xcafef00d 200) (51 0xf00dbabe 75) (51 0xfadeddab 15) (51 0x1234abcd 10))

Bu bölüm, İşlem Kodlarının hem alıcının çözümünden hem de gönderenin bilmecesinden gelebileceği noktayı ve bunun güveni ve güç dengesini nasıl temsil ettiğini göstermeyi amaçlamaktadır.

Bir sonraki alıştırmada, bildiğimiz her şeyi bir araya getireceğiz ve Chia’da cüzdanların birbirine nasıl para gönderebildiğinin temelini oluşturan “standart” işlemi oluşturacağız.

Örnek: İmza Kilitli Para

‘Birine para göndermek’ için, sadece alıcıların imzasını gerektiren, ancak daha sonra beğendikleri diğer İşlem Kodlarını iade etmelerine izin veren bir bulmaca oluşturursunuz. Bu, madeni paranın başka biri tarafından harcanamayacağı, ancak çıktıların tamamen alıcı tarafından kararlaştırıldığı anlamına gelir.

AGGSIG’nin 50 ve alıcının pubkeyinin olduğu aşağıdaki akıllı işlemi oluşturabiliriz 0xfadedcab.

(c (c (q . 50) (c (q . 0xfadedcab) (c (sha256 2) (q . ())))) 3)

Bu bulmaca, sonuçta ortaya çıkan değerlendirmeyi içermeye zorlar, (50 0xpubkey *hash_of_first_solution_arg*)ancak daha sonra çözümde sunulan tüm koşulları ekler.

Bunu clvm_tools’da test edelim – bu örnek için alıcının pubkey’i 0xdeadbeef olarak gösterilecektir. Alıcı, bozuk parayı 0xfadeddab bulmacasıyla kilitlenmiş yeni bir para yaratmak için harcamak istiyor.

$ brun '(c (c (q . 50) (c (q . 0xfadedcab) (c (sha256 2) (q . ())))) 3)' '("hello" (51 0xcafef00d 200))'
((50 0xfadedcab 0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824) (51 0xcafef00d 200))

Geri çekelim ve buraya biraz bağlam ekleyelim.

Cüzdanlar

Cüzdan, bir kullanıcının madeni paralarla etkileşimini kolaylaştıran çeşitli özelliklere sahip bir yazılımdır.

  • Bir cüzdan, genel ve özel anahtarların kaydını tutar
  • Bir cüzdan, bulmacalar ve çözümler üretebilir
  • Bir cüzdan, anahtarlarıyla bir şeyler imzalayabilir
  • Bir cüzdan, kullanıcının sahip olduğu paraları tanımlayabilir ve hatırlayabilir
  • Bir cüzdan para harcayabilir

Herhangi bir kişi bir jeton harcamayı deneyebilirse, bir cüzdanın kullanıcının sahip olduğu jetonları nasıl belirleyebildiğini merak ediyor olabilirsiniz. Bunun nedeni, tüm cüzdanların birisine para göndermek için standart biçimin ne olduğunu zaten bilip kabul etmesidir. Kendi pubkeylerinin ne olduğunu bilirler, bu yüzden yeni bir jeton yaratıldığında bir cüzdan, o madeni paranın içindeki bulmacanın pubkeylerinden birine ‘standart gönderme bulmacası’ olup olmadığını kontrol edebilir. Eğer öyleyse, o madeni paranın o ‘cüzdan’a ait olduğu düşünülebilir, çünkü başka kimse onu harcayamaz.

Madeni paraya ‘sahip’ olan cüzdan daha sonra bu parayı başka birine tekrar göndermek isterse, yeni alıcının pubkey’iyle ‘standart bir gönderme bulmacası’ oluştururdu. Daha sonra sahip oldukları parayı harcayabilir, yok edebilir ve süreçte yeni alıcılar pubkey ile kilitlenen yeni bir para yaratabilirler. Yeni alıcı daha sonra madeni paraya ‘sahip olduğunu’ belirleyebilir ve daha sonra istediği gibi gönderebilir.

Değişiklik Yapma

Değişiklik yapmak basittir. Bir cüzdan, bir madeni paranın toplam değerinden daha az harcıyorsa, kalan değer kısmı ile başka bir madeni para yaratabilir ve tekrar kendileri için standart bulmacaya kilitleyebilir. Bir madeni parayı istediğiniz kadar orijinal değerinin kesirleriyle çok sayıda yeni paraya bölebilirsiniz.

Aynı ebeveynden aynı bulmaca karması ile aynı değerde iki jeton oluşturamazsınız, çünkü bu bir kimlik çakışmasına yol açar ve harcama reddedilir.

Madeni Para Toplama ve Harcama Paketleri

Bir grup küçük madeni parayı bir büyük madeni paraya birleştirebilirsiniz. Bunu yapmak için, bir veya daha fazla harcamayı bölünemeyecek şekilde gruplayan bir SpendBundle oluşturabilirsiniz. SpendBundle ayrıca, AGGSIG koşulunun bir değerin imzalanıp imzalanmadığını nasıl kontrol edebileceğini gösteren bir Toplanmış İmza nesnesi içerir.

ASSERT_COIN_CONSUMED kullanarak aralarındaki bağı daha da sıkabilirsiniz. 20 jetonunuz ve 80 jetonunuz olduğunu varsayalım. 20 jetonda harcamada geri dönüş sağlayabilirsiniz (CREATE_COIN 0xnewpuzhash 100). Sonra 80 jetonda iade edebilirsiniz (ASSERT_COIN_CONSUMED 0xcoinID). SpendBundle içindeki kuplaj ve bunun 20 ile ilişkisini ortaya koyan 80 değeri, 80 jetonun değerinin yeni değer 100 jetonun yaratılmasına kanalize edildiği anlamına gelir.

Standart İşlem

Standart işlemimiz olarak kullanmak için imza kilitli madalyonun daha da güçlü bir versiyonunu oluşturabiliriz.

(c (c (q . 50) (c (q . 0xfadedcab) (c (sha256 2) (q . ())))) (a 5 11))

İlk kısım çoğunlukla aynıdır, bulmaca her zaman pubkey için bir AGGSIG kontrolü döndürür 0xfadedcab. Ancak, çözümün yalnızca ilk unsurunu kontrol eder. Bunun nedeni, bu bulmacanın çözümünün yazdırılacak İşlem Koşullarının bir listesi olması yerine, çözümün bir program / çözüm çifti olmasıdır. Bu, alıcının çözüm oluşturmanın bir parçası olarak kendi programını çalıştırabileceği veya bir bulmacayı imzalayarak çözümü başka birinin sağlamasına izin verebileceği anlamına gelir.

Çözüm içerisindeki yeni program ve çözüm değerlendirilir ve bunun sonucu OpCode çıktısına eklenir. Bu kılavuzun bir sonraki bölümünde bunun nasıl çalıştığını daha ayrıntılı olarak ele alacağız .

Bu standart işlem için temel bir çözüm şöyle görünebilir:

("hello" (q . ((51 0xmynewpuzzlehash 50) (51 0xanothernewpuzzlehash 50))) (q . ()))

Bunu clvm_tools içinde çalıştırmak şuna benzer:

$ brun '(c (c (q . 50) (c (q . 0xfadedcab) (c (sha256 2) (q . ())))) (a 5 11))' '("hello" (q . ((51 0xdeadbeef 50) (51 0xf00dbabe 50))) (q . ()))'

((50 0xfadeddab 0x1f82d4d4c6a32459143cf8f8d27ca04be337a59f07238f1f2c31aaf0cd51d153) (51 0xdeadbeef 50) (51 0xf00dbabe 50))

Sonuçlar

Madeni para sahipliği, bir bulmacayla bir madeni para yaratma kavramını ifade eder, bu da yalnızca madeni paranın “sahibinin” özel anahtarı ile imzalandığında harcanabileceği anlamına gelir. Cüzdan yazılımının amacı, bu tür paraları ve bulmacaları oluşturmak, yorumlamak ve yönetmektir.

Bu kılavuzun bir sonraki bölümü, ChiaLisp’te daha derinlere inecek ve daha karmaşık bulmacaların nasıl yazılacağını ele alacaktır. Kılavuzun bu bölümündeki herhangi bir materyal kafanızı karıştırdıysa, sonraki bölümden sonra ona geri dönmeyi deneyin.

3 – CLVM’nin Derinliklerine

Kılavuzun bu bölümü, ChiaLisp’in Chia ağındaki işlemler ve madeni paralarla nasıl ilişkili olduğunu kapsayacaktır. 

ChiaLisp’te Tembel Değerlendirme

1. bölümde gördüğümüz gibi, programlar genellikle (i A B C)akışı kontrol edecek şekilde yapılandırılır . ChiaLisp, programları önce yaprakların değerlendirildiği ağaçlar olarak değerlendirir. Bu, farkında değilseniz beklenmeyen sorunlara neden olabilir. Değerlendirilirse x hemen durup hata veren aşağıdaki programı kullanan programı düşünün .

$ brun '(i (q . 1) (q . 100) (x (q . "still being evaluated")))'
FAIL: clvm raise (0x7374696c6c206265696e67206576616c7561746564)

Bunun nedeni, ChiaLisp’in yalnızca birinin yolunu takip etse bile her iki yaprağı da değerlendirmesidir.

Bunu aşmak için, (i ABC) değiştirmek için aşağıdaki tasarım modelini kullanabiliriz.

(a (i (A) (q B) (q C)) (a))

Bunu yukarıdaki örneğimize uygulamak şuna benzer:

$ brun '(a (i (q . 1) (q . (q . 100)) (q . (x (q . "still being evaluated")))) 1)'
100

Ne zaman bir (i A B C).

Bunun nasıl çalıştığını (ve 2. bölümdeki standart işlemin nasıl çalıştığını) merak ediyorsanız , o zaman Değerlendirmemi tanıtmama izin verin.

Değerlendirmeye Giriş

In Bölüm 1 İlk eleman bir operatör olduğunu ve sonraki her eleman geçerli bir programdır nerede bir program listesi genellikle belirtti. Bir programın içinde yeni argümanlar içeren programları da çalıştırabiliriz.

Bu şuna benzer:

(a *(puzzle)* (*solution)*)

Bunu pratiğe dökelim.

İşte programı değerlendiren (+ 2 (q 5)))ve listeyi (70 80 90) veya (80 90 100) çözüm olarak kullanan bir program .

$ brun '(a (q . (+ 2 (q . 5))) (q . (70 80 90)))' '(20 30 40)'
75

$ brun '(a (q . (+ 2 (q . 5))) (q . (80 90 100)))' '(20 30 40)'
85

Orijinal çözümün (20 30 40) yeni değerlendirme ortamı için ne kadar önemli olmadığına dikkat edin . Bu örnekte q . , erken değerlendirilmelerini önlemek için hem yeni bulmacadan hem de yeni çözümden alıntı yapmak için kullanıyoruz.

Çekebileceğimiz güzel bir numara, yeni çözümü dış çözüm açısından tanımlayabilmemizdir. Bu sonraki örnekte eski çözümün ilk unsurunu yeni çözümümüze ekleyeceğiz.

$ brun '(a (q . (+ 2 (q . 5))) (c 2 (q . (70 80 90))))' '(20 30 40)'
25

Ancak, bunu kullanarak etkileyebileceğimiz sadece yeni çözüm değil, programları parametre olarak da geçirebiliriz.

Parametreler Olarak Programlar

Çekirdek CLVM, kullanıcı tanımlı işlevler oluşturmak için bir operatöre sahip değildir. Bununla birlikte, programların benzer sonuçlar için kullanılabilecek parametreler olarak geçirilmesine izin verir.

İşte 2 (ilk çözüm argümanı) içinde bulunan programı çözümle birlikte yürüten bir bilmece (12).

$ brun '(a 2 (q . (12)))' '((* 2 (q . 2)))'
24

Bunu daha da ileri götürerek, bulmacanın yalnızca eski çözümündeki parametreleri kullanan yeni bir değerlendirme çalıştırmasını sağlayabiliriz:

$ brun '(a 2 1)' '((* 5 (q . 2)) 10)'
20

Bu tekniği özyinelemeli programları uygulamak için kullanabiliriz.

4 – Üst Düzey Dil, Derleyici ve İşlevler

Bu kılavuz, önceki bölümleri zaten okuduğunuzu varsaymaktadır. Üst düzey dil doğrudan alt düzey dilin üzerine inşa edildiğinden, bunu yapmanız şiddetle tavsiye edilir.

Çalıştırmak

Daha yüksek seviyeli dil için bilmeniz gereken ilk fark, bunun runyerine aramanız gerektiğidir brun. Bu, çalışma zamanının daha yüksek seviyeli özellikleri içermesi gerektiğini bilmesini sağlar.

Farkında olmanız gereken ilk üst düzey özellik , artık atomlardan alıntı yapmanın gerekmediğidir!

Karşılaştırın brun ve run burada:

$ brun '(+ 200 200)'
FAIL: first of non-cons ()
$ run '(+ 200 200)'
400

Run ayrıca, şimdi ele alacağımız bir dizi uygun üst düzey operatöre erişim sağlıyor.

Liste

list herhangi bir sayıda parametre alır ve bunları bir listeye yerleştirir. Bu, bizi (c (A) (c (B) (q ())))hızla dağınık hale gelebilecek iç içe geçmiş aramaları manuel olarak oluşturma zorunluluğundan kurtarır .

$ run '(list 100 "test" 0xdeadbeef)'
(100 "test" 0xdeadbeef)

Eğer

if otomatik olarak ifademizi i tembel değerlendirme formuna koyar, böylece değerlendirilen kullanılmayan kod yolu hakkında endişelenmemize gerek kalmaz.

$ run '(if 1 (q . "success") (x))' '(100)'
"success"

$ run '(if 0 (q . "success") (x))' '(100)'
FAIL: clvm raise ()

qq alıntı

qq kullanarak içinde değerlendirilen seçilmiş kısımları içeren bir şeyden alıntı yapmamızı sağlar unquote. Bunun avantajları hemen açık olmayabilir, ancak önceden belirlenmiş kod bölümlerini değiştirmemize izin verdiği için pratikte son derece kullanışlıdır.

Başka bir paranın bulmacasını döndüren bir program yazdığımızı varsayalım. Bir bulmacanın şu biçimi aldığını biliyoruz: (c (c (q . 50) (c (q . 0xpubkey) (c (sha256 2) (q . ())))) (a 5 11)) Ancak, 0xpubkey’i çözümümüz aracılığıyla bize iletilen bir değere değiştirmek isteyeceğiz.

Not: @ daha yüksek seviyeli dildeki argümanlara erişmemize izin verir

$ run '(qq (c (c (q 50) (c (q (unquote (f @))) (c (sha256 2) (q ())))) (a 5 11)))' '(0xdeadbeef)'

(c (c (q 50) (c (q 0xdeadbeef) (c (sha256 2) (q ())))) (a 5 11))

Mod ile CLVM’ye Derleme

Pratikte akıllı sözleşmelerin daha düşük seviyeli dili kullanarak çalışacağını, bu nedenle yukarıdaki operatörlerin hiçbirinin ağ üzerinde çalışmayacağını hatırlamak önemlidir. Ne olabilir ancak bunu alt düzey dile onları derlemek olduğunu. İşte burada mod devreye giriyor. mod, Çalışma zamanının kodu gerçekten çalıştırmak yerine derlemesi gerektiğini bilmesini sağlayan bir işleçtir.

(mod A B) iki veya daha fazla parametre alır. Birincisi, aktarılan parametreleri adlandırmak için kullanılır ve sonuncusu, derlenecek olan daha yüksek seviyeli komut dosyasıdır.

Bizim argümanlar isim altında arg_oneve arg_two daha sonra erişim ve arg_one ana programı içinde

$ run '(mod (arg_one arg_two) (list arg_one))'
(c 2 (q ()))

Gördüğünüz gibi programımızı derlenmiş alt düzey formda döndürüyor.

$ brun '(c 2 (q ()))' '(100 200 300)'
(100)

mod Değişken isimleri ve kaynak kodu arasında diğer parametrelerin ne gerektirdiğini merak ediyor olabilirsiniz .

Fonksiyonlar, Makrolar ve Sabitler

Daha yüksek seviyeli dili biz kullanarak bizim programından önce fonksiyonlarını, makroları ve sabitlerini tanımlayabilir defundefmacro ve defconstant.

Bunlardan istediğimiz kadarını ana kaynak kodundan önce tanımlayabiliriz. Genellikle bir program şu şekilde yapılandırılır:

(mod (arg_one arg_two)
  (defconstant const_name value)
  (defun function_name (parameter_one parameter_two) (*function_code*))
  (defun another_function (param_one param_two param_three) (*function_code*))
  (defmacro macro_name (param_one param_two) (*macro_code*))

  (main *program*)
)

Dikkat edilmesi gereken birkaç nokta:

  • İşlevler kendi kodlarında kendilerine başvurabilir ancak satır içi işlevlere benzer şekilde, derleme zamanında eklendiklerinden makrolar bunu yapamazlar.
  • Hem işlevler hem de makrolar diğer işlevlere, makrolara ve sabitlere başvurabilir.
  • Parametrelerine atıfta bulunan makrolar, tırnaksız parametreler ile yarı tırnak içine alınmalıdır.
  • Diğer makrolara başvuran makrolardaki sonsuz döngülere dikkat edin.
  • Yorumlar noktalı virgülle yazılabilir

Şimdi fonksiyonları kullanan bazı örnek programlara bakalım.

Faktöriyel

(mod (arg_one)
  ; function definitions
  (defun factorial (input)
    (if (= input 1) 1 (* (factorial (- input 1)) input))
  )

  ; main
  (factorial arg_one)
)

Bu dosyaları komut satırından çalıştırılabilen .clvm dosyalarına kaydedebiliriz. Yukarıdaki örneği olduğu gibi kaydetmek, factorial.clvm aşağıdakileri yapmamızı sağlar.

$ run factorial.clvm
(a (q 2 2 (c 2 (c 5 ()))) (c (q 2 (i (= 5 (q . 1)) (q 1 . 1) (q 18 (a 2 (c 2 (c (- 5 (q . 1)) ()))) 5)) 1) 1))

$ brun '(a (q 2 2 (c 2 (c 5 ()))) (c (q 2 (i (= 5 (q . 1)) (q 1 . 1) (q 18 (a 2 (c 2 (c (- 5 (q . 1)) ()))) 5)) 1) 1))' '(5)'
120

Bir Listenin Karesini Alma

Şimdi makroları da kullanan bir örnek yapalım. Bir makro yazılırken, tırnaksız olarak parametrelerle benzer şekilde yazılmalıdır.

Derleyicinin başka bir özelliğini göstermek için de bu zamanı alabiliriz. Bir listedeki her parametreyi adlandırabilir veya listenin kendisini adlandırabilirsiniz. Bu, parametreleri adlandırdığınız her yerde çalışır ve boyuttan emin olmadığınız listeleri yönetmenize olanak tanır.

Burada bir parametrenin karelenmesi için bir makro ve ardından bir listenin karelenmesi için bir fonksiyon tanımlarız.

(mod args

  (defmacro square (input)
    (qq (* (unquote input) (unquote input)))
  )

  (defun sqre_list (my_list)
    (if my_list
      (c (square (f my_list)) (sqre_list (r my_list)))
      my_list
    )
  )

  (sqre_list args)
)

Bu kodu derlemek ve çalıştırmak şununla sonuçlanır:

$ run square_list.clvm
(a (q 2 2 (c 2 (c 3 ()))) (c (q 2 (i 5 (q 4 (* 9 9) (a 2 (c 2 (c 13 ())))) (q . 5)) 1) 1))

$ brun '(a (q 2 2 (c 2 (c 3 ()))) (c (q 2 (i 5 (q 4 (* 9 9) (a 2 (c 2 (c 13 ())))) (q . 5)) 1) 1))' '(10 9 8 7)'
(100 81 64 49)

Sonuç

Artık kendi chialisp programlarınızı yazmak için gereken içeriğe ve bilgiye sahip olmalısınız. Bölüm 2’den itibaren bu programların blok zincirinde çalıştığını ve blok zincirine madeni paranın değeriyle ne yapması gerektiğini anlattığını hatırlayın .

Büyük Chia Sözlüğü

Bu kılavuz, Chia’da kullanılan kavramların çoğu için bir sözlük işlevi görecektir. Bitcoin işlemlerinin nasıl çalıştığına aşinaysanız, bunların çoğu aşina olacaktır.


  • Coin (TXO/transaction output) – Bir jeton değeri depolar. Tüm madeni paralar, bir işlemin çıktısı veya bir para tabanı ödülü veya ücret hedefi olarak üretilir. Bir jeton tam olarak bir kez harcanarak değerinin diğer madeni paralara gitmesine izin verir ve ardından kalıcı olarak yok edilir. Harcanmamış her jeton, madeni paranın bulmacası olan bir ChiaLisp programı ile kilitlenir ve bu bulmacayı çözecek bilgiye sahip olan, o parayı harcayabilecek kişidir. En temel bulmacanın bir genel anahtarı vardır ve ilgili özel anahtarla imzalanmış koşulların bir listesini içeren bir çözümü kabul eder, böylece yalnızca özel anahtarın sahibi paranın kilidini açabilir ve onu harcayabilir.
  • Unspent Coin (UTXO/unspent transaction output) – Oluşturulmuş ancak henüz harcanmamış ve dolayısıyla değer depolayan bir jeton. Harcanmamışlar (UTXO set / harcanmamış işlem çıktı seti) – Bu, ağdaki tüm harcanmamış paraların setidir. Bulmacalar için bir arama görevi gören bir işlemin geçerli olup olmadığını kontrol etmek için kullanılır. Bir jeton kimliğini blok yüksekliğinde bir doğum tarihiyle eşler. Bir işlem, geçmemişler bu bilgiyi içermediğinden, yalnızca doğrulamak için kullanılabilen karmalar olduğundan, doğrulamanın mümkün olması için kimliği hesaplamak için kullanılan bilgilerin bir açıklamasını içermelidir.
  • Coin ID/CoinName (TXO ID/transaction output ID) – Chia’daki bir madeni paranın kimliği, birincil giriş kimliği, bulmaca karması ve bu sırayla birleştirilen miktarın hashingiyle oluşturulur. Bu, TXO kimliğini oluşturmak için çok daha fazla veri kullanan ve akıllı sözleşmelerin neler yapabileceğini kısıtlayan Bitcoin’den çok farklıdır. 
  • Primary Input/Parent – Bir madeni para oluşturulduğunda, işlemde girdi olarak kullanılan madeni para birincil girdi olarak belirlenir. Bu, madeni para kimliğini oluşturmak için kullanılır. Bir işlemde girdi olarak birden fazla madeni para kullanılırsa, madeni paralardan biri birincil girdi olarak belirlenir ve diğerleri işlemi basitçe güçlendirir.
  • Spend/CoinSolution – Harcama , tam bulmaca kodu ile birlikte bir madeni paranın kimliğinin ve bulmacayla çalıştırılacak bir çözümün ortaya çıkmasıdır . Bir harcamanın sonucu, bulmacayı çözümle çalıştırdıktan sonra döndürülen İşlem Kısıtlamaları tarafından belirlenir.
  • Spend Bundle – Harcama paketi, ağa gönderilecek toplu bir imza ile birlikte gruplanmış bir harcama koleksiyonudur.
  • ChiaLisp – ChiaLisp, madeni para harcamak için bulmacaların programlandığı Turing-complete işlevsel dilidir.
  • Puzzle (Scriptpubkey) – Bir madeni paranın harcandığı andaki davranışını belirleyen bir ChiaLisp programı. Bir bulmaca, bir çözümü reddedebilir veya bir dizi kısıtlama çıkarabilir.
  • Solution (Scriptsig) – Bu, bir işlem gönderildiğinde değerlendirme için bulmacaya aktarılan bazı ChiaLisp’tir. 
  • CLVM – CLVM bulmaca ve çözümleri çalıştırmak olduğunu korumalı alan ortamdır ChiaLisp Sanal Makine bir derleyici derlenmiş asgari sürüme üst düzey ChiaLisp dönüştürebilseniz de CLVM sadece ChiaLisp derlenmiş asgari sürümünü çalıştırır.
  • Aggregated Signature/AggSig – Toplu İmzalar, birden çok imzayı tek bir toplu imzada yoğunlaştırmamıza olanak tanır; böylece bir ortak anahtar ve değer bildiğimizde, tek bir kümede var olup olmadığını doğrulayabiliriz. Bu, etkileşimli olmayan BLS toplamayı kullanır.
  • Prepend Signature – Başa eklenen imzalar, toplu bir imzanın yapısıyla ilgili meta verileri tutabilmemiz için kullanılır.
  • Op Constraints/Conditions – Kısıtlamalar, çözüme geçildiğinde bulmaca tarafından döndürülür. İade edilen koşulların tümü karşılanırsa, bir işlem geçerli olur.
  • Wallet – İşlemlerle etkileşim kurmak için yazılmış yazılım. Chia, Hiyerarşik Belirleyici Cüzdanlar (HD Cüzdanlar) kullanır. Bu, tümü geçerli ve bu cüzdan için benzersiz olarak doğrulanabilir birçok farklı genel anahtar oluşturabilecekleri anlamına gelir. Bir cüzdan, o madeni paranın kilidini açmak ve onu harcayan bir işlem oluşturmak için gerekli bilgiye sahipse, bir madeni para içerir.
  • Puzzle Generator – Bir cüzdan, işlemleri nasıl almak istediğini tanımlamak için bir Bulmaca Oluşturucu kullanacaktır. Cüzdanların çoğu standart işlemi oluşturmak isteyecektir, ancak bir bulmaca oluşturan bir ChiaLisp programını depolayarak, bir Gönderen Cüzdanın tek yapması gereken, Alıcı Cüzdanına Program Oluşturucusunun ne olduğunu sormak ve ardından parayı kilitlemek için bulmacayı oluşturmak için bunu çalıştırmak ile yukarı.
  • Puzzle Generator ID – Bu, bir cüzdanın bulmaca oluşturucusunun karmasıdır. Bir cüzdan, bir karma arama yapabilir ve o bulmaca oluşturucunun kaynak kodunu zaten bilip bilmediğini görebilir. Değilse, tam kaynak kodunu isteyecek ve bu bilgiyi arama tablosunda saklayacaktır.
  • Smart Contract – Akıllı sözleşme, bir madeni parayı kilitleyen ve karmaşık blok zinciri etkileşimlerini mümkün kılan özel bir ChiaLisp bulmacasıdır.
  • Coloured Coins – Renkli Paralar, kullanıcılar tarafından oluşturulan özel bir chia parası türüdür. Renkli bir madeni para, sahte olmayan ve diğer varlıklara bağlanabilen benzersiz bir şekilde işaretlenmiş bir chia alt kümesidir.
  • Authorized Payees – Yetkili Alacaklar, Cüzdan A’nın Cüzdan B’ye biraz para verebileceği anlamına gelen akıllı bir sözleşmedir, ancak Cüzdan B’nin bu parayı yalnızca Cüzdan A’nın açıkça yetkilendirdiği şekillerde harcamasına izin verilir.
  • Decentralised ID – Merkezi olmayan bir kimlik, bir cüzdanın diğer kimliklere mesajlar oluşturabilen bir kimlik olarak hareket etmesini sağlayan akıllı bir sözleşmedir. 

Bir cevap yazın

*