浅谈以太坊元交易的新型授权钓鱼风险

一、什么是元交易

设想这样一个场景:你被DeFi的高收益所吸引,所以决定将交易所里的USDC全部提到钱包,然后投入到DeFi中,在提现完成后,你钱包确实收到了USDC,但你发现你不能完成任何链上操作,不能交易,不能质押。所以,你又需要重新从交易所中购买一些ETH再提到钱包….

在常规情况下,用户想要在区块链上发布一笔交易,需要账户内有足够的的原生代币(native coin,ETH、BTC这类)作为交易手续费,然后才能上链。而在使用元交易的情况下,用户可以不用自己发布交易,转而委托中继者(relay)代为发布,这样自然也就不需要用户自己有足够的的原生代币。

要实现交易委托,需要目标智能合约支持元交易,实现的方式一般是使用消息签名技术,使用钱包进行签名是不需要任何手续费的,因为这完全是链下行为,用户构造相应的元交易数据,并签名,然后将这些信息发送给中继者,接着中继者再对目标合约进行调用,并附带数据与签名,目标合约收到这些信息后进行验证后再执行相应的业务。

有一点要搞明白,元交易虽然是GasLess(免gas)的,但并不代表无需手续费,是否需要付出手续费,以及付出何种资产作为手续费,主要取决于中继者,一般来说,可以用主流token支付,所以你需要再签署一笔向中继者支付手续费的元交易。

总而言之,元交易的本质是一组信息凭证,是用户期望行为的一种证明,且具有真实的可执行力,第三方可以拿这些信息替用户执行想要执行的动作。

二、ERC20-permit(EIP-2612)

场景继续:当你准备购买ETH作为手续费时,你突然发现,USDC居然支持元交易,只需要签署一则消息即可完成授权,简直不要太方便!

ERC20是在以太坊上面创建token的实现标准,但是它并不支持元交易,如果token需要支持授权元交易,则需要按照EIP-2612的规范来进行扩展,如下:

新增了3个函数:

function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external
function nonces(address owner) external view returns (uint)
function DOMAIN_SEPARATOR() external view returns (bytes32)
  • permit函数:一般由中继者调用,负责验证参数与签名是否相符,然后进行授权(approve)操作
  • nonces函数:返回指定用户的nonce,在每次permit之后,nonce递增,为了防止一笔元交易被重复执行
  • DOMAIN_SEPARATOR函数:根据chainId、合约地址等信息生成一个唯一散列,防止一笔元交易在其他EVM链(ETC、BSC等)上被重放

最重要的是permit函数,所以看一下这个函数的具体实现,这里参考uniswap:

https://github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2ERC20.sol

function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');
        _approve(owner, spender, value);
    }

很短几行代码,可以看到,在进行了验签以及其他检测后,会执行授权操作,所以整个流程其实很简单,用户完成链下签名,中继进行链上调用,仅此而已。

三、 隐患

场景最后:钱包弹出了”请求签名“,上面的信息你有些看不懂,但是钱包并没有任何警告信息,也不用花钱,你很轻易的完成了确认,两分钟后,你钱包里的USDC全都消失了…

毫无疑问,与approve授权钓鱼类似,元交易也是存在钓鱼风险的,只要窃取到了签名,就窃取到了授权,更加危险,更容易中招,相对来说,元交易钓鱼目前存在以下”优势“

1、主流币种支持

虽然元交易尚未普及,但也有不少主流币种支持了ERC20-permit:

  1. USDC
  2. DAI
  3. UNI
  4. 1INCH
  5. ENS

2、警告信息缺失

相对于approve授权钓鱼,钱包对于元交易授权的警告几乎没有,以下测试了最新版本的主流钱包告警情况

MetaMask,无特别提醒

TokenPocket,无特别提醒,签名内容未处理

imtoken,无特别提醒

3、隐蔽性强

传统的授权钓鱼会在链上留下approve记录,而元交易钓鱼完全是链下行为,却又能够影响链上,对于元交易签名已泄露的用户来说,是一个定时炸弹,而且还不自知。

4、成本低廉

对于需要上链的操作,由于操作成本等原因,用户会相对谨慎,但对于链下签名,就会放松很多了,且无需成本,用户也很难会意识到签名操作也会影响到资产安全。

5、难以理解

除了基于EIP-2612实现的ERC20授权元交易外,还有很多项目方自己设计的元交易实现,而这些实现是非标准的,所以也无法被钱包所理解,并形成相应的警告,用户也很难理解其中含义。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/289795.html<

(0)
运维的头像运维
上一篇2025-05-16 23:08
下一篇 2025-05-16 23:10

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注