How does go-ethereum work?

Slides:



Advertisements
Similar presentations
동서 식사예절 박재용이은미. 보기 닫기 카톡 안철수가 빌게이츠에게 면박 당한 이유는...??
Advertisements

Ethereum 기반 비중앙식 IoT 플랫폼 9 조 : 김태경 정회운 조성수 스마트 홈 서비스 구축 프로젝트 KyungHee University.
10장. 시기별 학급경영 11조 염지수 이 슬 권용민 신해식.
일본 근세사. (1) 에도막부의 개창 ( ㄱ ) 세키가하라의 전투 (1600) - 히데요시의 사후 다섯 명의 다이로 ( 大老 ) 가운데 최대 영지 (250 만석 ) 를 보유하고 있던 도쿠가와 이에야스가 급부상. 이에 이에야스와 반목해 온 이시다 미쓰나리 ( 石田三成 ),
아니마 / 아니무스 송문주 조아라. 아니마 아니마란 ? 남성의 마음속에 있는 여성적 심리 경향이 인격화 한 것. 막연한 느낌이나 기분, 예견적인 육감, 비합리적인 것에 대 한 감수성, 개인적인 사랑의 능력, 자연에 대한 감정, 그리.
대구가톨릭대학교 체육교육과 06 학번 영안중학교 체육교사 신웅섭 반갑습니다. 반야월초등학교 축구부 대륜중학교 축구부 대륜고등학교 대구가톨릭대학교 차석 입학 대구가톨릭대학교 수석 졸업 2014 년 경북중등임용 체육 차석 합격 영안중학교 체육교사 근무 소개.
개방 공유 참여로 나아가는 지방의회 2.0 만들기 ㅡ 과천시의회 사례 ㅡ 서형원 | 과천시의회 의원 서울시청 정보공개로 통 ( 通 ) 하다. “GO 참여 공유 연대 ! START 정보공개 ” 서울시, 투명사회를 위한 정보공개센터 공동주최 정보공개워크숍.
의료자원 규제현황과 개선방향 자원평가실. 의료자원 관리 개요 규제개혁 토론과제.
1 ‘ 우리나라의 주요공업 ’ - 정도웅, 주민혁, 안수진, 백경민, 엄다운, 박경찬 -.
김 해 시김 해 시 김해시 헬스 3.3 핵심사업 120/80 고혈압 당뇨 중점관리 지역주민의 기대수명을 저해하는 3 대 사망원인 (1 위 암, 2 위 뇌혈관질환, 3 위 심장질환 ) 중 뇌혈관 질환을 제거하기 위하여 지역주민을 대상으로 고 혈압 당뇨병의 조기발견 및.
일장 - 1 일 24 시간 중의 명기 ( 낮 ) 의 길이 ( 밤은 암기, 낮은 명기 ) 광주기성 - 하루 중 낮의 길이의 장단에 따라 식물의 꽃눈 형성이 달라지는 현상 일장이 식물의 개화현상을 조절하는 중요한 요인 단일식물 - 단일조건에서 개화가 촉진되는 식물 장일식물.
수유부의 약물복용 시 주의점 발표자 조기성. 모유 수유의 장점 모유 수유의 장점은 ? 위장관 질환 발생감소 영아 돌연사 발생감소 아토피 질환 발생감소 정서적 안정.
2 학년 6 반 1 조 고은수 구성현 권오제 김강서.  해당 언어에 본디부터 있던 말이나 그것에 기초하여 새로 만들어진 말  어떤 고장 고유의 독특한 말  Ex) 아버지, 어머니, 하늘, 땅.
미국의 미디어교육 신문방송학과 강진구 한인수 곽모란 이명현.
2014년도 교원 및 기간제교사 성과상여금 전달교육 개 회 국기에 대한 경례 - 인사말
연 합 남 전 도 회 월 례 회 1부 예배- 찬 송 장 다같이 2011년 1월 2일 1부 예배- 찬 송 장 다같이 기 도
선진 고양교육 “유아교육 행정 업무 연수” 유치원 회계실무 및 유아학비 연수 경기도고양교육청.
PRESENTATION 저온화상이란?
통합인증기준 작성편람 및 심사편람 공청회 한국경영교육인증원 인증 현황 소개 손태원 수석부원장.
사 업 계 획 2011년 제1호 - 2월 1일 2011 주 안에서 소통하며 화합하고 참여하며 헌신하는 남신도회
공교육 정상화 및 선행학습 금지 학부모 연수 부천송일초등학교.
묵자 겸애, 비명, 비공, 상현, 상동, 천지, 명귀, 삼표 법.
공부할 내용 조상들이 살던 곳 자연과 잘 어울리는 한옥 지방에 따라 서로 다른 집의 모양 섬 지방의 집
사랑, 데이트와 성적 자율성 :데이트 성폭력!!! 성폭력예방교육 전문강사 / 여성학 전공 신 순 옥.
1636 쇼핑몰.
퇴계와 율곡의 사회사상 비교 남 일 재 동서대학교 교수/ 정치학 박사 1. 퇴계 이황과 율곡 이이의 약전(略傳)
내 아이를 위한 구강관리.
제16장 원무통계 • 분석 ☞ 통계란 특정의 사실을 일정한 기준에 의하여 숫자로 표시한 것을 말한다.통계로서 활용할 수 있는 조건으로는 ① 동질성을 지녀야 하고 ② 기준이 명확하고 ③ 계속성이 지속되어야 하며 ④ 숫자로 표시하여야 한다 경영실적의.
서울지방세무사회 부가세 교육 사진클릭-자료 다운 세무사 김재우.
501. 군인들의 세상 502. 민정 이양과 한일회담 이선용.
쌓지 말고 해소하자 이 주휘 이 진영 전 민석 전 혜림.
2015년 하반기 소방교육 자 유 전 공 학 부 (금) 안녕하십니까 자유전공학부 행정실 입니다.
쌍용차 회생계획안을 통한 투기자본(=먹튀자본) 수강과목: 회 계 학 원론 담당교수: 박 성 환 교수님
치매의 예방 김 은민 윤금 노인요양원 치매의.
마산에 대하여 만든이 : 2204 김신우, 2202 권성헌.
행정학과 김수민 중국 춘절의 교통문제.
고구려,백제,신라의 건국과 발전 Start!
글로벌한국사 2강 - 고조선과 단군할아버지- 신화 속 역사 읽기.
프로젝트 학습 -프로젝트의 운영- 초등교육학과B 정예은.
패시브하우스 신안산대학교 l 건축과 l 박효동, 박창준, 지예림.
정치개혁의 가능성 논의 권력구조 개편을 통하여 본 -개헌을 통한 정부형태의 변화를 중심으로 [한국정치론] 윤성이 교수님
주문완료메일 보험료 간편 조회 go > 여행 전 꼭 챙기세요! All about Travel | 여행자보험도 하나샵
10장. 회복과 병행 제어 트랜잭션 장애와 회복 병행 제어.
- 프로와 아마추어의 차이 -.
The Party-State (1) 영 어 학 부 강물결 영 어 학 부 박우인
커 GO 비 의 to 홈 게임공학과 박혜원.
Ethereum TrueBit 01 김도윤 TES 20주차 ( )
치료 레크레이션 프로그램 (지적 장애 대상) 과 목: 학 과: 학 번: 이 름: 제 출 일 자 담 당 교 수:
10% 여행자보험도 하나샵 하나샵 회원이라면! 당연히 챙겨야 할 혜택 출발 당일 가입 가능
영농법인 설립계획서 갈마드는 마실 사회적 농업화의 구심 촌 장 이 정 래
제안 목적 고객성향 분석으로 매출 증대 유사업체 분석으로 신상품 홍보 원가요소 분석 및 피드백으로 원가율 관리
청각기관의 구조와 기능2 옥정달.
3조 권기태 윤주영 은화령 이형찬 이송민 김동욱 한승묵
6장 마케팅 조사 박소현, 김중호, 박기찬.
노년기 발달 장안대 행정법률과 세류반 정 오 손
한밭대학교 창업경영대학원 회계정보학과 장 광 식
의사결정과 의사소통 발표 철학과 나지훈 요약 정치외교학과 양승명 PPT 일본어학과 왕동현 사례 패션학과 강민경
효율화와 활성화를 위한 조직구조의 설계 ►조직구조와 그 현상
현대카드 M 경영학과 4 나준호 3 이병주 3 신명택.
태국 문학 욜라다 왓짜니 싸란차나 팟차라와라이 끼따야펀 르앙다우 타니다.
음양오행과 물리학 조 원 : 김용훈, 양범길, 박수진, 윤진희, 이경남, 박미옥, 박지선 (11조)
학습자 매뉴얼.
이야기 치료에 대하여 <8조 학문적 글쓰기 발표> 주희록 최은지
정부조직론 Team 1 발표 제5장 제1절, 제2절 공공정책학부 강철욱 권지호
경영학의 상황학파에 대해서… 경제학과 3학년 최준용 회계학과 4학년 진현빈
워밍업 실뭉치 전달게임.
음파성명학 최종욱.
♣좋은 이미지 형성을 위한 5대 POINT ♣ 나의 이미지? 표정/시선 바른 자세 용모/복장 대화법 인사예절.
관광산업에서의 e-CRM 활동에 관한 탐색적 연구
11월 고등부 공과설교 업드림? 업드림! 갈라디아서 6:9-10.
Presentation transcript:

