public static ConsensusMessage DeserializeFrom(byte[] data) { ConsensusMessage message = ReflectionCache.CreateInstance <ConsensusMessage>(data[0]); if (message == null) { throw new FormatException(); } using (MemoryStream ms = new MemoryStream(data, false)) using (BinaryReader r = new BinaryReader(ms)) { message.Deserialize(r); } return(message); }
private ConsensusPayload MakeSignedPayload(ConsensusMessage message) { message.ViewNumber = ViewNumber; ConsensusPayload payload = new ConsensusPayload { Version = Version, PrevHash = PrevHash, BlockIndex = BlockIndex, ValidatorIndex = (ushort)MyIndex, Timestamp = Timestamp, Data = message.ToArray() }; SignPayload(payload); return(payload); }
private void LocalNode_InventoryReceived(object sender, IInventory inventory) { ConsensusPayload payload = inventory as ConsensusPayload; if (payload != null) { lock (context) { if (payload.ValidatorIndex == context.MyIndex) { return; } if (payload.Version != ConsensusContext.Version) { return; } if (payload.PrevHash != context.PrevHash || payload.BlockIndex != context.BlockIndex) { // Request blocks if (Blockchain.Default?.Height + 1 < payload.BlockIndex) { Log($"chain sync: expected={payload.BlockIndex} current: {Blockchain.Default?.Height}"); localNode.RequestGetBlocks(); } return; } if (payload.ValidatorIndex >= context.Validators.Length) { return; } ConsensusMessage message; try { message = ConsensusMessage.DeserializeFrom(payload.Data); } catch { return; } if (message.ViewNumber != context.ViewNumber && message.Type != ConsensusMessageType.ChangeView) { return; } switch (message.Type) { case ConsensusMessageType.ChangeView: OnChangeViewReceived(payload, (ChangeView)message); break; case ConsensusMessageType.PrepareRequest: OnPrepareRequestReceived(payload, (PrepareRequest)message); break; case ConsensusMessageType.PrepareResponse: OnPrepareResponseReceived(payload, (PrepareResponse)message); break; } } } }