/// <summary> /// Calculate merkle tree root of transaction. /// </summary> /// <returns></returns> public static Hash CalculateMerkleTreeRoot(this BlockBody blockBody) { if (blockBody.TransactionsCount == 0) { return(Hash.Empty); } var merkleTreeRoot = BinaryMerkleTree.FromLeafNodes(blockBody.TransactionIds).Root; return(merkleTreeRoot); }
private Block GenerateBlock(BlockHeader blockHeader, IEnumerable <Hash> transactionIds) { var leafNodes = transactionIds as Hash[] ?? transactionIds.ToArray(); blockHeader.MerkleTreeRootOfTransactions = BinaryMerkleTree.FromLeafNodes(leafNodes).Root; blockHeader.MerkleTreeRootOfWorldState = Hash.Empty; blockHeader.MerkleTreeRootOfTransactionStatus = Hash.Empty; blockHeader.SignerPubkey = ByteString.CopyFromUtf8("SignerPubkey"); var block = new Block { Header = blockHeader, Body = new BlockBody() }; block.Body.TransactionIds.AddRange(leafNodes); return(block); }
public void BlockBody_Test() { var blockBody = new BlockBody(); blockBody.CalculateMerkleTreeRoot().ShouldBe(Hash.Empty); var transaction1 = _kernelTestHelper.GenerateTransaction(); var transaction2 = _kernelTestHelper.GenerateTransaction(); var transaction3 = _kernelTestHelper.GenerateTransaction(); blockBody.AddTransaction(transaction1); blockBody.TransactionIds.Count.ShouldBe(1); blockBody.TransactionIds.ShouldContain(transaction1.GetHash()); blockBody.AddTransactions(new[] { transaction2.GetHash(), transaction3.GetHash() }); blockBody.TransactionIds.Count.ShouldBe(3); blockBody.TransactionIds.ShouldContain(transaction2.GetHash()); blockBody.TransactionIds.ShouldContain(transaction3.GetHash()); blockBody.CalculateMerkleTreeRoot().ShouldBe(BinaryMerkleTree.FromLeafNodes(blockBody.TransactionIds).Root); }