How does go-ethereum work? 박정원(Aiden) aiden.p@onther.io

P2P Network 2) Mining Ethereum? Consensus Not only PoW! broadcasting (ex. transaction, block) syncing (ex. transaction, block) state transition (transaction execution) Consensus

Why? 2) Mining Ethereum? state transition (transaction execution) go-ethereum의 핵심이기도 하지만, 현재 PoC단계인 Plasma-EVM을 살펴볼때도 큰 도움이 되기 때문.

본격적으로 시작하기 전에... Go 언어 자체에 대한 설명 go-ethereum의 전체 실행로직에 대한 자세한 설명 위 두가지는 최대한 압축적으로 정보를 전달해 드리기 위해 본 발표에서 최소한으로 다루겠습니다.

공부 자료 https://steemit.com/@sigmoid sigmoid 님의 go-ethereum 분석기 : geth의 거의 모든 부분을 잘 정리해주셨습니다. 개인적으로 정말 많은 도움이 되었습니다. https://github.com/NAKsir-melody/go-ethereum sigmoid 님의 go-ethereum 주석 한글화 프로젝트 http://www.notforme.kr/block-chain/geth-code-reading 자바 개발자의 go-ethereum 소스 분석기 : geth의 entry point부터 차근차근 잘 설명해주셨습니 다. 처음 공부를 시작하시는 분들은 이 분의 글을 먼저 보시면 큰 도움이 되실겁니다. https://blog.seulgi.kim/ 코드박스 김슬기님의 블로그 : 이더리움에 대한 수준 높은 포스트가 정말 많습니다. 직접적으로 소스코드를 다루는 글은 없지 만 이더리움의 기술적인 부분을 이해하시는데 정말 큰 도움이 됩니다. https://tech.etherstudy.net/ethereum/geth/delve/debug/consensus/lifecycle/2018/08/02/geth-consensus-lifecycle-debug.html 임완섭님의 이더리움 컨 센서스 라이프사이클 디버깅 : 디버깅을 통해 소스코드를 보다 더 이해하기 쉽게 해주셨습니다. 역시 큰 도움이 되실겁니다.

