区块链查找最长链
基于c#的BitcoinBlockchain包API调用
代码片
.
// An highlighted block
using System;
using BitcoinBlockchain.Data;
using BitcoinBlockchain.Parser;
using System.Collections.Generic;
using System.Linq;
namespace BlockParseSample
{
class Program
{
static void Main(string[] args)
{
string BlockPath = System.Environment.CurrentDirectory;
IBlockchainParser blockchainParser = new BlockchainParser(BlockPath);
IEnumerable<Block> blocks = blockchainParser.ParseBlockchain();
List<Block> originalBlocklist = blocks.ToList();
List<List<Block>> listofblocklist = new List<List<Block>>();
for (int i = 0; i < originalBlocklist.Count; i++)
{
List<Block> orderedBlockList = new List<Block>();
orderedBlockList.Add(originalBlocklist[i]);
create_a_list_from_this_block(orderedBlockList, originalBlocklist);
listofblocklist.Add(orderedBlockList);
}
Console.WriteLine();
Console.WriteLine("length of longest chain: " + find_longest_chain(listofblocklist));
}
static void create_a_list_from_this_block(List<Block> orderedBlocklist, List<Block> originalBlocklist)
{
Block block = find_previous_block(orderedBlocklist, originalBlocklist);//叶子节点王根节点找
while (block != null) //不等于null找到了
{
orderedBlocklist.Add(block);
block = find_previous_block(orderedBlocklist, originalBlocklist); //一直往前找
}
}
static Block find_previous_block(List<Block> orderedBlocklist, List<Block> originalBlocklist)
{
ByteArray previousBlockHash = orderedBlocklist[orderedBlocklist.Count - 1].BlockHeader.PreviousBlockHash;//往前找
for (int i = 0; i < originalBlocklist.Count; i++)
{
if (previousBlockHash == originalBlocklist[i].BlockHeader.BlockHash)
{
return (originalBlocklist[i]);
}
}
return (null);
}
static int find_longest_chain(List<List<Block>> listofblocklist)
{
int maxLength = 0;
foreach (List<Block> blocklist in listofblocklist)
{
if (blocklist.Count > maxLength)
{
maxLength = blocklist.Count;
}
}
return (maxLength);
}
}
}