NULS Protocol--TX

NULS协议之交易Transaction

NULS采用通用的交易协议格式,主要由以下字段组成:
| Len | Fields | Data Type | Remark |
| —- | ——– | ——— | ———————— |
| 2 | type | uint16 | 交易类型 |
| 4 | time | uint32 | 时间,精确到秒 |
| ? | txData | VarByte | 业务数据 |
| ? | coinData | VarByte | 资产数据 |
| ? | remark | VarString | 备注 |
| ? | sigData | VarByte | 包含公钥和签名数据 |

type

用于区分不同的业务交易,每个模块可以注册多个交易类型,每个交易类型可以有不同的验证逻辑、处理逻辑。取值范围是1~65535。
不同的交易类型不应该设置重复的type,系统不允许重复的type进行注册。
系统对扩展的支持:大于100的type

time

交易发生的时间,精确到秒,不做强制限制,取值范围可以是任何uint32内的数字。

txData

用于扩展业务数据,账本不验证txData内容,这里可以存放任何数据。目前NULS内置的交易类型中的业务数据都是存储在txData字段中。业务模块在注册了交易类型后,会提供三个接口来验证和处理txData中的数据(verifyTx,commitTx,rollbackTx)。

CoinData

交易的资产数据,NULS目前定义了一套通用的CoinData格式,具体如下

1
2
froms://List<CoinForm>格式,
tos://List<CoinTo>格式

注:支持多个账户同一笔交易中转出不同资产到不同的账户中

CoinForm结构[40]

1
2
3
4
5
6
address:  //byte[24] 账户地址
assetsChainId://uint16 资产发行链的id
assetsId: //uint16 资产id
amount: //uint128,转出数量
nonce : //byte[8] 交易顺序号,前一笔交易的hash的后8个字节
locked : //byte 是否是锁定状态(locktime:-1),1代表锁定,0代表非锁定

CoinTo结构[44]

1
2
3
4
5
address:  //byte[24],目标地址
assetsChainId://uint16 资产发行链的id
assetsId: //uint16 资产id
amount : //uint128,转账金额
lockTime://uint32,解锁高度或解锁时间,-1为永久锁定

手续费

1
forms-tos剩余的部分就是手续费(模型中支持多种资产缴纳手续费,约束条件由经济模型设计决定)

remark

备注,此内容的数据,会通过utf-8编码转换为字符串显示在浏览器和钱包中。也可以用remark字段进行交易的业务扩展。

sigData

签名数据支持多个账户的签名,每个签名包括四个部分:公钥长度、公钥、签名数据长度、签名数据。

交易的Hash计算

将交易除sigData外的数据进行序列化,获得完整的字节数组。使用Sha-256对数据进行两次计算,得到32位的Hash值。

-------------The End-------------