xdag的每個(gè)塊定長(zhǎng)512個(gè)字節(jié)诽里,分為固定的16個(gè)field手负,每個(gè)field為32字節(jié)贤重。
具體到每個(gè)field的細(xì)節(jié)構(gòu)成茬祷,普通塊和偽塊的構(gòu)成方式不同。
普通塊
-
head字段
-
第一個(gè)8字節(jié):傳輸層填充的信息并蝗,在計(jì)算hash的時(shí)候會(huì)清零祭犯。
- type:傳輸層block類型,目前只有一種類型就是xdag滚停。
- ttl:傳播次數(shù)沃粗。
- length:整個(gè)block大小,xdag下固定為512键畴。
- crc32:把crc32字段清零后最盅,整個(gè)block做crc32的結(jié)果。
-
第二個(gè)8字節(jié):存儲(chǔ)每個(gè)field類型起惕。
64-bit被切分為16個(gè)4-bit涡贱,每個(gè)4-bit表示一個(gè)field的type,倒序惹想。
-
第三個(gè)8字節(jié):時(shí)間戳盼产。
64位,其中低32放秒勺馆,高32位放毫秒戏售。
第四個(gè)8字節(jié):手續(xù)費(fèi)。
-
-
其他field
其他field根據(jù)不同塊類型布局不同草穆,下面重點(diǎn)說交易塊和主塊的布局灌灾,鏈接塊和地址塊比較簡(jiǎn)單,可以參考前一章內(nèi)容悲柱。
-
交易塊
假設(shè)交易塊包含下列field:
- 一個(gè)head
- 2個(gè)input field
- 1個(gè)output field
- 2個(gè)pubkey field(假設(shè)2個(gè)input field用的是不同的key)
- 2個(gè)input sign(因?yàn)橛?個(gè)pubkey)
- 1個(gè)output sign(注意這里的sign與output field沒有任何關(guān)系锋喜,這個(gè)sign是當(dāng)前塊持有人的。)
下面是布局
-
主塊
假設(shè)主塊包含
- head
- 1個(gè)output field 指向前一個(gè)主塊
- 2個(gè)output field 指向孤塊
- 1個(gè)output sign
- 1個(gè)last field,這個(gè)field在type中是input sign嘿般,但是跟sign沒關(guān)系段标,只是一個(gè)特殊類型。
布局
-
-
pubkey與input sign
每一個(gè)input作為轉(zhuǎn)入資金方炉奴,都需要用自己的key做一次簽名逼庞,這個(gè)簽名就是input sign,同時(shí)對(duì)應(yīng)的pubkey會(huì)復(fù)制到block中瞻赶。
多個(gè)input有可能來自同一個(gè)人赛糟,那么就有可能用的是同一個(gè)key,pubkey相同砸逊,那么只需要復(fù)制一次即可璧南。但是同一個(gè)人,也可能在不同block上用不同的秘鑰师逸,所以key不同是正常的司倚。
原則上,pubkey與input sign是一一對(duì)應(yīng)的篓像。
-
output sign
當(dāng)一個(gè)block創(chuàng)建后对湃,input 與 output 的金額差如果大于0,意味著這個(gè)block里留下了余額遗淳,這些余額就屬于創(chuàng)建這個(gè)block的人拍柒。為了在后面轉(zhuǎn)出金額的時(shí)候做轉(zhuǎn)出合法性校驗(yàn),需要為這個(gè)block的余額做一個(gè)簽名屈暗,這個(gè)output sign就是為了做這個(gè)拆讯。
用創(chuàng)建block人當(dāng)前的default key對(duì)block做一次簽名,就是output sign养叛。
-
input的來源驗(yàn)證
每一個(gè)input都意味另一個(gè)block賬戶余額的轉(zhuǎn)出种呐,當(dāng)系統(tǒng)收到一個(gè)block時(shí):
- 首先用所有pubkey對(duì)相關(guān)的input sign做一次驗(yàn)簽,
- 完成input sign驗(yàn)證后弃甥,只能說明input sign合法性驗(yàn)證通過爽室,但這筆金額的來源block是否授權(quán)了這次金額轉(zhuǎn)出,并沒有得到確認(rèn)淆攻。
- output sign的創(chuàng)建阔墩,就是為了轉(zhuǎn)出金額的時(shí)候做校驗(yàn)用,所以在這里瓶珊,用相同的pubkey啸箫,再去address的block上,對(duì)output sign做一次驗(yàn)簽伞芹,如果能通過忘苛,則說明這次轉(zhuǎn)出是被授權(quán)過的蝉娜。為什么要這樣驗(yàn)證?因?yàn)橹挥挟?dāng)前block的input sign和上游block的output sign是同一個(gè)私鑰簽名的扎唾,才能說明是同一個(gè)人授權(quán)的召川,如果用同樣的pubkey可以對(duì)兩邊的sign都驗(yàn)證通過,則能說明是同一個(gè)私鑰簽名的胸遇。