Skip to content

Commit

Permalink
Fix consensus problem for proposed blocks with zero transactions (neo…
Browse files Browse the repository at this point in the history
…-project#1053)

* Fix consensus (CRLF)

* Removing unnecessary lines changes - Cleaning PR

* Reverting all changes on CC

* Modifying ConsensusContext with proposed changes
  • Loading branch information
shargon authored and Tommo-L committed Jun 22, 2020
1 parent 09d1063 commit dca0e50
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 4 deletions.
5 changes: 1 addition & 4 deletions neo/Consensus/ConsensusContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -254,14 +254,11 @@ internal void EnsureMaxBlockSize(IEnumerable<Transaction> txs)
txs = txs.Take((int)maxTransactionsPerBlock);
List<UInt256> hashes = new List<UInt256>();
Transactions = new Dictionary<UInt256, Transaction>();
Block.Transactions = new Transaction[0];

// We need to know the expected block size

// Expected block size
var blockSize = GetExpectedBlockSizeWithoutTransactions(txs.Count());

// Iterate transaction until reach the size

foreach (Transaction tx in txs)
{
// Check if maximum block size has been already exceeded with the current selected set
Expand Down
13 changes: 13 additions & 0 deletions neo/Consensus/ConsensusService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,11 @@ private bool AddTransaction(Transaction tx, bool verify)
return false;
}
context.Transactions[tx.Hash] = tx;
return CheckPrepareResponse();
}

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
Expand Down Expand Up @@ -428,6 +433,14 @@ private void OnPrepareRequestReceived(ConsensusPayload payload, PrepareRequest m
if (context.CommitPayloads[i]?.ConsensusMessage.ViewNumber == context.ViewNumber)
if (!Crypto.Default.VerifySignature(hashData, context.CommitPayloads[i].GetDeserializedMessage<Commit>().Signature, context.Validators[i].EncodePoint(false)))
context.CommitPayloads[i] = null;

if (context.TransactionHashes.Length == 0)
{
// There are no tx so we should act like if all the transactions were filled
CheckPrepareResponse();
return;
}

Dictionary<UInt256, Transaction> mempoolVerified = Blockchain.Singleton.MemPool.GetVerifiedTransactions().ToDictionary(p => p.Hash);
List<Transaction> unverified = new List<Transaction>();
foreach (UInt256 hash in context.TransactionHashes)
Expand Down

0 comments on commit dca0e50

Please sign in to comment.