aboutsummaryrefslogblamecommitdiffstats
path: root/eth/downloader/peer.go
blob: 318da59b7ccce56593062015801e01c775931453 (plain) (tree)
1
2
3
4


                  
                





























                                                                                                                    
                                          


                           



                                                                









                                                                

                  
 
package downloader

import (
    "errors"
    "math/big"
    "sync"

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

const (
    workingState = 2
    idleState    = 4
)

// peer represents an active peer
type peer struct {
    state int

    mu         sync.RWMutex
    id         string
    td         *big.Int
    recentHash common.Hash

    getHashes hashFetcherFn
    getBlocks blockFetcherFn
}

// create a new peer
func newPeer(id string, td *big.Int, hash common.Hash, getHashes hashFetcherFn, getBlocks blockFetcherFn) *peer {
    return &peer{id: id, td: td, recentHash: hash, getHashes: getHashes, getBlocks: getBlocks, state: idleState}
}

// fetch a chunk using the peer
func (p *peer) fetch(chunk *chunk) error {
    p.mu.Lock()
    defer p.mu.Unlock()

    if p.state == workingState {
        return errors.New("peer already fetching chunk")
    }

    // set working state
    p.state = workingState
    // convert the set to a fetchable slice
    hashes, i := make([]common.Hash, chunk.hashes.Size()), 0
    chunk.hashes.Each(func(v interface{}) bool {
        hashes[i] = v.(common.Hash)
        i++
        return true
    })
    p.getBlocks(hashes)

    return nil
}