兄弟连区Go语言+区块链技术培训以太坊源码分析19coreblockchain分析Word文件下载.docx
- 文档编号:18139088
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:26
- 大小:27.57KB
兄弟连区Go语言+区块链技术培训以太坊源码分析19coreblockchain分析Word文件下载.docx
《兄弟连区Go语言+区块链技术培训以太坊源码分析19coreblockchain分析Word文件下载.docx》由会员分享,可在线阅读,更多相关《兄弟连区Go语言+区块链技术培训以太坊源码分析19coreblockchain分析Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
区块的hash值和区块头的hash值是同样的么。
所谓的区块的Hash值其实就是Header的区块值。
//key->
value
//+代表连接
"
LastHeader"
最新的区块头HeaderChain中使用
LastBlock"
最新的区块头BlockChain中使用
LastFast"
最新的快速同步的区块头
h"
+num+"
n"
->
hash用来存储规范的区块链的高度和区块头的hash值
+num+hash->
header高度+hash值->
区块头
+num+hash+"
t"
td高度+hash值->
总难度
H"
+hash->
num区块体hash->
高度
b"
blockbody高度+hash值->
区块体
r"
blockreceipts高度+hash值->
区块收据
l"
transaction/receiptlookupmetadata
key|value|说明|插入|删除|
----|---|---------------|-----------|-----------|
|hash|最新的区块头HeaderChain中使用|当区块被认为是当前最新的一个规范的区块链头|当有了更新的区块链头或者是分叉的兄弟区块链替代了它
|hash|最新的区块头BlockChain中使用|当区块被认为是当前最新的一个规范的区块链头|当有了更新的区块链头或者是分叉的兄弟区块链替代了它
|hash|最新的区块头BlockChain中使用|当区块被认为是当前最新的规范的区块链头|当有了更新的区块链头或者是分叉的兄弟区块链替代了它
|hash|用来存储规范的区块链的高度和区块头的hash值在HeaderChain中使用|当区块在规范的区块链中|当区块不在规范的区块链中
|td|总难度|WriteBlockAndState当验证并执行完一个区块之后(不管是不是规范的)|SetHead方法会调用。
这种方法只会在两种情况下被调用,1是当前区块链包含了badhashs,需要删除所有从badhashs开始的区块,2.是当前区块的状态错误,需要Reset到genesis。
+hash|num|区块的高度在HeaderChain中使用|WriteBlockAndState当验证并执行完一个区块之后|SetHead中被调用,同上
+num+hash|blockbody|区块数据|WriteBlockAndStateorInsertReceiptChain|SetHead中被删除,同上
+num+hash|blockreceipts|区块收据|WriteBlockAndStateorInsertReceiptChain|同上
+txHash|{hash,num,TxIndex|交易hash可以找到区块和交易|当区块加入规范的区块链|当区块从规范的区块链移除
数据结构
//BlockChainrepresentsthecanonicalchaingivenadatabasewithagenesis
//block.TheBlockchainmanageschainimports,reverts,chainreorganisations.
//BlockChain表示了一个规范的链,这个链通过一个包含了创世区块的数据库指定.BlockChain管理了链的插入,还原,重建等操作.
//Importingblocksintotheblockchainhappensaccordingtothesetofrules
//definedbythetwostageValidator.Processingofblocksisdoneusingthe
//Processorwhichprocessestheincludedtransaction.Thevalidationofthestate
//isdoneinthesecondpartoftheValidator.Failingresultsinabortingof
//theimport.
//插入一个区块需要通过一系列指定的规则指定的两阶段的验证器.
//使用Processor来对区块的交易进行处理.状态的验证是第二阶段的验证器.错误将导致插入终止.
//TheBlockChainalsohelpsinreturningblocksfrom**any**chainincluded
//inthedatabaseaswellasblocksthatrepresentsthecanonicalchain.It'
s
//importanttonotethatGetBlockcanreturnanyblockanddoesnotneedtobe
//includedinthecanonicalonewhereasGetBlockByNumberalwaysrepresentsthe
//canonicalchain.
//需要注意的是GetBlock可能返回任意不在当前规范区块链中的区块,
//但是GetBlockByNumber总是返回当前规范区块链中的区块.
typeBlockChainstruct{
config*params.ChainConfig//chain&
networkconfiguration
hc*HeaderChain
//只包含了区块头的区块链
chainDbethdb.Database
//底层数据库
rmLogsFeedevent.Feed
//下面是很多消息通知的组件
chainFeedevent.Feed
chainSideFeedevent.Feed
chainHeadFeedevent.Feed
logsFeedevent.Feed
scopeevent.SubscriptionScope
genesisBlock*types.Block
//创世区块
musync.RWMutex//globalmutexforlockingchainoperations
chainmusync.RWMutex//blockchaininsertionlock
procmusync.RWMutex//blockprocessorlock
checkpointint//checkpointcountstowardsthenewcheckpoint
currentBlock*types.Block//Currentheadoftheblockchain当前的区块头
currentFastBlock*types.Block//Currentheadofthefast-syncchain(maybeabovetheblockchain!
)当前的快速同步的区块头.
stateCachestate.Database//Statedatabasetoreusebetweenimports(containsstatecache)
bodyCache*lru.Cache//Cacheforthemostrecentblockbodies
bodyRLPCache*lru.Cache//CacheforthemostrecentblockbodiesinRLPencodedformat
blockCache*lru.Cache//Cacheforthemostrecententireblocks
futureBlocks*lru.Cache//futureblocksareblocksaddedforlaterprocessing暂时还不能插入的区块存放位置.
quitchanstruct{}//blockchainquitchannel
runningint32//runningmustbecalledatomically
//procInterruptmustbeatomicallycalled
procInterruptint32//interruptsignalerforblockprocessing
wgsync.WaitGroup//chainprocessingwaitgroupforshuttingdown
engineconsensus.Engine
//一致性引擎
processorProcessor//blockprocessorinterface//区块处理器接口
validatorValidator//blockandstatevalidatorinterface//区块和状态验证器接口
vmConfigvm.Config//虚拟机的配置
badBlocks*lru.Cache//Badblockcache错误区块的缓存.
}
构造,NewBlockChain使用数据库里面的可用信息构造了一个初始化好的区块链.同时初始化了以太坊默认的验证器和处理器(ValidatorandProcessor)
//NewBlockChainreturnsafullyinitialisedblockchainusinginformation
//availableinthedatabase.ItinitialisesthedefaultEthereumValidatorand
//Processor.
funcNewBlockChain(chainDbethdb.Database,config*params.ChainConfig,engineconsensus.Engine,vmConfigvm.Config)(*BlockChain,error){
bodyCache,_:
=lru.New(bodyCacheLimit)
bodyRLPCache,_:
blockCache,_:
=lru.New(blockCacheLimit)
futureBlocks,_:
=lru.New(maxFutureBlocks)
badBlocks,_:
=lru.New(badBlockLimit)
bc:
=&
BlockChain{
config:
config,
chainDb:
chainDb,
stateCache:
state.NewDatabase(chainDb),
quit:
make(chanstruct{}),
bodyCache:
bodyCache,
bodyRLPCache:
bodyRLPCache,
blockCache:
blockCache,
futureBlocks:
futureBlocks,
engine:
engine,
vmConfig:
vmConfig,
badBlocks:
badBlocks,
bc.SetValidator(NewBlockValidator(config,bc,engine))
bc.SetProcessor(NewStateProcessor(config,bc,engine))
varerrerror
bc.hc,err=NewHeaderChain(chainDb,config,engine,bc.getProcInterrupt)
iferr!
=nil{
returnnil,err
bc.genesisBlock=bc.GetBlockByNumber(0)//拿到创世区块
ifbc.genesisBlock==nil{
returnnil,ErrNoGenesis
iferr:
=bc.loadLastState();
err!
=nil{//加载最新的状态
//Checkthecurrentstateoftheblockhashesandmakesurethatwedonothaveanyofthebadblocksinourchain
//检查当前的状态,确认我们的区块链上面没有非法的区块.
//BadHashes是一些手工配置的区块hash值,用来硬分叉使用的.
forhash:
=rangeBadHashes{
ifheader:
=bc.GetHeaderByHash(hash);
header!
//getthecanonicalblockcorrespondingtotheoffendingheader'
snumber
//获取规范的区块链上面同样高度的区块头,如果这个区块头确实是在我们的规范的区块链上的话,我们需要回滚到这个区块头的高度-1
headerByNumber:
=bc.GetHeaderByNumber(header.Number.Uint64())
//makesuretheheaderByNumber(ifpresent)isinourcurrentcanonicalchain
ifheaderByNumber!
=nil&
&
headerByNumber.Hash()==header.Hash(){
log.Error("
Foundbadhash,rewindingchain"
"
number"
header.Number,"
hash"
header.ParentHash)
bc.SetHead(header.Number.Uint64()-1)
Chainrewindwassuccessful,resumingnormaloperation"
)
//Takeownershipofthisparticularstate
gobc.update()
returnbc,nil
loadLastState,加载数据库里面的最新的我们知道的区块链状态.这个方法假设已经获取到锁了.
//loadLastStateloadsthelastknownchainstatefromthedatabase.Thismethod
//assumesthatthechainmanagermutexisheld.
func(bc*BlockChain)loadLastState()error{
//Restorethelastknownheadblock
//返回我们知道的最新的区块的hash
head:
=GetHeadBlockHash(bc.chainDb)
ifhead==(common.Hash{}){//如果获取到了空.那么认为数据库已经被破坏.那么设置区块链为创世区块.
//Corruptoremptydatabase,initfromscratch
log.Warn("
Emptydatabase,resettingchain"
returnbc.Reset()
//Makesuretheentireheadblockisavailable
//根据blockHash来查找block
currentBlock:
=bc.GetBlockByHash(head)
ifcurrentBlock==nil{
Headblockmissing,resettingchain"
head)
//Makesurethestateassociatedwiththeblockisavailable
//确认和这个区块的worldstate是否正确.
if_,err:
=state.New(currentBlock.Root(),bc.stateCache);
//Danglingblockwithoutastateassociated,initfromscratch
Headstatemissing,resettingchain"
currentBlock.Number(),"
currentBlock.Hash())
//Everythingseemstobefine,setastheheadblock
bc.currentBlock=currentBlock
//Restorethelastknownheadheader
//获取最新的区块头的hash
currentHeader:
=bc.currentBlock.Header()
ifhead:
=GetHeadHeaderHash(bc.chainDb);
head!
=(common.Hash{}){
=bc.GetHeaderByHash(head);
currentHeader=header
//headerchain设置为当前的区块头.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 兄弟连 Go 语言 区块 技术培训 以太 源码 分析 19 coreblockchain
链接地址:https://www.bdocx.com/doc/18139088.html