以下内容是 chatgpt 生成的,还未经过验证,仅作参考。
Transaction 序列化
在 Steem 中,Transaction 的序列化顺序如下:
- 序列化 Transaction 版本号 (UInt16类型,Little Endian 编码);
- 序列化 Transaction 的 expiration 时间 (TimePointSec 类型,Little Endian 编码);
- 序列化 Transaction 中所有操作的数量 (Varint32 类型);
对于 Transaction 中的每个操作:
- 序列化操作的类型 ID (UInt32类型,Little Endian 编码),用于标识操作类型;
- 序列化操作数据 (序列化为字节数组)。
在上述序列化顺序中,Varint32 是一种可变长度的整数类型,它用于序列化 Transaction 中操作的数量。Varint32 的序列化规则如下:
对于小于等于127的整数,序列化为一个字节,该字节的值等于该整数;
对于大于127的整数,序列化为多个字节,每个字节的最高位为1,其余7位用于表示整数的低7位,最后一个字节的最高位为0,其余7位用于表示剩余整数的最高位。
需要注意的是,Transaction 的操作类型 ID 是 Steem 中唯一标识每个操作的方式。每个操作类型都有一个唯一的整数 ID,用于在序列化和反序列化过程中标识该操作类型。在序列化 Transaction 时,需要先序列化操作类型 ID,然后序列化操作数据。在反序列化时,也需要先解析操作类型 ID,然后根据操作类型 ID 解析操作数据。
最后,需要注意的是,在 Steem 中,Transaction 还可以包含一些附加的元数据,如延迟执行时间、参考块号等。这些附加的元数据也需要进行序列化,但它们的序列化顺序可能与操作数据的序列化顺序不同。具体序列化顺序取决于实现方式和应用场景。
Operation 序列化
在 Steem 中,不同类型的 Operation 在序列化时可能具有不同的序列化顺序。一般来说,Operation 的序列化顺序如下:
- 序列化 Operation 的类型 ID (UInt32类型,Little Endian 编码),用于标识该 Operation 类型;
- 序列化 Operation 数据 (序列化为字节数组)。
需要注意的是,不同类型的 Operation 可能具有不同的数据结构和序列化规则。以下是一些常见的 Operation 序列化顺序示例:
转账操作 (Transfer Operation) 的序列化顺序:
- 序列化 Operation 的类型 ID (值为2);
- 序列化 from 账户名 (String类型);
- 序列化 to 账户名 (String类型);
- 序列化 转账金额 (Asset类型);
- 序列化 转账备注 (String类型);
- 序列化 扩展字段 (扩展字段结构体,序列化为字节数组)。
发布帖子操作 (Comment Operation) 的序列化顺序:
- 序列化 Operation 的类型 ID (值为1);
- 序列化 父级帖子 (String类型);
- 序列化 作者 (String类型);
- 序列化 帖子标题 (String类型);
- 序列化 帖子正文 (String类型);
- 序列化 JSON 格式的帖子附加信息 (String类型);
- 序列化 扩展字段 (扩展字段结构体,序列化为字节数组)。
投票操作 (Vote Operation) 的序列化顺序:
- 序列化 Operation 的类型 ID (值为3);
- 序列化 投票人账户名 (String类型);
- 序列化 被投票对象的账户名 (String类型);
- 序列化 投票权重 (Int16类型,Little Endian 编码);
- 序列化 扩展字段 (扩展字段结构体,序列化为字节数组)。
需要注意的是,以上仅是一些常见的 Operation 序列化顺序示例,实际上每个 Operation 的序列化顺序可能不同。在序列化时,需要根据具体的 Operation 类型和序列化规则来确定序列化顺序。