宇宙链 宇宙链
Ctrl+D收藏宇宙链

深入理解以太坊交易处理机制

作者:

时间:1900/1/1 0:00:00

前言

区块链是一个以"去中心化"、"去信任化"方式集体维护的分布式账本,这里的"分布式"不仅体现在数据的分布式存储,也体现在数据的分布式记录,即由系统参与者共同维护,作为"账本"的区块链自然少不了记账,而交易自然而然的成为了重中之重。知道创宇区块链安全实验室?将从源代码视角对以太坊交易池数据结构、交易费用设置、交易构建、交易入池、交易签名、交易验证等逻辑设计进行简要浅析,并通过对以太坊交易安全机制设计来研究公链安全机制设计。

基本概念

交易流程示意图大致如下所示:

流程说明:

首先由用户通过网络发起交易请求,并使用自己的私钥对交易进行签名,之后进行交易广播,进而将交易添加到交易池中,矿工从交易池中获取交易信息,然后将其进行打包并生成区块,之后通过进行共识出块,最后向全网广播交易区块。数据流向:

交易池的数据来源:本地提交,第三方应用通过调用本地以太坊节点的RPC服务提交交易;远程同步,通过广播同步的形式,将其他以太坊节点的交易数据同步至本地节点。

交易池的数据去向:由miner(矿工)获取并验证,用于挖矿,挖矿成功后写进区块被广播,交易被写入规范链后会从交易池中进行删除,如果交易被写进分叉则交易池中的交易不会减少,之后等待重新打包。

数据结构

首先来看一下TxPoolConfig的配置信息:

默认配置如下:

TxPool数据结构如下所示:

基础配置

在分析交易执行我们首先需要来看一些基本的配置,例如:交易手续费是有有最大的上限/下限、交易池配置、交易最大信息检索数量等,在这里我们仅对一些关键的点进行查看:

Fireblocks Web3负责人:传统金融公司正在深入研究加密货币:金色财经报道,Fireblocks的Web3负责人表示,传统金融公司正在进一步进入加密领域。Fireblocks代表1,500多家金融机构托管资金,并使它们能够与区块链和加密服务进行交互。

Amsel表示,这些公司,尤其是更传统的公司,从托管服务开始,然后慢慢转向更多的加密原生交互。Amsel说,“我们看到越来越多的传统金融正在探索进入加密货币的方式,也许他们正在采取一种更加胆小的方法”。

Amsel举了一个假设的例子,一家公司可能在一两年前开始使用加密货币托管。他说,这些公司迈出了第一步,看到没问题,然后开始更多地探索这项技术。[2022/11/6 12:21:55]

01交易手续费

02交易池配置

初始化池

交易池的初始化通过NewTxPool来实现,具体代码如下所示:

在这里首先调用sanitize函数对配置参数进行校验,以规避设置不合理的gasprices。

之后使用默认配置初始化一个交易池(txpool):

之后初始化本地账户并将配置的本地账户地址加到交易池:

之后创建更加gasprices排序的交易:

具体实现代码如下所示:

之后调用reset更新交易池:

reset具体实现如下:

之后启动reorg循环,使其能够处理日志加载期间生成的请求:

scheduleReorgLoop具体实现代码如下所示,该函数主要用于reset和promoteExecutable的执行计划。

上海:深入应用区块链提升在线跨境结算功能:金色财经报道,上海市人民政府今日印发《关于本市加快发展外贸新业态新模式的实施意见》,其中指出将探索区块链技术在贸易细分领域中的应用,建设数字贸易交易促进平台,深入应用区块链、大数据技术,提升在线跨境结算功能。[2021/10/15 20:32:30]

此时如果本地交易开启那么从本地磁盘加载本地交易。

之后订阅相关交易事件并开启主循环:

主循环loop具体实现代码如下,它是txPool的一个goroutine,也是主要的事件循环,它主要用于等待和响应外部区块链事件以及各种报告和交易驱逐事件:

钱包来进行转账,在这里我们直接以eth_sendTransaction这一个RPC为例进行分析交易的构建流程,eth_sendTransaction请求示例如下:

参数示例:

from:DATA,20字节-发送交易的源地址

to:DATA,20字节-交易的目标地址,当创建新合约时可选

gas:QUANTITY-交易执行可用gas量,可选整数,默认值90000,未用gas将返还

gasPrice:QUANTITY-gas价格,可选,默认值:待定(To-Be-Determined)

value:QUANTITY-交易发送的金额,可选整数

