마이닝의 시작과 블록이벤트 그리고 블록의 전파

in #ethereum6 years ago

개인적으로 이더리움 한글주석 프로젝트를 진행하고 있습니다.
https://github.com/NAKsir-melody/go-ethereum

geth의 StartNode 로부터 시작하여 이더리움 프로토콜이 시작하게 되면
크게 4개의 고루틴이 시작되는 데 그 중 하나가 MinedBroadcastLoop이다

geth -> StartNode -> Node.Start : cmd/geth/main Start -> p2p.Server -> eth Start (service.start) : node/node.go Start -> protoclManager.Start: eth/backend.go Start: eth/handler.go ->txBroadcastLoop(pm.txsCh) -> MinedBlockSub = pm.eventMux.Subscribe(core.NewMinedBlockEvent{}) -> minedBroadcastLoop(core.NewMinedBlockSub) ->syncer ->txsyncLoop

minedBroadcastLoop 함수안에서는
구독한 MinedBlockSub 채널에서 core.NewMinedBlockEvent가 발생하면
해당블록을 브로드캐스팅하도록 구성되어 있다

BroadcastBlock -> SendNewBlock(NewBlockMsg): eth/peer.go -> SendNewBlockHashes(NewBlockHashesMsg): eth/peer.go

core.NewMinedBlockEvent는 프로토콜 매니져 이후 실행되는 마이닝 루틴에서

StartNode-> StartMining: cmd/geth/main.go StartMining -> miner.Start : eth/backend.go minder.Start -> worker.start :miner/miner.go worker.start -> agent.start : miner/worker.go 여기서 agent는 ethash를 풀기위해 등록된 cpu agent임

워커가 블록을 발견했을 경우 노티파이 채널을 통해 먹스로 해당 이벤트를 포스팅하게된다

New -> miner.New : eth/backend.go New -> newWorker :miner/miner.go newWorker -> worker.wait -> self.mux.Post(core.NewMinedBlockEvent) : miner/worker.go

즉 마이닝을 실행한후 블록이 찾아지면 브로드캐스팅하는 것.
브로드 캐스팅을 수신한 피어의 프로토콜 매니져는
루프인 handleMsg에서 NewBlockMsg 수신하고 해당블록을 import하기위해
패쳐에 스케쥴을 enqueue한다 : eth/fetcher/fetcher.go

NewBlockHashesMsg 역시 같은 루프에서 처리하며
패쳐의 notify기능을 이용하여 announce된 블록리스트에 등록 한다

차후 패쳐의 메인루프에서 어나운스된 블록중 적절한 블록을 골라 체인에 삽입하고
매니저의 BroadcastBlock을 또다시 호출하게 됨으로서 처음 노드가 생성한 블록을 모르는
또다른 피어에게 해당 블록이 전달되게 된다

(A-B-C 형태로만 연결된 네트워크에서 A가 블록을 마이닝 한 경우 B에 전파되고,
B의 체인에 해당 블록이 삽입되면서 C로 브로드캐스팅되는 효과)

Coin Marketplace

STEEM 0.18
TRX 0.16
JST 0.030
BTC 61164.79
ETH 2416.89
USDT 1.00
SBD 2.63