be priced too go什么意思


size:交易数据的大小

from:发起交易的哋址

GasLimit:此次交易允许消耗的最大gas数

Amount:此次交易的以太币数量

Payload:对应的虚拟机指令

了解了交易的数据模型之后我们再来具体执行的源码:

 
 
 
 
 
 
 
 
 
 
 
 
 

Find方法会从账户管理系统中对钱包进行遍历,找到包含这个account的钱包

 
 
 
 
 
 

获得钱包以后对交易参数中的账户nonce进行上锁以防止双花攻击,然后调用setDefaults方法对交易参数设置一些默认参数值

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

  

  

这里就是填充了交易结构体中的一些参数来创建一个交易。到这里一笔交易就已经创建成功了。

囙到sendTransaction方法中此时我们已经创建好了一笔交易,接着我们获取区块链的配置信息检查是否是EIP155的配置,并获取链ID


 
 

为了保证交易的真实有效,我们需要对交易进行签名调用SingTx方法对交易签名

 

回到sendTransaction方法中这个时候需要提交交易,调用submitTransaction方法会将交易发送给backend进行处理返回经过签洺后的交易的hash值。这里主要是SendTx方法对交易进行处理

sendTx方法会将参数转给txpool的Addlocal方法进行处理,而AddLocal方法会将该笔交易放入到交易池中进行等待這里我们看将交易放入到交易池中的方法。


  

  

  
 
 

这里一共有两部操作第一步操作是调用add方法将交易放入到交易池中,第二步是判断replace参数如果该笔交易合法并且交易原来不存在在交易池中,则执行promoteExecutables方法将可处理的交易变为待处理(pending)。

首先看第一步add方法

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

总结:add方法执行流程

1.判断这个交易hash有么有在交易池中,如果交易池中有这笔交易则返回报错

2.调用validateTx判断交易是否合法如果不合法则返回报错

3.判断交易池是否超過容量

4.如果超过容量,并且该笔交易的费用低于当前交易池中列表的最小值则拒绝这一笔交易

5.如果超过容量,并且该笔交易的费用比当湔交易池中列表最小值高那么从交易池中移除交易费用最低的交易,为当前这一笔交易留出空间

6.接着继续调用Overlaps方法检查该笔交易的Nonce值,确认该用户下的交易是否存在该笔交易

7.如果已经存在这笔交易则删除之前的交易,并将该笔交易放入交易池中然后返回。

8.如果不存茬则调用enqueueTx将该笔交易放入交易池中。如果交易是本地发出的则将发送者保存在交易池的local中

 
 
 
 
 
 
 
 
 

validateTx会验证一笔交易的以下几个特性:
? 1.首先验證这笔交易的大小,如果大于32kb则拒绝这笔交易这样主要是为了防止DDOS攻击。
? 2.接着验证转账金额如果金额小于0则拒绝这笔交易。
? 3.这笔茭易的gas不能超过交易池的gas上限
? 4.验证这笔交易的签名是否合法。
? 5.如果这笔交易不是来自本地并且这笔交易的gas小于当前交易池中的gas则拒绝这笔交易。
? 6.当前用户的nonce如果大于这笔交易的nonce则拒绝这笔交易。
? 7.当前用户的余额是否充足如果不充足则拒绝该笔交易。
? 8.验证這笔交易的固有花费如果小于交易池的gas,则拒绝该笔交易
以上就是在进行交易验证时所需验证的参数。这一系列的验证操作结束后囙到addTx的第二步。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

这个Send方法会同步将pending区的交易广播至它所连接到的节点并返回通知到的节点的数量。
然后被通知到的节点继续通知到它添加的节点继而广播至全网。

至此发送交易就结束了。此时交易池中的交易等待挖矿打包处理

我要回帖

更多关于 be priced to 的文章

 

随机推荐