0. 전체 흐름

Geth? Geth Node …. Ethereum service Shh service EthStats Service Dashboard service EthStats Service Txpool Miner Blockchain Protocol Manager …. Reference https://steemit.com/etherum/@sigmoid/55fbja

cmd/geth/main.go | func geth() func geth() 가 바로 geth 노드를 생성하고 실행시키는 함수이다. makeFullNode() : Geth 노드 생성 startNode() : Geth 노드 실행

miner 빨간색으로 표시된 부분인 services 가 바로 앞에서 살펴본 여러 서비스들이 등록되는 곳이다. serviceFuncs는 해당 service들의 Constructor역할을 하는 함수들이다. makeFullNode()과정에서 등록된 서비스들의 Constructor가 startNode()에서 실행되어 비로소 해당 서비스가 services에 할당된다.

cmd/geth/config.go | func makeFullNode() 중요!! 노드를 생성하는 함수인 makeFullNode를 살펴보면 RegisterEthService, RegisterDashboardService, RegisterShhService, RegisterEthStatsService 들을 실행시키는 것을 알 수 있다. 하지만 여기서 이더리움 노드 서비스를 생성하는 RegisterEthService()를 제외한 나머지는 크게 중요하지 않다. (Dashboard, whisper, Stats 관련 설정이다) 만약 해당 서비스들에 관심이 없다면 굳이 자세히 들여다 볼 필요는 없다.

