Parent hash'lerin nasıl korunduğunu daha iyi anlamak için, küçük bir grupta bunların nasıl evrildiğine ayrıntılı olarak bakalım. Aşağıdaki işlem dizisini ele alalım:
A yeni bir grup başlatır
A, tam bir Commit ile B'yi gruba ekler
B, tam bir Commit ile C ve D'yi ekler
C, boş bir Commit gönderir
Y Y'
| |
.-+-. .-+-.
==> ==> / \ ==> / \
X X' _=Z X' Z'
/ \ / \ / \ / \ / \
A A B A B C D A B C D
Şekil 30: Parent Hash'leri Göstermek İçin Dört Üyeli Bir Ağacın Kurulması
Daha sonra düğümlere ait parent hash'ler aşağıdaki gibi güncellenecektir (burada ph kısaltmasını parent hash için, th kısaltmasını tree hash için ve osth kısaltmasını original sibling tree hash için kullanıyoruz):
A, B'yi ekler: X'i belirler
- A.parent_hash = ph(X) = H(X, ph="", osth=th(B))
B, C ve D'yi ekler: B', X' ve Y' düğümlerini belirler
X'.parent_hash = ph(Y) = H(Y, ph="", osth=th(Z)); burada th(Z), (C, _, D) öğelerini kapsar
B'.parent_hash = ph(X') = H(X', ph=X'.parent_hash, osth=th(A))
C, boş bir Commit gönderir: C', Z' ve Y' düğümlerini belirler
Z'.parent_hash = ph(Y') = H(Y', ph="", osth=th(X')); burada th(X'), (A, X', B') öğelerini kapsar
C'.parent_hash = ph(Z') = H(Z', ph=Z'.parent_hash, osth=th(D))
Yeni bir üye gruba katıldığında, aşağıdaki parent hash değerlerine sahip bir ağaç alacak ve belirtilen parent hash geçerlilik ilişkilerini hesaplayacaktır:
| Düğüm | Parent Hash Değeri | Geçerli mi? |
|---|---|---|
| A | H(X, ph="", osth=th(B)) | Hayır, B değişti |
| B' | H(X', ph=X'.parent_hash, osth=th(A)) | Evet |
| C' | H(Z', ph=Z'.parent_hash, osth=th(D)) | Evet |
| D | (yok, hiçbir zaman UpdatePath göndermedi) | Uygulanamaz |
| X' | H(Y, ph="", osth=th(Z)) | Hayır, Y ve Z değişti |
| Z' | H(Y', ph="", osth=th(X')) | Evet |
Tablo 15
Başka bir deyişle, yeni katılan üye ağaçta aşağıdaki path-hash bağlantılarını görecektir:
Y'
|
+-.
\
X' Z'
\ /
A B' C' D
Şekil 31: Parent-hash bağlantıları, boş olmayan tüm ebeveyn
düğümlerini yapraklara bağlar
Bu zincirler birlikte ağaçtaki boş olmayan tüm ebeveyn düğümlerini kapsadığından, ağaç parent-hash açısından geçerlidir.
Bu ağacın geçerli olmakla birlikte geçersiz parent-hash bağlantıları içerdiğine dikkat edin. Örneğin bir istemci parent hash'leri Y' üzerinden yukarıdan aşağıya doğru denetleseydi, X' düğümünün Y'ye göre geçersiz bir parent hash'e sahip olduğunu, buna karşılık Z' düğümünün geçerli bir parent hash'e sahip olduğunu görürdü. Benzer şekilde, istemci aşağıdan yukarıya doğru denetim yapsaydı, B' zincirinin X' ile Y' arasındaki geçersiz bir bağlantıyla sonlandığını görürdü. Bu geçersiz bağlantılar, birden fazla istemcinin Commit göndermesinin doğal sonucudur.
Ayrıca tree hash ile parent hash'in nasıl etkileştiğine de dikkat edin. C' düğümünün parent hash'i, D düğümünün tree hash'ini içerir. Z' düğümünün parent hash'i ise A ve B' düğümlerini kapsayan X' düğümünün tree hash'ini içerir; buna B' düğümünün parent hash'i de dahildir. Tree hash ile parent hash birbirine bağlı olsa da, bu bağımlılık ilişkileri döngüsel bir bağımlılık oluşmayacak şekilde yapılandırılmıştır.
Yeni bir üyenin gruba ait ağacı ilk kez aldığı özel durumda (örneğin, Bölüm 12.4.3.3'teki bir ratchet tree GroupInfo uzantısında), parent hash'ler ağaç gösteriminde ifade edilir; ancak tree hash'in bu gösterimde yer alması gerekmez. Bunun yerine yeni üye, ağaçtaki tüm düğümler için tree hash değerlerini yeniden hesaplayacak ve bunun GroupInfo nesnesindeki tree hash ile eşleştiğini doğrulayacaktır. Ağaç geçerliyse, bu şekilde hesaplanan alt ağaç hash'leri, parent hash doğrulaması için gereken girdilerle uyumlu olacaktır; yalnızca birleştirilmemiş yaprakları hesaba katmak için yeniden hesaplama yapılması gereken durumlar bunun dışındadır.