被低估的EIP-3074,以太坊用户的大利好
在3月5日的以太坊核心开发者会议上,EIP-3074提案首次被提及,在一同被讨论的众多提案中,EIP-3074远没有像EIP-1559提案那样掀起市场的热烈讨论,但其致力于提升以太坊用户体验的理念也引起了圈内少数专业人士的关注。EthHub联合创始人Anthony Sassano曾表示,EIP-3074提案让其感到兴奋,但是很可惜却没有得到行业人士足够关注。
相对于EIP-1559提案将会给以太坊带来的重大变革,EIP-3074的理念在大众眼里确实有点小巫见大巫。但在加密领域,用户才是第一大推动发展主力军,而以太坊上的用户量在现阶段是任何其他链所不能比拟的,所以致力于改善用户体验的 EIP-3074 在未来的潜力绝对不可限量。为了更直观的发现EIP-3074的潜力价值,鸵鸟区块链为大家深度详解了EIP-3074的设计理念以及具体工作原理。以下内容来自于MyCrypto,由鸵鸟区块链编译。
EIP-3074设计理念
一般来讲,经常在以太坊上活跃地址数都会拥有一些ERC-20代币,它可以用于与以太坊生态系统中的不同DeFi项目进行交互。但是,这样做需要用户利用ETH来支付交易费用,因为用户无法使用ERC-20代币支付交易费用。此外,当用户想将代币发送到智能合约时,通常必须进行两个步骤:第一是批准花费代币的合约;第二是将代币发送到合约的交易。
EIP-3074提案就可以解决这些问题以及更多问题,它引入了一种智能合约方式,可以在外部账户(EOA,或者只是一个普通的以太坊地址)环境中发送交易。
该提案引入了两条EVM指令AUTH和AUTHCALL.。第一个设置基于ECDSA签名授权的环境变量。第二个作为授权发送调用,这本质上是将EOA的控制权委托给智能合约。AUTH和AUTHCALLEVM指令让智能合约基于已签名的消息授权EOA,并从该EOA发送交易调用。这开辟了很多可能性,例如:
1、赞助交易(也称为元交易):从另一个账户支付交易的gas。这也将允许用户从没有任何ETH的地址发送代币;
2、批量交易:在一次调用中发送多个交易。这样可以保证在同一个区块中执行两笔或多笔交易,还可以降低交易费用;
3、改进的用户体验 (UX):例如,用户可以在单个事务中调用批准和转移。
与这些问题的现有解决方案不同,EIP-3074不需要智能合约钱包,用户可以简单地将交易发送到执行交易的调用程序。调用程序是无状态、无信任的智能合约,它们不需要用户事先向合约发送余额。EIP-3074也没有引入新的事务类型,通过只引入两个新的EVM指令,这使得它在技术上应该更容易实现。
然而EIP-3074智能合约目前未经审计,只是概念证明。由于不同的安全问题,所以现在还不知道EIP何时会被激活。现阶段可以在Puxi测试网中试验它。如果想查看EIP-3074的实际效果,可以从下面的示例交易调用合约中查看:https://github.com/Mrtenz/transaction-invoker。
EIP-3074工作原理
AUTH和AUTHCALL操作码
EIP-3074定义了两个新的操作码,可以从智能合约中调用:
AUTH(0xf6)——根据签名和提交授权外部拥有的帐户。它需要四个输入参数:commit和签名的yParity,r和s。
AUTHCALL(0xf7)——在授权EOA的环境中发送交易调用。它需要八个输入参数:gas、addr、value、valueExt、argsOffset、argsLength、retOffset、retLength。这类似于现有的CALL操作码。
为了授权EOA,用户需要来自该EOA的签名消息。智能合约调用AUTH可以从消息签名中恢复签名者,然后将其设置为授权EVM环境变量。现在,每当智能合约调用时AUTHCALL,调用程序都会设置为授权地址。当被调用的智能合约调用CALLER(例如,通过 Solidity 的msg.sender)时就是授权EOA的地址,而不是执行调用的智能合约调用程序的地址。
发送一个或多个交易的基本流程如下所示:
一个基本的EIP-3074流程,其中调用程序合约发送多个交易
1、EOA签署授权消息;
2、EOA或其他gas支付方将交易数据和授权消息发送给调用方合约;
3、调用程序合约执行授权AUTH,并使用发送交易AUTHCALL。
只要EOA的签名有效,谁将交易发送到合约并不重要。这使得其他人(或其他帐户)可以发送交易。
请注意,目前无法使用EIP-3074从EOA发送ETH。这样做将极大地改变当前做出的重要假设,例如检查交易是否有效。相反,它取自调用程序自己的 ETH 余额。但用户仍然可以将ETH发送给调用程序并让调用程序转发。AUTHCALL操作码包括一个字段valueExt,目前需要将其硬编码为0。在未来,如果找到合适的解决方案,这将允许调用程序从EOA发送ETH。
授权消息和提交
要执行授权,EOA 必须以特定格式签署消息。(注意:| |用作字节连接运算符)
它由三部分组成:魔术字节 ( 0x03)、填充到32字节的调用程序地址(将执行授权智能合约的地址)和32字节的提交。
授权消息格式,包括可用作提交的示例
提交描述了EOA提交的内容,并且可以根据调用的某些属性进行计算,例如地址、值和随机数的散列。如果这些字段正确,调用程序合约可以根据提供的属性重新计算提交并执行授权。
例如,假设要发送以下交易(表示为 JSON):
然后就可以散列这些字段(例如,通过确定性方式将它们连接在一起)并将其用作提交,这样就可以在智能合约中提供要发送的交易和授权消息的签名。
智能合约根据重新计算提交交易,并将其与签名一起提供给AUTH调用。这将尝试恢复签名者的地址,如果提交无效,则会从签名中恢复错误的地址,这意味着交易将失败。
调用程序完全负责确保此提交是安全的。用户可以简单地使用0x0as commit签署消息,并授予智能合约对EOA的完全访问权限。以前版本的EIP-3074包含更严格的提交格式,包括重放保护等内容,但后来为了提供更大的灵活性就删除了该格式。正是出于这个原因,所以用户信任正在与之交互的调用程序是很重要的。
限制和安全问题
EIP-3074能够使调用程序根据签名更改EVM的工作方式,从而极大的改变了EVM的工作方式。这可能会在新智能合约和现有智能合约中引入潜在漏洞,所以以太坊基金会和参与开发以太坊2.0智能合约执行环境的Quilt在4月8日发起对EIP-3074操作代码进行安全审查的提案请求。
出于这些不同的原因,EIP-3074提案只与受信任的调用程序交互。例如,像MyCrypto这样的钱包接口可以实现受信任的调用程序白名单,还有只允许用户为某些调用程序签署授权消息。
弱提交和Replay Attacks
EIP-3074没有为提交定义标准化格式。调用程序可以以任何他们想要的方式自由地实现它。这意味着调用程序完全负责提供足够的保护,例如Replay Attacks。
如果提交不包含某种随机数,则则可以简单地获取签名消息并将其再次发送给调用程序。请注意,恶意调用程序可以不需要验证提交就控制EOA,所以签署消息时应始终小心。
EIP-3074通过在授权消息中包含调用程序的地址,具有防止重放攻击的基本保护。这样就不可能在另一个调用程序上重放一个调用程序的授权消息。
可升级的调用程序
EIP-3074明确声明调用程序不能升级。如果调用程序是可升级的,那么就会导致黑客可以部署不验证提交的另一个版本的调用程序,让智能合约完全控制EOA。
Replay Attacks
目前,智能合约可以使用:require(tx.origin == msg.sender),它可以检查交易是否来自 EOA(而不是另一个合约)。这允许简单的Replay预防,因为它可以防止合约调用该函数。
EIP-3074也允许tx.origin成为授权消息的签名者。即使调用是由智能合约AUTHCALL执行的,调用程序执行的任何s 也会导致tx.origin == msg.sender为真,从而可能引入Replay Attacks。EIP-3074 提到以下内容:“[...] 该EIP的开发者没有找到任何这种形式的Replay保护示例,尽管搜索并非详尽无遗。”
结论
EIP-3074为以太坊带来了更多令人兴奋的新可能性。AUTH和AUTHCALL允许EOA将帐户的控制权委托给 智能合约 调用程序,从而可以发送批量交易、赞助交易等。 然而,它对交易在以太坊上的工作方式进行了一些重大更改,所以在EIP-3074在主网上被激活之前,还需要对安全性进行更多思考。
来源:MyCrypto,作者:Maarten Zuidhoorn,编译:陈一晚风
==
和2万人一起加入鸵鸟社群
添加QQ群:645991580
添加TG群:鸵鸟中文社区 https://t.me/tuoniaox