# 블록체인 동작 기본
- PoW 기준 (이더리움)
이더리움의 구성 요소
---
- Full node
- Light node
- Miner
> - Validator 라는 개념은 PoS 에서 나오는 개념이다.
> - 비트코인에서의 SPV (Simple Payment Verification) 은 Light node 에 해당하는 용어다.
#### Full node
- 제네시스 블록체인부터 현재까지의 모든 노드 (약 7 TB의 데이터)를 갖고 있는 노드. 모든 데이터를 갖고 있기 때문에 모든 tx에 대한 검증을 **정확하게** 검증할 수 있다.
- 각 거래자의 거래가 유효한 거래인지 확인
- 새로운 블록이 생성되었을 때 이전 거래내역과 차이가 없는지 확인
- 보상이 채굴자에게 올바르게 가는지 확인
- 블록에서 이중지출이 발생하지 않았는지 확인
- 자신의 정보를 다른 노드들에게 전달
- Full node는 다른 노드에게 tx와 블록을 전파한다. 다른 노드로부터 블록을 전달받고, 직접 코드를 수행해보고 state 기반의 Merkle Tree를 생성하여 비교함 - Merkle Proof 라고 함 - 으로써 검증을 한다. 새로운 블록이 생성된면 새로 생성된 블록을 다운받는다.
#### Light node
- Full node에 의존하여 블록에 대한 컨펌을 할 수 있는 노드. block header 정보를 갖고 있으므로 블록에 대한 검증을 할 수 있다. 하지만, 검증을 할 수 있는 충분한 데이터가 없기 때문에 **풀노드에게 필요한 데이터를 요청하는 등 의존**할 수 밖에 없다.
- 라이트 노드는 블록의 헤더만 전달받고, 블록의 헤더에는 3개의 Merkle Root 가 존재한다. 이 정보만 갖고 검증을 진행한다. 여기서 3개의 Merkle Root 는 블록 내 모든 트랜잭션에 대한 Merkle Tree 의 Root, 블록 내 모든 영수증(post condition)에 대한 Merkle Root 그리고 EVM state 에 대한 Merkle Root 가 존재한다
#### Miner
- PoW를 통해서 블록을 생성하는 권한을 갖는 노드
- Miner가 하는 일은 1) mempool에서 tx들을 모은다 2) EVM 에서 tx 상의 코드를 수행한다 3) Merkle proof 를 생성한다 (merkle tree를 생성해서 비교한다?) 4) ETHash Proof of Work 을 진행한다
> 출처: https://frag.medium.com/this-is-how-ethereum-works-60f37abd5ef5
Mining Node vs Validtaion Node
---
- mining node 와 validation node 는 geth 옵션에서도 다르게 구분하는 것처럼 역할은 다르다. 기본적으로 validation 기능은 탑재하도록 하는 것 같고, mining 은 선택적으로 하는 것 같다.
- 말 그대로 mining node 는 computation power 를 제공하여 block 을 생성할 권한을 얻기 위해서 빠르게 CPU 나 GPU 자원을 소모시켜서 문제를 푸는 것이고, validation node 는 gossip network 를 통해서 트랜잭션의 검증을 수행하는 역할을 한다. 여기서 검증하는 행위는 tx 를 자기자신의 EVM 환경에서 동일하게 수행하고, 그 결과를 tx 값과 비교하고, receipt 를 비교하고, state 를 비교하는 과정을 의미한다. (**3개의 merkle root 를 검증한다고 보면 됨**)
Transaction Life Cycle
---
- 내가 tx를 발생시키면 네트워크 풀에 submit 이 되어 브로드캐스팅되고 네트워크 노드들의 pending tx pool (mempool)에 저장된다.
- mempool에 있는 tx를 miner 가 가져가서 block 에 포함시킨다
- block 이 생성되고 confirmation count가 충분해지기 전까지 확정될 순 없지만, 일정 개수의 블록이 생성되면 내 tx 는 그 블록에 포함된다고 고정된다. confirmation count가 일정 수준 이상으로 올라가기까지 reorganization 이 발생할 수 있다.
> https://ethereum.org/en/developers/docs/transactions/
이더리움 노드와 클라이언트의 차이
---
- 노드와 클라이언트는 비슷한 의미로 사용된다. 이 글에서 의미하는 바는, 노드는 os 이고 클라이언트는 computer 라고 한다. 즉, 노드는 블록체인 상에서 사용되는 용어와 같이 네트워크를 구성하는 주체이고, 클라이언트는 그러한 노드 구축을 가능하게 하는 주체라고 생각할 수 있다.
- Full client (풀노드): 모든 블록체인 데이터를 저장하여 tx를 검증, 블록 헤더를 검증, tx를 수행하는 역할을 한다.
- Light client (라이트노드): full client의 일부 기능을 수행하지만 클라이언트의 역할은 한다. (수행하지 못하는 기능은 tx 검증과 같은 것이다) private key를 저장하고, 이더리움 주소를 관리한다. 추가적으로 tx 를 브로드캐스팅하는 역할을 한다.
- Remote client : 블록체인의 어떤 데이터도 직접 저장하거나 검증하지 않는다. 주로 light client 와 full client 에게 tx를 보내거나 받는 역할을 한다
- Metamask 는 remote client로 RPC 를 통해서 metamask의 지정된 light client 로 tx를 보낸다.
- 여기서 지정된 light client 는 Infura 를 사용한다. Infura 는 이더리움 사용자들이 직접 노드를 설치하거나 운영하지 않고도 이더리움 클라이언트를 사용할 수 있도록 제공하는 인프라이다.
> - 출처 (1): https://www.coindesk.com/learn/ethereum-nodes-and-clients-a-complete-guide/
> - 출처 (2): https://medium.com/@seanschoi/what-is-metamask-really-what-is-it-7bc1bf48c75