data:DATA-合约的编译带啊或被调用方法的签名及编码参数

nonce:QUANTITY-nonce,可选,可以使用同一个nonce来实现挂起的交易的重写

响应示例:

下面我们来跟踪一下eth_sendTransaction这一个RPC的执行过程,在这里首先检索账户是否存在,之后检查Nonce是否为空,紧接着调用SingTx进行签名操作,之后调用SubmitTransaction来提交交易:

央行上海总部:深入推进金融科技创新监管试点:5月12日,央行上海总部发布通知称,下一步将加强对金融科技应用创新试点工程的组织领导,并会同上海市地方金融监管局等单位,深入推进金融科技创新监管试点,提升金融科技支撑能力。中国人民银行于2020年4月26日支持在上海等6市(区)扩大金融科技创新监管试点,这标志着金融科技创新监管工作正式在上海启动,也为加快推进上海金融科技中心建设再添助力。

近年来,人民银行上海总部把大力发展金融科技作为推动上海国际金融中心和科技创新中心联动发展的重要着力点,积极探索设计上海金融科技中心的建设与发展路径,发布了《关于促进金融科技发展 支持上海建设金融科技中心的指导意见》(银总部发〔2019〕67号)。

央行上海总部明确,下一步将以《发展规划》为指引,加强对金融科技应用创新试点工程的组织领导,并会同上海市地方金融监管局等单位,深入推进金融科技创新监管试点,加大试点项目横向交流和成果共享,深化金融市场科技应用,提升金融科技支撑能力,为把上海建设成为与国际金融中心地位相适应的金融科技中心提供有力支撑。(中新经纬APP)[2020/5/12]

SignTx实现代码如下所示,在这里会继续调用SignTx进行签名操作,这里不再深入,后续的"交易签名"会进行纤细分析:

签名之后返回SendTransaction中去调用SubmitTransaction来提交签名,在这里会首先检查交易费用是否足够,之后调用SendTx来发送交易:

SendTx的具体实现如下,在这里会调用AddLocal来添加交易到交易池中去,这里不再深入后续会有"添加交易"这一个分析单元模块:

之后检查接受地址是否为空,如果为空则创建一个地址(一般在合约创建时出现),之后打印一份完整的TX详细信息的日志便于后续手动调查分析,之后返回交易的hash值:

声音 | 河北辛集副市长:大力推进“区块链+智能制造”的深入融合:12月27日,河北省钢铁行业“区块链+智能制造”主题峰会在石家庄辛集市举行,峰会由河北省冶金行业协会、中国电信河北分公司、长城新媒体集团主办。辛集市副市长牛军波表示,冶金行业的发展对于辛集市的经济建设起到举足轻重的作用,目前钢铁行业的自动化、信息化的发展已具有良好的基础。大力推进“区块链+智能制造”的深入融合,可以为钢铁行业带来全面的提升,在提高企业竞争力、打造优质产品方面提供有力支持。(长城网)[2019/12/27]

交易入池

我们知道交易的来源有两个方面:一个方面是本地提交的,另一个方面是远程提交的,这两个的具体实现代码分别为AddLocals和AddRemotes,这两个函数在添加交易到交易池时都是通过调用addTxs来实现的:

addTxs代码如下所示:

首先会对交易进行过滤,检查是否是一个已知的交易(即添加过或广播过的),之后调用send函数校验通过secp256k1椭圆曲线从签名(v,r,s)派生的地址,如果派生失败或签名不正确,则返回错误:

之后将交易添加到交易池中去(注意:这里有事务锁)

addTxsLocked的具体实现如下所示,它会将有效的交易进行排队处理,同时调用pool.add函数将交易添加到交易队列中去:

add函数的具体实现如下所示:

在这里会首先检查当前的交易是否已经知晓(即被广播过或者添加到池子里过),如果已知晓则直接丢弃:

之后鉴别交易是本地提交还是远程提交,并调用函数validateTx来验证交易,如果验证不通过则直接丢弃:

之后检查交易池是否满了,如果满了则放弃交易队列中定价过低的交易,GlobalSlots和GlobalQueue为pending和queue的最大容量:

声音 | 香港金融发展局董事:香港金融服务的质量将随着区块链等应用的深入进一步提升:据新华网报道,中共中央、国务院日前印发了《粤港澳大湾区发展规划纲要》,大湾区共同家园投资有限公司总裁、香港金融发展局董事胡章宏表示,伴随新的政策出台,大湾区建设国际科技创新中心,香港打造一系列新的中心、平台以及发展特色金融等目标的推进,香港金融体系的结构将愈发丰富。随着区块链等科技应用的深入以及金融科技等新业态的不断培育,香港金融服务的质量和效率也将进一步提升。[2019/2/21]

