package p2p
|
|
|
|
|
|
// This file defines the structure for the protocol which is a msgp encoded ( which is standard)
|
|
// msgp would cause an easy rewrite of p2p layer even in c, ruby or rust etc as future may demand
|
|
// the protocol is length prefixed msgp payload
|
|
// though we can http2 stream features, they may become compilcated as the project evolve
|
|
// the prefix length is 4 bytes, little endian encoded ( so a frame can be 4GB in size)
|
|
|
|
//import "net"
|
|
|
|
// the protocol is completely asyncronous, except for first handshake, so the node remain undetectable to external network scans, the detection cost is to atleast send a handshake packet*/
|
|
|
|
// used to parse incoming packet for for command , so as a repective command command could be triggered
|
|
type Common struct {
|
|
Command uint64
|
|
Height uint64
|
|
Cumulative_Difficulty uint64
|
|
Top_ID [32]byte // 32 bytes of Top block
|
|
Top_Version uint64 // this basically represents the hard fork version
|
|
}
|
|
|
|
// at start, client sends handshake and server will respond to handshake
|
|
type Handshake struct {
|
|
Common // add all fields of Common
|
|
Local_Time uint64
|
|
Local_Port uint32
|
|
ID uint64
|
|
Network_ID []byte // 16 bytes
|
|
PeerList []Peer_Info
|
|
Extension_List []string
|
|
}
|
|
|
|
type Sync struct {
|
|
Common // add all fields of common
|
|
}
|
|
|
|
|
|
const V2_COMMAND_HANDSHAKE=1 // commands are syncronous and must be responded within 10 secs
|
|
const V2_COMMAND_SYNC=2
|
|
const V2_COMMAND_CHAIN_REQUEST=3
|
|
const V2_COMMAND_CHAIN_RESPONSE=4
|
|
const V2_COMMAND_OBJECTS_REQUEST=5
|
|
const V2_COMMAND_OBJECTS_RESPONSE=6
|
|
|
|
const V2_NOTIFY_NEW_OBJECTS=0x80000001 // all notifications come here, such as new block, new txs
|
|
|
|
|
|
|
|
type Chain_Request struct {
|
|
Block_list [][32]byte
|
|
}
|
|
|
|
type Chain_Response struct {
|
|
Block_list [][32]byte
|
|
}
|
|
|
|
type Object_Request struct {
|
|
Block_list [][32]byte
|
|
Tx_list [][32]byte
|
|
}
|
|
|
|
type Complete_Block struct {
|
|
Block []byte
|
|
Tx [][]byte
|
|
}
|
|
|
|
type Object_Response struct {
|
|
Blocks []Complete_Block
|
|
Tx_list [][32]byte
|
|
}
|
|
|
|
type Notify_New_Objects struct {
|
|
Block []byte
|
|
Tx_list [][]byte
|
|
}
|
|
|
|
|
|
|
|
|
|
// each packet has to be parsed twice
|
|
// the following
|