Ağ Protokolü
Camino ağı, Camino düğümleri arasındaki temel iletişim formatını tanımlar. Yük paketleme için formatını kullanır.
Tanımda "Konteynerler" terimi geniş bir biçimde bahsedilmektedir. Bir Konteyner, basitçe, konsensüs algoritmasının DAG veya Zincir olup olmadığını belirtmek gerektirmeden, bloklar veya düğümler için genel bir terimdir.
GetVersion
GetVersion
, bir Version
mesajının yanıt olarak gönderilmesini talep eder.
GetVersion
mesajlarında kullanılan OpCode şudur: 0x00
.
GetVersion Neleri İçerir
Bir GetVersion
mesajının yükü boştur.
[]
GetVersion Nasıl İşlenir
GetVersion
mesajını alan bir düğüm, mevcut zamanı ve düğüm sürümünü içeren bir Version
mesajı ile yanıt vermelidir.
GetVersion Ne Zaman Gönderilir
GetVersion
, bir düğüm başka bir düğüme bağlandığında fakat henüz bir Version
mesajı almadığında gönderilir. Ancak, her zaman yeniden gönderilebilir.
Version
Version
, bağlı olduğumuz düğümlerin uyumlu sürümlerinin çalıştığını ve mevcut zaman üzerinde en azından gevşek bir anlaşma sağladığını garanti eder.
Version
mesajlarında kullanılan OpCode şudur: 0x01
.
Version Neleri İçerir
Version
, düğümün Unix zaman formatındaki mevcut zamanını, yani 01/01/1970 tarihinden itibaren geçen milisaniye cinsinden sayıyı ve düğümün çalıştırdığı kodun sürümünü açıklayan bir sürüm dizesini içerir.
İçerik:
[
Long <- Unix Zaman Damgası (Saniye)
String <- Sürüm Dizesi
]
Version Nasıl İşlenir
Eğer sürümler uyumsuzsa veya mevcut zamanlar çok farklıysa, bağlantı sonlandırılacaktır.
Version Ne Zaman Gönderilir
Version
, bir GetVersion
mesajına yanıt olarak gönderilir.
Version Örneği
November 16th, 2008 at 12:00am (UTC)
zamanı ve camino/0.0.1
sürümü ile bir Version
mesajı göndermek:
[
Long <- 1226793600 = 0x00000000491f6280
String <- "camino/0.0.1"
]
=
[
0x00, 0x00, 0x00, 0x00, 0x49, 0x1f, 0x62, 0x80,
0x00, 0x0f, 0x61, 0x76, 0x61, 0x6c, 0x61, 0x6e,
0x63, 0x68, 0x65, 0x2f, 0x30, 0x2e, 0x30, 0x2e,
0x31,
]
GetPeers
Genel Bakış
GetPeers
, bir Peers
mesajının yanıt olarak gönderilmesini talep eder.
GetPeers
mesajlarında kullanılan OpCode şudur: 0x02
.
GetPeers Neleri İçerir
Bir GetPeers
mesajının yükü boştur.
[]
GetPeers Nasıl İşlenir
GetPeers
isteğini alan bir düğüm, bağlı olduğu staking düğümlerinin IP adreslerini içeren bir Peers
mesajı ile yanıt vermelidir.
GetPeers Ne Zaman Gönderilir
Bir düğüm, ağdaki katılımcıları keşfetmek için başlarken GetPeers
mesajlarını gönderir. Ayrıca, ağa yeni düğümler katıldıkça düzenli olarak GetPeers
mesajları da gönderebilir.
Peers
Genel Bakış
Peers
mesajı, IP adresleri olarak temsil edilen bir meslektaşlar listesini içerir. Not: Bir IP adresi hem IP hem de port numarasını içerir ve hem IPv4 hem de IPv6 formatını destekler.
Peers
mesajlarında kullanılan OpCode şudur: 0x03
.
Peers Neleri İçerir
Peers
, düğümün şu anda bağlı olduğu staking düğümlerinin IP adreslerini içerir.
İçerik:
[
Değişken Uzunlukta IP Adresi Dizisi
]
Peers Nasıl İşlenir
Bir Peers
mesajı alındığında, bir düğüm, mesajda görünen düğümleri kendi komşu listesindeki düğümlerle karşılaştırmalı ve yeni düğümlerle bağlantılar kurmalıdır.
Peers Ne Zaman Gönderilir
Peers
mesajlarının GetPeers
mesajına yanıt olarak gönderilmesine gerek yoktur ve yeni katılan düğümleri duyurmak için düzenli olarak gönderilir. Bu tür bir yayımlama gossip'i için varsayılan periyot 60 saniyedir.
Peers Örneği
IP adresleri "127.0.0.1:9650"
ve "[2001:0db8:ac10:fe01::]:12345"
olan bir Peers
mesajı göndermek:
[
Değişken Uzunlukta IP Adresi Dizisi <- ["127.0.0.1:9650", "[2001:0db8:ac10:fe01::]:12345"]
]
=
[
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0x7f, 0x00, 0x00, 0x01, 0x25, 0xb2, 0x20, 0x01,
0x0d, 0xb8, 0xac, 0x10, 0xfe, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x39,
]
Get
Genel Bakış
Get
mesajı, bir düğümden bir konteyner (blok veya düğüm) talep eder.
Get
mesajlarında kullanılan OpCode şudur: 0x04
.
Get Neleri İçerir
Bir Get
mesajı, bir SubnetID
, bir RequestID
ve bir ContainerID
içerir.
SubnetID
, bu mesajın hedeflendiği subneti tanımlar.
RequestID
, bir düğüm tarafından gönderilen mesajları takip etmeye yardımcı olan bir sayaçtır. Her seferinde özgün bir RequestID
oluşturulur.
ContainerID
, talep edilen konteynerin tanımlayıcısıdır.
[
Uzunluk 32 Bayt Dizisi <- SubnetID
UInt <- RequestID
Uzunluk 32 Bayt Dizisi <- ContainerID
]
Get Nasıl İşlenir
Düğüm, belirtilen SubnetID
, RequestID
ve ContainerID
ile aynı Put
mesajı ile yanıt vermeli ve talep edilen Container
ile birlikte göndermelidir. Doğru durumlarda, bir düğümden sadece sahip olduğu bir konteyner talep edilmelidir. Bu nedenle, eğer düğüm belirtilen konteynere sahip değilse, Get
mesajı güvenle atılabilir.
Get Ne Zaman Gönderilir
Bir düğüm, bir konteynerin varlığı hakkında bilgi veren bir düğüme Get
mesajı gönderir. Örneğin, Rick ve Morty adlı iki düğüm olduğunu varsayalım. Eğer Rick, Morty'nin sahibi olmadığı bir ContainerID
içeren bir PullQuery
mesajı gönderirse, Morty eksik ContainerID
'yi içeren bir Get
mesajı gönderir.
Get Örneği
[
SubnetID <- 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20
RequestID <- 43110 = 0x0000A866
ContainerID <- 0x2122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40
]
=
[
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
0x00, 0x00, 0xa8, 0x66, 0x21, 0x22, 0x23, 0x24,
0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c,
0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x40,
]
Put
Genel Bakış
Bir Put
mesajı, düğüme bir talep edilen konteyneri sağlar.
Put
mesajlarında kullanılan OpCode şudur: 0x05
.
Put Neleri İçerir
Bir Put
mesajı, bir SubnetID
, bir RequestID
, bir ContainerID
ve Container
içerir.
SubnetID
, bu mesajın hedeflendiği subneti tanımlar.
RequestID
, bir düğüm tarafından gönderilen mesajları takip etmeye yardımcı olan bir sayaçtır.
ContainerID
, bu mesajın gönderdiği konteynerin tanımlayıcısıdır.
Container
, bu mesajın gönderdiği konteynerin baytlarıdır.
[
Uzunluk 32 Bayt Dizisi <- SubnetID
UInt <- RequestID
Uzunluk 32 Bayt Dizisi <- ContainerID
Değişken Uzunlukta Bayt Dizisi <- Container
]
Put Nasıl İşlenir
Düğüm, konteyneri konsensüse eklemeye çalışmalıdır.
Put Ne Zaman Gönderilir
Bir düğüm, erişim sağladığı bir konteyner için bir Get
mesajı aldığında bir Put
mesajı gönderir.
Put Örneği
[
SubnetID <- 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20
RequestID <- 43110 = 0x0000A866
ContainerID <- 0x5ba080dcf6861c94c24ec62bc09a3c8b0fdd4691ebf02491e0e921dd0c77206f
Container <- 0x2122232425
]
=
[
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
0x00, 0x00, 0xa8, 0x66, 0x5b, 0xa0, 0x80, 0xdc,
0xf6, 0x86, 0x1c, 0x94, 0xc2, 0x4e, 0xc6, 0x2b,
0xc0, 0x9a, 0x3c, 0x8b, 0x0f, 0xdd, 0x46, 0x91,
0xeb, 0xf0, 0x24, 0x91, 0xe0, 0xe9, 0x21, 0xdd,
0x0c, 0x77, 0x20, 0x6f, 0x00, 0x00, 0x00, 0x05,
0x21, 0x22, 0x23, 0x24, 0x25,
]
PushQuery
Genel Bakış
Bir PushQuery
mesajı, belirtilen ContainerID
konsensüse eklendikten sonra düğümden tercih edilen konteyner ID'lerini talep eder. Eğer ContainerID
bilinmiyorsa, Container
iyimser bir şekilde sağlanır.
PushQuery
mesajlarında kullanılan OpCode şudur: 0x06
.
PushQuery Neleri İçerir
Bir PushQuery
mesajı, bir SubnetID
, bir RequestID
, bir ContainerID
ve Container
içerir.
SubnetID
, bu mesajın hedeflendiği subneti tanımlar.
RequestID
, bir düğüm tarafından gönderilen mesajları takip etmeye yardımcı olan bir sayaçtır.
ContainerID
, bu mesajın gönderilmeden önce konsensüse eklenmiş olmasını beklediği konteynerin tanımlayıcısıdır.
Container
, ContainerID
ile tanımlanan konteynerin baytlarıdır.
[
Uzunluk 32 Bayt Dizisi <- SubnetID
UInt <- RequestID
Uzunluk 32 Bayt Dizisi <- ContainerID
Değişken Uzunlukta Bayt Dizisi <- Container
]
PushQuery Nasıl İşlenir
Düğüm, konteyneri konsensüse eklemeye çalışmalıdır. Konteyner konsensüse eklendikten sonra, düğümün güncel tercih(ler) ile Chits
mesajı gönderilmelidir.
PushQuery Ne Zaman Gönderilir
Bir düğüm, bu düğümün güncel tercihlerini öğrenmek istiyorsa ve bunun mümkün olduğunu düşünüyorsa PushQuery
mesajı göndermelidir. Düğüm, yeni bir konteyner öğrendiğinde veya bir süredir bekleyen konteynerler olduğunda düğümlerin tercihlerini öğrenmek isteyecektir.
PushQuery Örneği
[
SubnetID <- 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20
RequestID <- 43110 = 0x0000A866
ContainerID <- 0x5ba080dcf6861c94c24ec62bc09a3c8b0fdd4691ebf02491e0e921dd0c77206f
Container <- 0x2122232425
]
=
[
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
0x00, 0x00, 0xa8, 0x66, 0x5b, 0xa0, 0x80, 0xdc,
0xf6, 0x86, 0x1c, 0x94, 0xc2, 0x4e, 0xc6, 0x2b,
0xc0, 0x9a, 0x3c, 0x8b, 0x0f, 0xdd, 0x46, 0x91,
0xeb, 0xf0, 0x24, 0x91, 0xe0, 0xe9, 0x21, 0xdd,
0x0c, 0x77, 0x20, 0x6f, 0x00, 0x00, 0x00, 0x05,
0x21, 0x22, 0x23, 0x24, 0x25,
]
PullQuery
Genel Bakış
Bir PullQuery
mesajı, belirtilen ContainerID
'nin konsensüse eklendikten sonra düğümden tercih edilen konteyner ID'lerini talep eder.
PullQuery
mesajlarında kullanılan OpCode şudur: 0x07
.
PullQuery Neleri İçerir
Bir PullQuery
mesajı, bir SubnetID
, bir RequestID
ve bir ContainerID
içerir.
SubnetID
, bu mesajın hedeflendiği subneti tanımlar.
RequestID
, bir düğüm tarafından gönderilen mesajları takip etmeye yardımcı olan bir sayaçtır.
ContainerID
, bu mesajın gönderilmeden önce konsensüse eklenmiş olmasını beklediği konteynerin tanımlayıcısıdır.
[
Uzunluk 32 Bayt Dizisi <- SubnetID
UInt <- RequestID
Uzunluk 32 Bayt Dizisi <- ContainerID
]
PullQuery Nasıl İşlenir
Eğer düğüm ContainerID
'yi eklememişse, konteyneri konsensüse eklemeye çalışmalıdır. Konteyner konsensüse eklendikten sonra, düğümün güncel tercih(ler) ile Chits
mesajı göndermelidir.
PullQuery Ne Zaman Gönderilir
Bir düğüm, bu düğümün güncel tercihlerini öğrenmek istiyorsa ve bunun oldukça olası olduğunu düşünüyorsa PullQuery
mesajı göndermelidir. Düğüm, yeni bir konteyner öğrendiğinde veya bir süredir bekleyen konteynerler olduğunda düğümlerin tercihlerini öğrenmek isteyecektir.
PullQuery Örneği
[
SubnetID <- 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20
RequestID <- 43110 = 0x0000A866
ContainerID <- 0x5ba080dcf6861c94c24ec62bc09a3c8b0fdd4691ebf02491e0e921dd0c77206f
]
=
[
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
0x00, 0x00, 0xa8, 0x66, 0x5b, 0xa0, 0x80, 0xdc,
0xf6, 0x86, 0x1c, 0x94, 0xc2, 0x4e, 0xc6, 0x2b,
0xc0, 0x9a, 0x3c, 0x8b, 0x0f, 0xdd, 0x46, 0x91,
0xeb, 0xf0, 0x24, 0x91, 0xe0, 0xe9, 0x21, 0xdd,
0x0c, 0x77, 0x20, 0x6f,
]
Chits
Genel Bakış
Bir Chits
mesajı, düğüme tercih edilen bir veya birden fazla konteyner setini sağlar.
Chits
mesajlarında kullanılan OpCode şudur: 0x08
.
Chits Neleri İçerir
Bir Chits
mesajı, bir SubnetID
, bir RequestID
, ve Preferences
içerir.
SubnetID
, bu mesajın hedeflendiği subneti tanımlar.
RequestID
, bir düğüm tarafından gönderilen mesajları takip etmeye yardımcı olan bir sayaçtır.
Preferences
, düğümün tercihlerini tam olarak tanımlayan konteyner ID'leri listesidir.
[
Uzunluk 32 Bayt Dizisi <- SubnetID
UInt <- RequestID
Değişken Uzunluk (Uzunluk 32 Bayt Dizisi) Dizisi <- Preferences
]
Chits Nasıl İşlenir
Düğüm, referans verilen konteynerleri konsensüse eklemeye çalışmalıdır. Eğer referans verilen konteynerler eklenemezse, düğüm eksik konteynerleri göz ardı edebilir ve kalan chits'i oylamaya uygulayabilir. Oylama tamamlandıktan sonra, konteyner güvenleri uygun şekilde güncellenmelidir.
Chits Ne Zaman Gönderilir
Bir düğüm, konsensüse eklediği bir konteyner için bir PullQuery
veya PushQuery
mesajı aldığında bir Chits
mesajı gönderir.
Chits Örneği
[
SubnetID <- 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20
RequestID <- 43110 = 0x0000A866
Preferences <- [
0x2122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40,
0x4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60,
]
]
=
[
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
0x00, 0x00, 0xa8, 0x66, 0x00, 0x00, 0x00, 0x02,
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40,
0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60,
]