之后判断当前交易在pending队列中是否存在nonce值相同的交易,如果存在则判断当前交易所设置的gasprice是否超过设置的PriceBump百分比,超过则替换覆盖已存在的交易,否则报错返回替换交易Gasprice过低,并且把它扔到queue队列中(enqueueTx):

之后调用enqueueTx将添加到交易队列中去,同时检查from账户是否为本地地址,如果是则添加到交易池本地地址中去:

enqueueTx代码如下所示,该函数主要将新的交易插入到交易队列中去:

最后会到addTx函数中在这里会调用requestPromoteExecutables函数进行一次交易提升请求操作,它主要将交易从queue投放到pending中去:

交易签名

交易签名主要通过函数SignTx来实现,首先检查钱包是否关闭,之后检查钱包账户中是否包含发情交易请求的账户,之后调用SignTx进行签名处理:

SignTx的具体实现代码如下所示:

校验过账户的有效性后我们可以通过SignTx来使用keystore进行签名处理,在这里紧接着调用LatestSignerForChainID进行签名:

之后再SignTx函数中使用私钥进行签名:

在sign中使用ECDSA(椭圆曲线加密算法)进行签名,之后返回签名的结果:

交易验证

交易验证时整个交易环节最重要的一环,对于用户来说,交易验证时保证用户财产安全的重要手段,而对于整个以太坊来说,交易验证时保证以太坊稳定运行和持续发展的重要方式,交易验证主要出现在以下几个场景中:

用户完成一笔交易的签名时,需要将交易提交到区块链网络中,是交易能够尽快确认,节点在提交交易之前需要先验证交易,确认交易的合法性;

节点收到其他节点广播的交易时,节点需要先验证交易是否合法,合法的交易才会加入节点的交易池;

当一个挖矿节点成功计算出符合要求的哈希值后,节点会将交易池中的交易打包到区块中,接地那在打包交易的时候需要验证交易的合法性;

节点收到其他节点同步到的区块是,也需要验证区块中包含的交易。

交易验证由validateTx函数来完成,其逻辑代码如下所示,在这里会检查eip2718是否开启以及交易的类型,之后检查交易的size、交易转账的额度、交易的gas、交易签名的正确性、确保交易遵循Nonce顺序、交易人资产是否足够、确保交易的gasprice币基本的交易费用要高:

交易升级

交易升级主要是指将交易放入pending列表中去,该方法与add方法的不同之处在于add函数是将获得到的新交易插入pending,而PromoteExecutables是将把给定的账号地址列表中可以执行的交易从queue列表中插入pending中,并检查失效的交易,然后发送交易池更新事件,其实现代码如下所示:

在这里通过一个for循环来迭代所有的账户并升级交易,在这里首先将所有queue中nonce低于账户当前nonce的交易删除:

之后将所有queue中消费大于账户所持余额或者gas大于最大gas限制的交易移除:

之后将所有可执行的交易从queue里面添加到pending里面,在这里会调用promoteTx方法将队列中的交易(Txs)放入pending:

promoteTx实现代码如下所示,该函数首先将交易插入到pending队列中去,如果旧交易更好(交易Gasprice大于或等于原交易价值的110%为标准,具体跟pricebump设定有关系)则删除当前这个交易,如果当前交易相较于旧的交易更好则删除旧的交易,之后更新列表:

之后回到promoteExecutables函数中,如果非本地账户queue小于限制(AccountQueue)则进行移除操作:

最后记录移除的条目并更新queuedGauge,如果队列中此账户的交易为空则删除此账户:

交易降级

交易降级是指当出现新的区块时,已被打包的交易将从padding中降级到queue中,或者当另外一笔交易的Gasprice更高时则会从padding中降级到queue中,降级操作的关键实现函数为demoteUnexecutables,交易降级主要出现在以下三种情况中:

分叉导致Account的Nonce值降低:假如原规范链A上交易序号m花费了20,且已经上链,而分叉后新规范链上交易序号m未上链,从而导致在规范链上记录的账户的Nonce降低,这样交易m就必须要回滚到交易池,放到queue中去;