1. miner 기능 생성과 시작

miner/miner.go | func New() eth/backend.go | func New() 실행과정 : 이더리움 풀노드 서비스 생성과정 이더리움 풀노드 서비스를 생성(Construct)하는 과정에서 마이너 기능 또한 설정이 된다. 60 : 생성과정에서 newWorker()를 호출한다. (이름에서 알 수 있듯이 worker가 실질적인 마이닝 작업의 대부분을 처리한다. 63 : 블록을 sync하는 Downloader의 이벤트를 추적하며 그에 맞는 로직을 수행한다.

miner/worker.go | func newWorker() worker가 실질적으로 mining의 대부분의 로직을 처리한다. 143~159 : worker 를 생성한다. newWorkch, taskCh, resultCh, exitCh, startCh 등의 채널을 생성한다. 161 : newTXsEvent를 txpool로부터 구독 163~164 : 블록체인의 체인 헤드와 체인사이드 이벤트를 구독 166 : 블록을 생성하는 메인 루프 로직이다. 167 : 새로운 마이닝 작업을 시작하게 하는 루프 로직이다. 168 : 작업이 끝난 블록을 데이터베이스에 저장하는 역할을 하는 루프다. 169 : 컨센서스 엔진에 task를 전달하기 위한 루프(sealing하는 로직을 실행 후 resultLoop로 전달하게 된다)

네가지 루프(고루틴)의 실행로직을 이해하는게 핵심! Mining의 실행로직(큰 그림) 이더리움노드 서비스 실행과정에서 startMining() 실행 Miner기능을 시작하는 miner.Start() 실행 worker.startCh 채널로 신호 전달 newWorkLoop() 에서 newWorkReq를 worker.newWorkCh 채널로 전달 mainLoop() 에서 task를 worker.taskCh 채널로 전달 taskLoop() 에서 Sealing이 완료된 블록을 worker.resultCh 채널로 전달 resultLoop() 에서 블록을 체인에 삽입(insert) 및 전파한 이후 블록이 새롭게 생성되었다는 메세지를 newWorkLoop()로 전달 네가지 루프(고루틴)의 실행로직을 이해하는게 핵심!

worker.startCh 채널로 신호 전달 2) 노드 실행 과정 1) 서비스 생성 과정 startNode() miner.new() startMining() miner.newWorker() miner.Start() go newWorkLoop() go mainLoop() go taskLoop() go resultLoop() 새로운 마이닝 작업을 전달 worker.startCh 채널로 신호 전달 생성된 블록을 db에 commit / 다른 노드에게 전파 / 새로운 마이닝 시작 신호 트랜잭션 실행 등 블록 생성의 대부분을 담당 컨센서스엔진(PoW or PoA)에 따라 Sealing (ex. nonce 값 찾기)

고루틴(Goroutine) & 채널(Channel) Reference http://pyrasis.com/book/GoForTheReallyImpatient/Unit01/05 http://rapapa.net/?p=2704

eth/backend.go | func StartMining() 337~341 : 이더베이스(코인베이스 계정) 계정을 가져온다. 342~349 : engine이 Clique(PoA)일 경우에 앞서 구한 이더베이스 계정을 통해 Authorize를 한다. 357 : 이더베이스를 인자로 전달하여 고루틴으로 miner.Start()메소드 실행

miner/miner.go | func Start() 109 : 이더베이스 관련 설정(코인베이스 계정 설정)을 진행한다. 111~114 : 만약 canStart 가 0이라면 아직 네트워크 동기화가 진행중임을 의미하므로 로그를 찍고 miner의 실행을 중단한다. 115 : Miner.worker의 start() 메소드를 실행한다.

miner/worker.go | func start() 채널이 굉장히 중요! 212 : worker가 스타트했다는 의미로 &w.running에 1을 할당한다. 213 : w.startCh 채널에 신호를 보낸다. (worker의 newWorkLoop로 이어진다.)

