在xdag網(wǎng)絡協(xié)議中政己,block分類兩種大的類型,普通塊和偽塊燕垃。
偽塊是一種command類型的塊俏橘,主要目的是用來在xdag網(wǎng)絡各個節(jié)點間傳遞一些統(tǒng)計信息允华,比如a節(jié)點向b節(jié)點請求拉取某個時間范圍內(nèi)的block。
普通塊是xdag塊的核心寥掐,xdag中所有與交易相關的塊都是普通塊靴寂。本章重點介紹普通塊,偽塊只做簡略的說明召耘。同時重點介紹邏輯設計部分百炬,協(xié)議細節(jié)不做深入說明,后面會有專門的章節(jié)描述污它。
block格式
在介紹不同類型塊之前剖踊,先簡要看下普通塊的格式庶弃,偽塊的格式比較簡單,這里不詳細說明德澈。
根據(jù)定義歇攻,每個block為定長512個字節(jié),其中包含16個field梆造,每個field也定長為32字節(jié)缴守。其中field有以下類型:
-
header
頭字段,其中包含所有field的type信息澳窑、block時間戳斧散、交易手續(xù)費、和傳輸標記摊聋。這個字段會因為不同類型的block內(nèi)容填充方式略有不同,在后面介紹詳細格式的時候會明確說明栈暇。
-
input
包含輸入block的地址和要輸入的金額麻裁,可以有多個。
-
output
這個類型的field被用做兩種不同的方式源祈。
- 轉賬輸出目標:包含輸出block的地址和要輸出的金額煎源。
- 單純?yōu)榱藰嬙霥AG圖做的引用:比如當前時間片的主塊引用前一個時間片的主塊,這時候金額沒什么意義香缺,設為0手销。
可以有多個。
-
input signature (half)
用輸入賬戶的prikey做的簽名图张。
half:因為這個算法的簽名結果是64個字節(jié)锋拖,一個field放不下,所以會放在連續(xù)兩個field中祸轮,每個field就只有一半兽埃。
這個sign結果可能會有多個,但是數(shù)量并不等于input field的數(shù)量适袜,而是看所有input field對應的源block到底有是由多少個key簽出來的(被哪個key簽名的block就是屬于這個key)柄错,因為有可能不同源block屬于相同的key,所以苦酱,input sign的個數(shù)小于等于input field個數(shù)售貌。
能用input 的 prikey做簽名,意味著當前創(chuàng)建block的人持有了input block 的 prikey疫萤,也就意味著颂跨,input block是當前創(chuàng)建者自己的block。因為只有歸屬自己的block给僵,才有權限轉出資金毫捣,才能作為input的角色存在详拙。但從邏輯上說,這種input的簽名過程蔓同,可以歸屬不同人饶辙,也就是說允許多個不同人的資金做輸入,只是當前的實現(xiàn)上沒有這么做斑粱。
-
output signature (half)
用創(chuàng)建當前block的人的prikey簽名出來的結果弃揽。
注意這個output的字面意思與實際的用處并不一樣,與轉出block無關则北,而是當前交易block創(chuàng)建者的prikey簽名矿微。
根據(jù)定義,如果一個block的signout字段能被自己的pubkey驗簽通過尚揣,則這個block屬于自己涌矢,因為這說明這個signout字段是用自己的prikey簽名的。這個signout字段快骗,更像是對當前block中余額的一把鎖娜庇,這個后面會詳細講。
每個block一旦創(chuàng)建方篮,就會用自己的prikey做簽出一個signout字段名秀,這個signout字段只能被自己的pubkey驗簽通過,這個block從此歸屬自己藕溅。但是out field指向的block卻可以不是自己的block匕得,所以這個output signature的命名是有誤導性的,容易被理解為與out field有關巾表,其實無關汁掠。
in/out sign的簽名和驗簽過程比較復雜,后面會專門講這個過程攒发,當前只有個基本概念即可调塌。
-
public key,偶數(shù)類型惠猿。
block創(chuàng)建后羔砾,會帶上sign結果相關的pubkey,以便后續(xù)接受者直接驗簽偶妖。
因為這個算法的pubkey結果有奇偶兩種類型姜凄,這里字段也分了兩種類型。
-
public key趾访,奇數(shù)類型态秧。
解釋見6。
普通塊
-
交易塊
普通的轉賬交易扼鞋,包含的field有:
- header field
- 多個input field
- 多個output field
- 多個pubkey field
- 多個input signature
- 一個output signature申鱼,注意目前只能有一個output signature field愤诱。
-
主塊
根據(jù)定義,主鏈上的塊被判定為主塊捐友,會被增加挖礦獎勵金額到主塊賬戶上淫半,比如1024。
在實際中匣砖,主塊通常是pool創(chuàng)建的科吭,是每個時間片中最后一個塊,用來鏈接所有當前時間片中pool中的交易快和所有其他類型的塊猴鲫。
比如圖中t5塊对人,作為主塊,主要的目的就是打包當前時間片中的所有交易拂共,通過這種方式牺弄,可以加大交易tps,允許不同節(jié)點處理不同的交易匣缘,最后用主塊鏈接一次即可猖闪。
主塊通常包含field有
- 一個header field
- 一個output field,指向前一個周期的主塊肌厨。
- 若干個output field,指向孤塊豁陆。
- 一個output signature柑爸。
- 最后一個field是input signature類型,這里是個特殊情況盒音,內(nèi)容并不是sign表鳍,而是挖礦的隨機值,這個在后面挖礦章節(jié)詳細描述祥诽。
注意譬圣,主塊中不包含input field,所以也就不包含pubkey和input sign雄坪,但是必須有output sign厘熟。
-
鏈接塊
鏈接塊的目的,是為了讓圖盡量收斂维哈,方便最后主塊去打包。我們還是用上圖中的t5舉例阔挠。
t5的目的是打包交易跪削,只有被t5鏈接到的交易才會變?yōu)橛行Вū淮_認)。但每個block的field是有限的碾盐,如果當前周期的交易block都要由主塊直接鏈接的話廓旬,顯然能鏈接的個數(shù)不可能超過16,這還沒有考慮pubkey和sign字段涩盾,這樣每個周期內(nèi)能被確認的交易就有很少了励背,哪怕未來field數(shù)量可以變大叶眉,也是有上限的。這就類似比特幣的包大小莲趣,陷入tps瓶頸饱溢,違背了xdag設計的初衷绩郎。鏈接塊的目的正是來解決這個問題的。
當一個周期內(nèi)交易塊非常多的時候肋杖,系統(tǒng)會自動生成一些鏈接塊状植,作為中間block浅萧,負責收斂頂部孤塊的數(shù)量。
如圖所示吩案,假如當前有30個交易快徘郭,顯然,一個主塊是沒法一次鏈接完所有交易快的胧后,這時候抱环,系統(tǒng)生成三個鏈接塊,提前收斂一次眶痰,各自鏈接10個竖伯,那么主塊只需要鏈接三個鏈接塊即可因宇,根據(jù)“主塊直接或間接引用的塊都有效”規(guī)則,30個交易也就自然被引用了打厘。
鏈接塊通常包含field有
- 一個header field
- 若干個output field婚惫,指向孤塊魂爪。
- 一個output signature滓侍。
與主塊類似撩笆,鏈接塊也不包含input field和input sign夕冲。
-
地址塊
在一個錢包剛創(chuàng)建的時候裂逐,為了給自己創(chuàng)建一個賬戶地址,需要先創(chuàng)建一個地址塊弥姻,這個塊的唯一目的就是作為賬戶地址存在庭敦,所以叫地址塊。
地址塊不包含交易伞广,不需要鏈接其他交易快疼电,也不需要鏈接鏈接塊,地址塊只在創(chuàng)建的時候鏈接歸屬自己的其他地址塊灾票。
地址塊包含的field有
- 一個header field
- 若干個output field茫虽,指向歸屬自己的其他地址塊濒析。
- 一個output signature。
偽塊
偽塊實際上代表在結點間的command請求和響應婴氮,大小也是固定為一個block(512字節(jié))主经,按類型分為:
-
批量block請求
一個結點發(fā)現(xiàn)自己有部分時間片的block不存在庭惜,會向其他結點發(fā)起拉取block的請求护赊。
-
批量block請求的響應
上一個請求的響應消息骏啰,注意這個響應block只包含一些統(tǒng)計信息,和block數(shù)量透绩,實際的block是通過異步方式從連接上發(fā)過來的渺贤。
-
sums請求
sums是一個時間段內(nèi)所有block的摘要志鞍,方便兩個結點做一致性對比。
一個結點為了對比自己跟其他結點之間的存儲是否一致统翩,會先按照時間段請求對方的sums厂汗,對比過sums后才會決定是否要拉block娶桦。
-
sums請求的響應
上一個消息的響應衷畦,包含響應方的sums內(nèi)容祈争。
-
單個block請求
想對方請求指定的block角寸。