作者:@0x30cf 本文链接:https://www.notion.so/0x30cf/Account-Abstraction-89af88303b2045cfa6e164348b5f938e?pvs=4
如果你发送 1 个 ETH 到由代码合约控制的账户,那就没有人可以再控制这个 ETH了。唯一可以转移这个 ETH 的是合约的执行,即代码本身。
它是一种新的账户类型,简单来说,账户抽象的目标是让智能合约成为顶级账户类型,而非受限于必须由外部账户调用,这样智能合约账户就可以主动发起事务并支付手续费。
账户抽象交易的有效性验证也发生了根本性改变,由原来固定的「签名+nounce+余额」变成了可编程的验证方式,其有效性由 target 字段指定的智能合约验证,通过验证之后,合约可以自行为该交易支付手续费。
核心思路是将“验证所有权”的操作由共识层下放到合约层,即不去检查事务的发送者是否与资产所有人一致,而是检查其是否提供了合法的凭据。
引入了一种新的事物类型:账户抽象事物类型,AA_TX_TYPE。
它的二进制数据 (payload) 会被解析为
RLP([nonce, target, data]), 而不是现有交易的RLP([nonce, gas_price, gas_limit, to, value, data, v, r, s])
新增了两种操作码
NONCE 操作码:添加一个
NONCE操作码,推送事务的 nonce 字段。PAYGAS 操作码:添加一个
PAYGAS操作码,创建一个不可逆的检查点,确保PAYGAS之前的状态变更无法被逆转。
新增了两种内存池规则
操作码限制:在验证阶段(即在执行 PAYGAS 操作码之前)部分操作码被视为无效,以防止抽象账户交易的有效性取决于抽象账户合约以外的任何状态 字节码前缀限制:只接受字节码前缀为 AA_PREFIX 的 target 合约,以防止非抽象账户交易与抽象账户交易发生交互,若
target指向的合约不是AA合约就放弃这笔交易
我们可以从以下几个方面出发,来看下AA有什么作用。