Ƒ-03: Îđéñţîţý
Šüḿḿàŕý
Ţĥé ƒŕàḿéŵöŕķ ĥàš ţĥŕéé îđéñţîţý þŕîḿîţîṽéš, éàçĥ àñšŵéŕîñĝ à đéŕéñţ ǫüéšţîöñ.
Éñţîţý ÎĐš (core/id) àŕé 8-çĥàŕàçţéŕ ƃàšé62 šţŕîñĝš ƒŕöḿ crypto/rand
(šĥöŕţ, ÜŔĻ-šàƒé, đéþéñđéñçý-ƒŕéé), üšéđ ŵĥéŕéṽéŕ šöḿéţĥîñĝ ñééđš àñ àļļöçàţéđ,
öþàǫüé ĥàñđļé. Ƃļöçķ îđéñţîţý (core/model.BlockIdentity) îš à þàîŕ öƒ
çöñţéñţ-àđđŕéššàƃļé ĥàšĥéš ţĥàţ àñšŵéŕ "îš ţĥîš ţĥé šàḿé çöñţéñţ?". Ŕéçöñçîļéđ
îđéñţîţý (core/reconcile) àñšŵéŕš ţĥé ĥàŕđéŕ ǫüéšţîöñ, "îš ţĥîš ţĥé šàḿé
üñîţ àš ļàšţ ţîḿé?", ƃý ĝŕàđîñĝ ţĥé ţŵö ĥàšĥéš àĝàîñšţ ţĥé þŕéṽîöüš ŕéàđ
ŕàţĥéŕ ţĥàñ ƃý þîçķîñĝ à ñàḿîñĝ šçĥéḿé. Ţĥé ƃļöçķ-àđđŕéššéđ šţöŕé
(core/blockstore) ķéýš öñ à đéŕîṽéđ ṽàļüé ţĥàţ ñàḿéšþàçéš ţĥé ƃļöçķ ƃý îţš
šöüŕçé ƒîļé, šö ƃļöçķš ƒŕöḿ đéŕéñţ ƒîļéš ñéṽéŕ çöļļîđé.
Çöñţéẋţ
ÎĐš àþþéàŕ éṽéŕýŵĥéŕé: çöḿḿàñđ öüţþüţ, ļöĝ ļîñéš, ÀÞÎ ŕéšþöñšéš, îñţéŕñàļ ŕéƒéŕéñçéš. ÜÜÎĐ ṽ4 îš ĝļöƃàļļý üñîǫüé àñđ çöļļîšîöñ-þŕööƒ, ƃüţ 36 çĥàŕàçţéŕš îñ çàñöñîçàļ ƒöŕḿ àŕé éẋçéššîṽé ŵĥéŕé ÎĐš àþþéàŕ îñ þàţĥš àñđ ţéŕḿîñàļ öüţþüţ, àñđ ĥýþĥéñš ḿàķé ţĥéḿ àŵķŵàŕđ ţö ŕéàđ ƃàçķ.
À šéçöñđ þŕöƃļéḿ îš šþéçîƒîç ţö çöñţéñţ. Ţĥé ƒŕàḿéŵöŕķ þŕöçéššéš ţĥé šàḿé çöñţéñţ
ƒŕöḿ ḿàñý šöüŕçéš, šö àñ îđéñţîƒîéŕ đéŕîṽéđ ƒŕöḿ ţĥé çöñţéñţ îţšéļƒ, ŕàţĥéŕ ţĥàñ
àñ àļļöçàţéđ ñüḿƃéŕ, ļéţš îđéñţîçàļ ƃļöçķš đéđüþļîçàţé àñđ ļéţš éđîţš ƃé đéţéçţéđ
ƃý ĥàšĥ çöḿþàŕîšöñ. Ƃüţ ƒöŕḿàţ ŕéàđéŕš àļšö àššîĝñ ţĥéîŕ öŵñ ÎĐš ƒŕöḿ ţĥé šöüŕçé
ƒöŕḿàţ (ẊĻÎƑƑ tu1, tu2, àñđ šö öñ), àñđ ţĥöšé àŕé üñîǫüé öñļý ŵîţĥîñ öñé ƒîļé.
À ţĥîŕđ þŕöƃļéḿ öñļý àþþéàŕš öñçé à þŕöĵéçţ îš îţéŕàţîṽé. À đéçîšîöñ, à ţŕàñšļàţîöñ, àñđ à çöñţéñţ-ḿéḿöŕý éñţŕý àŕé àļļ ŕéçöŕđéđ àĝàîñšţ à üñîţ, àñđ ţĥé šöüŕçé ƒîļé îš ŕé-ŕéàđ àƒţéŕ éṽéŕý éđîţ. Šöḿéţĥîñĝ ĥàš ţö šàý ŵĥîçĥ üñîţ îñ ţĥé ñéŵ ŕéàđ îš ŵĥîçĥ üñîţ ƒŕöḿ ţĥé öļđ öñé, àñđ ñéîţĥéŕ ĥàšĥ çàñ àñšŵéŕ ţĥàţ àļöñé.
Đéçîšîöñ
Šĥöŕţ ƃàšé62 ÎĐš
Àļļ éñţîţý ÎĐš çöḿé ƒŕöḿ core/id.New():
const base62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
// rejectThreshold is the largest byte value that divides evenly into the
// alphabet, so each symbol is equally likely: 256 - (256 % 62) = 248.
const rejectThreshold = 256 - (256 % len(base62))
func New() string {
out := make([]byte, 8)
var buf [1]byte
for i := range out {
for {
if _, err := rand.Read(buf[:]); err != nil {
panic("crypto/rand failed: " + err.Error())
}
if int(buf[0]) < rejectThreshold {
out[i] = base62[int(buf[0])%len(base62)]
break
}
}
}
return string(out)
}
Þŕöþéŕţîéš:
- 8 çĥàŕàçţéŕš, ƃàšé62 àļþĥàƃéţ, ŕöüĝĥļý 47.6 ƃîţš öƒ éñţŕöþý þéŕ ÎĐ: éñöüĝĥ ƒöŕ ḿîļļîöñš öƒ éñţîţîéš þéŕ šçöþé ƃéƒöŕé çöļļîšîöñ ƃéçöḿéš à çöñçéŕñ.
crypto/randƒöŕ çŕýþţöĝŕàþĥîç ŕàñđöḿñéšš, ŵîţĥ ŕéĵéçţîöñ šàḿþļîñĝ ŕàţĥéŕ ţĥàñ à ƃàŕé ḿöđüļö, šö ñö šýḿƃöļ îš ḿöŕé ļîķéļý ţĥàñ àñöţĥéŕ. À ḿöđüļö öṽéŕ 256 ŵöüļđ ƒàṽöüŕ ţĥé ƒîŕšţ éîĝĥţ çĥàŕàçţéŕš öƒ ţĥé àļþĥàƃéţ.- Žéŕö éẋţéŕñàļ đéþéñđéñçîéš. Ţĥé îḿþļéḿéñţàţîöñ đöéš ñöţ ĵüšţîƒý îḿþöŕţîñĝ à ÜÜÎĐ öŕ ñàñöîđ ļîƃŕàŕý.
- ÜŔĻ-šàƒé. Ñö šþéçîàļ çĥàŕàçţéŕš, ñö þéŕçéñţ-éñçöđîñĝ.
Ƒàîļîñĝ ţö ŕéàđ crypto/rand þàñîçš ŕàţĥéŕ ţĥàñ đéĝŕàđîñĝ. À ŕéàđ ƒàîļüŕé ḿéàñš
àñ ÖŠ-ļéṽéļ þŕöƃļéḿ, àñđ çöñţîñüîñĝ ŵîţĥ ŵéàķ ŕàñđöḿñéšš ŵöüļđ šîļéñţļý þŕöđüçé
þŕéđîçţàƃļé ÎĐš, ŵĥîçĥ îš ŵöŕšé ţĥàñ çŕàšĥîñĝ. Ţĥîš ḿàţçĥéš ţĥé šţàñđàŕđ ļîƃŕàŕý'š öŵñ
çöñṽéñţîöñ.
Çöñţéñţ-àđđŕéššàƃļé ƃļöçķ îđéñţîţý
Ƃļöçķš çàŕŕý ñö àļļöçàţéđ éñţîţý ÎĐ àţ ţĥé ƒŕàḿéŵöŕķ ļéṽéļ. BlockIdentity
đéŕîṽéš îđéñţîţý ƒŕöḿ ţĥé ƃļöçķ îţšéļƒ:
type BlockIdentity struct {
ContentHash string // SHA-256 of the normalized source text
ContextHash string // SHA-256 of name, type, and identifying properties
}
func ComputeIdentity(b *Block) *BlockIdentity
ComputeContentHash ñöŕḿàļîžéš ƃý ţŕîḿḿîñĝ ļéàđîñĝ àñđ ţŕàîļîñĝ ŵĥîţéšþàçé àñđ
ñöţĥîñĝ éļšé: çàšé àñđ îñţéŕîöŕ šþàçîñĝ àŕé çöñţéñţ-šîĝñîƒîçàñţ. Îđéñţîçàļ
šţŕîñĝš ţĥéŕéƒöŕé çöļļàþšé ţö öñé îđéñţîţý àñđ đéđüþļîçàţé àçŕöšš šöüŕçéš. Ţĥàţ
ñöŕḿàļîžàţîöñ îš þàŕţ öƒ à ŵîŕé çöñţŕàçţ: çĥàñĝîñĝ îţ (àđđîñĝ çàšé ƒöļđîñĝ, šàý,
öŕ Üñîçöđé ñöŕḿàļîžàţîöñ) àļţéŕš éṽéŕý éḿîţţéđ ĥàšĥ, šö à ĝöļđéñ-ĥàšĥ ţéšţ þîñš
ţĥé éẋàçţ öüţþüţ ƒöŕ à ķñöŵñ îñþüţ.
ComputeContextHash ƒöļđš îñ ţĥé ƃļöçķ'š ñàḿé, ţýþé, àñđ đéţéŕḿîñîšţîçàļļý-šöŕţéđ
þŕöþéŕţîéš, šö à šţŕüçţüŕàļ çĥàñĝé îš đéţéçţàƃļé àš à çöñţéẋţ-ĥàšĥ çĥàñĝé éṽéñ
ŵĥéñ ţĥé šöüŕçé ţéẋţ îš üñţöüçĥéđ. Þŕöþéŕţîéš ŵĥöšé ķéý ƃéĝîñš ŵîţĥ @ àŕé
àđṽîšöŕý àñđ éẋçļüđéđ: ţĥéý àŕé đéŕîṽéđ ļöçàţöŕš (à ļîñé ñüḿƃéŕ, à ƃýţé
öƒƒšéţ), àñđ à ļöçàţöŕ ḿöṽéš ŵĥéñéṽéŕ àñýţĥîñĝ àƃöṽé îţ ḿöṽéš, šö ĥàšĥîñĝ öñé
ŵöüļđ ŕéþöŕţ àñ üñţöüçĥéđ ƃļöçķ àš çĥàñĝéđ éṽéŕý ţîḿé à ƃļàñķ ļîñé ŵàš àđđéđ
éàŕļîéŕ îñ ţĥé ƒîļé.
Ţĥé ŕéçöŕđ ĥàšĥ: ŵĥàţ à ţŕàñšƒéŕ çöḿþàŕéš
À ţĥîŕđ ṽàļüé îš đéŕîṽéđ ƒŕöḿ ţĥé þàîŕ ŕàţĥéŕ ţĥàñ šţöŕéđ ƃéšîđé îţ.
BlockIdentity.RecordHash ƒöļđš ƃöţĥ ĥàļṽéš, àñđ îţ îš ŵĥàţ đéçîđéš ţŕàñšƒéŕ:
ŵĥéţĥéŕ à ƒàŕ šîđé àļŕéàđý ĥöļđš ŵĥàţ à ƃļöçķ çüŕŕéñţļý îš.
Ñéîţĥéŕ ĥàļƒ çàñ đéçîđé ţĥàţ àļöñé. Ţĥé çöñţéñţ ĥàšĥ ḿüšţ ñöţ ḿöṽé ƒöŕ à ŕéàšöñ öţĥéŕ ţĥàñ ţĥé ţéẋţ ḿöṽîñĝ: îţ îš ţĥé îđéñţîţý à đéçîšîöñ, à ḿéḿöŕý éñţŕý àñđ à šţöŕé ķéý àŕé àļļ ƒîļéđ üñđéŕ. Ƃüţ à ƃļöçķ îš þéŕšîšţéđ ŵîţĥ ḿöŕé ţĥàñ îţš ţéẋţ: îţš ñàḿé, îţš ţýþé, àñđ ţĥé þŕöþéŕţîéš à ŕéàđéŕ ŕéçöŕđéđ àƃöüţ îţ. À ŕéàđéŕ ţĥàţ šţàŕţš ŕéçöŕđîñĝ šöḿéţĥîñĝ ñéŵ ļéàṽéš ţĥé ţéẋţ üñţöüçĥéđ, šö à çöḿþàŕîšöñ ḿàđé öñ ţĥé çöñţéñţ ĥàšĥ ŕéþöŕţš ţĥé ƃļöçķ üñçĥàñĝéđ àñđ ţĥé ñéŵ ƒîéļđ ñéṽéŕ àŕŕîṽéš. Ñöţ öñ ţĥé ñéẋţ ţŕàñšƒéŕ: ñéṽéŕ, ƃéçàüšé ţĥé ţéẋţ îš ţĥé šàḿé ƒöŕéṽéŕ.
Ƒöļđîñĝ ţĥé çöñţéẋţ ĥàļƒ îñ îš ŵĥàţ ḿàķéš àñ öŕđîñàŕý ţŕàñšƒéŕ đéļîṽéŕ îţ, þéŕ ƃļöçķ, ŵîţĥ ñöţĥîñĝ đéçļàŕéđ àñđ ñö ṽéŕšîöñ ƃüḿþéđ. Ţĥé çöšţ ţĥàţ ŵöüļđ öţĥéŕŵîšé ḿàķé ţĥîš üñàƒƒöŕđàƃļé (à ļöçàţöŕ šĥîƒţîñĝ àñđ ŕé-šéñđîñĝ à ƒîļé'š ŵĥöļé ţàîļ) îš àļŕéàđý þàîđ ƒöŕ ƃý ţĥé àđṽîšöŕý þŕéƒîẋ àƃöṽé, ŵĥîçĥ ķééþš đéŕîṽéđ ļöçàţöŕš öüţ öƒ ţĥé çöñţéẋţ ĥàšĥ îñ ţĥé ƒîŕšţ þļàçé.
Ţĥé çöñšéǫüéñçé ƒöŕ ŕéàđéŕš: à ƒîéļđ ţĥîš ĥàšĥ çàññöţ šéé îš à ƒîéļđ ţĥàţ ñéṽéŕ ŕéàçĥéš çöñţéñţ àļŕéàđý šţöŕéđ éļšéŵĥéŕé. Àñýţĥîñĝ à ƃļöçķ îš þéŕšîšţéđ ŵîţĥ ƃéļöñĝš îñ öñé ĥàļƒ öŕ ţĥé öţĥéŕ, àñđ àñýţĥîñĝ çöḿþüţéđ ŕàţĥéŕ ţĥàñ ŕéàđ ƃéļöñĝš ƃéĥîñđ ţĥé àđṽîšöŕý þŕéƒîẋ.
Ţŵö þŕöđüçéŕš, ţŵö ṽîñţàĝéš
Đéļîṽéŕîñĝ à ƒîéļđ ţö çöñţéñţ àļŕéàđý šţöŕéđ ŕàîšéš ţĥé ḿîŕŕöŕ ǫüéšţîöñ: ŵĥàţ šţöþš àñ öļđéŕ þŕöđüçéŕ ƒŕöḿ ţàķîñĝ îţ àŵàý àĝàîñ? À ƒļééţ îš ñöţ öñé ṽéŕšîöñ: à ÇÎ ŕüññéŕ þîññéđ ţö àñ öļđéŕ ŕéļéàšé, öŕ à ļàþţöþ ţĥàţ ĥàš ñöţ üþĝŕàđéđ, ŕéàđš ţĥé šàḿé ƒîļéš ŵîţĥ à ŕéàđéŕ ţĥàţ ŕéçöŕđš ļéšš.
Ţŵö ḿéçĥàñîšḿš àñšŵéŕ îţ, àñđ ţĥéý đîṽîđé ƃý ŵĥàţ çàñ ƃé ḿéŕĝéđ.
Ƒîéļđš àŕé đéçļàŕéđ, àñđ šîļéñçé îš ñöţ đéļéţîöñ. À þüšĥ đéçļàŕéš ţĥé þŕöþéŕţý ķéýš îţš ŕéàđéŕš éḿîţ, çöḿþüţéđ öṽéŕ éṽéŕý ƃļöçķ îţ ŕéàđ ŕàţĥéŕ ţĥàñ ţĥé öñéš îţ šéñţ. Ţĥé ƒàŕ šîđé îš àüţĥöŕîţàţîṽé àƃöüţ ţĥöšé ķéýš àñđ ļéàṽéš ţĥé ŕéšţ öƒ à šţöŕéđ ƃļöçķ'š þŕöþéŕţîéš àļöñé, šö à ñöţé đéļéţéđ îñ ţĥé šöüŕçé îš đéļéţéđ ĥéŕé, ŵĥîļé à ķéý ţĥîš þŕöđüçéŕ ĥàš ñéṽéŕ ĥéàŕđ öƒ šüŕṽîṽéš. À þŕöđüçéŕ ţĥàţ đéçļàŕéš ñöţĥîñĝ ķñöŵš ñöţĥîñĝ: îţ àđđš àñđ üþđàţéš, àñđ ŕéḿöṽéš ñöţĥîñĝ. Ñö ṽéŕšîöñ îš îñṽöļṽéđ: à ŕéàđéŕ ţĥàţ ļéàŕñš ţö ŕéçöŕđ šöḿéţĥîñĝ ñéŵ ñééđš ñö çööŕđîñàţîöñ àţ àļļ.
Šţŕüçţüŕé îš ṽéŕšîöñéđ, àñđ à đöŵñĝŕàđé îš ŕéƒüšéđ. Šéĝḿéñţàţîöñ, ţĥé ŕüñ
ḿöđéļ, öṽéŕļàýš, ĥöŵ ƃļöçķš àŕé ñàḿéđ: ţĥéŕé îš ñö ḿéŕĝîñĝ ĥàļƒ öƒ öñé. Šö ţĥé
ƒŕàḿéŵöŕķ šţàţéš à çöñţéñţ-ḿöđéļ éþöçĥ, ţĥé šţŕéàḿ ŕéçöŕđš ţĥé ĥîĝĥéšţ îţ ĥàš
ŕéçéîṽéđ, àñđ à þüšĥ ƒŕöḿ à ļöŵéŕ öñé îš ŕéƒüšéđ àţ îñîţ, ƃéƒöŕé îţ üþļöàđš
àñýţĥîñĝ, ŕàţĥéŕ ţĥàñ àþþļîéđ. kapi push --force çàŕŕîéš þàšţ îţ, ƃéçàüšé à
đéļîƃéŕàţé đöŵñĝŕàđé îš à ļéĝîţîḿàţé ţĥîñĝ ţö ŵàñţ àñđ àñ àççîđéñţàļ öñé îš ñöţ.
Ţĥé éþöçĥ ḿöṽéš öñļý ŵĥéñ þŕöđüçéđ çöñţéñţ ĝàîñš ƒîđéļîţý àñ öļđéŕ kapi çàññöţ
ŕéþŕöđüçé ƒŕöḿ ţĥé šàḿé ƒîļé; à ñéŵ ƃļöçķ þŕöþéŕţý îš ñéṽéŕ à ŕéàšöñ ţö ḿöṽé îţ.
Îđéñţîţý àçŕöšš ŕéṽîšîöñš
Ţĥé ţŵö ĥàšĥéš àñšŵéŕ "îš ţĥîš ţĥé šàḿé çöñţéñţ?" àţ à þöîñţ îñ ţîḿé. Àñ îţéŕàţîṽé þŕöĵéçţ ñééđš ţĥé šéçöñđ àñšŵéŕ, àñđ ñéîţĥéŕ ĥàšĥ çàñ ĝîṽé îţ àļöñé, ñöŕ çàñ à ñàḿé:
- Þöšîţîöñ. À ŕéàđéŕ ŵîţĥöüţ à ñàţüŕàļ ķéý ñüḿƃéŕš ƃļöçķš àš îţ ĝöéš
(
para3,line5,tu2). Đéļéţé àñ éàŕļîéŕ ƃļöçķ àñđ éṽéŕýţĥîñĝ ƃéļöŵ îš ŕéñàḿéđ, šö à đéçîšîöñ ŕéçöŕđéđ àƃöüţ öñé þàŕàĝŕàþĥ šîļéñţļý ñàḿéš àñöţĥéŕ. - Çöñţéñţ. Đéŕîṽîñĝ ţĥé ñàḿé ƒŕöḿ ţĥé ţéẋţ ƃŕéàķš ţĥé öþþöšîţé çàšé: ƒîẋîñĝ à ţýþö ŕéñàḿéš ţĥé ƃļöçķ, šö îţ ŕéàđš àš à đéļéţîöñ þļüš àñ àđđîţîöñ àñđ ļöšéš ţĥé ĥîšţöŕý îţ šĥöüļđ ĥàṽé ķéþţ. Îţ àļšö çöļļàþšéš ţĥé çöñţéẋţ ĥàšĥ îñţö à ŕéšţàţéḿéñţ öƒ ţĥé çöñţéñţ ĥàšĥ, đéšţŕöýîñĝ ţĥé îñđéþéñđéñçé ţĥé þàîŕ éẋîšţš ţö þŕöṽîđé.
Çĥööšîñĝ ƃéţŵééñ ţĥéḿ öñļý çĥööšéš ŵĥîçĥ ŵàý îđéñţîţý ƃŕéàķš. Šö îđéñţîţý îš ñöţ à
ñàḿîñĝ šçĥéḿé. Îţ îš ţĥé öüţþüţ öƒ ḿàţçĥîñĝ à ŕéàđ àĝàîñšţ ţĥé þŕéṽîöüš öñé,
ţĥé ŵàý ŕéñàḿé đéţéçţîöñ ŵöŕķš öñ ƒîļéš: core/reconcile ķééþš ƃöţĥ šîĝñàļš àñđ
ĝŕàđéš ţĥé þàîŕ.
| çöñţéñţ | çöñţéẋţ | ḿéàñîñĝ | çàŕŕîéš öṽéŕ |
|---|---|---|---|
| ḿàţçĥ | ḿàţçĥ | üñţöüçĥéđ | éṽéŕýţĥîñĝ |
| ḿàţçĥ | đéŕ | ḿöṽéđ, öŕ ţĥé šàḿé ţéẋţ ŕéüšéđ éļšéŵĥéŕé | îđéñţîţý àñđ ĥîšţöŕý |
| đéŕ | ḿàţçĥ | éđîţéđ îñ þļàçé | îđéñţîţý àñđ ĥîšţöŕý; ţĥé ţàŕĝéţ îš šţàļé |
| đéŕ | đéŕ | ĝéñüîñéļý ñéŵ | ñöţĥîñĝ |
Ţĥé ţĥîŕđ ŕöŵ îš ţĥé öñé ñö šîñĝļé ķéý çàñ éẋþŕéšš, àñđ ţĥé ŕéàšöñ ţĥé þàçķàĝé éẋîšţš. Ţĥé ƒöüŕţĥ çàŕŕîéš ñöţĥîñĝ öṽéŕ: ŵĥéñ ƃöţĥ šîĝñàļš çĥàñĝé, ñöţĥîñĝ ļîñķš ţĥé ƃļöçķ ţö îţš þŕéđéçéššöŕ, àñđ à ĝüéšš ŵöüļđ àţţàçĥ à ŕéàļ đéçîšîöñ ţö ţĥé ŵŕöñĝ ŵöŕđš.
reconcile.Blocks(scope, current, prior) ŕüñš ƒöüŕ þàššéš (ƃöţĥ ĥàšĥéš, ţĥéñ
çöñţéñţ ŵîţĥîñ ţĥé ƃļöçķ'š öŵñ đöçüḿéñţ, ţĥéñ çöñţéñţ àñýŵĥéŕé îñ ţĥé þŕöĵéçţ,
ţĥéñ çöñţéẋţ àļöñé), àñđ éàçĥ þàšš çöñšüḿéš ţĥé þŕîöŕš îţ çļàîḿš, šö à þŕîöŕ üñîţ
îš çļàîḿéđ àţ ḿöšţ öñçé. Ţŵö ƃļöçķš çàñ ñéṽéŕ ŕéšöļṽé ţö öñé ķéý, ŵĥîçĥ îš ŵĥàţ
šţöþš àþþŕöṽîñĝ öñé ƒŕöḿ àþþŕöṽîñĝ àñöţĥéŕ. Çàļļéŕš ḿàý þàšš ţĥé ŵĥöļé þŕöĵéçţ'š
þŕîöŕ üñîţš ŵĥîļé ŕéçöñçîļîñĝ öñé đöçüḿéñţ àţ à ţîḿé, ŵĥîçĥ îš ŵĥàţ ļéţš çöñţéñţ
ḿöṽéđ ƃéţŵééñ ƒîļéš ķééþ îţš îđéñţîţý, àñđ ļéţš à ŕéḿöṽéđ ƃļöçķ ŕéţüŕñ ţö îţš öŵñ
ĥîšţöŕý ļàţéŕ.
À ƃļöçķ'š öŵñ đöçüḿéñţ îš šéàŕçĥéđ ƃéƒöŕé ţĥé ŕéšţ öƒ ţĥé þŕöĵéçţ. Šĥöŕţ šţŕîñĝš ŕéþéàţ àçŕöšš à þŕöĵéçţ, àñđ à çĥàñĝé ţö ţĥé çöñţéẋţ šîĝñàļ ƒàîļš ţĥé éẋàçţ ḿàţçĥ ƒöŕ àļļ öƒ ţĥéḿ àţ öñçé. Šéàŕçĥéđ þŕöĵéçţ-ŵîđé ƒîŕšţ, éàçĥ ƃļöçķ ŵöüļđ ţàķé ţĥé ƒîŕšţ üñçļàîḿéđ üñîţ ŵîţĥ îţš ŵöŕđš, öƒţéñ öñé ƒŕöḿ àñöţĥéŕ đöçüḿéñţ, àñđ ţĥé ţŕàñšļàţîöñ àñđ ŕéṽîéŵ àţţàçĥéđ ţö ţĥàţ üñîţ ŵöüļđ ḿöṽé ţö à đéŕéñţ ƒîļé. Šéàŕçĥéđ îñ îţš öŵñ đöçüḿéñţ ƒîŕšţ, à ƃļöçķ ķééþš îţš öŵñ üñîţ, àñđ ŕéþéàţéđ ţéẋţ îñšîđé öñé đöçüḿéñţ ķééþš îţš üñîţš îñ đöçüḿéñţ öŕđéŕ, ŵĥîçĥ îš ţĥé öŕđéŕ à ṽéñüé šéŕṽéš þŕîöŕš îñ.
Çöñţéñţ îš ĝŕàđéđ ƃéƒöŕé çöñţéẋţ, àñđ ţĥàţ šéţţļéš ţĥé àḿƃîĝüöüš çàšé. Đéļéţé à þàŕàĝŕàþĥ àñđ ţĥé öñé ƃéļöŵ šļîđéš îñţö ţĥé ṽàçàţéđ šļöţ: îţš ŵöŕđš ḿàţçĥ ţĥé öļđ ļöŵéŕ ƃļöçķ, îţš þöšîţîöñ ḿàţçĥéš ţĥé đéļéţéđ öñé. Çöñţéñţ-ƒîŕšţ ŕéàđš ţĥàţ àš à ḿöṽé, ŵĥîçĥ îš ŵĥàţ ĥàþþéñéđ; çöñţéẋţ-ƒîŕšţ ŵöüļđ çàļļ îţ à ŕéŵŕîţé àñđ ţĥéñ ĥàñđ ţĥé ñéîĝĥƃöüŕ'š ĥîšţöŕý ţö ŵĥàţéṽéŕ àŕŕîṽéđ ñéẋţ. Àñ éđîţ îñ þļàçé ļöšéš ñöţĥîñĝ ţö ţĥîš öŕđéŕîñĝ: îţš ŵöŕđš ĥàṽé çĥàñĝéđ, šö îţ ĥàš ñö çöñţéñţ ḿàţçĥ ţö ļöšé, àñđ ţĥé çöñţéẋţ þàšš šţîļļ çļàîḿš îţ.
Ŵĥàţéṽéŕ ñöţĥîñĝ çļàîḿš îš ḿîñţéđ ƒŕöḿ ƃöţĥ ĥàšĥéš, šö à þŕöĵéçţ ŵîţĥ ñö ĥîšţöŕý ŕéçöñçîļéš ţö ţĥé šàḿé ķéýš öñ à šéçöñđ ŕüñ.
Šçöþé, àñđ ŵĥý đöçüḿéñţš ĥàṽé îđéñţîţý ţöö
À ƃļöçķ'š ñàḿé îš üñîǫüé öñļý îñšîđé îţš öŵñ ƒîļé: éṽéŕý Ḿàŕķđöŵñ đöçüḿéñţ ĥàš à
para1. Ḿàţçĥîñĝ öñ çöñţéẋţ àļöñé àçŕöšš à þŕöĵéçţ ŵöüļđ ļéţ à þàŕàĝŕàþĥ îñ öñé
ƒîļé çļàîḿ ţĥé ĥîšţöŕý öƒ àñ üñŕéļàţéđ þàŕàĝŕàþĥ îñ àñöţĥéŕ, ŵĥîçĥ îñ à þŕöĵéçţ öƒ
à ƒéŵ ĥüñđŕéđ đöçüḿéñţš îš ţĥé çöḿḿöñ çàšé ŕàţĥéŕ ţĥàñ àñ éđĝé çàšé. Šö ţĥé çöñţéẋţ
ḿàţçĥ îš šçöþéđ ţö ţĥé đöçüḿéñţ: reconcile.Identify(scope, block) ŕéçöŕđš ţĥé
šçöþé ƃéšîđé ţĥé ƃļöçķ'š öŵñ ţŵö ĥàšĥéš, üñçĥàñĝéđ ƒŕöḿ model.ComputeIdentity,
àñđ ţĥé þööļ ķéýš îţš çöñţéẋţ ļööķüþ öñ ţĥé þàîŕ (šçöþé, çöñţéẋţ ĥàšĥ). Ţĥé
ĥàšĥéš šţàý ţĥé öñéš ţĥé šýñç ŵîŕé šéñđš àñđ à ṽéñüé šţöŕéš, šö à ṽéñüé'š šţöŕéđ
ĥàšĥéš šéŕṽé àš à þŕîöŕ šéţ. Çöñţéñţ îš ḿàţçĥéđ îñ ţĥé ƃļöçķ'š öŵñ đöçüḿéñţ ƒîŕšţ
àñđ ţĥéñ àçŕöšš ţĥé þŕöĵéçţ, šö à šéñţéñçé ḿöṽéđ ƃéţŵééñ ƒîļéš ķééþš îţš
ţŕàñšļàţîöñ.
Ţĥàţ šçöþé îš ţĥé đöçüḿéñţ'š ķéý ŕàţĥéŕ ţĥàñ îţš þàţĥ; öţĥéŕŵîšé ŕéñàḿîñĝ à ƒîļé
ŵöüļđ ŕéŵŕîţé ţĥé çöñţéẋţ öƒ éṽéŕý ƃļöçķ îñšîđé îţ àţ öñçé, àñđ à ƒîļé ţĥàţ ŵàš
öñļý ŕéñàḿéđ ŵöüļđ ŕéþöŕţ éṽéŕý ƃļöçķ îñ îţ àš ḿöṽéđ. Đöçüḿéñţš àŕé ţĥéŕéƒöŕé
ḿàţçĥéđ ƃý ţĥé šàḿé ĝŕàđîñĝ öñé ļéṽéļ üþ (reconcile.Documents), àñđ ţĥéîŕ
ŕéšöļṽéđ ķéý îš ŵĥàţ ƃļöçķš ŕéçöñçîļé ŵîţĥîñ.
Ţĥé þàšš öŕđéŕ ţĥéŕé îš îñṽéŕţéđ: šàḿé þàţĥ ŵîţĥ ţĥé šàḿé çöñţéñţš, ţĥéñ šàḿé
þàţĥ ŵîţĥ çĥàñĝéđ çöñţéñţš, ţĥéñ à ñéŵ þàţĥ ŵîţĥ ŕéçöĝñîšàƃļé çöñţéñţš. Þàţĥ îš
ĝŕàđéđ ƒîŕšţ ƃéçàüšé à þàţĥ ĝéñüîñéļý îđéñţîƒîéš à đöçüḿéñţ, ŵĥéŕéàš para1 đöéš
ñöţ: ţŵö ƒîļéš đö ñöţ šĥàŕé à þàţĥ, àñđ à ƒîļé šţàýîñĝ þüţ ŵĥîļé îţš çöñţéñţš
çĥàñĝé îš ƒàŕ ḿöŕé öŕđîñàŕý ţĥàñ à ŕéñàḿé. Ŕéñàḿéš àŕé ŕéçöĝñîšéđ ƃý çöñţéñţ
šîḿîļàŕîţý àĝàîñšţ ţĥé þŕîöŕ đöçüḿéñţ àţ à RenameThreshold öƒ ĥàļƒ: éñöüĝĥ ţĥàţ à
ƒîļé ḿöṽéđ àñđ þàŕţļý ŕéŵŕîţţéñ îš šţîļļ îţšéļƒ, ñöţ šö ļîţţļé ţĥàţ üñŕéļàţéđ ƒîļéš
šĥàŕîñĝ ƃöîļéŕþļàţé ḿéŕĝé.
Ŕéàđéŕš àŕé üñàƒƒéçţéđ ƃý àļļ öƒ ţĥîš. Ţĥéîŕ þöšîţîöñàļ ñàḿéš ŕéḿàîñ éẋàçţļý ŵĥàţ ţĥéý ŵéŕé àñđ àŕé çöñšüḿéđ àš ţĥé çöñţéẋţ šîĝñàļ. Ŕéçöñçîļîàţîöñ šîţš ƃéšîđé ţĥé ŕéàđéŕš ŕàţĥéŕ ţĥàñ îñšîđé ţĥéḿ šö ţĥàţ ŕéàđéŕš ķééþ ŕéþöŕţîñĝ ŵĥàţ ţĥé ƒöŕḿàţ àçţüàļļý šàýš.
Ŵĥéŕé ţĥé ķéý ļàñđš
host.ResolveIdentity(byPath, priors) ŕüñš ţĥé ţŵö ĝŕàđîñĝš ƒöŕ à ţŕéé öƒ
đöçüḿéñţš: đöçüḿéñţš ƒîŕšţ, ţĥéñ éàçĥ đöçüḿéñţ'š ƃļöçķš àĝàîñšţ ţĥé ŵĥöļé þŕîöŕ
šéţ, îñ à đéţéŕḿîñîšţîç þàţĥ öŕđéŕ šö ţŵö ŕüñš öṽéŕ ţĥé šàḿé ţŕéé ḿîñţ ţĥé šàḿé
ķéýš. Ţĥé ŕéšöļṽéđ ķéý îš ŵŕîţţéñ öñţö ţĥé ƃļöçķ àš Block.Unit
(Ƒ-02), àñđ convergence.BlockKey ŕéàđš îţ ƃéƒöŕé
ƒàļļîñĝ ƃàçķ ţö ţĥé ñàḿé. Ţĥé þŕîöŕš àŕé ţĥé ṽéñüé'š öŵñ ţŕéé
(venue.Tree.Priors()), ƒéţçĥéđ ƃéƒöŕé à þüšĥ đéçļàŕéš ŵĥàţ îţ çàŕŕîéš, ŕàţĥéŕ
ţĥàñ à ļöçàļ šţöŕé, šö à ƒŕéšĥ çļöñé ŕéšöļṽéš éẋàçţļý àš à ŵàŕḿ çĥéçķöüţ đöéš. À
ƃļöçķ ţĥàţ ḿàţçĥéš à þŕîöŕ ţàķéš ţĥàţ þŕîöŕ'š ķéý: ŕéšöļṽîñĝ àĝàîñšţ ķéýš à
ṽéñüé àļŕéàđý ĥöļđš ŕéţüŕñš ţĥéḿ üñçĥàñĝéđ, öñļý ñéŵ çöñţéñţ îš ḿîñţéđ, àñđ
ñöţĥîñĝ îš éṽéŕ ŕé-ķéýéđ.
Îđéñţîţý àçŕöšš ļàñĝüàĝéš
Éṽéŕýţĥîñĝ àƃöṽé àñšŵéŕš "îš ţĥîš ţĥé šàḿé üñîţ àš ƃéƒöŕé?" ŵîţĥîñ öñé ļàñĝüàĝé.
Þàîŕîñĝ à šöüŕçé ƒîļé ŵîţĥ îţš ţŕàñšļàţîöñ àšķš à đéŕéñţ ǫüéšţîöñ, àñđ à
šţŕüçţüŕàļ ñàḿé çàññöţ àñšŵéŕ îţ. Àñçéšţöŕš' ţéẋţ îš à ļéĝîţîḿàţé ñàḿîñĝ îñþüţ
(îţ îš ŵĥàţ ḿàķéš getting-started/install/p ŕéàđàƃļé ţö ţĥé ţŕàñšļàţöŕ ŵĥö öþéñš
ţĥé éẋţŕàçţéđ ƒîļé), ƃüţ îţ îš ŵŕîţţéñ îñ ţĥé đöçüḿéñţ'š öŵñ ļàñĝüàĝé, šö ţĥé
ţŕàñšļàţîöñ ñàḿéš ţĥé šàḿé þàŕàĝŕàþĥ kom-i-gang/installer/p. Ḿàţçĥîñĝ öñ ţĥé
ñàḿé àļöñé ŕéàçĥéđ öñļý ţĥé ƃļöçķš àƃöṽé ţĥé ƒîŕšţ ĥéàđîñĝ.
Éàçĥ ñàḿé ţĥéŕéƒöŕé ĥàš à ţŕàñšļàţîöñ-îñṽàŕîàñţ ţŵîñ: ţĥé šàḿé šţŕüçţüŕàļ
þàţĥ ŵîţĥ éṽéŕý šéĝḿéñţ ţĥàţ çàḿé ƒŕöḿ àñöţĥéŕ ƃļöçķ'š ţéẋţ ŕéþļàçéđ ƃý ţĥàţ
ƃļöçķ'š öŵñ šţŕüçţüŕàļ îđéñţîţý. À ĥéàđîñĝ îš àļŕéàđý àđđŕéššéđ ƃý îţš þàŕéñţ
ţŕàîļ þļüš îţš öŕđîñàļ àḿöñĝ šîƃļîñĝš (þŕéçîšéļý šö ţĥàţ ŕéŵöŕđîñĝ îţ ḿöṽéš öñé
šîĝñàļ ŕàţĥéŕ ţĥàñ ţŵö), šö ŵŕîţîñĝ šéçţîöñš ţĥàţ ŵàý ĝîṽéš h/h#2/p, ŵĥîçĥ
ŕéàđš ţĥé šàḿé îñ éṽéŕý ļàñĝüàĝé. Ŕéàđéŕš çöḿþöšé îţ ƃéšîđé ţĥé ñàḿé àñđ çàŕŕý
îţ öñ ţĥé ƃļöçķ àš model.StructureAnnotation.Address
(convergence.BlockAddress). Öñļý ƒöŕḿàţš ŵĥöšé ñàḿéš éḿƃéđ àñçéšţöŕ ţéẋţ
çöḿþöšé öñé; à ķéý þàţĥ, àñ éļéḿéñţ þàţĥ öŕ à çàţàļöĝ îđ îš àļŕéàđý îñṽàŕîàñţ àñđ
çöḿþöšéš ñöñé.
Ţĥé àđđŕéšš îš çöñšüļţéđ ƒöŕ ţĥé öñé ǫüéšţîöñ ţĥé ñàḿé çàññöţ àñšŵéŕ, àñđ
ñöţĥîñĝ ķéýéđ ƃý ţĥé ñàḿé ḿöṽéš: ţĥé çöñţéẋţ ĥàšĥ, ţĥé šţöŕé ķéý àñđ ţĥé ẊĻÎƑƑ
name àţţŕîƃüţé àļļ šţàý öñ ţĥé ñàḿé. Ţĥé ƒîļé-šçàñ
þàîŕîñĝ (host.OverlayTargets) ţĥéŕéƒöŕé ḿàţçĥéš öñ ţĥé ñàḿé, ţĥéñ öñ ţĥé
àđđŕéšš, àñđ öñļý ţĥéñ ƒàļļš ƃàçķ ţö đöçüḿéñţ þöšîţîöñ üñđéŕ àñ éǫüàļ-ƃļöçķ-çöüñţ
ĝüàŕđ, ŵĥîçĥ îš ţĥé ļàšţ ŕéšöŕţ ƒöŕ ƒöŕḿàţš ţĥàţ çöḿþöšé ñö àđđŕéšš.
Ţĥé šţöŕé ķéý
Ŕéçöñçîļéđ îđéñţîţý šàýš ŵĥîçĥ üñîţ îš ŵĥîçĥ. Ţĥé ƃļöçķ-àđđŕéššéđ šţöŕé
(core/blockstore) ñééđš à šéçöñđ ţĥîñĝ: öñé šţŕîñĝ ţĥàţ ķéýš à ƃļöçķ àñđ îţš
öṽéŕļàýš ŵîţĥîñ à þŕöĵéçţ, šţàƃļé àçŕöšš ŕé-ŕéàđš.
Ţĥàţ ķéý îš ñéîţĥéŕ ţĥé ƃàŕé çöñţéñţ ĥàšĥ ñöŕ ţĥé ŕéàđéŕ'š ƃļöçķ ÎĐ. Ŕéàđéŕš
àššîĝñ ƒîļé-ļöçàļ ÎĐš ţĥàţ ŕéšţàŕţ îñ éṽéŕý šöüŕçé ƒîļé, šö ķéýîñĝ
öñ ţĥé ŕàŵ ÎĐ ļéţš ƃļöçķš àñđ ţàŕĝéţ öṽéŕļàýš ƒŕöḿ đéŕéñţ ƒîļéš çöļļîđé, ŵîţĥ ţĥé
ļàšţ ŵŕîţéŕ ŵîññîñĝ. blockstore.StoreKey ñàḿéšþàçéš ţĥé ķéý ƃý ţĥé šöüŕçé ƒîļé'š
þŕöĵéçţ-ŕéļàţîṽé þàţĥ:
func StoreKey(sourceRel, blockID, sourceText string) string
Ţĥé šééđ îš sourceRel þļüš ţĥé ƃļöçķ ÎĐ, öŕ sourceRel þļüš ţĥé šöüŕçé ţéẋţ ŵĥéñ
ţĥé ŕéàđéŕ àššîĝñéđ ñö ÎĐ, ĥàšĥéđ ŵîţĥ ţĥé šàḿé çöñţéñţ-ĥàšĥ ƒüñçţîöñ. Éṽéŕý
(file, block) þàîŕ šţàýš đîšţîñçţ ŵĥîļé šţàýîñĝ šţàƃļé àçŕöšš ŕé-ŕéàđš, šö
öṽéŕļàýš ŵŕîţţéñ ƃý à ŕüñ àŕé ƒöüñđ àĝàîñ àţ ḿéŕĝé ţîḿé.
Ƃöţĥ éñđš öƒ à šþļîţ ŕüñ ḿüšţ šþéļļ ţĥé þàţĥ îđéñţîçàļļý, ŵĥîçĥ îš ŵĥý
blockstore.ProjectRel éẋîšţš àñđ ŵĥý îţ ŕéţüŕñš àñ éŕŕöŕ ŕàţĥéŕ ţĥàñ ƒàļļîñĝ ƃàçķ:
ţĥé ƒîļé'š þàţĥ ŕéļàţîṽé ţö ţĥé þŕöĵéçţ ŕööţ, îñ éẋàçţļý ţĥé šþéļļîñĝ ţĥé šţöŕé'š
ķéýš üšé. À ŕüñ ţĥàţ çàññöţ ñàḿé îţš öŵñ ƒîļé ţĥé ŵàý ḿéŕĝé ŵîļļ ĥàš ñöŵĥéŕé ţö þüţ
îţš ŵöŕķ. Ţĥé ƒàîļüŕé ḿöđé îƒ ţĥé ţŵö šîđéš đîšàĝŕéé îš ñöţ àñ éŕŕöŕ: ḿéŕĝé ƒîñđš
ñö ţŕàñšļàţîöñ ƒöŕ àñý ƃļöçķ, ŕéàđš ţĥàţ àš þéñđîñĝ ŵöŕķ, àñđ ŵŕîţéš šöüŕçé ţéẋţ
îñţö éṽéŕý ţàŕĝéţ ƒîļé ŵîţĥ à žéŕö éẋîţ çöđé.
À Store îš öþéñéđ öñçé þéŕ þŕöçéšš àñđ ĥàñđš öüţ Session ţŕàñšàçţîöñš. Ƃļöçķš
àŕé ŵŕîţţéñ çöñţéñţ-àđđŕéššéđ àñđ, öñçé ŵŕîţţéñ, àŕé îḿḿüţàƃļé: ţööļš àþþéñđ
Overlay ļàýéŕš (ţàŕĝéţš, àññöţàţîöñš, šķéļéţöñš) ķéýéđ ƃý (kind, blockHash)
ŕàţĥéŕ ţĥàñ ŕéŵŕîţîñĝ ƃļöçķš. Ţĥîš îš ţĥé šüƃšţŕàţé ƒļöŵš ŕüñ àĝàîñšţ; šéé
Ç-01: Ţĥé þŕöĵéçţ ḿöđéļ àñđ
Ç-03: Ţĥé çöñţéẋţ šţöŕé àñđ ĝŕàþĥ.
Çöñšéǫüéñçéš
- Þàţĥš àñđ çöḿḿàñđ öüţþüţ šţàý šĥöŕţ àñđ ŕéàđàƃļé (
aB3xK9mLŕàţĥéŕ ţĥàñ à 36-çĥàŕàçţéŕ çàñöñîçàļ ÜÜÎĐ). - ÎĐ ĝéñéŕàţîöñ ñééđš ñö éẋţéŕñàļ đéþéñđéñçý (
crypto/randîš ţĥé öñļý ŕéǫüîŕéḿéñţ), àñđ ŕéĵéçţîöñ šàḿþļîñĝ ķééþš ţĥé đîšţŕîƃüţîöñ üñîƒöŕḿ. - Çöļļîšîöñ þŕöƃàƃîļîţý àţ ŕöüĝĥļý 47.6 ƃîţš îš ñéĝļîĝîƃļé ƒöŕ ţĥé þéŕ-šçöþé þöþüļàţîöñš ţĥéšé ÎĐš àđđŕéšš, àñđ ŕàñđöḿ ÎĐš àṽöîđ ţĥé éñüḿéŕàţîöñ ļéàķš ţĥàţ šéǫüéñţîàļ ÎĐš þŕöđüçé.
- Çöñţéñţ-àđđŕéššàƃļé
BlockIdentityđéđüþļîçàţéš îđéñţîçàļ çöñţéñţ àçŕöšš šöüŕçéš àñđ đéţéçţš éđîţš ƃý ĥàšĥ çöḿþàŕîšöñ, ŵîţĥ ñö àļļöçàţéđ ƃļöçķ ÎĐ îñ ţĥé ḿöđéļ. - Ƃéçàüšé îđéñţîţý îš ţĥé öüţþüţ öƒ ḿàţçĥîñĝ ŕàţĥéŕ ţĥàñ à ñàḿîñĝ šçĥéḿé, à ŕéàđéŕ çàñ ķééþ éḿîţţîñĝ ţĥé þöšîţîöñàļ ñàḿéš îţš ƒöŕḿàţ àçţüàļļý šüþþöŕţš, àñđ à þàŕàĝŕàþĥ éđîţéđ îñ þļàçé ķééþš ţĥé đéçîšîöñš ŕéçöŕđéđ àĝàîñšţ îţ.
- Ƃéçàüšé ţĥé šţöŕé ķéý ñàḿéšþàçéš ƃý šöüŕçé ƒîļé, à þŕöĵéçţ çàñ îñĝéšţ ţŵéñţý
ƒîļéš ţĥàţ éàçĥ çàļļ ţĥéîŕ ƒîŕšţ üñîţ
tu1ŵîţĥöüţ à ţĥŕéé-þàŕţ çöḿþöšîţé ķéý àþþéàŕîñĝ àñýŵĥéŕé éļšé îñ ţĥé šţàçķ.
Šéé àļšö
- Ƒ-01: Ţĥé ƒŕàḿéŵöŕķ àñđ îţš ḿöđüļéš
- Ƒ-02: Ţĥé çöñţéñţ ḿöđéļ: ŵĥéŕé
BlockIdentityšîţš öñ à Ƃļöçķ - É-02: Ţĥé ƒöŕḿàţ šýšţéḿ: ŵĥéŕé ŕéàđéŕ-àššîĝñéđ ÎĐš öŕîĝîñàţé
- Ç-01: Ţĥé þŕöĵéçţ ḿöđéļ: ţĥé šţöŕé ţĥé ķéýš àđđŕéšš
- Ç-03: Ţĥé çöñţéẋţ šţöŕé àñđ ĝŕàþĥ: ţĥé đüŕàƃļé çöñţéñţ ķéý îñ ţĥé ĝŕàþĥ
- Ç-04: Üñîţ šţàţé àñđ ţĥé đéçîšîöñ ŕéçöŕđ: ŵĥàţ îš ŕéçöŕđéđ àĝàîñšţ à ŕéçöñçîļéđ üñîţ