作者: msfew@Foresight Ventures
当我们开发一个现代化 toC 应用程序的时候, 无论是 Web App 还是 Mobile App 还是 Desktop App, 他们的基本架构都可以用以下三端来概括:
从左到右分别是:
前端: 也叫客户端. 应用的前端是用户在浏览器内看到的页面, 或者移动设备里使用的 App. 前端掌控了视图和展示.
后端: 也叫服务器端. 应用的后端存在的意义主要就是为前端提供接口和数据, 通常应用的主要业务逻辑会在后端中.
数据库: 数据库顾名思义, 专门存储数据的. 后端会读取或者修改数据库的内容.
为什么软件都需要这三端? 为什么前端不直接连数据库呢? 中间为什么还要有一个后端? 这其实有很多方面的原因:
开发者角度: 现代化应用的前端没有精力同时处理复杂的数据模型以及视图的状态管理. 工程化的角度而言, 让每个工程师都全知全能地维护一套臃肿的系统是不好的. 除此之外很多的逻辑是不需要前端参与展示的, 比如电商平台的库存等.
架构角度: 每个端都有自己的一套规则和语言去描述数据. 前端用人类能理解的思路来构建页面, 后端用面向对象的语言来操作数据, 数据库使用关系代数语言来访问物理存储. 没有办法规定一套万金油的规则来统一三端. 同时由于语言各司其职, 所以性能侧重点也不同.
协议角度: 观察图中, 可以看到连接三端的两个连接方式是不一样的. 通常 toC 的应用程序前端和后端沟通使用 HTTP 协议, 而后端和数据库则有不同的协议, 如 MySQL 就和 MongoDB 有着不同的协议. 我们可以通过一层很薄的后端 (GraphQL + Hasura) 或者规定新的协议 (OData) 来达到类似前端直连数据库的效果, 也有 CouchDB 这样为这样的通信而生的协议, 但依然没有解决其他的缺点.
数据映射角度: 前端处理 UI, 后端处理对象, 数据库处理数据. 前端与后端的连接使用了 UI 与对象的映射, 后端与数据库的连接需要使用对象关系进行映射.
数据角度: 因为在目前, 我们所使用的应用越来越多是基于 Web 的应用, 所以如果让前端直连数据库, 那么在浏览器这个不安全且开放的环境下, 很难防住数据泄露和黑客攻击. 数据库理论上可以通过各种鉴权等手段控制数据可见度, 但是后端存在的另一个巨大意义就是确保在可信的环境中, 以设计好的方式运行, 并排除已知的安全性问题.
从以上三个角度, 我们分析了为什么 Web2 应用是三端架构, 而这也带给了我们对区块链 DApp 的一些思考:
工程化: 对应了区块链中的模块化思想. 各个组件各司其职, 存储则可以用存储链, 用户数据则用传统的公链存储. 开发者无需太高的开发心智负担.
通信: 对应了区块链网络不同的共识机制. 这些不同的机制也让区块链的互通变成难题, 但也有 诸如 Cosmos 和 Polkadot 的互通协议, 尝试去链接整个网络. 但从 Web2 应用的角度来说, 这并不意味着是最佳的解决方案. 数据映射则可以对应面向账户或者 UTXO 的设计模式, 两者在性能, 隐私, 和开发复杂度上各有优劣.
安全性: 对应了区块链的去中心化与 Verify, Not Trust 思想. 安全性在区块链领域中更为重要, 因此需要可验证, 甚至完全透明公开的方式来对数据的处理和数据的可见度进行调整, 从而实现透明和 Permissionless 的 DeFi, 公开且具有所有权的 NFT, 以及 DApp 最重要的可组合性.
大多数的 Web3 DApp 都遵循了如下的架构:
简单应用 (纯链上数据且交互并不复杂), 例如: Uniswap 以及纯链上存储的 NFT 项目.
前端与 Web2 App 没有区别.
无后端 (链上智能合约作为后端).
区块链作为数据库.
更细化地来说, 完整的 Web3 DApp 的工作流程涉及到更多的组件:
前端: 浏览器, 钱包, 页面.
前后端通信: 节点 Provider, 索引协议.
概念上的后端: 区块链网络上的智能合约.
后端数据库通信: 节点 Provider, 存储网络网关.
数据库: 智能合约状态和去中心化存储网络.
区块链网络上的图灵完备的智能合约的存在, 让区块链能成为最好的 Serverless 平台, 或者说是可以被视作 Trustware 的 World Computer. 应用的数据和后端逻辑都可以在智能合约中实现.
和 Serverless 函数相比, 智能合约更加优秀, 也造就了比 Web2 应用更加优秀的架构和模式:
付费方式: Serverless 函数通常是开发者支付费用, 而智能合约大部分交互费用都是由用户来支付, 且用户也会心甘情愿地为链上空间而付费.
执行环境: Serverless 函数有非常灵活的执行环境, 而智能合约的执行环境虽然选择很少, 但非常轻量级.
部署环境: Serverless 函数部署在中心化云服务平台, 而智能合约部署在去中心化和无需许可的去中心化网络上. 除此之外, 网络的运营成本也是从中心化平台转嫁到了矿工, 经济系统会更加具有自主性.
但是, 对于一个真正完整的应用来说, 只通过智能合约作为后端, 是无法实现完整的功能的, 因此会需要有 Keeper 网络或预言机等其他组件.
Web3 DApp 指的是通过智能合约作为后端实现的, 简单的去中心化应用. 要完成一个复杂应用, 可能或多或少会引入中心化的服务, 真正要实现一个 Crypto-native 且 trustless 的 DApp, 则需要在架构上加入新的变化.
Web2 的复杂应用其实也远远不止是我们之前所概括的三端了, 需要非常多模块化, 中间层以及水平拓展的架构拆分.
欢迎光临 优惠论坛 (https://tcelue.tv/) | Powered by Discuz! X3.1 |