# 中文：ERC4337 详解之：Account Creation

By [B+](https://paragraph.com/@b-2) · 2023-03-22

---

与传统意义上的钱包账户不同， AA账户本身实现了账户和签名器的分离，所以钱包地址不再是我们理解的签名器的地址，而是一个专门的账户地址，而且值得注意的是，这个账户地址因为是一个智能合约，所以他需要被部署到区块链上才能使用。但幸运的是，ERC4337定义了标准，让账户地址在账户只能合约部署之前就能得到。

这篇文章讲详细解释ERC 4337账户的创建以及部署：

### 账户创建

账户的创的目的是得到一个账户地址。整个过程需要一下模块的交互：

**账户工厂**：账户工厂的作用是用来创建账户的，但往往创建过程不是直接的账户工厂的调用。账户工厂未来保证创建账户地址的可预测性，会使用CREATE2方法来创建

**Example**：

![](https://storage.googleapis.com/papyrus_images/459f60d3aa26efc4090cc96efd5125fabd6984bfcef20cac2f199c8880e56bf5.png)

他需要一下步骤来完成：

*   getAccountInitCode：通过链接账户得到账户工厂的address，以及账户工厂账户创建的callData，把这两个数据组合到一起得到账户initCode
    

![](https://storage.googleapis.com/papyrus_images/c74fb62d6c9e8d4551eb431b8f84773952fed8512a255fe1277a497c94a07619.png)

*   调用EntryPoint → getSenderAddress，传入initCode，getSenderAddress内部会解析这个initCode，并且解析工厂合约的地址和callData，用call方法来执行账户创建并得到相应的地址
    

![](https://storage.googleapis.com/papyrus_images/df04be66b3aa18fc3c739e5eb64e3fb32fb097541a6bf99cfe3596c84b7a4c93.png)

### 账户部署

部署账户调用EntryPoint的handleOps 来完成，这是所有transaction的入口。账户部署和其他的transaction的区别在于：账户部署时，提交的UserOperation里边包含账户的initcode：

下边是账户部署提交的UserOperation的示例：

![](https://storage.googleapis.com/papyrus_images/732a3421e4e3b6a4970221562dcb83f5ae79bcf805e1da410a11e19f69bf185b.png)

---

*Originally published on [B+](https://paragraph.com/@b-2/erc4337-account-creation)*
