什么是 Facet?- 一种以太坊范式的转换

  • Tom Lehman
  • 更新于 2024-07-04 16:51
  • 阅读 769

Facet 通过移除状态树来,来减少共识成本。

介绍以太坊的范式转变

什么是 Facet?

Facet 是一个安全、去中心化且价格实惠的计算协议。

Facet 不是一个区块链。相反,它是一种不同的思考和使用区块链的方式。将 Facet 视为一个新的透镜,通过它你可以查看和与以太坊进行交互。

仅仅通过改变我们的视角,结果表明我们可以将以太坊交易成本降低高达 99%,而无需改变以太坊协议本身。

就像从不同角度观察同一颗宝石会展现其惊人的“面”,改变你对以太坊的看法将揭示其未开发的潜力。

Facet 使以太坊费用(极大)降底

让我们来看看两个示例交易中的节省,比较在 Facet 上构建的 DEX——Facet Swap 与传统以太坊 UniswapV2 DEX。

Facet Swap vs UniswapV2 DEX

在 DEX 上交换代币,有和没有 Facet

交换代币:比较从 Sushi Swap 进行的此代币交换与在 Facet Swap 上进行的此代币交换 。Facet 版本实现了相同的功能,但Gas成本为$3.41,而不是$24.61。这是超过 85%的节省!

创建交易对 Gas

创建 DEX 流动性池,有和没有 Facet

创建 UniswapV2 交易对:当涉及到像创建新交易对这样复杂的操作时,差异更加明显。 传统方式花费$316.55,而 Facet 仅需$3.09。这是超过 99%的降低!

有什么陷阱吗?

Facet 可以将Gas成本降低 99%?有什么陷阱?“没有免费的午餐”!

你是对的 —— Facet 不能创造免费的钱。但它可以创造“免费 停止浪费金钱”。

具体来说,Facet 使你能够停止在以太坊的一个不必要且昂贵的特性上浪费金钱:智能合约。

重新评估以太坊的核心特性:智能合约

Facet 的论点很简单:在以太坊上可以通过没有智能合约的更高效方式实现一切。智能合约传统上被赞誉为以太坊的关键创新,但实际上它们阻碍了以太坊的发展。

智能合约是以太坊设计缺陷的想法乍看起来令人难以置信,你可能会认为这是一个笑话。但想象一下,如果这是真的——如果你在使用以太坊时不需要智能合约。

这意味着多年来支付的数十亿美元的Gas费用是浪费的。这意味着以太坊的整体容量(由 30M Gas限制强制执行)被人为地限制了。但最重要的是,这意味着仍有时间进行调整并以更好的方式使用以太坊。

尽管 Facet 的论点似乎违反直觉,但如果以开放的心态来看待,其真相是很容易看到的。

一个思维实验:如果智能合约存储被删除了会怎样?

为了了解智能合约是否是以太坊的一个必要特性,或者我们是否可以没有它们,让我们使用“生活多美好”策略,想象一下如果所有智能合约突然消失会怎样。

考虑这种情况:以太坊社区明天醒来,发现智能合约存储已被抹去,但以太坊交易历史和以太坊的共识层保留了下来。

这会有多糟糕?

如果智能合约是必不可少的,那么这肯定是一场灾难。以太坊社区花费数十亿美元的Gas费用用于智能合约执行计算和存储结果。失去所有这些数据肯定也会造成数十亿美元的损失,对吗?否则,为什么我们要花费如此多的钱来填充它?

还原智能合约状态

同时,失去数据的糟糕程度只能取决于还原它的成本。如果填充数据花费了数十亿美元,并且这些钱花得其所,那么恢复这些已删除数据的成本也必须是数十亿美元。为什么?

对:因为如果你可以以远低于生成成本的方式恢复丢失的数据,你就不会应该一开始生成它!你将应该直接跳过“生成”步骤。

那么恢复所有丢失的智能合约数据会花费多少?十亿美元?百亿美元?令人惊讶的答案是:几乎没有成本。

为什么?因为智能合约中的所有数据都可以从以太坊交易的不可变历史中以完美的准确性重建。这些合约中的每一条信息都源自这些交易历史,要重新创建这些信息,我们只需要“重放”历史。

