mirror of
https://github.com/status-im/nim-eth.git
synced 2025-02-16 16:06:35 +00:00
Since these types were written, we've gained an executable spec: https://github.com/ethereum/execution-specs This PR aligns some of the types we use with this spec to simplify comparisons and cross-referencing. Using a `distinct` type is a tradeoff between nim ergonomics, type safety and the ability to work around nim quirks and stdlib weaknesses. In particular, it allows us to overload common functions such as `hash` with correct and performant versions as well as maintain control over string conversions etc at the cost of a little bit of ceremony when instantiating them. Apart from distinct byte types, `Hash32`, is introduced in lieu of the existing `Hash256`, again aligning this commonly used type with the spec which picks bytes rather than bits in the name.
55 lines
1.6 KiB
Nim
55 lines
1.6 KiB
Nim
import
|
|
chronos,
|
|
../../eth/[p2p, common]
|
|
|
|
# for testing purpose
|
|
# real eth protocol implementation is in nimbus-eth1 repo
|
|
|
|
type
|
|
PeerState = ref object of RootRef
|
|
initialized*: bool
|
|
|
|
p2pProtocol eth(version = 63,
|
|
peerState = PeerState,
|
|
useRequestIds = false):
|
|
|
|
onPeerConnected do (peer: Peer):
|
|
let
|
|
network = peer.network
|
|
|
|
discard await peer.status(63,
|
|
network.networkId,
|
|
0.u256,
|
|
default(Hash32),
|
|
default(Hash32),
|
|
timeout = chronos.seconds(10))
|
|
|
|
handshake:
|
|
proc status(peer: Peer,
|
|
protocolVersion: uint,
|
|
networkId: NetworkId,
|
|
totalDifficulty: DifficultyInt,
|
|
bestHash: Hash32,
|
|
genesisHash: Hash32)
|
|
|
|
requestResponse:
|
|
proc getBlockHeaders(peer: Peer, request: openArray[Hash32]) {.gcsafe.} =
|
|
var headers: seq[Header]
|
|
await response.send(headers)
|
|
|
|
proc blockHeaders(p: Peer, headers: openArray[Header])
|
|
|
|
requestResponse:
|
|
proc getBlockBodies(peer: Peer, hashes: openArray[Hash32]) {.gcsafe.} = discard
|
|
proc blockBodies(peer: Peer, blocks: openArray[BlockBody])
|
|
|
|
nextID 13
|
|
|
|
requestResponse:
|
|
proc getNodeData(peer: Peer, hashes: openArray[Hash32]) = discard
|
|
proc nodeData(peer: Peer, data: openArray[seq[byte]])
|
|
|
|
requestResponse:
|
|
proc getReceipts(peer: Peer, hashes: openArray[Hash32]) = discard
|
|
proc receipts(peer: Peer, receipts: openArray[Receipt])
|