github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/core/bloombits/generator.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2017 Go Ethereum作者 10 //此文件是Go以太坊库的一部分。 11 // 12 //Go-Ethereum库是免费软件:您可以重新分发它和/或修改 13 //根据GNU发布的较低通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊图书馆的发行目的是希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU较低的通用公共许可证,了解更多详细信息。 21 // 22 //你应该收到一份GNU较低级别的公共许可证副本 23 //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package bloombits 26 27 import ( 28 "errors" 29 30 "github.com/ethereum/go-ethereum/core/types" 31 ) 32 33 var ( 34 //如果用户尝试添加更多Bloom筛选器,则返回errSectionOutofBounds 35 //批处理的可用空间不足,或者如果尝试检索超过容量。 36 errSectionOutOfBounds = errors.New("section out of bounds") 37 38 //如果用户尝试检索指定的 39 //比容量大一点。 40 errBloomBitOutOfBounds = errors.New("bloom bit out of bounds") 41 ) 42 43 //发电机接收许多布卢姆滤波器并生成旋转的布卢姆位 44 //用于批量过滤。 45 type Generator struct { 46 blooms [types.BloomBitLength][]byte //每比特匹配的旋转花束 47 sections uint //要一起批处理的节数 48 nextSec uint //添加花束时要设置的下一节 49 } 50 51 //NewGenerator创建一个旋转的Bloom Generator,它可以迭代填充 52 //批量布卢姆过滤器的钻头。 53 func NewGenerator(sections uint) (*Generator, error) { 54 if sections%8 != 0 { 55 return nil, errors.New("section count not multiple of 8") 56 } 57 b := &Generator{sections: sections} 58 for i := 0; i < types.BloomBitLength; i++ { 59 b.blooms[i] = make([]byte, sections/8) 60 } 61 return b, nil 62 } 63 64 //addbloom接受一个bloom过滤器并设置相应的位列 65 //在记忆中。 66 func (b *Generator) AddBloom(index uint, bloom types.Bloom) error { 67 //确保我们添加的布卢姆过滤器不会超过我们的容量 68 if b.nextSec >= b.sections { 69 return errSectionOutOfBounds 70 } 71 if b.nextSec != index { 72 return errors.New("bloom filter with unexpected index") 73 } 74 //旋转花束并插入我们的收藏 75 byteIndex := b.nextSec / 8 76 bitMask := byte(1) << byte(7-b.nextSec%8) 77 78 for i := 0; i < types.BloomBitLength; i++ { 79 bloomByteIndex := types.BloomByteLength - 1 - i/8 80 bloomBitMask := byte(1) << byte(i%8) 81 82 if (bloom[bloomByteIndex] & bloomBitMask) != 0 { 83 b.blooms[i][byteIndex] |= bitMask 84 } 85 } 86 b.nextSec++ 87 88 return nil 89 } 90 91 //位集返回属于给定位索引的位向量。 92 //花开了。 93 func (b *Generator) Bitset(idx uint) ([]byte, error) { 94 if b.nextSec != b.sections { 95 return nil, errors.New("bloom not fully generated yet") 96 } 97 if idx >= types.BloomBitLength { 98 return nil, errBloomBitOutOfBounds 99 } 100 return b.blooms[idx], nil 101 }