但是重放这个历史是否意味着重新运行第一次发生的各种昂贵的智能合约交互?不需要,因为我们不需要智能合约来执行智能合约逻辑。这是因为智能合约逻辑是完全确定性的——对于给定的输入,智能合约将始终产生相同的输出。

而智能合约逻辑本身包含在合约部署的 calldata 中的以太坊交易历史中。

鉴于我们有以太坊交易历史作为输入,我们也有所有智能合约逻辑,我们可以通过在相同输入上执行智能合约逻辑来精确重现智能合约输出。通过反复应用此过程,我们可以恢复这个思维实验中丢失的所有数据。

智能合约的悖论

从这个角度看,智能合约是奇怪的实体。我们为它们支付数十亿美元来执行计算,同时如果这些计算的结果被抹去,我们可以以远低于成本的方式重新生成它们。

这听起来几乎像一个谜语:“你花数十亿让我告诉你你已经知道的事情 ”

Facet 的观点是,这不是一个具有挑战性的哲学难题,而是一个简单的机会,可以转向更便宜的选择并节省金钱。

以太坊的“本质”是什么?

如果我们共同花费了数十亿美元来维护一个不包含任何独特信息的数据存储,那么以太坊是如何取得如此多惊人成就的呢?

如果智能合约不是以太坊的“本质”,那么是什么?正如我们上面所看到的,以太坊的一切都源自以太坊验证者产生的有序序列的以太坊交易。

如果你拥有这个序列,你可以计算出任何你需要的确定性结果,而无需区块链。相反,如果你没有这个序列,你将永远无法在没有区块链的情况下重新创建它。与智能合约行为不同,以太坊交易的顺序是非确定性的。在确定给定区块中的交易以及何种顺序时,没有办法使用初始条件和共享逻辑来达成“正确答案”。事实上,没有“正确答案”——相同的初始条件可能导致多个同样有效的结果(不同的顺序下)。

这就是权益证明共识机制的魔力所在。它使每个人都能就非确定性过程的结果达成一致,而无需中心决策权。

权益证明的工作原理几乎令人难以置信。我们不应进一步加重以太坊验证者的负担,让他们执行简单的数学问题——例如确定如果你拥有 2 个代币并铸造 2 个,你的余额现在是 4。我们不需要区块链告诉我们 2 + 2 = 4!

Facet 的费用节省是通过要求以太坊验证者只做他们唯一要做的事情来实现:对以太坊交易进行排序。其他所有事情都可以在链下计算。

Facet 的工作原理

Facet 不仅仅是一个理论概念;它是一个完全在以太坊主网上运行的功能系统。

Facet 协议是由开源的 Facet 虚拟机(FVM)实现的:

它是如何工作的。

基本思想

回想一下我们之前讨论的使用以太坊交易历史重建智能合约存储的内容。Facet 虚拟机就是基于这一原则运行的,但有一个变化:它不是重建已删除的智能合约状态,而是组建一个从未存储在智能合约中的状态!

一个例子

让我们看一个简单的例子:使用 Facet 铸造 ERC20 代币。考虑此交易 。首先,注意交易的“To”地址是 0x00000000000000000000000000000000000FacE7,一个虚拟销毁地址(不是智能合约)。

接下来,看一下输入数据:

data:application/vnd.facet.tx+json;rule=esip6,{  
    "op": "call",  
    "data": {  
        "to": "0x0fa4d1eea940b2c82019f4d048e887715f5eb703",  
        "function": "mint",  
        "args": {  
            "amount": "100000000000000000000000000000000000000000000000000000"  
        }  
    }  
}

如果你不使用 Facet,这个交易负载是毫无意义的。但是,如果你调整一下你的视角,你会发现它是相当有意义的:这个人表达了他们要从特定“合约地址”(在“to”字段中)铸造一定数量代币的意图。

接下来,Facet 协议将用户意图的输入与该“合约地址”的逻辑以及以前 Facet 交易的历史结合起来,以确定用户是否成功或失败。这是逻辑:

function :mint, { amount: :uint256 }, :public do  
  require(amount > 0, 'Amount must be positive')  
  require(amount <= s.perMintLimit, 'Exceeded mint limit')require(s.totalSupply + amount <= s.maxSupply, 'Exceeded max supply')

  _mint(to: msg.sender, amount: amount)  
end

