消除盲签风险:EIP-7730实现透明交易签名

本文深入分析Web3生态中的盲签安全问题,介绍EIP-7730如何通过提供JSON清单使硬件钱包能够解析交易数据,将技术参数转换为人类可读格式,从而消除用户盲签风险,提升交易安全性。

立即实施EIP-7730

盲签如何造成不可能的安全负担

最近发生的15亿美元Bybit黑客事件暴露了Web3生态系统中一个关键漏洞,这个漏洞多年来一直被社区忽视。虽然Bybit受攻击的供应链和未在单独设备上验证签名是直接原因,但这一事件突显了影响所有钱包用户(不仅仅是大型交易所)的更广泛安全挑战。

作为行业专业人士,我们必须问:典型用户是否有足够信息来安全验证他们的交易?令人不安的真相是没有。当前期望用户应在多个设备上交叉检查签名对于主流采用来说是不现实的。很少有用户(如果有的话)在签署交易前使用多种验证方法例行验证调用数据。

在这篇文章中,我们将演示dapp开发者如何使用EIP-7730帮助保护用户免受盲签问题的影响,该标准使硬件钱包能够解码交易,并让用户理解他们实际签署的内容。

我们相信支持EIP-7730的dapp将比竞争对手拥有巨大优势。随着涉及盲签的高调黑客攻击事件增加,用户将要求他们选择交互的dapp提供改进的安全保证。

盲签如何造成不可能的安全负担

考虑用户需要为每笔交易遵循的安全步骤:

  • 验证交易调用数据与其在工作站上的预期操作匹配
  • 确认工作站的交易哈希与其硬件钱包上的匹配
  • 在单独工作站上交叉检查交易哈希及其解码调用数据是否与其预期操作对应

虽然在理论上是安全的,但这种多设备验证过程为普通用户创造了不可逾越的障碍,需要几分钟时间在多个设备上严格交叉检查每笔交易。如果我们期望dapp实现主流采用,安全性不能以牺牲可用性为代价。

盲签问题

核心问题在于盲签:要求用户签署他们无法有意义解释的数据。这是因为钱包缺乏将交易数据解码为人类可读格式所需的协议特定知识。每个DeFi协议都有自己独特的智能合约接口和参数结构,但如果没有明确的解释指令,钱包无法理解这些技术参数实际意味着什么。

你会不阅读内容就签署法律合同吗?然而在Web3中,用户经常签署显示为难以理解字符串的加密哈希:

1
0x3b812a5cf28be8e4787e1d1d4d513744966d8684da2f9a51187a79607c1b9fca

用户这样做是因为在与某些协议交互时通常没有替代方案。大多数钱包实现提供原始签名作为所谓更好的选项,即签署非解码格式信息。例如:

1
0x0000000000000000000000008c1ed7e19abaa9f23c476da86dc1577f1ef401f50000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063ae3c1f

然而,为了做出明智的签名决策,用户需要理解关键交易细节:正在转移、交换或存入的确切资金金额,目标地址,正在执行的操作类型,任何相关风险如滑点容忍度或委托权限等。没有这些细节,用户基本上信任他们的工作站向硬件钱包发送非恶意交易,创建了对可能受入侵系统的危险依赖。

这使我们回到最初的盲签问题:用户签署他们无法验证或理解的数据表示。

EIP-712的进步,但还不够

EIP-712最初专门为解决盲签问题而引入,通过提供标准化方式让应用程序在签名前向用户呈现结构化、人类可读的数据。该标准通过定义钱包可以解释和显示的结构化数据格式工作,允许用户查看有组织的字段,如代币金额、接收方地址和操作类型,而不是原始加密数据。该协议通过要求应用程序提供原始交易数据和描述每个数据片段代表什么的结构化模式来实现这一点,使钱包能够向用户呈现有意义的信息。

该标准允许用户验证他们正在签署的各个字段,理论上实现"清晰签名"而不是盲签。

图1:无EIP-712(左)和有EIP-712(右)的Metamask签名请求

虽然EIP-712通过在许多协议中标准化结构化数据签名代表了重大进展,但它仍在关键方面存在不足。Bybit黑客事件清楚地展示了这些限制。尽管支持EIP-712,交易数据对人类验证来说仍然太复杂。在受入侵的交易中,签名输入的某些参数被更改,最关键的是操作类型从0(正常调用)更改为1(委托调用),以及目标地址。

这是他们签署的受入侵信息:

图2:Bybit黑客攻击在Etherscan上签署的受入侵交易

操作类型的这种细微差异完全改变了交易行为,允许攻击者在Safe合约的上下文中执行恶意代码。当面对不提供人类可读上下文的十六进制编码值时,大多数用户几乎不可能检测到这些技术细节。

