以太坊上存在着不同的交易类型,比如,将ETH发送到某个地址,部署合约等等。在柏林网络升级之前,以太坊上就有四种不同的交易类型:
带接收地址的常规交易,数据域等;
没有目的地址的合约部署交易,数据域用于合约代码;
带v值签名方式的交易,但不包括链ID(pre-EIP-155);
带v值签名方式的交易,但包括链ID。
不同的以太坊客户端(clients)、库(libraries)和其它工具会分析每次交易,理解每个交易类型。虽然只有四种交易类型,但也有很多复杂性和情况需要处理。技术人员应该检查交易中所有的域,弄清楚是属于什么交易类型。这对于新型交易来说是关键,比如元交易(meta transaction)、多重签名交易(multisig transaction)等pre-EIP-2718交易类型。
以太坊现在有了一个新的交易标准,这是由开发人员迈卡·佐尔图(Micah·Zoltu)在EIP-2718中定义和创建的。类型化交易信封形成了以太坊上一些和其它尚未开发的功能的基础。
本文我们将详细介绍柏林升级中包含的一些标准,以及其它可能未来可能包括的内容。
以太坊有一个交易格式。每个交易包括一个随机数(nonce)、gas价格、gas极限、目的地址、value、数据、v、r、和s。这些字段是RLP编码的,如下所示:
RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])
EIP-2718为类型化交易定义了一个新的广泛的信封。在新标准中,交易如下所示:
TransactionType || TransactionPayload
其中,这些字段被定义为:
交易类型:介于0和0x7f之间的数字,总共有128个可能的交易类型。
交易有效负载:由交易类型定义的任意字节数组。
这些字段连接组合形成类型化交易。该标准没有描述交易有效负载的格式;它可以是任何任意的字节系列,由新的交易类型(例如,RLP、SSZ等)定义的编码器进行编码。选择简单的字节连接是因为读取一个字节数组的第一个字节,而不需要任何库或工具:你不需要一个RLP或SSZ解析器来检查交易类型。
这种新方法使新的EIPs可以引入交易类型,而不在现有交易格式中引入不必要的复杂性,而且使用不同的以太坊工具(客户端、库)来区分不同的交易变得更容易。
增加的复杂性的一个很好的例子是EIP-155,它通过在交易中使用链ID来引入了回复保护(reply protection)。向交易参数中添加一个新字段将会破坏向后兼容性(backwards compatibility),所以链ID被编码到交易签名(v)的恢复参数(v)中。使用EIP-2718,我们可以简单地创建一个新的交易类型,以维护向后兼容性。
EIP-2718的一个大主题是向后兼容性。EIP-2718采用完全向后兼容模式,这意味着任何现有的工具、库、(硬件)钱包和交易都可以使用它,但他们将无法使用EIP-2718提供的新“功能”以及使用它的标准。旧的交易格式(现在称为原始交易)对于以太坊网络上的新交易仍然有效。
新交易类型的最大数目为0x7f,被选为维持这些旧交易的向后兼容性。RLP编码的交易总是以一个为l的字节开头,参数大于或等于0xc0,因此类型化交易永远不会与旧交易发生冲突,并且只需检查第一个字节,就可以区分类型化交易和旧交易。
EIP-2718本身不定义任何交易类型,但有一些建议使用新标准:
EIP-1559:ETH1.0链市场手续费变化;
EIP-2711:赞助、到期和批处理交易,也由开发人员迈卡·佐尔图(Micah·Zoltu)创建,这也是EIP-2718被创建的原因;
EIP-2930:可选的访问列表。
其中一些标准将在下面进一步详细说明。
新的交易类型可以支持功能的集成,否则将通过Solidity合约或第三方解决方案进行处理。以即将到期的交易为例。在现有的解决方案中,你可以将资金发送到一个Solidity合约,签署一项交易,并将该交易发送到一个专门的节点,以便该交易具有额外的参数,如到期日。然后节点处理发送交易,并确保它在设置的到期日期之前执行,否则交易不会被广播。一些dApps和合约(例如Uniswap)内置了这个功能,但对于大多数交易来说,这是不容易实现的。
EIP-2711将此功能本地化添加到以太坊网络中,同时保持与原始类型交易的向后兼容性(如上一节所述)。它不需要智能合约或专门的节点来运行。然而,目前EIP-2711仍是一个草案,不清楚该EIP是否会很快加入以太坊网络。也可能被分割成多个更小的 EIPs(如EIP-3074)。
在EIP-1559中,gas的工作方式发生了显著的变化。不再向矿工支付全部gas,而是燃烧一部分gas。我们不详细介绍EIP-1559的所有变化,但它确实指定了一种新的交易格式:
0x02 || RLP([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, accessList, signatureYParity, signatureR, signatureS])
最显著的变化是:
Gas价格已被“每个gas最高优先费用”和“每个gas最高费用”所替代。
链ID是单独编码,而不是包含在签名v值中。这本质上用一个更简单的执行取代了EIP-155。
签名v值现在是一个简单的奇偶校验位(“签名Y奇偶校验”),它是0或1,这取决于应该使用椭圆曲线上的哪个点。
EIP-1559还提供了一种基于EIP-2930来指定访问列表的方法。这可以降低交易的gas成本。
由于EIP-1559对gas费用的工作方式发生了重大变化,因此它与原始交易并不直接兼容。为了保持向后兼容性,EIP-1559描述了一种将原始交易升级到EIP-1559兼容的交易的方法。它通过使用原始gas价格作为每个gas的最高优先费用和最高gas费用来实现这一点。
元交易已经出现了几年,但到目前为止仍一直需要智能合约。与即将到期的交易一样,这需要将ETH发送到智能合约,而该合约必须专门支持元交易。
EIP-2711使得原生元交易(称为赞助交易)和批交易成为可能,而不需要智能合约。一种新的交易格式被定义,交易类型为0x02(尽管这可能会发生变化,因为EIP-1559使用相同的交易类型)。交易如下:
0x02 || RLP([...SenderPayload, ...SenderSignature, ...GasPayerPayload, ...GasPayerSignature])
基本上,EIP-2711包括一个(可选的)有效载荷和gas支付人的签名。该账户将用于支付交易中的gas费用。例如,可以从一个地址发送ERC-20代币,而不需要该地址持有任何ETH。发送方有效载荷、签名等是基于交易子类型定义的。例如,对于交易类型为1的交易,发送方有效载荷被定义为:
[1, ChildTransaction[], nonce, ChainId, ValidUntil, gasLimit, gasPrice]
子交易( Child Transaction )被定义为:发送地址、值、数据。这使得可以在单个交易中指定多个地址、值和数据。例如,这可以用于在单个交易中调用ERC-20的批准和转移。
有关EIP-2711中可用的所有交易子类型的详细说明,建议读者阅读官方文件。
类型化交易为以太坊网络带来了很多可能性。它们可以在不给以太坊客户端(clients)、库(libraries)和其它可用工具增加大量复杂性的情况下创建。
目前,新的交易类型还没有被广泛使用,因为EIP最近才被包含在网络中,但有一些激动人心的EIP正在开发中,比如EIP-2711,它增加了过期交易、批处理交易和赞助交易(又称元交易)等特性。现在可以在以太坊上定义新的交易类型,因此可以轻松创建其它EIP。
本文来自 Mycrypto,原文作者:Maarten Zuidhoorn。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。