暂时忽略细节和短语“合约地址”,试着理解基本要点。从 require 语句可以清楚地看出,要成功铸造:

  1. 你必须至少铸造 1 个代币。
  2. 你不能超过每次铸造的限制。
  3. 你的铸造不能超过最大供应量。

(1) 可以通过查看用户的交易负载轻松验证。对于 (2) 和 (3),你需要检查 Facet 的交易历史。

s.perMintLimit 上的 s. 前缀表示它是一个存储变量。要确定其当前值,你必须查看交易历史,并确定哪个最后成功更新了该值。对于 s.totalSupplys.maxSupply 的验证也是如此。

理论上,这些问题可以通过查询历史以太坊交易来无状态地回答。实际上,这样的查询很复杂且性能不佳。此外,状态对开发人员来说更容易。如果你正在编程这个代币,你希望能够说“给我总供应量”,而不是“对所有先前有效的铸造交易的铸造金额求和,其中‘有效’由另一个复杂查询定义”。

Facet 虚拟机使开发人员能够使用他们熟悉和喜爱的范例高效地回答这类问题:智能合约。

引入愚蠢合约( Dumb Contract)

“智能合约?!我以为我们正在放弃智能合约!”Facet 不使用智能合约,但我们借用了智能合约的 范式 来构建 Facet 应用程序。

为了区分我们的合约与以太虚拟机的合约,并且有点俏皮,Facet 合约被称为“愚蠢合约”。但从开发人员的角度来看,它们的工作方式与智能合约完全相同——它们是自包含的逻辑和存储“容器”,你可以用来构建应用程序并与其他合约交互。

愚蠢合约在创建时被分配唯一的以太坊风格地址。合约的地址是通过确定性计算的,并作为合约的标识。当用户或其他愚蠢合约想要与愚蠢合约交互时,他们通过地址识别合约,并指定要调用的函数和要使用的参数。

愚蠢合约是用我们创建的 Ruby-Solidity 混合语言 Rubidity 编写的。你可以在 Facet VM 存储库中看到所有这些内容:https://github.com/0xFacet/facet-vm/tree/main/app/models/contracts

这是我们之前讨论的铸造请求中的愚蠢合约的完整代码:

pragma :rubidity, "1.0.0"import './ERC20.rubidity'

contract :PublicMintERC20, is: :ERC20 do  
  uint256 :public, :maxSupply  
  uint256 :public, :perMintLimit

constructor(  
    name: :string,  
    symbol: :string,  
    maxSupply: :uint256,  
    perMintLimit: :uint256,  
    decimals: :uint8  
  ) {  
    ERC20.constructor(name: name, symbol: symbol, decimals: decimals)  
    s.maxSupply = maxSupply  
    s.perMintLimit = perMintLimit  
  }

function :mint, { amount: :uint256 }, :public do  
  require(amount > 0, 'Amount must be positive')  
  require(amount <= s.perMintLimit, 'Exceeded mint limit')

require(s.totalSupply + amount <= s.maxSupply, 'Exceeded max supply')

_mint(to: msg.sender, amount: amount)  
end

function :airdrop, { to: :address, amount: :uint256 }, :public do  
    require(amount > 0, 'Amount must be positive')  
    require(amount <= s.perMintLimit, 'Exceeded mint limit')

require(s.totalSupply + amount <= s.maxSupply, 'Exceeded max supply')

_mint(to: to, amount: amount)  
  end  
end

与以太虚拟机一样,我们通过查看部署合约的以太坊交易知道这是正确的代码。所有愚蠢合约代码也可以在 Facet Scan 上找到,尽管以其转译形式。

回到我们的例子:我们的用户想要从这个合约铸造。Facet 虚拟机会做什么?粗略地说,它:

  1. 找到正确的愚蠢合约实现逻辑。
  2. 实例化一个新的愚蠢合约“对象”。
  3. 将愚蠢合约的最新状态加载到对象中。
  4. 执行用户调用的函数。
  5. 存储生成的新合约状态。

愚蠢合约是否去中心化?我提到了保存 Dumb Contract 状态。这个状态存在哪里?在 Facet VM 中,状态存储在本地的 Postgresql 数据库中。如果 Dumb Contracts 的状态存在链下,它们如何去中心化呢?

虽然在编写和使用 Dumb Contracts 时会感觉“真实”,但实际上它们只是解释以太坊 calldata 的协议。它们只是一种“看待方式”。

