go-ethereum/eth/downloader/peer.go

56 lines
1.1 KiB
Go
Raw Normal View History

2015-04-12 13:38:25 +03:00
package downloader
import (
"errors"
2015-04-12 13:38:25 +03:00
"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 {
2015-04-12 13:38:25 +03:00
p.mu.Lock()
defer p.mu.Unlock()
if p.state == workingState {
return errors.New("peer already fetching chunk")
}
2015-04-12 13:38:25 +03:00
// 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
2015-04-12 13:38:25 +03:00
}