6 g "github.com/anacrolix/generics"
9 type Cache[Peer, BlockKey, Hash comparable] struct {
10 Hash func([]byte) Hash
13 blocks map[BlockKey][]peerAndHash[Peer, Hash]
16 type Block[Key any] struct {
21 type peerAndHash[Peer, Hash any] struct {
26 func (me *Cache[Peer, BlockKey, Hash]) Init() {
30 func (me *Cache[Peer, BlockKey, Hash]) RecordBlock(peer Peer, key BlockKey, data []byte) {
33 defer me.lock.Unlock()
34 peers := me.blocks[key]
35 peers = append(peers, peerAndHash[Peer, Hash]{peer, hash})
36 me.blocks[key] = peers
39 func (me *Cache[Peer, BlockKey, Hash]) CheckBlock(key BlockKey, data []byte) (bad []Peer) {
40 correct := me.Hash(data)
42 defer me.lock.RUnlock()
43 for _, item := range me.blocks[key] {
44 if item.Hash != correct {
45 bad = append(bad, item.Peer)
51 func (me *Cache[Peer, BlockKey, Hash]) ForgetBlock(key BlockKey) {
53 defer me.lock.Unlock()
54 delete(me.blocks, key)
57 func (me *Cache[Peer, BlockKey, Hash]) HasBlocks() bool {
59 defer me.lock.RUnlock()
60 return len(me.blocks) != 0