以太坊的社群其实讨论了好一阵子究竟要如何设计新一代的帐户,不同的思路也对应了不同的提案,本文主要介绍AA在以下这两种方向的相关内容:
让现行的EOA有智能合约的功能让现行的智能合约有EOA的功能
TableofContents
EIP-3074EIP-4337ClosingBackground
本文主要继承自前篇:AccountAbstraction抽象帐户:EIP-2938简介,因此会希望读者已经阅读完前篇,以及具备相关的背景知识。
▎EIP-3074
EIP-3074:AUTHandAUTHCALLopcodes打算在EVM中加入两个新的OpCodes,分别是?AUTH?和AUTHCALL,让EOA能透过这两个opcode授权合约代替EOA的身份去呼叫其他合约。
此提案仍在review阶段,请大家谨慎服用。EIP-3074的主要目的并非设计一个崭新的protocol来扩展EOA的functionality,因为随着protocol与相关的介面标准越来越复杂,能被攻击的地方也会越来越多。
它倾向让User可以以合约代理自己执行各种动作,同时让开发者能以一个更具弹性的框架来设计交易物件和验证机制,使任何的EOA可以像一个合约帐户一样运作,却不用自己布署任何合约。
Overview
ImageSource:?Ethereumwalletstodayandtomorrow—EIP-3074vs.ERC-4337
概括来说一个EOA能将一则已签的讯息送至自己信任的合约上,合约可以利用?AUTH?和?AUTHCALL?代替这个EOA送出这笔交易。
由于EOA/User提交给Invoker的形式是合约自订的,搭配新的OpCodes之后能让各种需求变得很好实现,例如批次交易、包装交易、手续费缴交方式、多签、签章验证方式等。EOA也能透过他喜欢的方式给予Invoker手续费。
Vitalik Buterin:账户抽象升级可以吸引数十亿人使用以太坊:7月20日消息,以太坊创始人Vitalik Buterin最近在以太坊社区会议(EthCC)演讲中详细介绍账户抽象升级“paymasters”如何让用户用用于交易的代币支付Gas费,从而吸引数十亿人使用以太坊。账户抽象使用户能够从外部拥有的钱包(EOA)切换到基于智能合约的钱包。如果此次升级成功,钱包管理将比现在更加高效和轻松。Vitalik Buterin和社区相信,这可以使加密货币得到广泛采用。
此外,加密货币领域充斥着丢失助记词或助记词被盗的用户。通过账户抽象,用户可以创建充当可编程智能合约的非托管钱包。钱包恢复只是此次新升级带来的众多功能之一。[2023/7/20 11:06:21]
特别注意:EIP-3074可以视为是EOA的扩充而非必要。Invoker是不可升级的,因为可升级合约的新逻辑可能会让Invoker无法适当地验证commit,导致造成非常严重的问题,例如让不该通过的交易签章通过,或该通过的无法通过。
此外,commit可以利用平行的call和在其之中的nonce,达到multi-call的「包装交易」效果。例如我们在面对ERC-20的交易时,就可以把approve-transfer包在一个动作里面。
关于这个部分每一个callframe里面的角色及运作,可以见下文。
EIP-3074相关的缺点与改进建议的部分可以看:AcaseforasimpleralternativetoEIP3074?、EIP-3074ThreatModels和Reference处的内容。authorized
authorized是一个型态为?address?的变数,表示当今合约是被哪个帐户授权的。被授权的合约能够使用?AUTHCALL?代表此帐户执行各种行为。authorized和其他以太坊中的变数不同,它没有预设值,每次合约开始一个执行前就会将其初始化为unset,代表当前没有EOA授权此合约执行。authorized是?AUTH?及?AUTHCALL?这两个新OpCodes会去查看的变数,存在当前合约执行时的EVM中,用于确认是否已经正确设置授权帐户,如果已经被设置且所有签章合法则?authorized?的值会被?AUTH?及?AUTHCALL?取用。合约每一次只能有一个authorized,也就是说合约不能同时代替两个EOA执行动作。每次执行时,每次的?authorized?是独立的,不能监听到别人的authorized。即便是利用DELEGATECALL,或同样?address?授权加上同样一笔交易,当前?authorized?都不能离开作用域影响别人。不能跨出executionframe的原因是同一笔交易里面可能有多个callframe,而每一个callframe都有一个经过?AUTH?授权的authorized,这个授权只停留在自己的callframes里面,也就是?authorized?不能影响他人及被影响的原因。AUTH和AUTHCALL
Worldcoin:World App使用Safe账户抽象堆栈提高钱包安全性:5月29日消息,Worldcoin 在社交媒体上表示,该生态首个加密钱包 World App 已成为 Polygon 网络最大 Safe 钱包部署者。
据悉,每个 World App 用户都会收到一个部署在链上的智能合约以太坊钱包。World App 使用账户抽象来提高钱包的整体安全性。在底层,这个智能合约钱包使用了一个由 Safe 开发的账户抽象堆栈 Safe{Core}。[2023/5/29 9:49:18]
AUTH:会基于ECDSA签章演算法去设定?authorized?的值
AUTH会从Stack中取出三个元素:authority、offset、length,首项代表signeraddress,后两者代表memory的range,会接收EOA的以及commit。由于是接收dynamicmemoryrange,因此?AUTH?未来是有机会升级来支援与ContractAccount互动或使用其他验证方法的。此处EOA送来的签章仍然是使用?secp256k1?这个演算法,签章结果为:(v,r,s)。如果签章合法且签章recover后?authority==signer?或authority==tx.origin,则将?authorized?设为authority。如果?authorized?被成功设定成?authority?也就是signer,那?AUTH?会回传1,否则回传0。commit是EOA提交的交易资讯,InvokerContract会验证这里面的内容,包含nonce、to、gas、calldata。
AUTHCALL:会代理?authorized?这个帐户发送call
AUTHCALL会从Stack中取出八个元素,包含:gas、addr、value等,用于发送call。与?CALL(0xF1)?的行为很像,差别主要在于一些参数的逻辑判断,例如:authorized如果是unset的状态,则这次执行动作就不合法。在EIP-3074中还有?dynamic_gas?的设计,这个部份因为比较琐碎我就先略过,如果有兴趣或是想知道其他参数的Spec.可以详阅此处。
▎EIP-4337
以太坊账户抽象提案ERC-4337的核心合约已通过审计:3月2日消息,以太坊基金会安全研究员Yoav Weiss宣布,新的以太坊账户抽象提案ERC-4337的核心合约已经通过了Open Zeppelin的审计,并将在每个以太坊虚拟机(EVM)兼容网络上提供,包括Polygon、Optimism、Arbitrum、BNB Smart Chain、Avalanche和Gnosis Chain。Weiss表示,新用户将不再需要学习复杂的助记词或设置钱包的技术过程,就能进入去中心化的加密世界。
据悉,账户抽象(Account Abstraction)是通过省略以太坊账户体系中不必要细节,来减少复杂性并提高有效性有效地(消除了对EOA的需求和对智能合约钱包的特殊处理)。Weiss是以太坊改进提案 (EIP) 4337的主要作者之一,另外还有以太坊联合创始人Vitalik Buterin和其他五位成员。Weiss表示:“V神9年前首次发布了这个概念,甚至在以太坊推出之前。我们花了这么长时间才到达了现在这个阶段。”(Cointelegraph)[2023/3/2 12:37:37]
EIP-4337:AccountAbstractionviaEntryPointContractspecification则希望可以把原本交易在底层运作的逻辑拉到合约中:
当User签核完一笔交易后将其送到UserOperationmempool之中而Bundler会从中挑选交易,捆绑成一笔BundleTransaction呼叫EntryPointSmartContract的handleOps完成相关执行与验证之后,把交易推到链上。在这里我们有许多名词是第一次碰到,下文我会慢慢解释!
此提案仍在draft阶段,请大家谨慎服用。
Source:?ERC4337:accountabstractionwithoutEthereumprotocolchanges
首先,这个提案最大的特点就如同上图来源,Vitalik文章的标题叙述一样,不用去更改Ethereum底层的Protocol就能完成AA的实作。
严谨来说是不用去修改或增加共识层的Protocol。EIP-4337可以达到以下目标,某些点可能与我们之前介绍过的EIP-2938和EIP-3074稍微不同:
以太坊账户抽象提案EIP-4337新增签名聚合,可为rollups降低数据成本:10月3日消息,据以太坊创始人V神(Vitalik Buterin)近日发布的推文,其于2021年9月联合发起的以太坊账户抽象提案EIP-4337近期发布了新版本,添加了包括BLS签名算法的签名聚合。签名聚合功能能够让构建者和批次提交者也能聚合签名(例如BLS、SNARKs),大大减少了链上的数据。
V神表示,ERC-4337为账户抽象提供了真正有价值和必要的东西,可为使用智能合约钱包的用户操作提供“去中心化费用市场”。我们正在慢慢精准实现账户抽象的实际路径,本次发布新增的签名聚合功能可以为rollups降低数据成本,这也将成为采纳ERC-4337的动力之一。
据悉,账户抽象(Account Abstraction)是通过省略以太坊账户体系中不必要细节,来减少复杂性并提高有效性有效地(消除了对EOA的需求和对智能合约钱包的特殊处理)。[2022/10/3 18:38:21]
以ContractAccount作为真正的主要帐户:不再需要任何EOA作为呼叫的源头去中心化:不需要对bundler这个角色的信任假设不需要修改共识层的Protocol:所以不会有新的OpCodes也不会有新的TransactionType。拥有过往我们提到的其他特性,例如:Atomicmulti-operations、Privacy-Solution、不同支付手续费的方式ContractSpecification
我们可以把EIP-4337的AA实作当成是一个Contract的Spec.,它的目的是要把底层的交易与帐户运作拉到合约层面执行。这边我会边解释名词,边顺过整个交易在AA被执行的过程。
1.UserOperation&2.UserOperationmempool
在合约里面,用户送上来的交易物件是一个在合约中名为?UserOperation?的struct。这个?struct?的members和我们认识的交易很像,包含sender、nonce、callData、callGas、signature等,细节可见原提案。
为了避免ReplayAttack,Signature的制作必须要包含?chainid?和?EntryPointaddress?等元素。3.Bundler&4.BundleTransaction
Nervos network谢晗剑:未来的区块链不是追求性能更好,而是抽象层次更高:金色财经现场报道,10月26日,由万向区块链实验室主办的第七届区块链全球峰会在上海举行,Nervos network 架构师谢晗剑在题为《区块链抽象和演进》的分享中称,治理和抽象是区块链面临的新挑战。以太坊改变了一切,它是把区块链技术一般化,它去寻找利用区块链技术的应用,发现它们的共性,然后为各种应用、场景和需求,创造一个平台,使得在以太坊上可以创造各种应用,包括支付、游戏等。以太坊是抽象层次更高的系统,而未来的区块链,追求不是性能更好,而是抽象层次更高,更加一般化的设计。他认为区块链在抽象层面的问题有三个,比如特定的账户体系,特殊的密码学算法,特殊的运行时。区块链应该追求抽象层次越高,性能是副产品。[2021/10/26 20:57:53]
Bundler有可能是矿工,或是能作为User和Miner之间的中介人。会去聆听UserOperationmempool中新加入的UserOperation,并且将从这些交易中挑选一部分捆绑成BundleTransactions。
这边我们可以假设UserOperation一定会被打包处理,因为可能会有类似FlashBot的Bundler去快速过滤出有利润可图的交易。首先Bundler会在Local使用RPCCall呼叫EntryPointSmartContract中的simulateValidation(),以此先确保这些UserOperation的签章没问题和GasFee被正常支付。关于模拟交易结果的部分可见此处。
最后BundleTransactions会呼叫EntryPointSmartContract中的函式handleOps。
5.handleOps&6.EntryPointSmartContract
EntryPointSmartContract是一个早就被布署的合约,将在未来被相关的AATransaction呼叫使用,例如某一个Dapp有它想要的AA交易模式,它就需要布署一个它的EntryPoint。
EntryPoint会处理UserOperations的内容和替BundleTrandactions布署一个WalletsContract。
WalletContract会用来处理nonce与signature的验证并且执行交易。
EntryPointSmartContract
在进到?EntryPoint?与?handleOps?的解释之前,我们先回忆一下之前在EIP-2938提到的,节点需要负责验证一笔AA交易是否合法的两个阶段:PAYGAS以前的验证阶段,与?PAYGAS?以后的执行阶段。
前者限制交易只能阅读合约的storage以及不能更改任何状态,如果交易在这个阶段失败,矿工会拒绝这笔交易。后者因为已经支付了fee,如果交易在这个阶段失败,矿工仍然可以选择要不要加入这笔交易。
Source:?Implementingaccountabstractionaspartofeth1.x
在?handleOps?中有很类似的举动,面对每一个UserOperation,handleOps会用两个ForLoop来实作上述两个phases,一个是verificationloop,另一个是executionloop。
VerificationLoop
如果这个?UserOperation?还没有一个对应的walletcontract,就用?UserOperation?中的其中一个field:initCode,来布署一个合约。如果?initCode?是空的,或者布署之后的WalletContractAddress和?UserOperation.sender?不同,这个call就视为失败。将?UserOperation?作为参数并且附上手续费,以呼叫walletcontract中的validateUserOpvalidateUserOp首先会用?require(msg.sender==ENTRY_POINT)?确认?EntryPoint?是自己认可的。接着验证交易是否合法,包含我们上述提到的那些AA特性的验证以及nonce是否正确。若是都合法则Wallet支付手续费。以上过程中有任何失败都会revert。补充说明:用户在送上?UserOperation?这个物件时,必须先用EIP-1014自行计算UserOperation.sender,也就是?CREATE2?创建的WalletContract的地址。validateUserOp()和我们之前提到Bundler会预先呼叫?EntryPoint?的?simulateValidation()?要做相同的检查。需要特别注意VerificationLoop中,如果再用call呼叫其他合约时有禁止执行的OpCodes,这个部份对应到之前EIP-2938的「限制交易在?PAYGAS?之前只能阅读合约自己的storage以及不能更改任何状态」。ExecutionLoop
handleOps中的第二个步骤会以?UserOperation?作为calldata,去呼叫VerificationLoop布署的WalletContract。并且执行交易本身该执行的内容。
执行完以后,会将剩余的gasfee给予WalletContract。
Paymasters
在EIP-4337还有特别重要的一个Features叫做Paymasters。
大家还记得在之前的文章中有介绍过的其他支付手续费的方式,以及TornadoCash的AAExample吗。Paymasters可以做到第三方代替别人支付一笔交易的手续费的行为,此时就可以去接收其他种的Fee。
要如何判断这笔交易的手续费是WalletContract还是Paymasters支付,得看?validateUserOp?中的参数?requiredPrefund?是否为0。如果我们已经确定要用Paymaster支付的话,可以对应着看上方示意图。
EntryPoint中要特别去实做一些属于Paymaster的函式,例如:
addStake、unlockStake、withdrawStake:这些函式可以让paymasters管理他们在?EntryPoint?中的资金,Paymaster必须要抵押资金以此代表同意成为第三方支付者。balanceOf、depositTo、withdrawTo:这些函式能够让Paymaster去管理用户资产在?EntryPoint?这个Contract中的状态。例如?depositTo?可以让Paymaster存款到用户身上,之后就可以这里扣除该用户交易需要用到的手续费。在以上的示意图中,对应的步骤如下:
Bundler会呼叫?EntryPoint?的handleOps。EntryPoint将?UserOperation?作为参数呼叫walletcontract中的validateUserOp,验证所有交易该验证的事情,和上文介绍两回圈时不同的是:这边不会支付手续费。先不付的原因就是为了等第三方的角色支付手续费。handleOps除了?validateUserOp?以外,还需要确认Paymaster的状况,例如拥有足够的ETH可以支付这笔交易的手续费。EntryPoint呼叫PaymasterContract中的validatePaymasterUserOp,确认paymaster愿意支付这笔交易的手续费。愿意则支付,如果不愿意这笔交易就会failed。呼叫WalletContract并执行交易本身该执行的内容。做完第五步之后,必须紧接着呼叫PaymasterContract的postOp。需要注意这里除了跳出去找paymaster之外,这一到六步都是不可分割的!
ImageSource:?Ethereumwalletstodayandtomorrow—EIP-3074vs.ERC-4337
上面这张图也蛮漂亮的,大家可以参考一下:
补充说明:第一到第四步为VerificationLoop,第五与第六步为ExecutionLoop。为了防止Paymasters可能DoS系统的风险,我们需要一个Paymaster的声望机制,详细可见:reputation,throttlingandbanningsection。可以有多个Paymasters来分担一笔交易的手续费。Security
整个系统的安全假设有一个前提是Node必须在包装这笔UserOperation时就先利用上文提到的模拟行为确保交易会成功、手续费会被支付。如果这件事情没有做到,那我们可以假设有恶意人士会提交很多个operations,并且被包装抵达?EntryPoint?但在最后一刻,才被revert。但如果有在每次提交到EntryPoint?前确实模拟,那系统就可以预设是DoSSafe的。
虽然无论是使用WalletContract还是Paymaster支付手续费,都可以利用模拟行为避免交易在最后一步才被revert,但Paymaster是被第三方制造出来的,因此我们可以想像有一种恶意情况是模拟行为中?paymaster.validatePaymasterUserOp?会成功,但之后的?postOp?等真正要执行时会失败。
Closing
和前一篇介绍AA的文章相同,由于是简介所以非常多设计细节还有实作的设计想法我都没有提到,如果想要了解的话可以细细品尝该EIP本身还有下方Reference提到的资料。
由于以上介绍的两个提案都还不是定案,在研究时也会找到许多旧版提案的内容,因此如果大家发现认知与资料不一的情况,可以先去确认EIP内文,那里肯定是最准确的!
本文要感谢
NICLin老师的Review(这篇超级长的
元宇宙中的网络效应 由正如我在上一篇关于元宇宙体验的文章中所指出的,元宇宙的内容和应用已经非常多样化。元宇宙已经在这里了。但是当我们谈论它时,我们谈论的是它正在变成什么.
谋求上市,社交应用Soul把注押在元宇宙上。从3D捏脸到最近发布的NAWA引擎,赴美折戟转战港股的Soul拼命套上元宇宙的外衣,但这件外衣既没法遮住下滑的口碑,也掩盖不了连续的亏损.
前几天,Solana生态上的DeFi项目Mango受到黑客闪电贷攻击,损失超过1亿美金。据悉,黑客是通过操作预言机的价格来掏空了Mango协议的流动性.
“thebirdisfreed”这是马斯克刚刚最新发布的推文,这也意味着拉扯半年之久的推特收购案已基本落下帷幕.
这是一个正在进行中的文件,我试图记下我所遵循的一些原则。并不是所有的原则都有对错之分,大多数只是我做或者看待事物的方式.
加密市场虽然处于熊市,但Web3增长工具市场正在不断升温,这里有一份Web3增长工具清单请查收.