github.com/Gessiux/neatchain@v1.3.1/chain/core/state/statedb_forbidden.go (about) 1 package state 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "sort" 8 9 "github.com/Gessiux/neatchain/utilities/common" 10 "github.com/Gessiux/neatchain/utilities/rlp" 11 ) 12 13 // ----- forbidden Set 14 15 // MarkAddressForbidden adds the specified object to the dirty map 16 func (self *StateDB) MarkAddressForbidden(addr common.Address) { 17 if _, exist := self.GetForbiddenSet()[addr]; !exist { 18 self.forbiddenSet[addr] = struct{}{} 19 self.forbiddenSetDirty = true 20 } 21 } 22 23 func (self *StateDB) GetForbiddenSet() ForbiddenSet { 24 if len(self.forbiddenSet) != 0 { 25 return self.forbiddenSet 26 } 27 // Try to get from Trie 28 enc, err := self.trie.TryGet(forbiddenSetKey) 29 if err != nil { 30 self.setError(err) 31 return nil 32 } 33 var value ForbiddenSet 34 if len(enc) > 0 { 35 err := rlp.DecodeBytes(enc, &value) 36 if err != nil { 37 self.setError(err) 38 } 39 self.forbiddenSet = value 40 } 41 return value 42 } 43 44 func (self *StateDB) commitForbiddenSet() { 45 data, err := rlp.EncodeToBytes(self.forbiddenSet) 46 if err != nil { 47 panic(fmt.Errorf("can't encode forbidden set : %v", err)) 48 } 49 self.setError(self.trie.TryUpdate(forbiddenSetKey, data)) 50 } 51 52 func (self *StateDB) ClearForbiddenSetByAddress(addr common.Address) { 53 delete(self.forbiddenSet, addr) 54 self.forbiddenSetDirty = true 55 } 56 57 // Store the Forbidden Address Set 58 59 var forbiddenSetKey = []byte("ForbiddenSet") 60 61 type ForbiddenSet map[common.Address]struct{} 62 63 func (set ForbiddenSet) EncodeRLP(w io.Writer) error { 64 var list []common.Address 65 for addr := range set { 66 list = append(list, addr) 67 } 68 sort.Slice(list, func(i, j int) bool { 69 return bytes.Compare(list[i].Bytes(), list[j].Bytes()) == 1 70 }) 71 return rlp.Encode(w, list) 72 } 73 74 func (set *ForbiddenSet) DecodeRLP(s *rlp.Stream) error { 75 var list []common.Address 76 if err := s.Decode(&list); err != nil { 77 return err 78 } 79 forbiddenSet := make(ForbiddenSet, len(list)) 80 for _, addr := range list { 81 forbiddenSet[addr] = struct{}{} 82 } 83 *set = forbiddenSet 84 return nil 85 }