worker.startCh 채널로 신호 전달 2) 노드 실행 과정 1) 서비스 생성 과정 startNode() miner.new() startMining() miner.newWorker() miner.Start() go newWorkLoop() go mainLoop() go taskLoop() go resultLoop() 새로운 마이닝 작업을 전달 worker.startCh 채널로 신호 전달 생성된 블록을 db에 commit / 다른 노드에게 전파 / 새로운 마이닝 시작 신호 트랜잭션 실행 등 블록 생성의 대부분을 담당 컨센서스엔진(PoW or PoA)에 따라 Sealing (ex. nonce 값 찾기)

miner/worker.go | func newWorkLoop() 먼저 newWorkReq를 newWorkCh 채널로 전달하는 로직이 포함된 함수를 commit 변수에 할당한다. 이 함수는 새로운 마이닝 작업의 시작을 알리는 역할을 한다.

miner/worker.go | func newWorkLoop() 앞서 startMining()의 실행결과 w.startCh로 신호를 보내는 것을 알 수 있었다. 347~350 : 해당 신호가 들어오면 commit()을 실행하게 된다. 352~355 : 마이닝 사이클이 한번 돌고 난 뒤 다시 마이닝을 시작하는 부분

worker.startCh 채널로 신호 전달 2) 노드 실행 과정 1) 서비스 생성 과정 startNode() miner.new() startMining() miner.newWorker() miner.Start() go newWorkLoop() go mainLoop() go taskLoop() go resultLoop() 새로운 마이닝 작업을 전달 worker.startCh 채널로 신호 전달 생성된 블록을 db에 commit / 다른 노드에게 전파 / 새로운 마이닝 시작 신호 트랜잭션 실행 등 블록 생성의 대부분을 담당 컨센서스엔진(PoW or PoA)에 따라 Sealing (ex. nonce 값 찾기)

miner/worker.go | func mainLoop() mainLoop 고루틴이 실행되면 계속해서 for문 루프를 돌게 된다. 앞의 newWorkLoop()를 통해 w.newWorkCh 채널에 값이 들어오게 되면 w.commitNewWork()를 호출하여 새로운 블록의 생성을 시작하게 된다.

miner/worker.go | func commitNewWork() 655~667 : 블록 시간 체크 (너무 시간이 많이 흐르지 않도록) 669~676 : 새로운 헤더 생성, 헤더 Number에 부모 Number + 1, 가스리밋 계산 등

miner/worker.go | func commitNewWork() 678~684 : 코인베이스 주소 설정 (만약에 비어있다면 에러) 685~688 : (PoW일 경우)헤더가 ethash 프로토콜을 따르도록 난이도 필드를 초기화 한다. 689~701 : DAO 해킹관련 하드포크를 했기 대문에, 해당 구간의 블록은 따로 검증한다.

miner/worker.go | func commitNewWork() 744 : Pending 상태인 트랜잭션들을 TxPool 에서 가져온다. 754 : NewTransactionsByPriceAndNonce creates a transaction set that can retrieve price sorted transactions in a nonce-honouring way. (가격과 논스를 기준으로 트랜잭션들을 정렬) 755 : commitTransactions() 을 실행하고 실행이 문제 없이 끝나면 false가 나기 때문에 return이 되지 않는다. true가 나는 경우는 w.current 가 nil일 경우를 제외하고는 없다. 759 : 다음 슬라이드에 자세히

miner/worker.go | func commitTransactions() 576~579 : 현재 남은 가스리밋이 21000보다 작으면 반복문 종료 581~584 : 처리할 다음 tx를 갖고온다. tx 더 갖고올게 없으면 반복문 종료 589~597 : signer 관련 설정 599 : stateDB Prepare() 601 : commitTransaction호출

miner/worker.go | func commitTransaction() 실제 트랜잭션을 처리하는 과정 앞서 반복문에서 계속 트랜잭션을 하나씩 가져오면서 실행을 하게 된다. 트랜잭션을 실행하기 전에 스냅샷을 찍어뒀다가 트랜잭션 실행 과정에 에러가 나게되면 이전 스냅샷으로 revert한다. 실행을 정상적으로 마치면 트랜잭션과 리십트를 w.current.txs / receipts 슬라이스에 각각 append한다.

core/state_processor.go | func ApplyTransaction() 트랜잭션 실행의 자세한 내용은 아래 링크 참고 https://docs.google.com/presentation/d/1UE4mMz7395pZmVOhFecnNv33AN0sGaNsmyr0hB2uNDs/edit#slide=id.p

miner/worker.go | func commitNewWork() commitTransactions() 의 실행을 마치면 w.commit()이 실행된다.

