阈值签名在EVM区块链上如何拥有固定地址/公钥?相关技术疑问
关于EVM上TSS阈值签名的核心疑问解答
你的初始理解修正
先直接纠正两个关键误解:
- TSS钱包不需要依赖链上智能合约作为地址,它可以直接对应一个标准EOA(外部拥有账户)地址,和普通外部账户完全兼容,无需额外合约验证逻辑。
- 两方TSS场景下完全可以离线生成合法的EOA地址,不需要第三方合约授权。
关键原理拆解
1. TSS如何生成固定EOA地址?
TSS的核心是密码学秘密共享机制:
- 多方在离线状态下,通过安全的密钥生成协议(如GG18、DKG)共同计算出共享的私钥分片,但整个过程中从未出现完整私钥。
- 这个共享私钥对应的公钥是固定的,按照EVM标准由公钥推导的EOA地址(
keccak256(公钥[1:])[-20:])自然也是固定的,和普通EOA地址生成规则完全一致。
2. TSS签名的验证逻辑(无需合约)
当需要签名交易时,各方用自己的私钥分片执行签名协议,最终合成一个标准ECDSA签名(和普通EOA签名格式完全相同)。
- 这个签名可以直接被EVM内置的
ecrecover函数验证,不需要额外智能合约——因为它本质上就是对应那个固定EOA地址的合法签名,和普通用户用私钥签出的结果没有任何区别。
3. 无完整私钥能否生成对应同一地址的签名?
完全可以。以下是两方TSS的极简流程示例:
密钥生成阶段
- 方A生成随机数
a,计算公钥分片A = a*G(G为椭圆曲线基点),安全发送给方B; - 方B生成随机数
b,计算公钥分片B = b*G,安全发送给方A; - 双方共同计算总公钥
P = A + B = (a+b)*G,对应的EOA地址为addr = keccak256(P[1:])[-20:],此时双方都不知道完整私钥a+b。
签名阶段
- 签署消息
m时,方A计算临时公钥r1 = k1*G(k1为临时随机数),发送给方B; - 方B计算临时公钥
r2 = k2*G,发送给方A; - 双方计算合并后的临时公钥
R = r1 + r2,再分别计算签名分片:s1 = k1^{-1}(hash(m) + r*a) mod n、s2 = k2^{-1}(hash(m) + r*b) mod n(n为椭圆曲线阶); - 最终合成完整签名
s = (s1^{-1} + s2^{-1})^{-1} mod n,得到标准ECDSA签名(R, s); - 用EVM的
ecrecover验证时,会从签名恢复出公钥P,对应地址就是之前生成的固定addr。
整个过程中没有任何一方拥有完整私钥,但最终签名完全符合EVM的验证标准,对应固定的EOA地址。
TSS vs 多签(MultiSig)的核心区别
- 多签是基于智能合约的逻辑,需要部署合约作为钱包地址,签名是多个EOA的签名集合,由合约验证签名数量是否达标;
- TSS是纯密码学层的解决方案,钱包地址是标准EOA,签名是单一的标准ECDSA签名,和普通账户无差异,不需要链上合约。
内容的提问来源于stack exchange,提问作者Anters Bear
相关产品推荐
相关产品推荐

