以太坊transactiontype1以太坊transactions字段解析
很多朋友对于以太坊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,本文到此结束,如果可以帮助到大家,还望关注本站哦!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 931614094@qq.com 举报,一经查实,本站将立刻删除。