miner/worker.go | func commit() 앞에서 commitTransactions 로 트랜잭션들을 처리하고 나면 commit을 실행하게 된다. commit은 블록 생성의 마감 작업에 들어가게 된다. 772 : consensus engine의 Finalize() 호출 781 : w.taskCh 로 task를 보낸다.

ethash/consensus.go | func Finalize() 548 : 블록 보상 합치는 로직 549 : 블록 헤더의 stateRoot에 IntermediateRoot 할당 552 : 블록 생성

worker.startCh 채널로 신호 전달 2) 노드 실행 과정 1) 서비스 생성 과정 startNode() miner.new() startMining() miner.newWorker() miner.Start() go newWorkLoop() go mainLoop() go taskLoop() go resultLoop() 새로운 마이닝 작업을 전달 worker.startCh 채널로 신호 전달 생성된 블록을 db에 commit / 다른 노드에게 전파 / 새로운 마이닝 시작 신호 트랜잭션 실행 등 블록 생성의 대부분을 담당 컨센서스엔진(PoW or PoA)에 따라 Sealing (ex. nonce 값 찾기)

miner/worker.go | func taskLoop() 397 : w.taskCh에서 받아온 값을 task에 할당한다. 받아온 값은 receipts, state, block, createdAt(time.Now()) 403 : 고루틴으로 w.seal()을 실행한다.

miner/worker.go | func seal() 367 : 블록을 Sealing하는 메소드인 w.engine.Seal()을 실행한다. Seal()은 PoW에서 유명한 논스를 찾는 과정이다. 378: 이후 이를 바탕으로 받은 리턴값을 t.block에 할당하고 이를 w.resultCh에 전송한다.

worker.startCh 채널로 신호 전달 2) 노드 실행 과정 1) 서비스 생성 과정 startNode() miner.new() startMining() miner.newWorker() miner.Start() go newWorkLoop() go mainLoop() go taskLoop() go resultLoop() 새로운 마이닝 작업을 전달 worker.startCh 채널로 신호 전달 생성된 블록을 db에 commit / 다른 노드에게 전파 / 새로운 마이닝 시작 신호 트랜잭션 실행 등 블록 생성의 대부분을 담당 컨센서스엔진(PoW or PoA)에 따라 Sealing (ex. nonce 값 찾기)

miner/worker.go | func resultLoop() 416 : w.resultCh에서 값을 result로 받아옴. 420 : result.block 을 따로 꺼내어 변수 block에 할당 432~436 : 블록과 state를 데이터베이스에 커밋한다. 439 : NewMinedBlockEvent를 Post한다. => minedBroadcastLoop()가 실행된다. 454 : unconfirmed 블록에 새 블록을 insert한다.

worker.startCh 채널로 신호 전달 2) 노드 실행 과정 1) 서비스 생성 과정 startNode() miner.new() startMining() miner.newWorker() miner.Start() go newWorkLoop() go mainLoop() go taskLoop() go resultLoop() 새로운 마이닝 작업을 전달 worker.startCh 채널로 신호 전달 생성된 블록을 db에 commit / 다른 노드에게 전파 / 새로운 마이닝 시작 신호 트랜잭션 실행 등 블록 생성의 대부분을 담당 컨센서스엔진(PoW or PoA)에 따라 Sealing (ex. nonce 값 찾기)

miner/worker.go | func newWorkLoop() 352~355 : 마이닝 사이클이 한번 돌고 난 뒤 다시 마이닝을 시작하는 부분

요약 정리 Geth Node …. Ethereum service Shh service EthStats Service Dashboard service EthStats Service Txpool Miner Blockchain Protocol Manager ….

worker.startCh 채널로 신호 전달 2) 노드 실행 과정 1) 서비스 생성 과정 startNode() miner.new() startMining() miner.newWorker() miner.Start() go newWorkLoop() go mainLoop() go taskLoop() go resultLoop() 새로운 마이닝 작업을 전달 worker.startCh 채널로 신호 전달 생성된 블록을 db에 commit / 다른 노드에게 전파 / 새로운 마이닝 시작 신호 트랜잭션 실행 등 블록 생성의 대부분을 담당 컨센서스엔진(PoW or PoA)에 따라 Sealing (ex. nonce 값 찾기)

Thank you