以太坊交易分为:发起、广播、打包与执行、验证与执行
1.发起:用户在本地的以太坊钱包软件中选择要发送的交易地址(From)、输入目标地址(To)、金额(Value)、是否部署或调用合约(Data)、手续费单价(Gasprice)等,确认发送至以太坊节点
节点和钱包可以是同一台物理服务器,也可以分离。 多个用户各自保有钱包私钥,而通过同一个以太坊节点广播交易。
一般,以太坊钱包软件会自动为用户设置Gaslimit(交易的最大燃料上限)、Nonce值,最后使用私钥得到r、s、v,最终将交易序列化后发送到网络中。(部分客户端中Gaslimit,Nonce自己定义)
2.广播:节点收到(或自己发起)交易后,会对交易进行验证。
验证:交易的签名、发起账号的余额是否能支付转账余额与手续费、Nonce是否为账号已发出的交易数。
验证为合法后,将交易加入节点的交易池中。
交易池中存储着待打包的交易,交易经过验证并暂存到交易池的这一过程对区块链的数据结构没有影响。
3.打包与执行
具有挖矿功能的全节点,开始打包下一个区块。
一般情况下,节点从自身利益出发,会将交易池中的交易按GasPrice取出具有较高手续费的交易。
根据To值的不同,将交易分为以下3种类型:
(1)创建合约交易。To 为空的交易。
对于创建合约交易,EVM 将会根据 From值及Nonce 值生成合约地址,执行 Data 中对应的智能合约代码(包含合约本身及其构造函数的代码),并最终将合约 EVM代码存储到合约地址中。
(2)调用合约交易。To为合约账户的交易。
对于调用合约交易,EVM 将从世界状态中获取To地址中存储的 EVM 代码,并执行交易的 Data 宇段中包含的代码。一般To地址中存储的是合约本身,而 Data中则包含了调用合约的相应函数及其参数。本质上来说,对合约的调用是对合约状态的修改。
(3)普通转账交易。To 为人控制的账户(也称为外部账户)的交易。
这一交易的执行则是直接将以太币金额从 From 转到To。
每笔以大坊交易都是对以大坊状态的修改,而在每一笔交易执行后,会生成交易的收据,其中带有新建的合约地址、消耗的 Gas总量、交易生成的事件日志(称为event 或 log)等。在所有需要打包的交易执行后,交易、状态和收据的信息也会打包到区块中。记账节点在打包交易并获得合法的区块后,将区块(包含交易数据)广播到网络中的相邻节点。
4.验证与执行
没有获得记账权的节点,即未打包区块的节点,在收到广播的区块后,将对区块进行合法性的验证,并进行交易的执行。验证的内容与执行的过程与2(广播)、3 (打包与执行)中的相同,目的是保证智能合约执行的去中心化。