@@ -63,7 +63,15 @@ func (s *roundState) GetPrepareOrCommitSize() int {
6363 s .mu .RLock ()
6464 defer s .mu .RUnlock ()
6565
66- return s .getPrepareOrCommitSize ()
66+ result := s .Prepares .Size () + s .Commits .Size ()
67+
68+ // find duplicate one
69+ for _ , m := range s .Prepares .Values () {
70+ if s .Commits .Get (m .Address ) != nil {
71+ result --
72+ }
73+ }
74+ return result
6775}
6876
6977func (s * roundState ) Subject () * istanbul.Subject {
@@ -143,51 +151,36 @@ func (s *roundState) Sequence() *big.Int {
143151 return s .sequence
144152}
145153
146- func (s * roundState ) SetPreparedCertificate (preparedCertificate istanbul.PreparedCertificate ) {
147- s .mu .Lock ()
148- defer s .mu .Unlock ()
149-
150- s .preparedCertificate = preparedCertificate
151- }
152-
153154func (s * roundState ) CreateAndSetPreparedCertificate (quorumSize int ) error {
154155 s .mu .Lock ()
155156 defer s .mu .Unlock ()
156157
157- prepareOrCommitSize := s .getPrepareOrCommitSize ()
158- if prepareOrCommitSize >= quorumSize {
159- messages := make ([]istanbul.Message , prepareOrCommitSize )
160- i := 0
161- for _ , message := range s .Prepares .Values () {
162- messages [i ] = * message
163- i ++
158+ messages := make ([]istanbul.Message , quorumSize )
159+ i := 0
160+ for _ , message := range s .Prepares .Values () {
161+ if i == quorumSize {
162+ break
164163 }
165- for _ , message := range s .Commits .Values () {
166- if s .Prepares .Get (message .Address ) == nil {
167- messages [i ] = * message
168- i ++
169- }
164+ messages [i ] = * message
165+ i ++
166+ }
167+ for _ , message := range s .Commits .Values () {
168+ if i == quorumSize {
169+ break
170170 }
171- s . preparedCertificate = istanbul. PreparedCertificate {
172- Proposal : s . Preprepare . Proposal ,
173- PrepareOrCommitMessages : messages ,
171+ if s . Prepares . Get ( message . Address ) == nil {
172+ messages [ i ] = * message
173+ i ++
174174 }
175- return nil
176- } else {
175+ }
176+ if i != quorumSize {
177177 return errFailedCreatePreparedCertificate
178178 }
179- }
180-
181- func (s * roundState ) getPrepareOrCommitSize () int {
182- result := s .Prepares .Size () + s .Commits .Size ()
183-
184- // find duplicate one
185- for _ , m := range s .Prepares .Values () {
186- if s .Commits .Get (m .Address ) != nil {
187- result --
188- }
179+ s .preparedCertificate = istanbul.PreparedCertificate {
180+ Proposal : s .Preprepare .Proposal ,
181+ PrepareOrCommitMessages : messages ,
189182 }
190- return result
183+ return nil
191184}
192185
193186// The DecodeRLP method should read one value from the given
0 commit comments