// Start announces the new block to sign func (nt *Ntree) Start() error { log.Lvl3(nt.Name(), "Start()") go byzcoin.VerifyBlock(nt.block, "", "", nt.verifyBlockChan) for _, tn := range nt.Children() { if err := nt.SendTo(tn, &BlockAnnounce{nt.block}); err != nil { return err } } return nil }
// listen will select on the differents channels func (nt *Ntree) listen() { for { select { // Dispatch the block through the whole tree case msg := <-nt.announceChan: log.Lvl3(nt.Name(), "Received Block announcement") nt.block = msg.BlockAnnounce.Block // verify the block go byzcoin.VerifyBlock(nt.block, "", "", nt.verifyBlockChan) if nt.IsLeaf() { nt.startBlockSignature() continue } for _, tn := range nt.Children() { err := nt.SendTo(tn, &msg.BlockAnnounce) if err != nil { log.Error(nt.Name(), "couldn't send to", tn.Name(), err) } } // generate your own signature / exception and pass that up to the // root case msg := <-nt.blockSignatureChan: nt.handleBlockSignature(&msg.NaiveBlockSignature) // Dispatch the signature + expcetion made before through the whole // tree case msg := <-nt.roundSignatureRequestChan: log.Lvl3(nt.Name(), " Signature Request Received") go nt.verifySignatureRequest(&msg.RoundSignatureRequest) if nt.IsLeaf() { nt.startSignatureResponse() continue } for _, tn := range nt.Children() { err := nt.SendTo(tn, &msg.RoundSignatureRequest) if err != nil { log.Error(nt.Name(), "couldn't sent to", tn.Name(), err) } } // Decide if we want to sign this or not case msg := <-nt.roundSignatureResponseChan: nt.handleRoundSignatureResponse(&msg.RoundSignatureResponse) } } }