private void OnConsensusPayload(ConsensusPayload payload) { if (context.State.HasFlag(ConsensusState.BlockSent)) { return; } if (payload.ValidatorIndex == context.MyIndex) { return; } if (payload.Version != ConsensusContext.Version) { return; } if (payload.PrevHash != context.PrevHash || payload.BlockIndex != context.BlockIndex) { if (context.BlockIndex < payload.BlockIndex) { Log($"chain sync: expected={payload.BlockIndex} current={context.BlockIndex - 1} nodes={LocalNode.Singleton.ConnectedCount}", LogLevel.Warning); } 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; } }
public ConsensusMessage GetMessage(ExtensiblePayload payload) { if (payload is null) { return(null); } if (!cachedMessages.TryGetValue(payload.Hash, out ConsensusMessage message)) { cachedMessages.Add(payload.Hash, message = ConsensusMessage.DeserializeFrom(payload.Data)); } return(message); }
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 || payload.PrevHash != context.PrevHash || payload.BlockIndex != context.BlockIndex) { 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; } } } }
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; } } } }