摘要:
一个去中心化应用由多个部分构成,但目前只有最核心的后端逻辑运行在以太坊上,其他部分比如前端代码还部署在以太坊之外,同时还包含很多没有上链的数据,所以大多数 DAPP 无法完整继承以太坊的安全性,远未达到理想化的状态。
导致上述问题的原因主要有两个:一是以太坊没有为开发者提供相应的前端标准和工具,二是链上存储数据的成本太高。
为了提供去中心化的前端标准,EthStorage 团队提出了 web3:// 访问协议,为开发者提供一整套通过智能合约来部署和访问前端代码,甚至是类文件系统的标准和工具,目前已成为以太坊的正式标准。
为了降低以太坊链上数据的存储成本,EthStorage 团队开发了二层存储协议 EthStorage,利用 PoRA (Proof of Random Access) 和零知识证明,在继承以太坊一层安全性的同时,极大降低存储开销。
致谢:感谢来自极客 Web3 的 Faust,ChainFeeds 的 Zhixiong Pan、LXDAO 的 Bruce、EthStorage 的 Qi Zhou, Lun Deng 对本文的反馈。
去中心化 DAPP 的背景和问题
以太坊的愿景是成为世界计算机,希望在其上构建的应用程序都继承它的安全性。开发者只需一次部署,该应用就会永远在以太坊上运行,没有实体可以对其进行审查或恶意操纵。
但现在的去中心化应用 DAPP 是否达到了上述目标?为了更清晰的回答这个问题,我们需要将一个 DAPP 应用解构,看它都包括哪些部分,进而分析各个部分的去信任化程度,来得出最终结论。
一般情况下,一个去中心化 DAPP 会包含前端界面、后端服务器、数据库。用户访问前端界面时,会通过浏览器和域名服务来加载前端内容。其中:
前端和域名服务:大多没有通过智能合约来部署和访问,区块链提供的特性如避免单点故障、代码不可篡改、抗审查、社区治理等都没有在前端这部分体现出来。
后端服务器:部分由智能合约实现,有些计算密集型的任务无法完全上链。
数据库:部分由智能合约实现,由于链上存储费用非常高,数据量较大的情况下 DAPP 还是采用链下的存储方案。
通过上面的分析,可以看到现在的去中心化 DAPP 只有部分组件通过智能合约获得了以太坊的保护,以太坊体系还远未实现当初的「去中心化的世界计算机」愿景。
2023 年末 Vitalik 回顾以太坊的发展,写了一篇反响较大的文章「Make Ethereum Cypherpunk Again」,讨论了以太坊社区该如何回归密码朋克的理念。他在文中总结了以太坊甚至是更大范围的 Web3 社区应该坚守的价值观,提到非常重要的一点:
去中心化应用应尽量减少对任何单一主体的依赖,即便 DAPP 的核心开发者永久消失,应用程序也可以继续运转。
由此可见 Vitalik 对于去中心化应用该如何构建也有类似的期待。接下来我们将详细分析去中心化 DAPP 中每个组件面临的问题,探讨如何对其进行改进。
前端和域名服务
在去中心化应用的几个组成部分中,前端和域名服务的中心化程度最为严重。目前绝大部分 dApp 的前端都使用中心化服务器,项目方可以随时修改前端代码,不需要经过社区治理,也不受到时间锁限制,这部分的安全性与部署在以太坊上的智能合约相去甚远。
黑客可以入侵服务器修改前端代码,而 dApp 用户会因为使用该恶意前端而损失资产。这个问题在上个 DeFi Summer 中反复出现,我们不禁要问:为什么前端不能和后端一样部署在以太坊上,让修改行为通过社区治理和时间锁才生效呢?
另外请设想一下,假如 Uniswap 的开发团队有一天不再给他们的前端服务器以及域名服务付费,那么 Uniswap 的用户和 LP 将如何使用 Uniswap?
绝大部分用户并不懂得如何绕过前端和智能合约交互,虽然 Uniswap 有尝试将其前端上传到 IPFS,但是 IPFS 和以太坊是不同的网络,在可靠性和去信任程度上完全不同。值得一提的是,IPFS 的内容访问速度很慢,现在绝大多数用户还是在和 Uniswap 部署在中心化服务器上的前端进行交互。
此外,因为Uniswap 前端的运营主体是 Uniswap Labs,他们为了迎合监管,增加了对 Token 列表的审查,这与他们在以太坊上部署的智能合约进成了反差,因为谁都无法随意对智能合约进行修改。所以,在前端被审查的 Token 还是可以在合约层面被交互到的,由此可见代码上链对抗审查的重要性。
后端服务器
因为 EVM 可以提供图灵完备的执行环境,所以大部分后端逻辑都可以在以太坊链上执行,我们可以说智能合约类的应用可以完全继承以太坊的安全。只是因为成本原因,一些计算密集型的任务无法直接在链上进行。
针对这个问题,现在探索比较多的是使用 ZK 或者 OP 的方式,将计算移交到链下完成,以太坊链上只对计算结果进行最终确认,以此在计算层面上进行扩容。有些 AI 相关的项目将这类方法推向了极致,希望将 AI 大模型这种超级计算密集型的任务与区块链挂钩,值得我们去密切关注。
数据库
对于数据库,EVM 原本就支持键值对 /KV 型存储 (Key Value Store),可以覆盖非常多的使用场景,但核心的问题是:链上存储的成本太高。
贵到什么地步呢?在 Gas Price 为 10Gwei 的情况,链上存储 1GB 的数据需要 6200 多枚 ETH,超过 2000 万美元!显然存储成本成为了数据库去中心化的核心问题。
我们可能会想,能否使用和上述计算扩容类似的方法,对存储进行扩容,也就是链下存储,链上验证存储效果。后面我们会对这个思路详细展开。
分析了上述谈及的 DAPP 组成部分后,我们发现,只有让 DAPP 的每个部分都足够安全和去信任,其作为一个去信任的整体,才能真正成为一个去中心化的 DAPP。而以太坊作为 dApp 的运行与托管平台,需要给开发者提供相应的解决方案,才能孕育出符合以太坊愿景的应用生态。
DAPP 的去信任解决方案
围绕着如何让 DAPP 完全基于以太坊来部署和访问,EthStorage 团队提出了两套解决方案:
web3:// 访问协议
web3:// 可以被理解为去中心化版本的 http://,与 http 的 URL 中通过指定服务器 IP 地址或者域名来访问中心化的资源类似,web3 的 URL 需要指定一个智能合约地址或者 ENS 域名,来访问存储在其上的资源。
我们可以将一个网站的前端全部部署到一个智能合约中,并通过 web3:// 来访问!可以对比一下两者的区别:
目前 web3:// 已经成为了以太坊的正式标准(ERC-4804),如果希望详细了解 web3:// 访问协议的内容,可以访问其官网。为了更好的在智能合约中做文件管理,我们提出了 ERC-5018,它在智能合约中模拟了一套文件系统的接口,这样就可以通过 ethfs-cli,将打包好的前端代码文件夹上传到一个智能合约中,并通过 web3:// 来访问这个网站。
大家如果感兴趣,可以按照 教程 完成一个简单的去中心化应用部署和访问。
有了 web3:// 访问协议,我们才能真正让 dApp 前端也具有了「Code is law」的属性。对于开发者来说,一旦部署,这个前端将永久执行下去。试想如果 Uniswap labs 也将其前端部署到了以太坊,那么即使团队想在前端层面对用户进行审查和限制,也无法阻止人们使用其部署在以太坊上的前端了。
当然在解决了可行性的问题后,我们还意识到链上存储大量数据的成本会非常高,从而使开发者在链上部署前端的时候面临困扰。我们进一步开发了 EthStorage 二层存储协议,在继承以太坊安全性的同时,极大降低存储开销。
EthStorage 二层存储协议
EthStorage 协议由部署在以太坊上的智能合约和 Layer2 网络中的存储节点组成,其中,智能合约提供了键值存储, 而二层的存储节点负责存放数据本身。
用户通过 EIP-4844 的 BLOB 将待存储的数据上传到以太坊上,EthStorage 智能合约只会记录 BLOB 内数据的哈希,从而有效的降低存储成本。
同时,二层的存储节点会下载对应的 BLOB 数据到本地磁盘,使用 PoRA (Proof of Random Access) 和 ZK,将存储证明提交至以太坊上的合约做验证,该合约需要通过之前记录的 Blob 哈希来确认存储节点上传的 ZK 证明能否对上号,以此确认二层网络中的存储节点真的存放了这些数据。
具体流程如下:
对于开发者来说,其上传数据和获取数据的接口非常简单:
应用开发者可以直接通过 EthStorage 提供的合约接口,对大块数据进行读写,写入成本约等于直接在链上存储数据的千分之一。因此,EthStorage 不仅支持链上部署前端,对更广泛的键值存储数据库操作也提供了成本更低的解决方案。
目前,EthStorage 已获得了以太坊官方的 Grants,并且已经在 Sepolia 部署了公开测试网,欢迎大家加入。
总结与展望
大多数 DAPP 的重要组件如前端和数据库未部署在以太坊,无法继承以太坊的安全,导致应用作为一个整体无法做到永久执行,抗审查,可治理。
EthStorage 对此提出了两个方案解决这个问题:web3:// 访问协议解决使用智能合约来部署和访问前端的问题;EthStorage 二层存储协议解决存储成本过高的问题。
为了实现以太坊最初的愿景,我们认为它将演进为一个去中心化的 Web 服务器,生态中的去中心化应用会将其所有组件都部署于以太坊,不管是后端代码、前端还是数据,一旦部署,代码可以永久运行,数据可以永久访问,成为一个真正的 Unstoppable Dapp。
EthStorage 公开测试网正在进行第二次激励活动,感兴趣的社区小伙伴可以按照 Guide 完成自己的第一个 Unstoppable Dapp 部署和访问!