分叉后出现间隙:这种问题出现通常是因为交易余额问题导致的,假如原规范链上交易m花费100,分叉后该账户又发出一个交易m花费200,这就导致该账户余额本来可以支付原来规范链上的某笔交易,但在新的规范链上可能就不够了,这个余额不足的交易如果是m3,那么在m2,m4号交易之间就出现了空隙,这就导致从m3开始往后所有的交易都要降级;

分叉导致pending最前一个交易的nonce值与状态的nonce值不等。

demoteUnexecutables代码如下所示,在这里首先通过遍历pending列表来获取每个addr的最新Nonce值,之后删除Nonce小于之前查询所得Nonce值的交易,之后返回账户余额已经不足以支付交易费用和一些暂时无效的交易,并将暂时无效的交易放到queue中,此时如果有间隙,则将后面的交易移动到queue列表中,如果经过上面的降级,如果pending里某个addr一个交易都没有,就把该账户给删除:

池子重置

我们可以通过reset来重置交易池,该方法具体代码如下所示:

如果老区块不为空且老区块不是新区块的父区块,则检查老区块和新区块之间的差值是否大于64,如果超过64则不进行重组,否则获取旧头和新头的最新区块,如果旧头为null则检查新头的高度是否小于旧头的高度,则打印日志并直接return,如果不满足则继续向下执行;

如果旧头不为null则开始进行重组,此时如果旧链的头区块大于新链的头区块高度时则旧链先后回退并回收所有回退的交易,如果新链的头区块大于旧链的头区块则新链后退并回收交易,当新链和旧链的到达同一高度时则同时回退直到找到共同的父节点,之后找出所有存储在discard里面但是不在included里面的值,之后将这些交易重新插入到pool里面:

之后设置最新的世界状态、设置新链头区块的状态,然后把旧链回退的交易放入交易池:

本篇文章通过从源代码角度对以太坊交易池数据结构、交易手续费设置、交易构建、交易签名、交易入池、交易验证、交易升级、交易降级、交易池重置等功能模块的分析,探索了以太坊交易处理的流程以及安全设计,而公链安全体系的建设依旧是长路漫漫,有待进一步深入探索。

https://blog.csdn.net/lj900911/article/details/84825739?

https://blog.csdn.net/pulong074

标签:ENDONCINGNCELegends of AriaLEMONCHAINbiking英语Topshelf Finance

中币交易所热门资讯
楚悦辰:6.19比特币符合预期下跌,事实验证空头思路没有问题

浮沉几度,岁月难收。是把握当下,还是悔不当初?成功的投资者要做到:既敢输,更敢赢,既不能因为亏损就缩手缩脚不敢操作,也不能赚点小钱就落袋为安,只有这样,才能拥有成功的交易心理。其实,交易很简单,复杂的是人性.

1900/1/1 0:00:00
者邮寄虚假硬件钱包给Ledger数据泄露受害者

据Cointelegraph消息,硬件钱包制造商Ledger重大数据泄露的影响仍在持续。Reddit上r/ledgerwallet论坛的一名投稿人以“u/jjrand”为标签发帖,自称是受此次数据泄漏影响的投稿人之一,他发布了从邮件中.

1900/1/1 0:00:00
关于上线CELEB的公告(0617)

尊敬的用户: BiKi平台即将上线CELEB,并开放CELEB/USDT交易对,具体时间如下:1、开放充值时间:6月17日12:002、开放交易时间:6月17日15:003、开放提现时间:6月17日15:00 币种介绍: 代币名称:C.

1900/1/1 0:00:00
早期玩家眼中的NFT

在NFT的市场上,我们看到一些早期的持有者收益很高,但大多数后期进入者难以获利。相对而言,对于多数加密用户来说,NFT市场是一个进入门槛较高的领域。我们要想理解NFT市场,其中一个很好的视角是来自早期持有者们.

1900/1/1 0:00:00
老崔说币:比特币市场惨淡,不要盲目追涨!

大家好,我是来自CKcoin平台首席分析师老崔说币,也是你们的朋友老崔说币Lcsb18888,老崔说币公众号同步专注数字货币行情分析,争取为广大币友传递最有价值的币市信息,欢迎广大币友的关注与点赞.

1900/1/1 0:00:00
如何在 imToken 中体验 Fantom ?

imToken现已支持用户通过自定义节点功能体验Fantom公链。Fantom是基于DAG技术并支持智能合约的高性能公链,致力于解决现存区块链技术的可拓展性和处理时间问题.

1900/1/1 0:00:00