不用浏览器钱包,照样用 dApp
网站期望浏览器里有一个钱包。而浏览器是电脑上暴露面最大的程序。AirNox 的解决办法是:一个在网页看来就是钱包、自身却什么都不保存的插件。

本页内容
一个不是钱包的插件
AirNox 浏览器插件(browser extension)会注入去中心化应用所寻找的标准接口:EVM 网络的 EIP-1193 和 EIP-6963、TON Connect,以及 Solana 和 Sui 的钱包标准。对网页来说,它就是一个钱包。它以通常的方式回应“有哪些账户”“当前是哪条链”“请签这个”。
实际上,它只是个信使。它不持有密钥,不存储助记词(seed),也无法签署任何东西。网页发出的每个请求,都会通过一条仅限本地的通道转发给桌面端的 AirNox Wallet,回复也原路返回。就算明天这个插件被换成了恶意副本,它也没有任何东西可偷,也没有任何东西可用来签名。
传统插件钱包的问题在哪里
传统 Web3 钱包整个都活在浏览器里,密钥也不例外。这就把密钥放进了电脑上暴露面最大的程序。注入网页的代码可以触及插件的接口。存储的机密数据所用的加密方式,现代显卡可以大规模暴力破解(brute force)。很多插件钱包自带跟踪器和广告。几乎没有哪个能防范收款地址被替换。而为了这些“待遇”,它们还整天占用内存和处理器时间。AirNox 只在浏览器里留一个信使,把所有重要的东西都移出浏览器,放进原生桌面程序;在 AirGap 模式下,更是放到一部从不联网的手机上。
仅限本地
插件与桌面端之间的通道从不离开你的电脑。没有中继服务器,没有云端会话,也没有账户。两端互相认证,所以冒充钱包的程序什么也拿不到,冒充插件的网页同样什么也拿不到。
权限由桌面端掌管
权限存放在 AirNox Wallet 里,而不是浏览器里。权限按站点(origin)、按链逐项授予,一次一项,没有任何隐含的权限。一个获准查看你 Ethereum 账户的网站,并没有因此获准查看你的 Polygon 账户。在一个钱包上获准的网站,在另一个钱包上并未获准。

站点身份以浏览器验证过的为准,而不是网页自己附带的一个字符串。网页无法冒称自己是另一个网站。整个系统遵循失败即拒绝(fail-closed)的原则:任何没有被明确授予的都会被拒绝,钱包看不懂的请求也会被拒绝。
锁定即拒绝
钱包锁定期间,无论请求怎么措辞,插件都一概不回应。网页无法唤醒钱包,无法枚举账户,也无法把签名请求排进队列、等你解锁后再执行。你得亲自在钱包里解锁,浏览器这时才能得到回应。
签名
交易、消息和结构化数据(typed data)都走同一条路径。桌面端先解码并筛查请求,识别标准操作,标记仿冒项、无限授权(unlimited allowance)和未知授权对象(unknown spender)。在 AirGap 模式下,未签名的请求随后传到手机,在手机上再次从字节解码、展示给你,只有在你按下 Accept(接受)后才会签名。签名传回来,桌面端将其广播出去,网页收到一个交易哈希。切换链也按同样的方式处理,由钱包决定是否允许切换。
对于助记词存放在桌面端的钱包,桌面端会在同样的筛查之后签名,签名在钱包窗口里完成,而不是在手机上。
被攻破的网页能做什么,不能做什么
被攻破的网页,或者浏览器里被投毒的脚本,可以对你撒谎。它可以给你看一笔交易,请求的却是另一笔。它可以把一次领取伪装成一次验证。它做不到的,是签名。决定是在密钥所在的地方做出的,而且是在你读过手机解码后的请求之后。盗币程序(drainer)发起的授权,在浏览器弹窗里畅通无阻,到了手机上就会现出原形:一笔授权,给这个授权对象,这个金额。如果是无限授权,手机会明说。
这正是我们想要的取舍:网页享有浏览器钱包的便利,而你不必承担它的任何暴露风险。