区块链技术开发教程

区块链技术指南,区块链技术的工作原理讲解,区块链技术入门教程

以太坊源码分析——交易池

2018-12-12

本章节介绍以太坊的交易池基本功能,主要是介绍交易池函数的作用。后续章节会针对某个一个函数进行更详细的分析。

点击区块链技术培训课程获取更多区块链技术学习资料。


一、TxPool概述

1.1 前言

本章节介绍以太坊的交易池基本功能,主要是介绍交易池函数的作用。后续章节会针对某个一个函数进行更详细的分析。


1.2 交易池的基本功能

txpool主要用来存放当前提交的等待打包入区块的交易。数据结构如下

type TxPool struct {
config       TxPoolConfig
chainconfig  *params.ChainConfig
chain        blockChain
gasPrice     *big.Int   //最低的gasPrice设置
txFeed       event.Feed //通过txFeed来订阅TxPool的消息
scope        event.SubscriptionScope
chainHeadCh  chan ChainHeadEvent//txpool订阅了区块头的消息,当有了新的区块头生成的时候会在这里收到通知
chainHeadSub event.Subscription//区块头的消息订阅器,通过它可以取消消息
signer       types.Signer //封装了事务签名处理
mu           sync.RWMutex
 
//头区块的状态接口
currentState  *state.StateDB      // Current state in the blockchain head
//pending列表的中的账户的nonce值管理
pendingState  *state.ManagedState // Pending state tracking virtual nonces
 //交易的gas上限
currentMaxGas uint64              // Current gas limit for transaction caps
 
locals  *accountSet // Set of local transaction to exempt from eviction rules
journal *txJournal  // Journal of local transaction to back up to disk
 
//当前可以处理的交易
pending map[common.Address]*txList   // All currently processable transactions
//当前不可以处理的交易
queue   map[common.Address]*txList   // Queued but non-processable transactions
//每隔账号最后一次心跳时间
beats   map[common.Address]time.Time // Last heartbeat from each known account
//全局交易列表,可以查找到所有交易
all     *txLookup                    // All transactions to allow lookups
//所有交易按价格排序
priced  *txPricedList                // All transactions sorted by price
 
wg sync.WaitGroup // for shutdown sync
 
homestead bool
}


交易池有几个比较重要的成员,pending和queue。pending和queue的类型是字典,key是账户地址,value是一个交易列表。也就是pending和queue记录的是收到过某个账号的哪些交易,这个交易列表中的交易时按nonce排序,从小到大。pending列表中存放是马上可以被打包的交易,queue列表中存放的是暂时不可以被打包的交易。

pending中某个账户的交易列表需满足如下条件:

1. 交易的nonce连续递增,中间不能有空隙

2. 列表中第一个交易的nonce值需要和账户状态中的nonce值相同

3. 交易的总花费需要小于等于账户状态中的余额

4. 交易的gaslimit需要小于当前规范链头区块的gaslimit(也就是TxPool的currentMaxGas)


  Queue中某个账户的交易列表需满足如下条件:

1. 交易的nonce递增,但可以不连续(中间可以有空隙)

2. 交易的总花费需要小于等于账户状态中的余额

3. 交易的gaslimit需要小于当前规范链头区块的gaslimit(也就是TxPool的currentMaxGas)


对比queue和pending,我们发现queue主要是交易的nonce不连续,因为以太坊要求必须要按nonce递增的顺序打包交易入区块。所以queue列表相当于一个缓存,等待交易的nonce值变成连续就可以放入pending中。


那么从queue中将交易搬到pending中的过程,叫升级。从penging中将交易搬到queue中的过程叫降级。当世界状态发生变化时就会发生降级的操作,因为世界状态发生变化会导致pending中的某些交易不再符合上面的2、3、4条件而被删除,某些交易被删除后又会导致交易不连续,那些不连续的交易会被降级到queue列表。


如果新的交易被放入交易池,使得queue列表被填充,达到升级条件,这些交易会被升级到pending列表


1.3 交易池的函数

交易池有包含了一些重要的函数,如下表,我们分别介绍一下这些函数功能,后续章节详细介绍。

NewTxpool

交易池初始化

validateTx

交易池验证交易

add

向交易池中添加一个交易

reset

交易池重置

enqueueTx

将交易放入queue列表中

demoteUnexecutables

降级

promoteTx

将交易放人pending列表

promoteExecutables

升级

NewTxpool函数

交易池初始化函数,主要是初始化Txpool类,启动监听事件的go程。这个函数在以太坊启动的过程中被调用。

validateTx

交易验证函数,所有被加入的交易池的交易都要经过验证,如果验证失败,直接丢弃,并返回错误字符串。

add

向交易池中添加一个交易,这个函数会调用validateTx函数验证交易。Add主要在以太坊接收到网络上其他节点广播的交易或者本地的rpc接收到的交易时被调用

reset

交易池重置方法,reset会先先后调用降级函数和升级函数,当交易池会监听到规范链更新事件,会调用reset函数 

l   enqueueTx

将一个交易放入queue列表。

demoteUnexecutables

降级操作,demoteUnexecutables会检查pending中每一个账户的交易列表,看这些交易是否满足条件, 如果不满足就将这些交易删除或降级到queue列表。

promoteTx

将一个交易放入pending列表

promoteExecutables

升级操作,demoteUnexecutables会检查queue中每一个账户的交易列表,看这些交易是否满足升级的条件,如果满足就调用promoteTx将这些交易放入pending列表。


1.4 总结

本章节主要介绍了交易池的主要功能和一些函数的作用,后续章节会对每一个函数进行详细介绍。


-END-


001周末班+0628二维码.jpg

区块链应用案例手箭头.png

点击查看更多区块链应用成功案例 ,区块链技术开发教程 。

003学习路径+公众号.jpg








7*24客服电话

150-1118-1611

扫码添加助教微信

二维码
菜单 在线咨询 回到顶部
关闭