签名校验

TRON 如何使用基于 secp256k1 的 ECDSA 校验交易签名,以及多签账户如何使用权重阈值。

TRON 上的每笔交易都必须携带一个或多个签名。签名校验用于确认交易确实由对应私钥持有人授权;如果账户配置了多签权限,则需要足够多的授权地址共同达到权限阈值。

节点校验签名时,核心流程如下:

  1. 重新计算 SHA-256(raw_data),得到交易消息哈希。
  2. 使用 secp256k1 ECDSA 从签名中恢复公钥。
  3. 根据恢复出的公钥派生地址。
  4. 检查该地址是否具备本交易所需权限,并在多签场景下累加权重。
📘

前置阅读


签名消息

交易签名的对象是 SHA-256(raw_data)raw_data 包含系统合约体、TAPOS 参考区块、过期时间、fee_limittimestamp 等字段,完整结构参见交易

签名只承诺 raw_data,不包含 signature[] 本身。因此在多签流程中,不同签名人可以依次向 signature[] 追加签名,不会使已有签名失效。


ECDSA 校验

TRON 使用 secp256k1 曲线上的 ECDSA,与 Bitcoin 和 Ethereum 使用的曲线一致。上链签名固定为 65 字节,顺序为 r || s || v

字节内容
0–31r 值,32 字节
32–63s 值,32 字节
64恢复字节 v,1 字节,通常为 01
⚠️

上链字节顺序是 r || s || v

恢复字节 v 在最后。部分以太坊工具会用 v || r || sv + 27 的表示方式;迁移代码时,需要先转换为 r || s || v 再写入 transaction.signature[]。顺序错误会导致恢复出错误地址,签名校验失败。

可恢复签名允许节点只凭消息哈希和签名恢复公钥,无需在交易体中额外携带公钥,从而节省交易字节数。


单签校验

默认权限账户(普通 EOA)通常只需要一个签名。节点会:

  1. 从交易签名中恢复地址。
  2. 检查恢复地址是否与 raw_data.contract 中的 owner_address 一致。

一致则签名有效,交易继续进入后续校验;不一致则交易被拒绝。


多签校验

账户配置多方控制的 Permission 后,交易可能携带多个签名。节点会:

  1. signature[] 中逐个恢复签名地址。
  2. 在目标权限的 keys 列表中查找这些地址。
  3. 累加匹配地址的权重。
  4. 将权重和与该权限的 threshold 对比。

当权重和 >= threshold 时,交易获得授权。

⚠️

多签校验是严格模式

以下任一情况都会直接抛出 PermissionException 并拒绝整笔交易,而不是把异常签名当作 0 权重处理:

  • 签名数量过多signature[] 数量超过该权限的 keys 数量。
  • 未知签名者:恢复出的地址不在目标权限的 keys 列表中。
  • 重复签名者:同一地址在 signature[] 中出现多次。

示例

一个 2-of-3 的 Owner 权限:

threshold = 2
keys:
  - Key1, weight = 1
  - Key2, weight = 1
  - Key3, weight = 1
  • Key1 + 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权限类型说明
0Owner 权限账户最高权限。不显式指定时默认使用该权限。
1Witness 权限只用于超级代表(SR)区块生产签名,不能授权普通转账或合约交易。
2–9Active 权限自定义日常权限,每个账户最多 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在签名满足阈值后广播交易。

相关资源