签名者在其钱包中可能看到的是EIP-712数据结构略有不同的表示。虽然像Trezor Model T这样的一些硬件钱包确实支持EIP-712并能显示结构化消息,但该标准没有解决以人类可读格式呈现嵌套操作的挑战。钱包需要专门知识,知道"数据"参数代表需要进一步解码的调用数据操作。

即使在像MetaMask这样的界面中并排比较时,原始和被篡改的交易也会看起来足够相似,以至于用户没有对底层参数的深入技术理解就很容易将一个误认为另一个。最关键的变化,即操作类型切换到委托调用,在没有专门知识的情况下特别难以识别。

这突显了虽然EIP-712提供了结构,但这些复杂交易必须进一步解码为真正人类可读的格式。没有这额外的解释层,用户仍然有效地盲签他们无法有意义验证的数据。

硬件钱包提供不完整的解决方案

笔记本电脑、手机和计算机都可能被入侵。硬件钱包更安全,因为它们设计仅用于签署交易和保持密钥安全。它们被入侵的机会最小。然而,虽然计算机可以显示丰富的用户界面,但硬件钱包具有非常简单和极简的UX,不能被请求签名的网站修改。然而,硬件钱包除了最简单的交易外没有能力解码任何东西。这是因为它们缺乏解码特定合约函数被调用时会发生什么所需的语义信息。例如,在普通ERC-20上调用transferFrom函数可能与在实施费用转移的合约上调用transferFrom有不同的结果。

像Ledger这样的一些硬件钱包制造商试图通过专用插件解决这个问题。当与支持的协议(如Paraswap)交互时,用户可以将特定应用程序下载到他们的硬件钱包,使他们能够直接在安全设备上查看交易详情,绕过计算机上任何受入侵的信息。

然而,这种方法面临关键的采用差距。在数百个DeFi应用程序中,只有不到200个有专用的Ledger应用程序¹,其中许多是简单钱包而不是dapp。主要DeFi协议明显缺席。

这种有限采用的一个重要因素是开发这些插件所需的重大投资。协议团队经常避免创建硬件钱包集成,因为需要相当多的时间和财务资源。开发、测试和维护这些专业应用程序需要专门的工程人才,并为市场上的每个硬件钱包提供持续支持,许多协议更愿意将这些资源分配给功能开发、流动性激励或其他增长计划。然而,这种成本效益分析未能适当权衡盲签的关键安全影响。

EIP-7730及未来的前进道路

幸运的是,一个有前途的解决方案即将出现。EIP-7730代表了一项关键倡议,通过实现真正的"清晰签名"且协议实现负担最小来消除盲签。

这种方法大大提高了交易验证的效率。由于硬件设备可以直接解析每条消息的内容,并明确说明显示什么和如何显示,用户可以看到人类可读的信息而不是加密乱码。想象看到这些技术数据:

1
2
3
4
uint256 amountIn: 500000000000000000
uint256 amountOutMin: 800000000
uint256 slippageBps: 100
uint256 deadline: 1715157000

在您的硬件钱包屏幕上转换为:用0.5 ETH交换至少800 USDC(1%滑点保护)- 有效期至2024年5月8日上午8:30

这种清晰度的改进通过将技术参数转换为用户实际理解的概念来实现真正知情的同意。

关键的安全优势是这些信息出现在完全隔离的硬件设备上,除非利用硬件钱包本身的漏洞,否则不会被恶意软件入侵。

用户可以更有信心,他们在硬件钱包上看到的正是他们正在签署的内容。没有受入侵的供应链或工作站可以在不改变其语义描述的情况下篡改交易。如果描述不符合他们的期望,他们可以简单地拒绝交易。

使EIP-7730具有革命性的是开发者实现的简单性。协议不需要开发复杂的硬件钱包集成,只需提供JSON文件将其合约列入设备注册表的白名单。这种标准化方法大大阻止了安全签名实践广泛采用的技术障碍。从协议的角度来看,整个实现过程可能简单到提交带有适当JSON文件的拉取请求。

EIP-7730实践

为了演示EIP-7730实现可以多么简单,让我们为基本代币交换函数创建JSON清单。考虑Uniswap V3中的这个Solidity函数:

1
2
3
4
5
6
7
function swapTokensForExactTokens(
    uint amountOut,
    uint amountInMax,
    address[] calldata path,
    address to,
    uint deadline
) external returns (uint[] memory amounts);

使用EIP-712,用户将在钱包上看到结构化但仍然技术性的数据:

1
2
3
4
5
6
7
Domain: Uniswap V3 Router 2
amountOut: 800000000
amountInMax: 800000000000000000000
path: [0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48,
0x6b175474e89094c44da98b954eedeac495271d0f]
to: 0x742d35Cc6634C0532925a3b8D5c5E3e7e7e7e7e7
deadline: 1715157000

