#LibraWallet
##APP密码、助记词加密解密模块
方案: AES-256-CBC + PKCS7填充,结果Base64输出
密钥key的32字节HEX:
0000000000000000000000000000000000000000000000000000000000000000
偏移量iv的16字节HEX:
30313030313030313030313030313038
填充方式padding:
PKCS7
###一、Argument类型
####1.U64(此处需要注意,金额需要*1000000,单位才是Libra) 类型
00000000
4个字节类型 + 8个字节金额 = 12个字节
例:1 Libra
0000000040420f0000000000
####2.Address 类型
01000000
4个字节类型 + 4个字节地址长度 + 地址 = (4 + 4 + 地址长度)个字节
例:4fddcee027aa66e4e144d44dd218a345fb5af505284cb03368b7739e92dd6b3c
01000000200000004fddcee027aa66e4e144d44dd218a345fb5af505284cb03368b7739e92dd6b3c
####3.String 类型
02000000
4个字节类型 + 4个字节Bytes长度 + Bytes = (4 + 4 + Bytes长度)个字节
例:2c25991785343b23ae073a50e5fd809a2cd867526b3c1db2b0bf5d1924c693ed
01000000200000002C25991785343B23AE073A50E5FD809A2CD867526B3C1DB2B0BF5D1924C693ED
####4.Bytes 类型
03000000
4个字节类型 + 4个字节Bytes长度 + Bytes = (4 + 4 + Bytes长度)个字节
例: cafed00d
0300000004000000CAFED00D
###二、AccessPath类型 ####WriteType #####1.Deletion 类型
00000000
#####2.Value
类型
01000000
例:cafed00d
0100000004000000CAFED00D
4个字节类型 + 4个字节Address长度 + Address + 4个字节Path长度 + Path + WriteType = (4 + 4 + Address长度 + 4 + Path长度 + WriteType)个字节
例:
[
(
AccessPath {
address: a71d76faa2d2d5c3224ec3d41deb293973564a791e55c6782ba76c2bf0495f9a,
path: 01217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc97
},
Deletion
),
(
AccessPath {
address: c4c63f80c74b11263e421ebf8486a4e398d0dbc09fa7d4f62ccdb309f3aea81f,
path: 01217da6c6b3e19f18
},
cafed00d
)
]
010000000200000020000000A71D76FAA2D2D5C3224EC3D41DEB293973564A791E55C6782BA76C2BF0495F9A2100000001217DA6C6B3E19F1825CFB2676DAECCE3BF3DE03CF26647C78DF00B371B25CC970000000020000000C4C63F80C74B11263E421EBF8486A4E398D0DBC09FA7D4F62CCDB309F3AEA81F0900000001217DA6C6B3E19F180100000004000000CAFED00D
###三、Payload ####1.Program 类型
00000000
Code为move脚本编译生成
4个字节类型 + 4个字节Code长度 + Code + 4个字节Arguments数量 + Argument1 + ··· + Argumentn + 4个字节Modules数量 + Module1 + ··· + Modulen
例:
Program {
code: "4c49425241564d0a010007014a00000004000000034e000000060000000d54000000060000000e5a0000000600000005600000002900000004890000002000000008a90000000f00000000000001000200010300020002040200030204020300063c53454c463e0c4c696272614163636f756e74046d61696e0f7061795f66726f6d5f73656e6465720000000000000000000000000000000000000000000000000000000000000000000100020004000c000c0113010102",
args: [{u64: 1}, {address: 4fddcee027aa66e4e144d44dd218a345fb5af505284cb03368b7739e92dd6b3c}],
modules: [],
}
00000000b80000004c49425241564d0a010007014a00000004000000034e000000060000000d54000000060000000e5a0000000600000005600000002900000004890000002000000008a90000000f00000000000001000200010300020002040200030204020300063c53454c463e0c4c696272614163636f756e74046d61696e0f7061795f66726f6d5f73656e6465720000000000000000000000000000000000000000000000000000000000000000000100020004000c000c01130101020200000001000000200000004fddcee027aa66e4e144d44dd218a345fb5af505284cb03368b7739e92dd6b3c00000000405489000000000000000000
####2.WriteSet 类型
01000000
4个字节类型 + 4个字节WriteSet数量 + WriteSet1 + ··· + WriteSetn
###四、Raw_Transaction
4个字节发送人地址长度 + 发送人地址 + 8个字节Sequence数量 + Payload + 8个字节maxGasAmount + 8个字节gasUnitPrice + 8个字节expirationTime
例:
{
sender: 65e39e2e6b90ac215ec79e2b84690421d7286e6684b0e8e08a0b25dec640d849,
sequence_number: 0,
payload: Program {
code: "4c49425241564d0a010007014a00000004000000034e000000060000000d54000000060000000e5a0000000600000005600000002900000004890000002000000008a90000000f00000000000001000200010300020002040200030204020300063c53454c463e0c4c696272614163636f756e74046d61696e0f7061795f66726f6d5f73656e6465720000000000000000000000000000000000000000000000000000000000000000000100020004000c000c0113010102",
args: [{u64: 9}, {address: 4fddcee027aa66e4e144d44dd218a345fb5af505284cb03368b7739e92dd6b3c}],
modules: [],
} ,
max_gas_amount: 140000,
gas_unit_price: 0,
expiration_time: 0 seconds
}
2000000065e39e2e6b90ac215ec79e2b84690421d7286e6684b0e8e08a0b25dec640d849000000000000000000000000b80000004c49425241564d0a010007014a00000004000000034e000000060000000d54000000060000000e5a0000000600000005600000002900000004890000002000000008a90000000f00000000000001000200010300020002040200030204020300063c53454c463e0c4c696272614163636f756e74046d61696e0f7061795f66726f6d5f73656e6465720000000000000000000000000000000000000000000000000000000000000000000100020004000c000c01130101020200000001000000200000004fddcee027aa66e4e144d44dd218a345fb5af505284cb03368b7739e92dd6b3c00000000405489000000000000000000e02202000000000000000000000000000000000000000000
###五、Sign ####Sign过程
待签名字节流第一部分 Salt: 46f174df6ca8de5ad29745f91584bb913e7df8dd162e3e921a5c1d8637c88d16
待签名字节流第二部分: Raw_Transaction
sha3_256加密 -> ED25519算法签名 -> 签名后数据
未签名Raw_Transaction + 4个字节公钥长度 + 公钥 + 4个字节签名长度 + 签名 例:
{
sender: b8c39fc6910816ad21bc2be4f7e804539e7529b7b7d188c80f093e1e61f192cf,
sequence_number: 0,
payload: Program {
code: "4c49425241564d0a010007014a00000004000000034e000000060000000d54000000060000000e5a0000000600000005600000002900000004890000002000000008a90000000f00000000000001000200010300020002040200030204020300063c53454c463e0c4c696272614163636f756e74046d61696e0f7061795f66726f6d5f73656e6465720000000000000000000000000000000000000000000000000000000000000000000100020004000c000c0113010102",
args: [{u64: 9}, {address: 4fddcee027aa66e4e144d44dd218a345fb5af505284cb03368b7739e92dd6b3c}],
modules: [],
} ,
max_gas_amount: 140000,
gas_unit_price: 0,
expiration_time: 0 seconds
}
2aa80320000000b8c39fc6910816ad21bc2be4f7e804539e7529b7b7d188c80f093e1e61f192cf000000000000000000000000b80000004c49425241564d0a010007014a00000004000000034e000000060000000d54000000060000000e5a0000000600000005600000002900000004890000002000000008a90000000f00000000000001000200010300020002040200030204020300063c53454c463e0c4c696272614163636f756e74046d61696e0f7061795f66726f6d5f73656e6465720000000000000000000000000000000000000000000000000000000000000000000100020004000c000c01130101020200000001000000200000004fddcee027aa66e4e144d44dd218a345fb5af505284cb03368b7739e92dd6b3c00000000405489000000000000000000e022020000000000000000000000000000000000000000002000000035b91d2d8ffb743b208b83c15def3bcf68dad9f0a7174f6b6a52156db36c4144400000002cec5fd134657afe96846b6b7e5f575be5086bbbaf9edec71d136472ff1556a8ffff4a062e2d6e7725b6c338c240639c57d8c710660202154bed227d0d726a06
010000002100000001217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc978d00000020000000b8c39fc6910816ad21bc2be4f7e804539e7529b7b7d188c80f093e1e61f192cf00a8e6cf00000000000700000000000000200000003b07b78954be13a5bc5cb2e0eaf48312a85d864091d5cb5faee296d5248d89df0400000000000000200000003f486909a2abd12a387797d9d1f78496c95b7d3878767a56dafe8f2260e5144d0400000000000000
1.读取前4个字节,获取数据数量
01000000
结果为1
2.读取4个字节,获取类型长度
210000000
结果为33
3.读取33个字节数据,获取类型
01217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc97
4.读取4个字节数据,获取第一组数据长度
8d000000
结果为141
5.读取141个字节,获取第一组数据
20000000b8c39fc6910816ad21bc2be4f7e804539e7529b7b7d188c80f093e1e61f192cf00a8e6cf00000000000700000000000000200000003b07b78954be13a5bc5cb2e0eaf48312a85d864091d5cb5faee296d5248d89df0400000000000000200000003f486909a2abd12a387797d9d1f78496c95b7d3878767a56dafe8f2260e5144d0400000000000000
6.读取4个字节,获取地址长度
20000000
结果为32
7.读取32个字节数据,获取地址
b8c39fc6910816ad21bc2be4f7e804539e7529b7b7d188c80f093e1e61f192cf
8.读取8个字节数据,获取余额
00a8e6cf00000000
结果为3488
9.读取1个字节数据,获取delegatedWithdrawalCapability状态
00
结果为0
10.读取8个字节数据,获取总接收数
0700000000000000
结果为7
11.读取4个字节数据,获取接收接收事件长度
20000000
结果为32
12.读取32个字节,获取接收事件
3b07b78954be13a5bc5cb2e0eaf48312a85d864091d5cb5faee296d5248d89df
13.读取8个字节,获取总发送数
0400000000000000
结果为4
14.读取4个字节,获取发送事件长度
20000000
15.读取32个字节,获取发送事件
3f486909a2abd12a387797d9d1f78496c95b7d3878767a56dafe8f2260e5144d
16.读取最后8个字节,获取SequenceNumber
0400000000000000
结果为4