// NewBFTCoSiProtocol returns a new bftcosi struct func NewBFTCoSiProtocol(n *onet.TreeNodeInstance, verify VerificationFunction) (*ProtocolBFTCoSi, error) { // initialize the bftcosi node/protocol-instance bft := &ProtocolBFTCoSi{ TreeNodeInstance: n, collectStructs: collectStructs{ prepare: cosi.NewCosi(n.Suite(), n.Private(), n.Roster().Publics()), commit: cosi.NewCosi(n.Suite(), n.Private(), n.Roster().Publics()), }, verifyChan: make(chan bool), VerificationFunction: verify, threshold: (len(n.Tree().List()) + 1) * 2 / 3, Msg: make([]byte, 0), Data: make([]byte, 0), } idx, _ := n.Roster().Search(bft.ServerIdentity().ID) bft.index = idx // Registering channels. err := bft.RegisterChannels(&bft.announceChan, &bft.challengePrepareChan, &bft.challengeCommitChan, &bft.commitChan, &bft.responseChan) if err != nil { return nil, err } n.OnDoneCallback(bft.nodeDone) return bft, nil }
// NewProtocol returns a ProtocolCosi with the node set with the right channels. // Use this function like this: // ``` // round := NewRound****() // fn := func(n *onet.Node) onet.ProtocolInstance { // pc := NewProtocolCosi(round,n) // return pc // } // onet.RegisterNewProtocolName("cothority",fn) // ``` func NewProtocol(node *onet.TreeNodeInstance) (onet.ProtocolInstance, error) { var err error // XXX just need to take care to take the global list of cosigners once we // do the exception stuff publics := make([]abstract.Point, len(node.Roster().List)) for i, e := range node.Roster().List { publics[i] = e.Public } c := &CoSi{ cosi: cosi.NewCosi(node.Suite(), node.Private(), publics), TreeNodeInstance: node, done: make(chan bool), tempCommitLock: new(sync.Mutex), tempResponseLock: new(sync.Mutex), } // Register the channels we want to register and listens on if err := node.RegisterChannel(&c.announce); err != nil { return c, err } if err := node.RegisterChannel(&c.commit); err != nil { return c, err } if err := node.RegisterChannel(&c.challenge); err != nil { return c, err } if err := node.RegisterChannel(&c.response); err != nil { return c, err } return c, err }