github.com/datachainlab/burrow@v0.25.0/execution/state/proposals.go (about) 1 package state 2 3 import ( 4 "fmt" 5 6 "github.com/hyperledger/burrow/execution/proposal" 7 "github.com/hyperledger/burrow/txs/payload" 8 ) 9 10 var _ proposal.IterableReader = &State{} 11 12 func (s *ReadState) GetProposal(proposalHash []byte) (*payload.Ballot, error) { 13 tree, err := s.Forest.Reader(keys.Proposal.Prefix()) 14 if err != nil { 15 return nil, err 16 } 17 bs := tree.Get(keys.Proposal.KeyNoPrefix(proposalHash)) 18 if len(bs) == 0 { 19 return nil, nil 20 } 21 22 return payload.DecodeBallot(bs) 23 } 24 25 func (ws *writeState) UpdateProposal(proposalHash []byte, p *payload.Ballot) error { 26 tree, err := ws.forest.Writer(keys.Proposal.Prefix()) 27 if err != nil { 28 return err 29 } 30 bs, err := p.Encode() 31 if err != nil { 32 return err 33 } 34 35 tree.Set(keys.Proposal.KeyNoPrefix(proposalHash), bs) 36 return nil 37 } 38 39 func (ws *writeState) RemoveProposal(proposalHash []byte) error { 40 tree, err := ws.forest.Writer(keys.Proposal.Prefix()) 41 if err != nil { 42 return err 43 } 44 tree.Delete(keys.Proposal.KeyNoPrefix(proposalHash)) 45 return nil 46 } 47 48 func (s *ReadState) IterateProposals(consumer func(proposalHash []byte, proposal *payload.Ballot) error) error { 49 tree, err := s.Forest.Reader(keys.Proposal.Prefix()) 50 if err != nil { 51 return err 52 } 53 return tree.Iterate(nil, nil, true, func(key []byte, value []byte) error { 54 entry, err := payload.DecodeBallot(value) 55 if err != nil { 56 return fmt.Errorf("State.IterateProposal() could not iterate over proposals: %v", err) 57 } 58 return consumer(key, entry) 59 }) 60 }