마이닝 - 트렌젝션이 풀에서 블록에 포함되기까지

in #ethereum7 years ago

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

노드 동작시 아래 순서대로 호출되는 과정에서
eth.New->miner.New: eth/backend.go New -> newWorker: miner/miner.go newWorker: miner/worker.go -> commitNewWork
commitNewWork함수에서 새로운 블록의 생성을 시작한다
먼저 새로운 헤더를 하나 생성한후 부모의 블록번호로 부터 해시정보를 얻어와 채우고
체인정보를 기반으로 난이도 필드를 초기화 한다

-> self.eth.TxPool().Pending() -> types.NewTransactionsByPriceAndNonce(self.current.signer, pending) : core/types/transaction.go
트렌젝션 풀에서 트렌젝션을 펜딩된 트렌젝션을 가져와서 가격을 기준으로 정렬한다
이유는 블록에 포함시킬 트렌젝션들이 비싸야 채굴했을때 수익을 더 크게 가져갈수 있기 때문이다
(블록채굴 보상 + 트렌젝션에서 사용된 수수료)

참고로, 트렌젝션풀에서는 트렌젝션을 2가지로 분류한다
pending: 현재 처리가능한 트렌젝션들
queue: 풀에 큐잉은 되었지만 처리가 불가능한 트렌젝션 (현제 체인 스테이트에서는 실행할수가 없어서)

-> commitTransactions -> commitTransaction -> ApplyTransaction: core/state_processor.go
가지고온 트렌젝션을 하나하나 실행한다. 그리고 실행에 따른 스테이트를 DB에 업데이트 한다
또한 해당 트렌젝션에 대한 영수증을 만든다
트렌젝션이 실패할경우 검증을 시작하기 직전의 snapshot으로 돌려놓는다
모든 트렌젝션의 실행이 완료될경우 mux.Post(core.PendingStateEvent{})를 호출한다
트렌젝션 하나하나 실행할때마다 스테이트가 변합니다,
나중에 이걸모아서 해더에 스테이트 해시로!

-> self.engine.Finalize: consensus/ethash/consensus.go mine: miner.agent.go
헤더의 루트를 완성하고 주어진 헤더 + 트렌젝션 + 엉클정보 + 영수증으로
블록을 만든다.
생성한 블록을 마이너 에이전트에게 전달한다
에이전트는 블록이 담긴 워크를 마이닝하기 시작한다

'
self.engine.Seal: consensus/ethash/sealer.go
ethash.mine
'
ethash.mine 함수를 호출하게 되면 우리가 아는 pow기반으로 nonce를 찾기 시작한다.
논스를 찾았다면, 해당 결과를 worker 채널로 전송한다.

miner.wait에서 결과를 받으면 블록의 해시를 영수증에 업데이트 하고
self.chain.WriteBlockWithState 함수를 통해 체인에 해당 블록을 등록한다

그리고 나서 self.mux.Post(core.NewMinedBlockEvent{Block: block})
를 통해 블록을 브로드캐스팅한다
(그이후는 발생하는 상황은 https://steemit.com/ethereum/@sigmoid/3flwa 참조)

self.chain.PostChainEvents(events, logs) self.unconfirmed.Insert(block.NumberU64(), block.Hash())
이후 해당 블록에서 발생한 이벤트를 모아 발생시키고
해당블록을 unconfirmed 블록 리스트에 저장한다

unconfirmed란 아직 캐노니컬 체인에 등록되지 못한 블록들을 뜻한다
블록들은 unconfirmed상태에 존재하다가, 시간이지나면 miner.shift함수에 의해제거된다
이 scheme 은 유저가 지금까지 마이닝된 블록이 확률상
캐노니컬 채널에 등록될 확률이 높음을 알려줌으로서
해당 블록이 실제로 채널에 등록되기전에 해당블록의 다음 블록에 대한 일을 할 수 있게 해준다

Sort:  

Get your post resteemed to 72,000 followers. Go here https://steemit.com/@a-a-a

Coin Marketplace

STEEM 0.09
TRX 0.30
JST 0.035
BTC 110354.36
ETH 3920.62
USDT 1.00
SBD 0.58