如何授权服务器代第三方钱包签名交易且无需获取用户私钥
方案结论
你不需要索要用户私钥,仅靠原生的approve方法无法覆盖全部业务场景,是否需要部署自定义合约完全取决于你的业务需求:
仅需要服务器代转ERC20/ERC721类资产:无需额外部署合约
原生的approve方法刚好能满足这个场景的需求,流程如下:
- 前端引导用户连接自己的EOA钱包
- 用户调用对应代币合约的
approve方法,授权你的服务器控制的链上地址为可花费方,按需设置授权额度/授权有效期 - 服务器监听到触发条件后,用自身持有的私钥签名调用代币合约的
transferFrom方法,即可完成用户资产的转移,全程不接触用户私钥
需要服务器代用户执行任意链上操作:必须部署自定义合约
如果你需要服务器代用户执行除了代币转移之外的操作(比如调用其他合约方法、mint NFT、触发业务逻辑等),approve完全无法满足需求,需要基于*会话密钥(Session Key)*方案部署自定义合约,主流实现逻辑如下:
- 部署支持授权白名单的用户钱包代理合约,也可以直接用符合ERC-4337标准的账户抽象合约
- 用户前端连接钱包后,用自身私钥签名授权消息,给你的服务器地址授予指定有效期、指定操作范围的执行权限,将授权信息上链存入代理合约
- 服务器监听到触发条件后,用自身私钥签名交易调用用户的代理合约,合约校验服务器地址的授权有效后,自动执行对应操作
- 全程用户仅需完成一次授权签名,后续所有操作由服务器自主发起,不需要用户二次交互,也不会泄露用户私钥
注意事项
你原预想流程中「授权服务器代其钱包签名交易」的描述存在认知偏差:用户的EOA钱包私钥仅用户自身持有,没有任何方案能让第三方代EOA地址生成合法签名,所有代执行方案的本质都是将操作权限托管到链上合约,给服务器地址开放合约层面的执行权限,而非真的让服务器获得用户钱包的签名权。
内容的提问来源于stack exchange,提问作者r.beer
相关产品推荐
相关产品推荐

