aboutsummaryrefslogblamecommitdiffstats
path: root/eth/protocol.go
blob: 948051ed1f0469c625eeb97513f8d2a7f0700f27 (plain) (tree)
1
2
3
4
5
6
7
8
9


           

                  
                                                
                                                    

 
       
                               
                              






                                             
                           







                         

                








                                  
                        

 




                                     








                                                                
                                                     

 

                                                                          
                       
                                             
                                            


                             


                                                                                      

 
                                             



                             
package eth

import (
    "math/big"

    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/core/types"
)

const (
    ProtocolVersion    = 60
    NetworkId          = 0
    ProtocolLength     = uint64(8)
    ProtocolMaxMsgSize = 10 * 1024 * 1024
)

// eth protocol message codes
const (
    StatusMsg = iota
    GetTxMsg  // unused
    TxMsg
    GetBlockHashesMsg
    BlockHashesMsg
    GetBlocksMsg
    BlocksMsg
    NewBlockMsg
)

type errCode int

const (
    ErrMsgTooLarge = iota
    ErrDecode
    ErrInvalidMsgCode
    ErrProtocolVersionMismatch
    ErrNetworkIdMismatch
    ErrGenesisBlockMismatch
    ErrNoStatusMsg
    ErrExtraStatusMsg
    ErrSuspendedPeer
)

func (e errCode) String() string {
    return errorToString[int(e)]
}

// XXX change once legacy code is out
var errorToString = map[int]string{
    ErrMsgTooLarge:             "Message too long",
    ErrDecode:                  "Invalid message",
    ErrInvalidMsgCode:          "Invalid message code",
    ErrProtocolVersionMismatch: "Protocol version mismatch",
    ErrNetworkIdMismatch:       "NetworkId mismatch",
    ErrGenesisBlockMismatch:    "Genesis block mismatch",
    ErrNoStatusMsg:             "No status message",
    ErrExtraStatusMsg:          "Extra status message",
    ErrSuspendedPeer:           "Suspended peer",
}

// backend is the interface the ethereum protocol backend should implement
// used as an argument to EthProtocol
type txPool interface {
    AddTransactions([]*types.Transaction)
    GetTransactions() types.Transactions
}

type chainManager interface {
    GetBlockHashesFromHash(hash common.Hash, amount uint64) (hashes []common.Hash)
    GetBlock(hash common.Hash) (block *types.Block)
    Status() (td *big.Int, currentBlock common.Hash, genesisBlock common.Hash)
}

// message structs used for RLP serialization
type newBlockMsgData struct {
    Block *types.Block
    TD    *big.Int
}