Odaily星球日报■以太坊上的通用经济抽象


编者按:本文来自:以太坊爱好者(ID:ethfans) , 作者:Kevin Britz , 翻译 & 校对: 曾汨 & 阿剑 , Odaily星球日报经授权转载 。
在 Astro 钱包(最近已被 Coinbase 收购)过去两年的大部分时间里 , 我们都在研究各种形式的经济抽象(economic abstraction) 。 我们想要和区块链行业中更多的同仁分享我们的发现 , 希望可以为 dApp 如今所面临的诸多用户体验问题提供一些指导 。
尽管经济抽象并非一个新概念 , 但此前切实可行的用例寥寥无几 。 在本文中 , 我们将讨论如何实现一套通用的经济抽象方法 。
定义鉴于这一术语已经被广泛使用 , 因此在讨论开始之前 , 我们希望给出一个明确的定义 。
经济抽象 —— 能够原子化地使用 任意一种区块链资产 支付发起任意区块链交易的手续费以及交易操作本身 。
让我们举几个例子来进一步阐明它的意思:
用户想要转移 USDC , 但苦于钱包中没有 ETH 来支付交易手续费 。
用户想要通过 0x v3 中继器来购买一只加密猫(CryptoKitty) , 而这需要使用 ZRX 来支付中继费 , 且加密猫的卖家只接受 DAI , 但用户手中只有 USDC 。
组成实际上 , 在大多数区块链上经济抽象都被划分为两个组成部分:手续费抽象和代币抽象 。 如果二者都能实现 , 我们就拥有了完整的经济抽象 。
手续费抽象 —— 能够原子化地使用区块链上的任意资产支付发起交易的手续费 。
通常来说 , 区块链协议需要依赖特定的基础代币(如以太币)来保障网络的安全性 。 一些协议以为只要支持用任意 token 来支付手续费 , 就能实现手续费抽象了 , 但这并不适合绝大多数协议 。 在下文的实现部分 , 我们将讨论如何在一个类似以太坊的协议上建构手续费抽象 。
代币抽象 —— 能够原子化地使用区块链上的任意资产来达成交易 。
交易被执行的 , 其产生的操作或多或少会花掉一些资产 , 比如使用 USDC 购买一只加密猫 , 或在 Compound 上出借 DAI 。 而有了代币抽象 , 我们的支付手段就不再局限于某一特定的代币了 , 而可以是区块链上的任何资产 。
实现为了实现手续费及代币抽象 , 我们需要两个核心的区块链功能:手续费委托和多操作交易 。 绝大多数区块链都没有原生地支持这两个功能(以太坊也不例外) , 因此需要进行额外的建构来达成我们的先决条件 。 我们将主要基于以太坊平台进行建构 , 但这同样适用于其它绝大多数智能合约平台 。
基础构建模块在以太坊上实现这些核心功能的关键是使用智能合约钱包 。 传统的地址型钱包并不具备这些功能 , 但是我们可以通过智能合约为其添加额外的逻辑 , 从而实现新的核心功能 。
手续费委托 —— 即指派另一支付者而非发送者本人支付交易手续费 。
如今的绝大部分智能合约钱包都采用 Gas 中继器来实现手续费委托 。 用户无需直接往其智能合约钱包中打入以太币用于支付交易手续费 , 而可以通过签名消息来完成交易的中继(中继器会将该消息打包进交易中 , 然后作为发送方发送该笔交易) 。 由于用户的账户实际上是智能合约 , 因此只要钱包能够验证该合约调用 , 以上两种方式都行之有效 。
多操作交易 —— 即在单笔交易内完成多个原子函数调用 。
不同于手续费委托 , 多操作交易尚未得到广泛应用 。 而要想在单笔原子交易内完成多笔操作 , 这一特性不可或缺 。 有人尝试使用 Wrapper 合约来解决这一问题 , 也取得了一些成果 , 然而对诸如 msg.sender 等元数据的隐藏使得它们难以成为通用化的解决方案 。 幸运的是 , 在智能合约钱包中集成这一功能相当简单 , 但截至目前只有 Dapper 这一家智能合约钱包支持了该功能 。
实现手续费抽象利用多操作交易 , 我们可以在标准的 Gas 中继器架构上再建构一层消息传输协议 , 从而实现手续费抽象 。 下面我们通过一个简单的案例来说明该协议如何扩展钱包以提供额外的功能 。


推荐阅读