了解在以太坊和 Solana 上构建账户时的不同之处。
作为区块链网络,以太坊和 Solana 拥有独特的数据结构,充当全球公共计算机,在其网络上存储和共享数据。在本章中,我们旨在探索这些链如何构建其数据集。
以太坊中的“账户”
在以太坊中,“账户”是指拥有以太币并可以发送交易的实体。它包括存款和取款所需的地址,并分为以下几类:
- EOA(外部拥有账户):外部拥有的账户,拥有私钥。可以将其视为个人钱包的账户。
- CA(合约账户):合约账户,持有智能合约代码。
以太坊中 EOA 与 CA 的一个关键区别是,EOA 不是智能合约,通常没有自己的存储。因此,EOA 的代码哈希被设置为“空”哈希,表示该帐户没有存储空间。
外部拥有账户 (EOA) 是具有私钥的账户,拥有私钥意味着控制对资金或合约的访问。私钥意味着控制对资金或合约的访问。EOA 中包含以下数据:
场地 |
描述 |
address |
账户地址 |
balance |
地址拥有的 ETH 数量(以 wei 为单位)。 |
nonce |
计数器显示从账户发送的交易数量,以确保交易只处理一次。对于智能合约,它反映了账户创建的合约数量。 |
code hash |
EVM 上的账户代码。 |
storage hash (storage root) |
对账户存储内容进行编码的 Merkle Patricia 树根节点的 256 位哈希值。此树对此账户存储内容的哈希值进行编码,默认情况下为空。 |
合约账户包含智能合约代码,而 EOA 根本无法拥有这些代码。此外,合约账户没有私钥。相反,它由智能合约代码的逻辑控制。此智能合约代码是在创建合约账户时记录在以太坊区块链上的,是由 EVM 执行的软件程序。
与 EOA 一样,合约账户有一个地址,可以发送和接收 Ether。但是,当交易的目的地是合约账户地址时,交易和交易数据将用作在 EVM 中执行合约的输入。除了 Ether,交易还可以包含指示要执行的合约特定功能的数据以及要传递给该功能的参数。因此,交易可以调用合约内的函数。如果 EOA 请求,合约还可以调用其他合约。但是,由于合约账户没有私钥,因此它无法签署交易,也无法自行发起交易。关系总结如下:
- EOA → EOA(确定)
- EOA → CA(确定)
- EOA → CA → CA(确定)
- CA → CA(不可能)
Solana 中的“账户”
Solana 中的帐户概念比以太坊中的要广泛一些。在 Solana 中,所有数据都是基于帐户存储和执行的。这意味着,在交易之间需要存储状态的每种情况下,都会使用帐户来保存状态。与 Linux 等操作系统中的文件类似,帐户可以存储在程序生命周期之外仍然存在的任意数据。此外,与文件一样,帐户包含元数据,可告知运行时谁可以访问数据以及如何访问。
在 Solana 的 Sealevel VM 中,所有账户都能够存储数据。那么,智能合约开发人员可以将数据存储在哪里呢?他们可以将数据存储在可执行账户拥有的非可执行账户 (PDA) 中。开发人员可以通过分配与其可执行账户地址相同的所有者来创建新账户来存储数据。
场地 |
描述 |
lamports |
此帐户拥有的 lampor 数量。相当于 balance 。 |
owner |
此帐户的程序所有者。 |
executable |
该账户是否可以处理指令。 |
data |
该账户存储的原始数据字节数组。 |
rent_epoch |
此帐户下次欠租金的时期。 |
然而,Solana 网络上存储数据的“账户”需要支付费用。这些账户包含有关其所含数据寿命的元数据,以名为“Lamports”的原生代币表示。账户存储在验证者的内存中,并支付“租金”以保留在那里。验证者定期扫描所有账户并收取租金。Lamports 降至零的账户将被自动删除,因为它们无法支付租金。如果一个账户包含足够数量的 Lamport,它将免收租金,并且不会单独扣除租金。
Solana 的账户分为以下两种类型,与以太坊类似:
- 可执行账户(程序账户):这些是存储代码的智能合约,通常更简单地称为“程序”。
- 不可执行账户(数据账户):这些账户可以接收代币或数据,但不能执行代码,因为可执行变量设置为“false”。
(*与以太坊不同,Solana 使用术语“程序”而不是“合约”。)
比较每个链中的帐户结构,可以发现以下差异。
以太坊账户 |
Solana 的账户 |
Account |
owner |
balance |
lamports |
nonce |
[无同等效力] |
code hash |
executable && data |
storage hash |
data |
[无同等效力] |
rent_epoch |
那么,EOA 和 CA 与 Solana 的 Account 结构如何对应呢? 它们可以进行如下映射。
EOA(外部拥有账户、钱包) |
→ 不可执行的数据账户 |
然而,Solana 上的个人钱包由一系列 数据账户组成,这是一个比EOA 更广泛的概念。 |
CA(合约账户) |
→ 可执行文件、程序帐户 |
虽然具有相同的概念,但以太坊的CA不能自行执行交易;它们必须由EOA执行。 |
账户抽象
以太坊一直在探索账户抽象的概念。以太坊中有两种类型的账户:EOA 和 CA,每种账户的功能截然不同。值得注意的是,合约账户 (CA) 无法生成或签署交易,这带来了很大的限制。交易必须通过 EOA 发起和签署,这意味着使用 21,000 gas 的基本费用,并增加了账户管理的复杂性。账户抽象旨在消除这些限制,允许单个账户同时执行 EOA 和合约账户的功能。
因此,可以对图表进行以下调整:
- EOA → EOA(确定)
- EOA → CA(确定)
- EOA → CA → CA(确定)
- EOA + CA (AA) → CA(现在,好的!)
例如,多重签名钱包或智能合约钱包需要在单独的 EOA 中存储少量以太坊以支付交易费用,这带来了需要随时间补充的不便。账户抽象允许单个账户执行合约并发出交易,从而改善了这种不便。Vitalik 通过 ERC-4337 向社区提出了这一概念,并于 2021 年被采纳,现已在以太坊网络中实现。
总而言之,账户抽象具有以下好处:
- 其他人支付我的交易费用,或者我为其他人支付。
- 使用 ERC-20 代币支付费用
- 设置自定义安全规则。
- 密钥丢失时的帐户恢复。
- 在受信任的设备或个人之间共享帐户安全。
- 批量交易(例如,一次性授权和执行掉期)。
- 为 dapp 和钱包开发人员提供更多机会来创新用户体验。
Solana 中实现了账户抽象吗?
Solana 自推出以来就实现了账户抽象(AA)。如前所述,Solana 将所有数据存储在称为“账户”的单元中,分为可执行(程序账户)和不可执行(数据账户)。从一开始,Solana 就支持程序创建和管理特定账户(即直接发起交易)的能力。此功能扩展了 Solana 中的账户抽象功能,称为程序派生地址(PDA)。与数据账户不同,Solana 程序是包含可执行代码的可执行账户。通过 PDA,开发人员可以设置交易签名的规则和机制,允许代表 Solana 网络认可和批准的受控账户(PDA)自主授权各种链上操作。因此,与以太坊不同,Solana 允许直接控制基于 Solana 程序的另一个程序,而无需繁琐的分层。
概括
- Solana 的账户概念构建了链上的所有数据,所有数据都基于账户。
- Solana 原生支持 AA,实现程序间自调用。
原文:https://solana.com/developers/evm-to-svm/accounts