|
|
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
|