NULS协议之交易Transaction
原文地址:https://niels.wang/2019/06/16/NULS-Protocol-TX
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格式,具体如下
froms://List<CoinForm>格式,
tos://List<CoinTo>格式
注:支持多个账户同一笔交易中转出不同资产到不同的账户中
CoinForm结构[40]
address: //byte[24] 账户地址
assetsChainId://uint16 资产发行链的id
assetsId: //uint16 资产id
amount: //uint128,转出数量
nonce : //byte[8] 交易顺序号,前一笔交易的hash的后8个字节
locked : //byte 是否是锁定状态(locktime:-1),1代表锁定,0代表非锁定
CoinTo结构[44]
address: //byte[24],目标地址
assetsChainId://uint16 资产发行链的id
assetsId: //uint16 资产id
amount : //uint128,转账金额
lockTime://uint32,解锁高度或解锁时间,-1为永久锁定
手续费
forms-tos剩余的部分就是手续费(模型中支持多种资产缴纳手续费,约束条件由经济模型设计决定)
remark
备注,此内容的数据,会通过utf-8编码转换为字符串显示在浏览器和钱包中。也可以用remark字段进行交易的业务扩展。
sigData
签名数据支持多个账户的签名,每个签名包括四个部分:公钥长度、公钥、签名数据长度、签名数据。
交易的Hash计算
将交易除sigData外的数据进行序列化,获得完整的字节数组。使用Sha-256对数据进行两次计算,得到32位的Hash值。