首页 > 编程知识 正文

以太坊平台(以太坊eth介绍)

时间:2023-05-04 05:00:31 阅读:103246 作者:4447

免责声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星金融官方立场。

边肖:记得要注意

来源:以太博物馆爱好者

原标题:《科普 | EIP-3074:提升以太坊用户体验》

如果你是Ethereum的活跃用户,你可能会持有一些(ERC 20)代币来与Ethereum生态中的各种DeFi项目进行交互。但是这样做的前提是你必须持有ETH,因为ERC 20代币不能用来支付Ethereum的费用。此外,向智能合约发送令牌时,通常需要执行两个事务:一个是允许目标合约使用您的令牌,另一个是将令牌转移到目标合约。

EIP-3074可以启用smart contract _ representative _ external account(即普通的ethereum地址)发送交易,从而解决上述问题甚至更多。

EIP 3074引入了两个EVM指令,AUTH和AUTHCALL。第一条指令设置基于ECDSA签名授权的环境变量,第二条指令以授权的方式发送调用。本质上,这是授予智能合约对外部账户的控制权。

通过AUTH和AUTHCALL EVM指令(也称为操作码),智能合约可以基于签署的消息从外部账户获得授权,并代替外部账户发送交易。这带来了许多可能性,例如:

*赞助交易* *(也称为元交易):从另一个账户支付交易的气体。这样,令牌就可以在没有ETH地址的情况下发送。

*批量交易* *:通过一次调用发送多个交易。这可以确保两个或多个事务在同一个块中执行,并且还可以降低事务成本。

*改善用户体验* *:例如,您可以在单个事务中调用approve和transferFrom。

与现有解决方案不同,EIP 3074不需要智能合约钱包。您可以将事务直接发送给负责执行事务的调用者。调用者是一个无状态且不可信的智能合约,您不需要提前将余额发送给智能合约。EIP 3074也没有引入新的交易类型。从技术角度来看,EIP 3074应该更容易实现,因为只引入了两个新的EVM指令。

不幸的是,EIP 3074仍在审查中,由于各种(安全)考虑,不知道何时投入使用。如果你现在想体验,可以用浦西测试网。在本文中,我将详细介绍EIP 3074的工作原理。

想看EIP 3074的实际操作效果,我写了一个(批量)交易调用者合同作为例子。点击以下链接访问:

https://github.com/Mrtenz/transaction-invoker

请注意,本合同未经审核,仅是概念证明。不要在生产环境中使用。

AUTH 和 AUTHCALL 操作码

EIP 3074定义了两个可以被智能合约调用的新操作代码:

AUTH(0xf6)——外部帐户,具有基于签名和提交的授权。有四个输入参数:commit和signed yParity,r和s. AUTHCALL(0xf7) ——发送调用(事务),而不是授权的外部帐户。有八个输入参数:gas、addr、value、valueExt、argsOffset、argsLength、retOffset和retLength。类似于现有的CALL操作码。确认外部帐户的授权需要来自外部帐户的签名消息。调用AUTH的智能合约可以通过消息签名恢复签名者,然后将其设置为授权的EVM环境变量。这样,每次智能合约调用AUTHCALL时,调用者都会被设置为授权地址。当被调用的智能合约调用CALLER(例如,通过msg.sender of Solidity)时,调用将由授权外部帐户的地址执行,而不是由调用者的地址执行(智能合约)。

发送一个或多个事务的基本流程如下图所示:

-上图为EIP 3074的基本流程,主叫签约发送多个交易-

外部账户签署授权消息;外部账户或其他燃气支付方将交易数据和授权消息发送给合同调用方;调用方协定使用AUTH操作码来执行授权,使用AUTHCALL操作码来发送事务。谁把交易发到合同里都无所谓,只要外部账户的签字有效。因此,其他人(或账户)也可以发送交易。

请注意,目前无法使用EIP 3074通过外部账户发送ETH。这样做会大大改变目前一些重要的假设,比如检查交易是否有效。来电者需要使用自己的ETH余额发送ETH。不过你可以把ETH发给打电话的人,打电话的人会代他发。目前,包含在AUTHCALL操作码中的valueExt

字段必须被硬编码成 0。将来,如果找到适当的解决方案,我们可以更改这个字段,允许调用者外部账户发送 ETH。

授权消息和 commit

为了执行授权,外部账户必须签署特定格式的消息:

