xdag的每个块定长512个字节,分为固定的16个field,每个field为32字节。
具体到每个field的细节构成,普通块和伪块的构成方式不同。
普通块
-
head字段
-
第一个8字节:传输层填充的信息,在计算hash的时候会清零。
- type:传输层block类型,目前只有一种类型就是xdag。
- ttl:传播次数。
- length:整个block大小,xdag下固定为512。
- crc32:把crc32字段清零后,整个block做crc32的结果。
-
第二个8字节:存储每个field类型。
64-bit被切分为16个4-bit,每个4-bit表示一个field的type,倒序。
-
第三个8字节:时间戳。
64位,其中低32放秒,高32位放毫秒。
第四个8字节:手续费。
-
-
其他field
其他field根据不同块类型布局不同,下面重点说交易块和主块的布局,链接块和地址块比较简单,可以参考前一章内容。
-
交易块
假设交易块包含下列field:
- 一个head
- 2个input field
- 1个output field
- 2个pubkey field(假设2个input field用的是不同的key)
- 2个input sign(因为有2个pubkey)
- 1个output sign(注意这里的sign与output field没有任何关系,这个sign是当前块持有人的。)
下面是布局
-
主块
假设主块包含
- head
- 1个output field 指向前一个主块
- 2个output field 指向孤块
- 1个output sign
- 1个last field,这个field在type中是input sign,但是跟sign没关系,只是一个特殊类型。
布局
-
-
pubkey与input sign
每一个input作为转入资金方,都需要用自己的key做一次签名,这个签名就是input sign,同时对应的pubkey会复制到block中。
多个input有可能来自同一个人,那么就有可能用的是同一个key,pubkey相同,那么只需要复制一次即可。但是同一个人,也可能在不同block上用不同的秘钥,所以key不同是正常的。
原则上,pubkey与input sign是一一对应的。
-
output sign
当一个block创建后,input 与 output 的金额差如果大于0,意味着这个block里留下了余额,这些余额就属于创建这个block的人。为了在后面转出金额的时候做转出合法性校验,需要为这个block的余额做一个签名,这个output sign就是为了做这个。
用创建block人当前的default key对block做一次签名,就是output sign。
-
input的来源验证
每一个input都意味另一个block账户余额的转出,当系统收到一个block时:
- 首先用所有pubkey对相关的input sign做一次验签,
- 完成input sign验证后,只能说明input sign合法性验证通过,但这笔金额的来源block是否授权了这次金额转出,并没有得到确认。
- output sign的创建,就是为了转出金额的时候做校验用,所以在这里,用相同的pubkey,再去address的block上,对output sign做一次验签,如果能通过,则说明这次转出是被授权过的。为什么要这样验证?因为只有当前block的input sign和上游block的output sign是同一个私钥签名的,才能说明是同一个人授权的,如果用同样的pubkey可以对两边的sign都验证通过,则能说明是同一个私钥签名的。