虽然这比原始十六进制数据好,但用户仍然需要:

  • 手动将800000000转换为USDC金额
  • 将800000000000000000转换为DAI金额
  • 查找代币地址以了解正在交换的代币
  • 将时间戳转换为可读日期
  • 验证接收方地址是否与其钱包匹配

使用EIP-7730,开发者可以创建简单的JSON清单,将这些技术数据转换为真正人类可读的格式。以下是步骤:

  1. 克隆clear-signing-erc7730-developer-tools仓库
  2. 转到/developer-preview目录
  3. 使用npm i安装依赖项
  4. 创建JSON文件并添加到注册表文件夹
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
{
    "context": {
        "$id": "Uniswap v3 Router 2",
        "contract": {
            "deployments": [
                {
                    "chainId": 1,
                    "address": "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"
                }
            ],
            "abi": "https://github.com/LedgerHQ/ledger-asset-dapps/blob/211e75ed27de3894f592ca73710fa0b72c3ceeae/ethereum/uniswap/abis/0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45.abi.json"
        }
    },

    "metadata": {
        "owner": "Uniswap",
        "info": {
            "legalName": "Uniswap Labs",
            "url": "https://uniswap.org/"
        }
    },

    "display": {
        "formats": {
            "0x42712a67": {
                "$id": "swapTokensForExactTokens",
                "intent": "Swap tokens",
                "fields": [
                    {
                        "path": "amountOut",
                        "label": "Amount to Receive",
                        "format": "tokenAmount",
                        "params": {
                            "tokenPath": "path.[-1]"
                        }
                    },
                    {
                        "path": "amountInMax",
                        "label": "Maximum Amount to Send",
                        "format": "tokenAmount",
                        "params": {
                            "tokenPath": "path.[0]"
                        }
                    },
                    {
                        "path": "to",
                        "label": "Recipient of the output tokens",
                        "format": "addressName",
                        "params": {
                            "sources": ["local"]
                        }
                    },
                    {
                        "path": "deadline",
                        "label": "Valid until",
                        "format": "date"
                    }
                ]
            }
        }
    }
}
  1. 使用npm run dev本地运行
  2. 用户现在看到:图3:实施EIP-7730后Ledger上的UX
  3. 将JSON添加到官方仓库

整个实现过程涉及创建此JSON文件并将其提交到注册表。没有复杂的集成,没有自定义硬件钱包开发,只是一个简单的清单,使您的协议交易人类可读。

这种方法可以扩展到任何协议复杂性,同时保持相同的简单实现模式,使生态系统中的每个dapp都能实现安全签名。

立即实施EIP-7730

在您的协议中消除盲签的道路现在简单易行。作为dapp开发者,您可以在几个小时的实现工作中显著改善用户的安全性和体验。

开始很简单:

  1. 使用Ledger的开发工具:Ledger开发了一个全面的工具,在https://get-clear-signed.ledger.com/简化JSON清单创建。该工具指导您完成整个过程,使即使没有广泛加密专业知识的团队也能实现EIP-7730。

  2. 提交您的集成:一旦您的JSON清单准备好,创建拉取请求将其添加到Ledger注册表仓库https://github.com/LedgerHQ/clear-signing-erc7730-registry。此集中注册表确保可发现性,同时维护安全标准。请注意,注册表所有权将来将过渡到基金会运营模式,类似于以太坊链ID列表,在去中心化和可发现性之间达到最佳平衡。

  3. 专业审查过程:提交后,Ledger的安全团队将在几天内审查您的清单。此审查确保您的实现准确表示交易数据,不隐藏关键信息或使用误导性术语。只有非恶意的、正常运行的清单才会被批准。

  4. 启动清晰签名:一旦您的清单获得批准,清晰签名功能立即为您的协议可用。您的用户将在硬件钱包上看到人类可读的交易详情。

就这样!您通过消除盲签带来的焦虑和恐惧改变了用户的体验,将他们的Web3体验从不确定性转变为真正的信心。

虽然EIP-7730通过消除盲签显著提高了交易安全性,但黑客最直接的攻击向量仍然是利用智能合约本身的漏洞。即使有完美的交易透明度,如果底层协议包含安全缺陷,用户仍然可能损失资金。

如果您不确定智能合约安全状况,Trail of Bits可以提供帮助。我们的团队审计了数百个DeFi协议,可以在漏洞在生产中被利用之前识别它们。联系我们了解我们如何帮助将安全性构建到您的协议中,同时实施EIP-7730以实现全面的用户保护。

¹来源:Ledger Live App(2025年6月6日)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计