Ana içeriğe geç

Durum Akıllı Sözleşmesi

İlk hello-world akıllı sözleşmemizde, uzak çağrılmaya imkân tanımak için bir greet fonksiyonu oluşturduk ve bunu publicFacet aracılığıyla açık hale getirdik. Ancak, dikkat ederseniz, akıllı sözleşmemizde çağrılar arasında korunmuş bir durum bulunmamaktadır. Sözleşmeler, durum için sıradan değişkenler ve veri yapıları kullanabilir.

İkinci örnek akıllı sözleşmemizde, bir oda listesini yöneteceğiz. publicFacet erişimine sahip olan herkesin yeni bir oda oluşturabilmesini ve mevcut oda sayısını alabilmesini istiyoruz. Durumu, aşağıdaki gibi bir Map veri yapısı kullanarak koruyoruz:

<<< @/../snippets/zoe/src/02-state.js#rooms-map

Yeni odalar eklemek için herkes, aşağıda tanımlanan makeRoom fonksiyonuna bir çağrı yapabilir:

<<< @/../snippets/zoe/src/02-state.js#makeRoom

makeRoom kullanarak yeni bir oda oluşturulur ve bu yeni eklenen oda üzerinde getId, incr ve decr adındaki fonksiyonların çağrılmasına izin verilir. Gördüğünüz gibi, bu model Nesne Yeterlilik Modelini izlemektedir; çünkü makeRoom çağrısını yapan kişi, artık bu üç metoda erişime sahip olacaktır. Sonrasında, rooms.set(id, room) ifadesi yeni oluşturulan odayı sözleşmenin harita durum değişkenine ekler. getRoomCount fonksiyonuna yapılan bir çağrı, bu haritada bulunan oda sayısını döndürür.

<<< @/../snippets/zoe/src/02-state.js#getRoomCount

Her şeyi bir araya getirirsek:

<<< @/../snippets/zoe/src/02-state.js#state-contract

Bu sözleşmeyi 02-state.js olarak kaydedelim ve işlevselliğini doğrulamak için basit bir test oluşturalım:

<<< @/../snippets/zoe/contracts/test-zoe-hello.js#test-state

Bu test, başta oda sayısının sıfır olduğunu ve makeRoom çağrısından sonra oda sayısının bir değiştiğini doğrular. Eğer sorun yaşıyorsanız, örnek depo içerisindeki dalına göz atmayı unutmayın.

::: tip Yığın durumu kalıcıdır

Sıradan yığın durumu, sözleşme çağrıları arasında kalıcılık gösterir.

Büyük sayıda nesne (sanak nesneleri) ve yükseltmeler arasında kalan nesneler () için daha açık durum yönetimini daha sonra tartışacağız.

:::