// Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package storage import ( "bytes" "crypto" "fmt" "hash" "io" "sync" "github.com/ethereum/go-ethereum/bmt" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto/sha3" ) type Hasher func() hash.Hash type SwarmHasher func() SwarmHash // Peer is the recorded as Source on the chunk // should probably not be here? but network should wrap chunk object type Peer interface{} type Key []byte func (x Key) Size() uint { return uint(len(x)) } func (x Key) isEqual(y Key) bool { return bytes.Equal(x, y) } func (h Key) bits(i, j uint) uint { ii := i >> 3 jj := i & 7 if ii >= h.Size() { return 0 } if jj+j <= 8 { return uint((h[ii] >> jj) & ((1 << j) - 1)) } res := uint(h[ii] >> jj) jj = 8 - jj j -= jj for j != 0 { ii++ if j < 8 { res += uint(h[ii]&((1<