与智能合约一样,Dumb Contract 存储没有信息内容。如果明天擦除所有 Dumb Contract 存储,将不会丢失任何有价值的东西。Facet Protocol 不依赖于 Dumb Contracts 的独立存在。

Facet 仅依赖于存储在以太坊上的交易数据。所有 Dumb Contract 状态都是通过开源软件从这些交易数据中推断出来的。

通过使用共享的初始条件和共享的规则计算出的结果是去中心化的。这是因为你无需依赖任何人来为你计算这些结果,因为你和任何你想询问的人具有完全相同的知识和能力。

如果你确实从第三方那里得到了结果,你可以通过简单地重复计算来验证它们是否正确。

Facet 是 Layer 2 吗?

由于 Facet 只是使用以太坊的一种不同方式,因此它显然不是 Layer 2,因为 Layer 2 是独立的链。

在更深层次上,你可以将 Facet 视为 Layer 2 的对立面。Layer 2 保留了智能合约功能,并通过不使用去中心化共识机制来实现 Gas 节省。

对我们来说,这恰恰是最糟糕的扩展策略,因为它加倍要求区块链执行我们不需要它执行的任务(执行计算和存储数据),并让区块链摆脱我们无法没有它的任务(以公平的方式排序交易)。

其中一个后果是使用 Layer 2 存在重大风险:Layer 2 的所有者可决定停止运营 Layer 2 ...

相比之下,Facet 无论如何都无法被任何人关闭。

Facet 有哪些限制?

Facet VM 的第一个版本并没有完全实现 Facet 的愿景。我们推出它并不是因为我们认为我们已经找到了“正确答案”,而是因为我们认为我们找到了正确的道路,我们希望围绕着达到目标建立一个社区。

在 Facet 初始版本中的一个关键限制是部署任意 Dumb Contract 代码的限制。目前,用户必须从社区批准的支持和经过测试的合约列表中进行选择。这一限制源于 Rubidity 的一个当前差距 —— 缺乏类似 Gas 的机制来防止合约执行中的无限循环。

现在在你说“啊哈!隐藏的陷阱终于显露出来了!Facet 不能 做到智能合约能做到的一切!”之前,让我向你保证:计算函数的 Gas 成本只是智能合约使用以太坊的交易历史作为输入进行的另一个确定性计算。一个链下的 VM 可以做得和 EVM 一样好。

然而,这仍然是一个具有挑战性的问题,这就是为什么我们不想等到解决它之前才发布 V1 版本!

接下来是什么?

除了改进核心协议外,我们正在积极为新的用例构建 Dumb Contracts。我们的目标是将所有流行的以太坊应用 —— 从 NFT 市场到借贷协议 —— 迁移到更高效的 Facet Protocol。

Facet VM 和所有 Dumb Contracts 都是开源的,如果你想参与,我们欢迎接受拉取请求!

了解我们下一步工作的最佳方式是通过 Facet Discord,所以考虑加入吧。

你也可以在 X 上找到 Facet,账号为 @0xFacet,以及 Facet 的联合创始人,Tom Lehman(@dumbnamenumbers)Michael Hirsch(@0xHirsch)

Facet 运动

如果 Facet 的论点是正确的,那么 Vitalik Buterin 和其他以太坊先驱者错过了以太坊发展的另一种替代、更优越的道路。

对于任何理性的人来说,Vitalik 是错的,Facet 是对的,看似不可能,Vitalik 错过了他创造的系统中这么重要的事情的几率有多大呢?如果 Vitalik 确实错过了什么,难道不应该是他发现它吗?

然而,当我们放眼科学和技术突破的历史时,我们会发现革命经常推翻建立的世界观,而且它们经常由局外人领导。从这个角度来看,Facet 的机会看起来更好。

最终,Facet 是否会成为区块链技术新时代的催化剂?就像以太坊本身的故事一样,答案可能取决于你选择如何看待它。

Facet

Facet 协议已在主网上线!可以在 Facet SwapFacet ScanFacet Cards 上尝试。继续阅读以了解其工作原理!

我是 AI 翻译官,为大家转译优秀英文文章,如有翻译不通的地方,在这里修改,还请包涵~

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

1 条评论

请先 登录 后评论
Tom Lehman
Tom Lehman
Facet co-founder | Ethscriptions co-founder