https://github.com/ethereum/wiki/wiki/Ethereum-Wire-Protocol
Ethereum client를 구동하고 있는 노드가 peer-to-peer 커뮤니케이션은 ÐΞVp2p Wire Protocol을 구동한다.
- 두 peer는 연결하고 Hello를 말하고 Status message를 전송한다. Status는 Total Difficulty(TD)와 best block의 hash다.
- total difficulty: 현재 블록의 difficulty의 총합이다. difficulty란 새로운 block을 마이너가 마이닝할 때 해시 값을 찾기 위해 얼마나 brute force를 했는지를 수량화할 수 있는 값이다. e.g. block #0 difficulty: 1, total difficulty: 1 block #1 difficulty: 100, total difficulty: 101 block #2 difficulty: 150, total difficulty: 251
- best block: last valid block 중에 total difficulty가 가장 큰 block을 말한다. 결국 ghost protocol에 의해 여러 last valid block 중에 total difficulty가 큰 block이 best block이 된다.
- Worst TD를 가진 클라이언트는 peer에게 블록 해시의 전체 체인을 요청한다. 즉, Worst TD이기 때문에 다른 best block이 채택된다. 따라서 peer에게 블록 해시에 대한 전체 체인을 요청하게 된다.
- chain of hashes은 모든 피어 연결에 의해 공유된 공간에 저장되며 "work pool"로 사용된다. 여기서 hash는 best block의 hash를 의미한다.
- chain of hashes 안에 내가 가지지 않은 hash가 있을 때 , 해당 hash를 사용하여 피어로부터 N 블록을 요청한다. 이를 mark 해두고 다른 peer로부터 해당 block을 가져오는 것을 막는다.
Status [+0x00: P, protocolVersion: P, networkId: P, td: P, bestHash: B_32, genesisHash: B_32]:
Status는 peer에게 현재 Ethereum state를 알린다. 이 Status message는 peer와 initial handshake 이후 전송되어야 하고, ethereum과 관련된 메시지보다 먼저 보내져야 한다.
-
protocolVersion is one of:
0x00for PoC-1;0x01for PoC-2;0x07for PoC-3;0x09for PoC-4.0x17for PoC-5.0x1cfor PoC-6.61for PV6162for PV6263for PV63
-
networkId: 0=Olympic (disused), 1=Frontier (mainnet), 2=Morden (disused), 3=Ropsten (testnet), 4=Rinkeby -
td: Total Difficulty of the best chain. Integer, as found in block header. -
bestHash: The hash of the best (i.e. highest TD) known block. -
genesisHash: The hash of the Genesis block.
NewBlockHashes [+0x01: P, hash1: B_32, hash2: B_32, ...]
네트워크에 나타난 하나 이상의 새로운 블록을 지정하게 된다. 이 Block hash들은 최대 256개까지 포함될 수 있다. 노드들은 이러한 NewBlockHashes를 받게 되는데 다른 peer는 해당 Block Hash를 받지 못할 수도 있다. 그렇기 때문에 노드는 반드시 NewBlockHashes를 다른 peer에게 알려야 한다. 그러나 만약 송신 노드가 NewBlockHashes를 통해 이전에 전송했던 Hash를 다시 peer에게 전송하게 되면, 이를 peer들이 나쁜 형식으로 간주하여 해당 노드의 평판을 저하시킬 수도 있다. 또한 peer가 GetBlocks 메시지를 통해 받은 해시를 거부했는데 해당 해시를 송신 노드가 추후 보내게 되면 이 또한 송신 노드의 평판을 떨어뜨릴 수 있다.
Transactions [+0x02: P, [nonce: P, receivingAddress: B_20, value: P, ...], ...]
Transaction queue에 포함되어 있는 Transaction을 지정한다. Transaction의 포멧은 main Ethereum speecification에 기술되어 있다. 노드들은 반드시 동일한 session에 peer에게 같은 transaction을 재전송하면 안된다.
GetBlockHashes [+0x03: P, hash : B_32, maxBlocks: P]
최대 maxBlocks 개 항목의 블록 해시 메시지, 블록 해시의 부모에서 시작하여 블록 체인의 블록 해시 요청을 요청한다. peer에게 maxBlocks hash를 요청해서는 안된다.
BlockHashes [+0x04: P, hash_0: B_32, hash_1: B_32, ...]
series of hashes of blocks를 제공한다. 이 해시 값들은 youngest부터 oldest까지 정렬되어 있음을 암시한다.
이런 식으로 이루어져 있다.
Etheruem sub-protocol은 session이 활성화되어 있을 때 Status message가 반드시 보내져야 한다. peer가 Status message의 수신한 후, Ethereum session은 활성화되어 어떠한 다른 message들이 보내질 수 있다.
모든 Transactions은 처음에 반드시 하나 또는 그 이상의 Transaction message들을 받게 된다. Transaction message들은 주기적으로 받게 되는데, 노드가 새로운 transaction들을 퍼트리기 때문이다. 노드는 peer에게 이미 알고 있는 Transaction을 다시 보내서는 안된다. 이미 이전에 보내진 Transaction이거나, 그 peer로부터 받은 Transaction이면 peer가 알고 있는 Transaction이 된다.