签名校验
TRON 如何使用基于 secp256k1 的 ECDSA 校验交易签名,以及多签账户如何使用权重阈值。
TRON 上的每笔交易都必须携带一个或多个签名。签名校验用于确认交易确实由对应私钥持有人授权;如果账户配置了多签权限,则需要足够多的授权地址共同达到权限阈值。
节点校验签名时,核心流程如下:
- 重新计算
SHA-256(raw_data),得到交易消息哈希。 - 使用 secp256k1 ECDSA 从签名中恢复公钥。
- 根据恢复出的公钥派生地址。
- 检查该地址是否具备本交易所需权限,并在多签场景下累加权重。
前置阅读
签名消息
交易签名的对象是 SHA-256(raw_data)。raw_data 包含系统合约体、TAPOS 参考区块、过期时间、fee_limit 和 timestamp 等字段,完整结构参见交易。
签名只承诺 raw_data,不包含 signature[] 本身。因此在多签流程中,不同签名人可以依次向 signature[] 追加签名,不会使已有签名失效。
ECDSA 校验
TRON 使用 secp256k1 曲线上的 ECDSA,与 Bitcoin 和 Ethereum 使用的曲线一致。上链签名固定为 65 字节,顺序为 r || s || v:
| 字节 | 内容 |
|---|---|
0–31 | r 值,32 字节 |
32–63 | s 值,32 字节 |
64 | 恢复字节 v,1 字节,通常为 0 或 1 |
上链字节顺序是r || s || v恢复字节
v在最后。部分以太坊工具会用v || r || s或v + 27的表示方式;迁移代码时,需要先转换为r || s || v再写入transaction.signature[]。顺序错误会导致恢复出错误地址,签名校验失败。
可恢复签名允许节点只凭消息哈希和签名恢复公钥,无需在交易体中额外携带公钥,从而节省交易字节数。
单签校验
默认权限账户(普通 EOA)通常只需要一个签名。节点会:
- 从交易签名中恢复地址。
- 检查恢复地址是否与
raw_data.contract中的owner_address一致。
一致则签名有效,交易继续进入后续校验;不一致则交易被拒绝。
多签校验
账户配置多方控制的 Permission 后,交易可能携带多个签名。节点会:
- 从
signature[]中逐个恢复签名地址。 - 在目标权限的
keys列表中查找这些地址。 - 累加匹配地址的权重。
- 将权重和与该权限的
threshold对比。
当权重和 >= threshold 时,交易获得授权。
多签校验是严格模式以下任一情况都会直接抛出
PermissionException并拒绝整笔交易,而不是把异常签名当作 0 权重处理:
- 签名数量过多:
signature[]数量超过该权限的keys数量。- 未知签名者:恢复出的地址不在目标权限的
keys列表中。- 重复签名者:同一地址在
signature[]中出现多次。
示例
一个 2-of-3 的 Owner 权限:
threshold = 2
keys:
- Key1, weight = 1
- Key2, weight = 1
- Key3, weight = 1Key1 + Key3签名:权重和为 2,通过。- 只有
Key1签名:权重和为 1,不足阈值。 Key1 + 未知私钥签名:未知签名者触发PermissionException。Key1 + Key1重复签名:触发重复签名错误。
非对称权重也很常见:
threshold = 3
keys:
- Founder, weight = 2
- Partner1, weight = 1
- Partner2, weight = 1这类配置要求 Founder + 任意一位 Partner 才能通过;两位 Partner 单独签名的权重和只有 2,不能满足阈值。
权限选择
多签交易通过 raw_data.contract 中的 Permission_id 声明使用哪个权限:
Permission_id | 权限类型 | 说明 |
|---|---|---|
0 | Owner 权限 | 账户最高权限。不显式指定时默认使用该权限。 |
1 | Witness 权限 | 只用于超级代表(SR)区块生产签名,不能授权普通转账或合约交易。 |
2–9 | Active 权限 | 自定义日常权限,每个账户最多 8 个。 |
节点会按 Permission_id 查找对应权限,再执行多签权重校验。对于任何 Permission_id != 0 的普通交易,链上权限类型必须是 Active;如果把 Permission_id = 1 的 Witness 权限用于普通合约调用,节点会返回 "Permission type is wrong!"。
Active 权限还带有 operations 位图,用于限制该权限可签署哪些系统合约类型。若交易类型不在位图授权范围内,节点会以 "Permission denied!" 拒绝交易。
交易撤销与失效
TRON 没有原生的“取消已广播交易”操作。多签交易如果中途放弃,通常直接等待其 expiration 过期即可。默认过期时间约 60 秒,最长不超过 24 小时。
API
| API | 说明 |
|---|---|
wallet/getsignweight | 查询部分签名交易当前已收集的签名权重。 |
wallet/getapprovedlist | 列出当前交易中已经通过校验的签名地址。 |
wallet/broadcasttransaction | 在签名满足阈值后广播交易。 |
相关资源
Updated 26 days ago