// CreateIdentity will register a new SkipChain and add it to our list of // managed identities. func (s *Service) CreateIdentity(ai *CreateIdentity) (network.Body, onet.ClientError) { log.Lvlf3("%s Creating new identity with config %+v", s, ai.Config) ids := &Storage{ Latest: ai.Config, } log.Lvl3("Creating Root-skipchain") var cerr onet.ClientError ids.Root, cerr = s.skipchain.CreateRoster(ai.Roster, 2, 10, skipchain.VerifyNone, nil) if cerr != nil { return nil, cerr } log.Lvl3("Creating Data-skipchain") ids.Root, ids.Data, cerr = s.skipchain.CreateData(ids.Root, 2, 10, skipchain.VerifyNone, ai.Config) if cerr != nil { return nil, cerr } roster := ids.Root.Roster replies, err := s.propagateIdentity(roster, &PropagateIdentity{ids}, propagateTimeout) if err != nil { return nil, onet.NewClientErrorCode(ErrorOnet, err.Error()) } if replies != len(roster.List) { log.Warn("Did only get", replies, "out of", len(roster.List)) } log.Lvlf2("New chain is\n%x", []byte(ids.Data.Hash)) s.save() return &CreateIdentityReply{ Root: ids.Root, Data: ids.Data, }, nil }
// ProposeSend only stores the proposed configuration internally. Signatures // come later. func (s *Service) ProposeSend(p *ProposeSend) (network.Body, onet.ClientError) { log.Lvl2(s, "Storing new proposal") sid := s.getIdentityStorage(p.ID) if sid == nil { return nil, onet.NewClientErrorCode(ErrorBlockMissing, "Didn't find Identity") } roster := sid.Root.Roster replies, err := s.propagateConfig(roster, p, propagateTimeout) if err != nil { return nil, onet.NewClientErrorCode(ErrorOnet, err.Error()) } if replies != len(roster.List) { log.Warn("Did only get", replies, "out of", len(roster.List)) } return nil, nil }
// notify other services about new/updated skipblock func (s *Service) startPropagation(blocks []*SkipBlock) onet.ClientError { log.Lvlf3("Starting to propagate for service %x", s.Context.ServerIdentity().ID[0:8]) for _, block := range blocks { roster := block.Roster if roster == nil { // Suppose it's a dataSkipBlock sb, ok := s.getSkipBlockByID(block.ParentBlockID) if !ok { return onet.NewClientErrorCode(ErrorBlockNoParent, "Didn't find Roster nor parent") } roster = sb.Roster } replies, e := s.Propagate(roster, block, propagateTimeout) if e != nil { return onet.NewClientErrorCode(ErrorOnet, e.Error()) } if replies != len(roster.List) { log.Warn("Did only get", replies, "out of", len(roster.List)) } } return nil }