// proposeSkipBlock sends a proposeSkipBlock to the service. If latest has // a Nil-Hash, it will be used as a // - rosterSkipBlock if data is nil, the Roster will be taken from 'el' // - dataSkipBlock if data is non-nil. Furthermore 'el' will hold the activeRoster // to send the request to. func (c *Client) proposeSkipBlock(latest *SkipBlock, el *onet.Roster, d network.Body) (reply *ProposedSkipBlockReply, cerr onet.ClientError) { log.Lvl3(latest) activeRoster := latest.Roster hash := latest.Hash propose := latest if !hash.IsNull() { // We have to create a new SkipBlock to propose to the // service propose = NewSkipBlock() if d == nil { // This is a RosterSkipBlock propose.Roster = el } else { // DataSkipBlock will be set later, just make sure that // there will be a receiver activeRoster = el } } if d != nil { // Set either a new or a proposed SkipBlock b, e := network.MarshalRegisteredType(d) if e != nil { cerr = onet.NewClientError(e) return } propose.Data = b } host := activeRoster.RandomServerIdentity() reply = &ProposedSkipBlockReply{} cerr = c.SendProtobuf(host, &ProposeSkipBlock{hash, propose}, reply) if cerr != nil { return } return }
// LinkParentChildBlock sends a request to create a link from the parent to the // child block and inversely. The child-block is supposed to already have // the parentBlockID set and be accepted. func (c *Client) LinkParentChildBlock(parent, child *SkipBlock) (*SkipBlock, *SkipBlock, onet.ClientError) { log.Lvl3(parent, child) if err := child.VerifySignatures(); err != nil { return nil, nil, onet.NewClientError(err) } if !bytes.Equal(parent.Hash, child.ParentBlockID) { return nil, nil, onet.NewClientErrorCode(ErrorBlockNoParent, "Child doesn't point to that parent") } host := parent.Roster.RandomServerIdentity() reply := &SetChildrenSkipBlockReply{} cerr := c.SendProtobuf(host, &SetChildrenSkipBlock{parent.Hash, child.Hash}, reply) if cerr != nil { return nil, nil, cerr } return reply.Parent, reply.Child, nil }