原标题:What I would love to see in a wallet作者:Vitalik,以太坊创始人;编译:邓通,特别感谢 Liraz Siri、Yoav Weiss 以及 Im
原标题:What I would love to see in a wallet
作者:Vitalik,以太坊创始人;编译:邓通,
特别感谢 Liraz Siri、Yoav Weiss 以及 ImToken、Metamask 和 OKX 开发人员的反馈和审核。
以太坊基础设施堆栈的一个关键层是钱包,但经常被核心 L1 研究人员和开发人员低估。钱包是用户和以太坊世界之间的窗口,用户只能从以太坊及其应用程序提供的任何去中心化、审查阻力、安全、隐私或其他属性中受益,前提是钱包本身也具有这些属性。
最近,我们看到以太坊钱包在改善用户体验、安全性和功能方面取得了很大进展。这篇文章的目的是给出我自己对理想的以太坊钱包应具备的一些特性的看法。这并不是一个完整的列表;它反映了我的密码朋克倾向,它专注于安全和隐私,并且几乎可以肯定它在用户体验方面是不完整的。然而,我认为愿望清单在优化用户体验方面不如简单地根据反馈进行部署和迭代有效,因此我认为关注安全和隐私属性是最有价值的。
现在有一个越来越详细的改善跨L2用户体验的路线图,该路线图有短期部分和长期部分。在这里,我将谈论短期部分:即使在今天理论上仍然可以实施的想法。
核心思想是 (i) 内置跨 L2 发送,以及 (ii) 链特定地址和支付请求。您的钱包应该能够为您提供一个地址(遵循本 ERC 草案的风格),如下所示:
当某人(或某些应用程序)向您提供这种格式的地址时,您应该能够将其粘贴到钱包的“收件人”字段中,然后单击“发送”。钱包应该以任何可能的方式自动处理发送的数据:
如果您在目标链上已经有足够的所需类型的代币,请直接发送代币;
如果您在另一条链(或多个其他链)上有所需类型的代币,请使用 ERC-7683(实际上是跨链 DEX)等协议来发送代币;
如果您在同一条链或其他链上有不同类型的代币,请使用去中心化交易所将它们转换为正确链上的正确类型的代币并发送它们。这应该需要用户的明确许可:用户将看到他们支付了多少费用,以及接收者收到了多少费用。
具有跨链地址支持的可能钱包接口的模型
上述内容适用于“您复制粘贴一个地址(或 ENS,例如,[email protected])以便某人向您付款”的用例。如果 dapp 请求存款(例如,参见 Polymarket 示例),那么理想的流程是扩展 web3 API 并允许 dapp 发出特定于链的支付请求。然后,您的钱包将能够以任何需要的方式满足该请求。要使用户体验良好,还需要标准化 getAvailableBalance 请求,并且钱包需要认真考虑默认将用户资产存储在哪些链上,以最大程度地提高安全性和转账便利性。
特定于链的支付请求也可以放入二维码中,移动钱包可以扫描二维码。在面对面(或在线)消费者支付场景中,接收者将发出 QR 码或 web3 API 调用,表示“我想要链 Z 上的 X 单位代币 Y,带有参考 ID 或回调 W”,钱包将可以以任何可能的方式自由地满足该请求。另一种选择是索赔链接协议,其中用户的钱包生成一个二维码或 URL,其中包含从其链上合约中索赔一定数量资金的授权,接收者的工作就是弄清楚如何将这些资金转移到他们的账户上。
另一个相关主题是Gas支付。如果您在还没有 ETH 的 L2 上收到资产,并且需要在该 L2 上发送交易,钱包应该能够自动使用协议(例如 RIP-7755)来支付链上的 Gas你有 ETH 的地方。如果钱包希望你将来在 L2 上进行更多交易,它也应该只使用 DEX 来发送。价值几百万 Gas 的 ETH,以便未来的交易可以直接在那里花费 Gas(因为这样更便宜)。
我对帐户安全挑战的概念化的一种方式是,一个好的钱包应该同时在两个方面发挥作用:(i)保护用户免受钱包开发人员的黑客攻击或恶意攻击,以及(ii)保护用户免受自己的错误的影响。
左边的“错误”是无意的。然而,当我看到它时,我意识到它非常适合上下文,所以我决定保留它。
十多年来,我首选的解决方案是社交恢复和带有分级访问控制的多重签名钱包。用户的帐户有两层密钥:主密钥和 N 个监护人(例如 N = 5)。主键是能够进行低价值和非财务操作。大多数监护人需要执行 (i) 高价值操作,例如发送帐户中的全部价值,或 (ii) 更改主密钥或任何监护人。如果需要,可以允许主键通过时间锁执行高价值操作。
以上是基本设计,可以进行扩展。会话密钥和 ERC-7715 等权限机制可以帮助支持不同应用程序的便利性和安全性之间的不同平衡。更复杂的监护人架构,例如在不同阈值下具有多个时间锁定持续时间,可以帮助最大限度地提高成功恢复合法帐户的机会,同时最大限度地降低盗窃风险。
对于经验丰富的加密货币用户社区中的经验丰富的加密用户来说,一个可行的选择是您的朋友和家人的密钥。如果您要求每个人为您提供一个新的地址,那么没有人需要知道他们是谁 —— 事实上,您的监护人甚至不需要知道彼此是谁。如果他们没有向你通风报信,他们串通一气的可能性很小。然而,对于大多数新用户来说,此选项不可用。
第二种选择是机构监护人:专门提供服务的公司,只有在他们得到来自您的请求的其他确认时才会签署交易。一个确认码,或为高价值用户一个视频通话。很长一段时间以来,人们一直在尝试制作这些东西。我在2013年介绍了CryptoCorp。然而,到目前为止,这类公司还不是很成功。
第三种选择是多种个人设备(例如手机、桌面、硬件钱包)。这是可行的,但对于没有经验的用户来说,设置和管理起来也很困难。同时还有设备丢失或被盗的风险,尤其是当它们位于同一位置时。
最近,我们开始看到越来越多的基于密钥的钱包。密码只能备份在你的设备上,使它们成为一种个人设备解决方案,或者备份在云中,使它们的安全性依赖于密码安全、机构和可信硬件假设的复杂混合。实际上,对于普通用户来说,密钥是一种有价值的安全增益,但它们本身不足以保护用户的毕生积蓄。
幸运的是,有了 ZK-SNARK,我们还有第四种选择:ZK 包装的中心化 ID。这种类型包括 zk-email、Anon Aadhaar、Myna Wallet 等等。基本上,您可以采用多种形式(公司或政府)中心化 ID,并将其转换为以太坊地址,您只能通过生成证明拥有中心化 ID 的 ZK-SNARK 来发送交易。
有了这个补充,我们现在有了广泛的选择,并且 ZK 包装的中心化 ID 具有独特的“新手友好性”。
为此,它需要通过简化且集成的 UI 来实现:您应该能够仅指定您想要“[email protected]”作为监护人,并且它应该自动生成相应的 zk-email 以太坊地址在引擎盖下。高级用户应该能够将他们的电子邮件(以及可能保存在该电子邮件中的隐私盐值)输入到开源第三方应用程序中,并确认生成的地址是正确的。对于任何其他受支持的监护人类型也应该如此。
可能的安全界面模型
请注意,如今 zk-email 面临的一个实际挑战是它依赖于 DKIM 签名,该签名使用每隔几个月轮换一次的密钥,并且这些密钥本身并未由任何其他机构签名。这意味着如今的 zk-email 具有超出提供商本身的某种程度的信任要求;如果 zk-email 在受信任的硬件内使用 TLSNotary 来验证更新的密钥,则可以减少这种情况,但这并不理想。希望电子邮件提供商能够开始直接签署其 DKIM 密钥。今天,我建议一位监护人使用 zk-email,但不建议大多数监护人使用:不要将资金存储在 zk-email 损坏意味着您无法使用资金的设置中。
新用户实际上不希望在第一次注册体验中输入大量监护人。因此,钱包应该为他们提供一个非常简单的选择。一种自然的途径是在其电子邮件地址上使用 zk-email、本地存储在用户设备上的密钥(可能是万能密钥)以及提供商持有的备份密钥,进行 2-of-3 的选择。随着用户变得更有经验或积累更多资产,在某些时候应该提示他们添加更多监护人。
钱包集成到应用程序中是不可避免的,因为试图吸引非加密用户的应用程序不希望用户同时下载两个新应用程序(应用程序本身,加上以太坊钱包)带来混乱的用户体验。然而,许多应用程序钱包的用户应该能够将他们的所有钱包链接在一起,这样他们就只需担心一个“访问控制问题”。最简单的方法是采用分层方案,其中有一个快速的“链接”过程,允许用户将其主钱包设置为所有应用内钱包的监护人。 Farcaster 客户端 Warpcast 已经支持这一点:
默认情况下,您的 Warpcast 帐户的恢复由 Warpcast 团队控制。但是,您可以“接管”您的 Farcaster 帐户,并将恢复更改为您自己的地址。
除了帐户安全之外,当今的钱包还做了很多工作来识别虚假地址、网络钓鱼、诈骗和其他外部威胁,并尽力保护用户免受此类威胁。与此同时,许多对策仍然相当原始:例如,要求点击才能将 ETH 或其他代币发送到任何新地址,无论您发送的是 100 美元还是 100,000 美元。在这里,不存在单一的灵丹妙药。这是针对不同类别威胁的一系列缓慢的持续修复和改进。然而,继续努力改进这里有很多价值。
现在是时候开始更加认真地对待以太坊的隐私了。 ZK-SNARK技术现在已经非常先进,不依赖后门来降低监管风险的隐私技术(例如隐私池)越来越成熟,而像Waku和ERC-4337 mempools这样的二级基础设施也慢慢变得更加稳定。然而,到目前为止,在以太坊上进行私人转账需要用户明确下载并使用“隐私钱包”,例如 Railway(或用于隐形地址的 Umbra)。这增加了极大的不便,也减少了愿意进行私人转账的人数。解决方案是私人转账需要直接集成到钱包中。
一个简单的实现如下。钱包可以将用户资产的一部分作为“私人余额”存储在隐私池中。用户进行转账时,会先自动退出隐私池。如果用户需要接收资金,钱包可以自动生成一个隐形地址。
此外,钱包可以自动为用户参与的每个应用程序生成一个新地址(例如,defi 协议)。存款将来自隐私池,提款将直接进入隐私池。这允许用户在任何一个应用程序中的活动与其在其他应用程序中的活动取消链接。
该技术的一个优点是,它不仅是保护隐私的资产转移的自然途径,也是保护隐私的身份的自然途径。身份已经发生在链上:任何使用身份证明门控的应用程序(例如 Gitcoin Grants)、任何代币门控聊天、以太坊遵循协议等等都是链上身份。我们希望这个生态系统也能保护隐私。这意味着用户的链上活动不应收集在一个地方:每个项目都应单独存储,并且用户的钱包应该是唯一具有“全局视图”的东西,可以同时看到您的所有证明。原生的每用户多账户生态系统有助于实现这一目标,EAS 和 Zupass 等链下证明协议也是如此。
这代表了中期内以太坊隐私的务实愿景。尽管可以在 L1 和 L2 引入一些功能以使隐私保护传输更加高效和可靠,但它现在就可以实现。一些隐私倡导者认为,唯一可以接受的事情是所有事物的完全隐私:加密整个 EVM。我认为这可能是理想的长期结果,但它需要对编程模型进行更根本的重新思考,而且目前还没有达到准备在以太坊上部署的成熟水平。我们确实需要默认隐私以获得足够大的匿名集。然而,首先关注(i)账户之间的转账,以及(ii)身份和与身份相关的用例(例如私有证明)是务实的第一步,更容易实现,而且钱包现在就可以开始使用。
任何有效的隐私解决方案的一个后果是,无论是用于支付、身份还是其他用例,它都会产生用户存储链下数据的需求。这在 Tornado Cash 中很明显,它要求用户保存每张代表 0.1-100 ETH 存款的“票据”。更现代的隐私协议有时会在链上保存加密的数据,并使用单个私钥对其进行解密。这是有风险的,因为如果密钥泄露,或者量子计算机变得可行,数据就会全部公开。 EAS 和 Zupass 等链下证明对链下数据存储的需求更为明显。
钱包不仅需要成为存储链上访问权限的软件,还需要成为存储您的私人数据的软件。非加密世界也越来越认识到这一点,例如。请参阅 Tim Berners-Lee 最近在个人数据存储方面的工作。所有我们需要围绕稳健保证访问权限控制来解决的问题,我们还需要围绕稳健保证数据的可访问性和不泄漏来解决。也许这些解决方案可以叠加在一起:如果您有 N 个监护人,请在这 N 个监护人之间使用 M-of-N 秘密共享来存储您的数据。数据本质上更难保护,因为你无法撤销某人的数据份额,但我们应该提出尽可能安全的去中心化托管解决方案。
如今,钱包相信他们的 RPC 提供商会告诉他们有关链的任何信息。这是一个漏洞,有两个方面:
RPC 提供商可能会尝试通过向他们提供虚假信息来窃取金钱,例如关于市场价格
RPC 提供者可以提取有关用户正在与之交互的应用程序和其他帐户的私人信息
理想情况下,我们希望堵住这两个漏洞。为了解决第一个问题,我们需要 L1 和 L2 的标准化轻客户端,它们可以直接验证区块链共识。 Helios 已经为 L1 做到了这一点,并且一直在做一些初步工作来支持一些特定的 L2。为了正确覆盖所有 L2,我们需要一个标准,通过该标准,代表 L2(也用于特定于链的地址)的配置合约可以声明一个函数,也许以类似于 ERC-3668 的方式,包含获取最近的state roots,并根据这些州state roots证明和收据。这样我们就可以拥有一个通用的轻客户端,允许钱包安全地验证 L1 和 L2 上的任何状态或事件。
为了隐私,当今唯一现实的方法是运行您自己的完整节点。然而,现在 L2 正在进入人们的视野,运行所有内容的完整节点变得越来越困难。这里相当于轻客户端的是私有信息检索(PIR)。 PIR 涉及保存所有数据副本的服务器和向服务器发送加密请求的客户端。服务器对所有数据执行计算,返回客户端所需的数据,并加密到客户端的密钥,而不会向服务器透露客户端访问了哪条数据。
为了保持服务器的诚实,各个数据库项目本身就是 Merkle 分支,因此客户端可以使用轻客户端来验证它们。
PIR 的计算量非常大。解决这个问题有几种途径:
蛮力:算法或专用硬件的改进可能会使 PIR 运行得足够快。这些技术可能取决于预处理:服务器可以为每个客户端存储加密和打乱的数据,并且客户端可以查询该数据。以太坊环境中的主要挑战是使这些技术适应快速变化的数据集(就像国家一样)。这使得实时计算成本更低,但很可能使总计算和存储成本更高。
削弱隐私要求:例如,每次查找只能有 100 万个“mixin”,因此服务器会知道客户端可以访问的一百万个可能值,但不知道任何更细的粒度。
多服务器 PIR:如果您使用多个服务器,并且这些服务器之间的诚实性假设为 1-of-N,那么 PIR 算法通常会更快。
匿名而不是保密:请求可以通过 mixnet 发送,从而隐藏请求的发送者,而不是隐藏请求的内容。然而,有效地这样做不可避免地会增加延迟,从而恶化用户体验。
在以太坊环境中找出正确的技术组合来最大化隐私,同时保持实用性是一个开放的研究问题,我欢迎密码学家尝试这样做。
除了传输和状态访问之外,需要在跨 L2 上下文中顺利工作的另一个重要工作流程是更改帐户的验证配置:无论是更改其密钥(例如恢复),还是对帐户的整个逻辑进行更深层次的更改。这里有三层解决方案,按照难度递增的顺序排列:
重播更新:当用户更改其配置时,授权此更改的消息将在钱包检测到用户拥有资产的每个链上重播。有可能,消息格式和验证规则可以独立于链,因此可以在尽可能多的链上自动重播。
L1 上的密钥库:配置信息位于 L1 上,L2 上的钱包使用 L1SLOAD 或 REMOTESTATICCALL 读取它。这样,只需要在L1上更新配置,配置就会自动生效。
L2 上的密钥库:配置信息存在于 L2 上,L2 上的钱包使用 ZK-SNARK 读取它。这与 (2) 相同,除了密钥库更新可能更便宜,但另一方面读取更昂贵。
解决方案(3)特别强大,因为它与隐私很好地结合在一起。在正常的“隐私解决方案”中,用户有一个秘密 s ,“叶子值” L 发布在链上,并且用户证明 L = hash(s, 1) 和 N = hash(s, 2) 对于某些(从未透露)他们控制的秘密。无效器 N 被发布,确保同一叶子的未来支出失败,而不会泄露 L。这取决于用户保证 s 的安全。恢复友好的隐私解决方案会说: s 是链上的位置(例如地址和存储槽),并且用户必须证明状态查询: L = hash(sload(s), 1) 。
用户安全中最薄弱的环节通常是 dapp。大多数时候,用户通过访问网站与应用程序交互,网站隐式地从服务器实时下载用户界面代码,然后在浏览器中执行。如果服务器被黑客攻击,或者 DNS 被黑客攻击,用户将获得界面的虚假副本,这可能会诱骗用户执行任意操作。交易模拟等钱包功能对于降低风险非常有帮助,但它们还远非完美。
理想情况下,我们会将生态系统转移到链上内容版本控制:用户将通过其 ENS 名称访问 dapp,该名称将包含接口的 IPFS 哈希值。更新接口需要来自多重签名或 DAO 的链上交易。钱包会向用户显示他们是否正在与更安全的链上界面或安全性较低的 Web2 界面进行交互。钱包还可以向用户显示他们是否正在与安全链交互(例如阶段 1 、多重安全审核)。
对于注重隐私的用户,钱包还可以添加偏执模式,要求用户点击接受HTTP请求,而不仅仅是web3操作:
偏执模式可能的界面模型
更先进的方法是超越 HTML Javascript,并用专用语言(可能是 Solidity 或 Vyper 上相对较薄的覆盖层)编写 dapp 的业务逻辑。然后,浏览器可以自动生成任何所需功能的 UI。 OKContract 已经在这样做了。
另一个方向是加密经济信息防御:dapp 开发者、安全公司、链部署者和其他人可以设立一笔保证金,如果 dapp 被黑客攻击或以高度误导性的方式伤害用户,则该保证金将支付给受影响的用户。由一些链上裁决 DAO。钱包可以向用户显示基于债券大小的分数。
以上都是在传统界面的背景下进行的,其中涉及指向和单击事物以及将事物输入到文本字段中。然而,我们也正处于范式发生更深刻变化的风口浪尖:
人工智能,这可能会导致我们从点击式打字范式转向“说出你想做的事情,机器人就会弄清楚”的范式;
脑机接口,既有眼动追踪等“温和”方法,也有更直接甚至侵入性的技术(参见:今年第一位 Neuralink 患者);
客户端主动防御:Brave 浏览器主动保护用户免受广告、跟踪器和许多其他不良对象的侵害。许多浏览器、插件和加密钱包都有整个团队积极致力于保护用户免受各种安全和隐私威胁。这些“积极的守护者”在未来十年只会变得更加强大。
这三种趋势共同将导致人们对界面工作方式进行更深入的重新思考。通过自然语言输入、眼球追踪,或者最终更直接的脑机接口,再加上你的历史记录(也许包括短信,只要所有数据都在本地处理),“钱包”可以清楚直观地了解什么你想做的事。然后,人工智能可以将这种直觉转化为具体的“行动计划”:一系列链上和链下交互来完成你想要的事情。这可以大大减少对第三方用户界面的需求。如果用户确实与第三方应用程序(或其他用户)进行交互,人工智能应该代表用户进行对抗性思考,识别任何威胁并提出避免威胁的行动计划。理想情况下,这些人工智能应该有一个开放的生态系统,由具有不同偏见和激励结构的不同群体产生。
这些更激进的想法依赖于当今极其不成熟的技术,因此我今天不会将我的资产放入依赖它们的钱包中。然而,类似的事情似乎很明显是未来的趋势,因此值得开始朝这个方向更积极地探索。