Far(), Remotable ve Marshaling
Vats arasındaki bir işleminin detaylarına bakalım:
İhracat vatında, remotable sayaçlar oluşturmak için makeCounter
alacağız ve bunu ile işaretleyeceğiz:
<<< @/../snippets/test-distributed-programming.js#makeFarCounter
Kopyalama veya Varlık ile Marshaling
Bir işlemindeki ilk adımın metot adını ve argümanlarını marshaling etmek olduğunu unutmayın. , bir veri yapısını depolama veya iletim için uygun bir formata dönüştürmektir. paketi kullanır, ancak doğrudan JSON olarak ifade edilemeyen Javascript değerlerini de (örneğin, undefined
ve BigInt
gibi) yönetebilir.
<<< @/../snippets/test-marshal.js#marshal-json-steroids
Ayrıca, birçok veri türü vatlar arasında kopyalanırken, remotables marshaled edilirler, böylece unmarshaled olduklarında uzaktan varlıklar haline gelirler. Başka bir vat, dışa aktarılan sayaçları kullanabilir:
<<< @/../snippets/test-distributed-programming.js#useFarCounter
Geçiş Stilini Belirleme ve Harden
Uzaktan varlıklara yapılan çağrılar yalnızca geçirilebilir argümanlar içermeli ve geçirilebilir sonuçlar döndürmelidir. Geçirilebilir, marshaled edilebilen bir değerdir. Dört ana tür geçilebilir vardır:
- Kopya ile geçirilen ilkel değerler:
undefined
,null
, booleanstrue
vefalse
, sayılar, , dizeler ve ya ya da semboller. - Döngüsel olmayan kopya ile geçirilen kapsayıcılar, non-kapsayıcı geçilirlerle sona eren.
Böyle kapsayıcılar,
harden(['foo', 'bar'])
gibi CopyArrays,harden({ keys: [0, 1], values: ['foo', 'bar'] })
gibi CopyRecords ve CopySet, CopyBag ve CopyMap gibi türleri temsil eden CopyTaggeds içerir. - Referansla geçirilen "PassableCaps":
- Remotables: uzaktan sistemlerle paylaşılabilen nesneler, bu nesnelerin
örneğin
E()
eventual send notasyonu ile metodları çağırabilmesini sağlar. Remotables, ve ilgili fonksiyonlar ile oluşturulur. - Geçirilebilirler için Promises.
- Remotables: uzaktan sistemlerle paylaşılabilen nesneler, bu nesnelerin
örneğin
- Özel bir durum olarak, Hatalar, diğer geçilebilirleri içerebilen kopya ile geçirilen veriler olarak ele alınır.
Bir akıllı kontrattan dışa aktarılan her nesne, örneğin publicFacet
veya
creatorFacet
, geçirilebilir olmalıdır. Sözleşmenizde kullanılan tüm nesneler
geçirilebilir olmalıdır.
Tüm Geçirilebilirlerin hardened hale getirilmesi gerekir. Diyelim ki uzaktan bir item
ile
geçirilebilir bir kopya verisi göndermediğimizde ne olabileceğine bakalım:
let amount1 = { brand: brand1, value: 10n };
await E(item).setPrice(amount1); // Bir hata fırlatır, ama hayal edelim ki fırlatmadı.
amount1.value = 20n;
Artık amount1
hem yerel hem de uzaktan vatlarda mevcut olduğunu varsayıyoruz, ancak value
yerel vatda 20n
değerinde iken, uzaktan vatda 10n
değerindedir. (Daha da kötüsü: uzaktan vat
yerel vat ile aynı olabilir.) Kopya ile geçirilen verilerin harden()
çağrısını gerektirmesi,
vatlar arasında anlaşılır bir davranışa neden olur.
passStyleOf API
<<< @/../snippets/test-distributed-programming.js#import-pass-style
passStyleOf(passable)
bir PassStyle
dizesi döndürür ve passable
türünü kategorize eder.
passable
{Passable}
- Dönüş değeri:
{PassStyle}
PassStyle
değerleri, geçilebilirlerin farklı türleriyle ilişkilidir:
- Kopya ile geçirilen ilkel değerler:
"undefined"
,"null"
,"boolean"
,"number"
,"bigint"
,"string"
veya"symbol"
. - Kopya ile geçirilen kapsayıcılar:
"copyArray"
,"copyRecord"
veya"copyTagged"
. - Referansla geçirilen PassableCaps:
"remotable"
veya"promise"
. - Kopya ile geçirilen Hatalar:
"error"
.
Eğer passable
geçirilebilir değilse (örneğin, henüz hardened edilmemişse veya
karmaşık bir prototip zincirine sahipse), o zaman passStyleOf
bir hata fırlatacaktır.
::: tip Güvenilmeyen yapılandırılmış verileri işlerken passStyleOf
'u kontrol edin
Bir argümanın string veya sayı olduğunu kontrol etmek için typeof
kullanırmış gibi, bir copyRecord
bekliyorsanız passStyleOf
kullanın; bu, kötü niyetli istemcilerin döngüsel verilerle oyun oynamasını önler.
:::
Far() API
<<< @/../snippets/test-distributed-programming.js#importFar
Far(farName, objectWithMethods)
bir nesneyi Remotable olarak işaretler.
farName
{ String }
objectWithMethods
{ Object }
- Opsiyonel.- Dönüş değeri: Bir
Remotable
nesne.
farName
parametresi, Remotable
için hata ayıklama amacıyla bir arayüz adı verir. Bu sadece console
üzerinden, örneğin console.log
ile kaydedildiğinde görünür.
Opsiyonel objectWithMethods
parametresi, nesnenin işlevleri olarak görev yapan özelliklere sahip bir nesne olmalıdır.
Bu nesne zaten hardened veya donmuş olmamalıdır (ancak Far()
başarılı bir şekilde döndürmeden önce onu hardened edecektir).
Sağlanmazsa, yeni boş bir nesne kullanılacaktır.
Başarılı olmadan önce, Far()
fonksiyonu:
- Nesnenin her bir özellik değerinin fonksiyon olup olmadığını kontrol eder ve aksi takdirde bir hata fırlatır.
- Erişimciler (örneğin,
get()
veset()
) izin verilmez.
- Erişimciler (örneğin,
- Arayüz adını nesneye kaydeder.
- Nesneyi hardened eder.
::: tip Kazara dışa aktarımlardan kaçının Eğer bir nesne diğer vatlara asla açığa çıkarılmamalıysa, ona Far() kullanmamaya özen göstermelisiniz. Eğer bir nesne Remotable olarak işaretlenmemişse fakat kazara açığa çıkmışsa, bir hata fırlatılır. Bu, bu tür kazara açığa çıkmalardan kaynaklanan herhangi bir güvenlik açığını önler. :::