``` *

0x03 || ||

(注:||用作字节连接运算符。)

这个消息包含三个部分:一个魔术字节(`0x03`)、填充成 32 字节的调用者地址(执行 authorize 的智能合约的地址)以及一个 32 字节的 commit。 ![科普 | EIP-3074:提升以太坊用户体验](https://img.chainnews.com/material/images/57c919fe36183af8e3caef553ca635e3.jpg)_- 授权消息格式,包含一个 commit 示例 -_ 该 commit 描述了外部账户提交的数据,并且可以根据调用的某些属性计算得出,例如,地址、值和 nonce 的哈希值。调用者合约可以根据属性重新计算出 commit,如果这些字段都正确的话,就会执行授权。 假设我们想要发送以下事务(JSON 格式): [ { "to": "0x6b175474e89094c44da98b954eedeac495271d0f", "value": 123, "nonce": 0 }, { "to": "0x4bbeEB066eD09B7AEd07bF39EEe0460DFa261520", "value: 123, "nonce": 1 }]

我们可以对这些字段进行哈希计算(例如,用确定性的方式将它们连接起来,或使用 EIP 712 之类的规范),并将得到的哈希值用作 commit。

我们可以在智能合约中提供要发送的事务和授权消息的签名,如 JSON 数据所示。合约函数就如下面这个例子所示:``` *function sendTransactions(Transaction[] calldata transactions, Signature calldata signature) external;

智能合约根据 transactions 重新计算 commit,并将这个 commit (连同签名一起)提供给 AUTH 调用。此举的目的是找回签名者的地址,如果计算得到的 commit 无效,根据签名找回的地址将是错误的,也就是说事务将失败。

调用者对 commit 的安全性负全责。你可以将 0x0 作为 commit 来签署消息,并授予智能合约对外部账户的完整访问权。前几版 EIP-3074 对 commit 的格式要求更为严格,包括重放保护等,但是后面为了提高灵活性已经将其移除。这就要求你在与调用者进行交互时必须信任对方。

局限性和安全隐患

由于能够根据签名更改 CALLER,EIP 3074 极大地改变了 EVM 的运作方式。这会为新合约和现有合约引入潜在漏洞。因此,EIP 3074 已经经过正式审计。

下文解释了一些安全隐患。由于种种原因,EIP 3074 建议只与可信调用者交互。MyCrypto 等钱包界面提供可信调用者白名单功能。使用该功能的用户只能为白名单内的调用者签署授权消息。

弱 commit 和重放攻击

正如上文解释的那样,EIP 3074 没有为 commit 定义标准格式。调用者可以通过任意方式生成 commit。这意味着,调用者有责任确保 commit 的安全性,例如,抵御重放攻击。

如果 commit 不包含某种随机数,攻击者就可以轻松获取已签署的消息,再一次发送给调用者。恶意调用者完全不需要验证 commit,就可以获得外部账户的控制权。每次签署消息时,请你务必谨慎。

EIP 3074 通过将调用者的地址包含在授权消息内,提供了最基础的重放攻击保护。这样一来,恶意调用者就无法重放其他调用者的授权消息。

可升级调用者

EIP 3074 明确声明调用者程序不可升级。如果调用者程序是可以升级的,攻击者就可以部署另一个版本的调用者,在不验证 commit 的情况下授予合约对外部账户的控制权。

重入攻击

目前,智能合约可以使用 require(tx.origin == msg.sender) 来验证事务是否来自外部账户(而非另一个合约)。这样可以在一定程度上防止重入攻击,因为它可以防止合约调用该函数。

EIP 3074 也允许 tx.origin 成为授权消息的签名者。调用者执行的任何 AUTHCALL 都会导致 tx.origin == msg.sender 成真,即使这个调用是由智能合约执行的,因此很有可能遭到重入攻击。EIP 3074 指出:“……本 EIP 的作者并未找到任何有关这种重入攻击的例子,尽管没有进行详尽的搜索。”

结论

EIP 3074 为以太坊带来了很多新的可能。AUTH 和 AUTHCALL 使得外部账户能够将账户的控制权授予智能合约调用者,从而实现批量事务和赞助事务等新的事务类型。然而,该 EIP 也极大地改变了事务在以太坊上的运作方式,因此在主网上激活该 EIP 之前,我们需要更深入地思考其安全性。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。