以太坊节点:
- 以太坊可以被认为是一个交易基础的状态机(transaction-based state machine),以太坊是由一部分状态组成的,而状态的迁移是由于一系列的交易的发生
在以太坊交易中,可用把交易分成两类:
- 简单交易(就是单纯的转账)如:从一个 address 向一个 address 转账一个 Ether
- 智能合约的交互:因为智能合约的交互也改变了以太坊的状态,所以在以太坊中,智能合约的交互也被称为交易
States(状态):
在以太坊中关注三种状态:
- Account balance and nonce:
- balance:账户中有多少钱(如 ETH 等网络原生代币(native token),不包含 ERC20 Token,ERC20 Token balance 是 Contract Storage)
- nonce:表示该账户从一开始到现在一共发起了多少比交易
- Contract Code and Storage:
- Contract Code:在链上可以允许的智能合约代码
- Storage:该合约中存储的变量的值(智能合约中持久化存储的数据)
- Other consensus-related data(在智能合约层用不到)
以太坊节点分类
最长接触的两个节点类型为:Archive Node 和 Full Node
Archive Node(归档节点):
一个 Archive 节点会存储:区块链中每一个区块的所有历史状态(history states)
Full Node(全节点):
只存储最近的 128 块的状态,(节省存储空间的目的)
大多数情况下是不关注历史状态的,有一个 Full Node 节点即可。节点的实现是通过不同语言实现的(Go,Rust等,以太坊是使用 Go 语言实现的节点)
Account(账户)
在以太坊中存在两种账户:
- Externally owned accounts(EOA)—— 外部拥有账户(简称外部账户)
- Smart contract account —— 智能合约账户
EOA 账户和智能合约账户本质的区别就是:EOA账户没有 Code,而 Smart contract account 有 Code
Account 的信息是存储在区块链上的,Account 是否有 Code 也是存在区块链的 States 的,通过查看一个 Account 是否拥有 Code 即可判断账户是否为 EOA 账户。
EOA Account:Valid Ethereum Address(有效的以太坊地址)
- 一个公、私钥对
- balance(native Token 原声代币 余额)
- nonce
- code-Hash(一个 Account 里的 Code 代码的哈希值,如果是一个 EOA 账户,其中不存在 Code,但是无论是否为 EOA 都有 code-Hash)
Contract Account:存储和执行智能合约代码的账户
- balance 和 nonce (一个合约也有 native Token 余额,nonce)
- code-Hash:关联的智能合约代码的哈希
- storageRoot 包含关联存储数据的默克尔树(contains Merkel tree of associated storage data)
Transactions(交易)
交易:更改区块链中的状态一个请求
交易可分为三种:
- 账户之间的转账(Fund Transfer)
- 智能合约的部署
- 智能合约函数的调用
根据交易的类型还可分为:外部交易(External Transaction)和内部交易(Internal Transaction)
Fund Transfer
Gas
为什么要设置 Gas 的机制?
补偿提供计算资源的人,如果没有 Gas 的存在,可能存在攻击者对智能合约平台进行毫无代价的 DDos 攻击
- Gas Limit:每一笔交易都要指出你对这笔交易最多支付的 Gas 单元,这个值就是 Gas Limit
- Gas Price:每一笔基本单元的 Gas 花费多少 native Token。
- Gas Cost:每笔交易真正花费的 gas:
gas = gasUsed * gasPrice
。如果gas > gas limit
,交易会回滚
当gas > gas limit
时:
当 Out of Gas 时,交易会发生回滚(revert),但是之前指定的 gas 不会返还,因为在发起这笔交易时,已经花费了区块链网络的算力,所以依然会花费 gas。
在 EIP-1559 后,Gas 的计算变得复杂。详细查看 EIP-1559。