很多朋友对于以太坊transaction type 1和以太坊transactions字段解析不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

本文目录

以太坊web3.sendRawTransaction离线签名交易Miner 流程以太坊web3.sendRawTransaction离线签名交易工作中需要复现短地址攻击和thedao重入攻击,重入攻击可以直接通过eth.sendTransaction和remix来发送交易,但是短地址攻击由于钱包和remix这些都对input做了长度检测,无法通过这些方式来复现,只能通过发离线签名交易来实现。

1.环境依赖:nodejs,keythereum,ethereumjs-common,ethereumjs-tx。

2.进入Node控制台,获取相应账户私钥。

3.签名交易,进入Node,这里注意nonce问题,需要Nonce是实际可执行的nonce,Nonce不对会发送交易失败,关于如何获取inputdata百度比较多就不详述了。

4.遇到的坑,百度出来的步骤是有问题的或者过时了,当时是参考的这篇文章,https://www.freebuf.com/articles/blockchain-articles/199903.html

,在控制台通过eth.sendRawTransaction发送签名好的交易,我遇到了这个错误**sendRawTransactioninvalidsender**

Miner 流程以太坊的矿工出块的流程,不同版本有过变更,下面基于1.7.3版本和1.8.4版本来分享

channel:用于1发1收

发送:sampleChan<-

接收:<-sampleChan 

Feed:用于1发多收,参考chainHeadCh

接收者注册:Subscribe(sampleChan)

发送:send,发送的地方不太好找,需要通过send和event/channel类型查找,例如miner中主要涉及到的就是PostChainEvents

接收:<-sampleChan

数据结构:

可以理解为操作间(eth)中有了矿(tx),那么矿主(miner)安排工人(worker)挖矿(seal)。结构体定义如下:

TypeMinerstruct{ ---理解为矿主

  mux    *event.TypeMux

  worker   *worker  ----理解为干活的工人

  coinbase  common.Address

  eth      Backend  ----理解为操作间

  engine   consensus.Engine  ----理解为挖矿的工具

  exitCh    chanstruct{}

  canStart    int32//canstartindicateswhetherwecanstarttheminingoperation

  shouldStart int32//shouldstartindicateswhetherweshouldstartaftersync

}

 流程图如下:

1. 节点启动:backend.new->miner.new->worker.new:调用commitNewWork,里面使用push把work传递给cpuAgent,之后在geth命令行敲miner.start()后->miner.start->worker.start->cpuAgent.start,调用Seal,计算nonce值,再发送recv消息,通知worker.wait,在收到之后将块打包插入到区块链,之后调用PostChainEvents,发送消息chainHeadCh,Worker.update在收到消息后,重新调用commitNewWork,形成一个循环。

 2. 创世块:调用geth的init命令触发调用initGenesis->SetupGenesisBlock,里面具体强调一下time是使用的genesisBlock.json中的值,一般都是0.

 3. 正常情况:worker.wait,在收到之后将块打包插入到区块链,之后调用PostChainEvents,发送消息chainHeadCh,Worker.update在收到消息后,重新调用commitNewWork,形成一个循环。

Miner.new:在backendnew的时候调用,即在节点启动的时候调用。

Miner.update:在节点启动的时候调用,用于监控是否有块同步,如果有则停止挖矿,如果没有启动挖矿,这个在POW这种竞争性出块的环境中需要。

Worker.new:在miner.new的时候调用,记载节点启动的时候调用 

Worker.update:节点启动的时候调用,如果是非全节点的话用于监控接受交易transaction,关键函数commitTransactions,还用于调度在收到chainHeadCh的消息后,触发commitNewWork

其中commitNewWork: 用于将pending的tx输入到系统,计算trie等等操作,生成block,并将workpush到cpuAgent处理,注意没有盖章

Worker.wait(对应于1.8.4的resultLoop):节点启动的时候调用,循环监听recv消息,将携带的block插入区块链中、发送广播消息(NewMinedBlockEvent)、发送消息PostChainEvents(发送ChainHeadEvent,即chainHeadCh),其中的关键函数是WriteBlockAndState。

cpuAgent.update(): 在cpuAgent.start()->worker.start->miner.start->geth的命令行调用之后启动循环,用于接收commitNewWork分配下来的work,关键函数mine,里面调用Seal,主要是完成POW寻找nonce值的操作,发送recv消息通知worker,也可以叫做盖章。

类图如下:

具体结构不再赘述

流程:

Miner.update:用于监控是否有块同步,如果有则停止挖矿,这个在POW这种竞争性出块的环境中需要

mainLoop:收到newWorkCh消息后处理,调用commitNewWork中的commit发送taskCh消息

newWorkLoop:收到startCh消息和chainHeadCh消息后发送newWorkCh消息

resultLoop:循环监听resultCh(seal发送)消息,将携带的block插入区块链中,并发送广播消息,关键函数WriteBlockAndState,并发送chainHeadCh消息

taskLoop:以前agent做的事情,收到taskCh消息后,调用seal,里面发送resultCh消息

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

薄荷茶的做法?四种方法分享

年化收益率是指什么?要怎么选择呢?

怎样利用宝塔线指标进行股票逃顶?