private bool CheckPrepareResponse() { if (context.TransactionHashes.Length == context.Transactions.Count) { // if we are the primary for this view, but acting as a backup because we recovered our own // previously sent prepare request, then we don't want to send a prepare response. if (context.IsPrimary || context.WatchOnly) { return(true); } // Check maximum block size via Native Contract policy if (context.GetExpectedBlockSize() > NativeContract.Policy.GetMaxBlockSize(context.Snapshot)) { Log($"rejected block: {context.Block.Index}{Environment.NewLine} The size exceed the policy", LogLevel.Warning); RequestChangeView(ChangeViewReason.BlockRejectedByPolicy); return(false); } // Timeout extension due to prepare response sent // around 2*15/M=30.0/5 ~ 40% block time (for M=5) ExtendTimerByFactor(2); Log($"send prepare response"); localNode.Tell(new LocalNode.SendDirectly { Inventory = context.MakePrepareResponse() }); CheckPreparations(); } return(true); }