主页 > 最新imtoken官方下载 > 以太坊交易处理流程
以太坊交易处理流程
交易部分总结,好记性不如烂笔头
用代码吃饭(Geth v1.9.0 stable)
整体流程
发起交易:设置from、to、value、gas等参数生成交易
交易签名:使用账户私钥对交易进行签名
提交交易:将交易加入交易池txpool
广播交易:向其他节点广播交易信息
处理交易:矿工获取交易,EVM 执行,改变状态
代码流程(全节点) 1.前端发起交易 2.internal/ethapi/api.go3.eth/api_backend.go4.core/tx_pool.go
tip:TxPool包含两个交易队列,pending(当前可执行交易队列)和queue(当前不可执行交易队列),类型为map[common.Address]*txList
add方法返回是否有替换交易(replace bool)。 如果为false,则不是替换,而是添加了新的事务。 执行参数来自TxPool.promoteExecutables
TxPool.promoteExecutables 方法将队列中的可执行交易转为挂起以太坊交易信息获取以太坊交易信息获取,并删除所有无效交易。 具体逻辑包括:
判断如果promoted的大小大于0,则协程发送事件广播go pool.txFeed.Send(NewTxsEvent{promoted}) 判断如果pending的交易数超过限制(4096),做一个平衡操作:创建一个集合记录超过限制的交易数量 对于本地账户,丢弃这些账户下的一些交易在pending中,直到数量不超过限制,更新TxPool.pendingState判断队列中的交易数量是否超过limit(1024),取出非本地账户交易,按照心跳排序,丢弃交易,直到数量不超过limit
Extension,有TxPool.promoteExecutables和TxPool.demoteUnexecutables,具体逻辑:
调用时机:在reset中调用,当NewTxPool和TxPool.loop中收到ChainHeadEvent时调用reset方法,PostChainEvents5会在miner worker.resultLoop收到resultCh和BlockChain.InsertChain后发布。 当一个新的交易插入挂起时,广播 NewTxsEvent ,使用 SubscribeNewTxsEvent 方法监听 NewTxsEvent
什么时候打电话:
6.core/state_processor.go7.core/state_transition.go
计算阈值(threshold),在core/tx_list.go添加方法
old.gasprice(100+priceBump)/100=阈值threshold