Add Mining/Proof-of-Work
This commit is contained in:
@@ -11,6 +11,7 @@ namespace BasicBlockChain
|
||||
public string PreviousHash { get; set; }
|
||||
public string Data { get; set; }
|
||||
public string Hash { get; set; }
|
||||
public int Nonce { get; set; }
|
||||
|
||||
public Block(DateTime date, Block previousBlock, string data)
|
||||
{
|
||||
@@ -25,11 +26,21 @@ namespace BasicBlockChain
|
||||
{
|
||||
SHA256 sha256 = SHA256.Create();
|
||||
|
||||
byte[] dataBytes = Encoding.UTF8.GetBytes(string.Format("{0}-{1}-{2}", Date, PreviousHash, Data));
|
||||
byte[] dataBytes = Encoding.UTF8.GetBytes(string.Format("{0}-{1}-{2}-{3}", Date, PreviousHash, Data, Nonce));
|
||||
byte[] hashBytes = sha256.ComputeHash(dataBytes);
|
||||
|
||||
string hash = Convert.ToBase64String(hashBytes);
|
||||
return hash;
|
||||
}
|
||||
|
||||
public void Mine(int difficulty)
|
||||
{
|
||||
var leadingZeros = new string('0', difficulty);
|
||||
while (Hash.Substring(0, difficulty) != leadingZeros)
|
||||
{
|
||||
Nonce++;
|
||||
Hash = CalculateHash();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,10 +7,13 @@ namespace BasicBlockChain
|
||||
public class BlockChain
|
||||
{
|
||||
public List<Block> Chain { get; } = new List<Block>();
|
||||
public int Difficulty { get; set; } = 2;
|
||||
|
||||
public BlockChain(DateTime? genesisDate = null)
|
||||
public BlockChain(DateTime? genesisDate = null, int difficulty = 2)
|
||||
{
|
||||
Block genesisBlock = new Block(genesisDate ?? DateTime.UtcNow, null, "{}");
|
||||
genesisBlock.Mine(difficulty);
|
||||
Difficulty = difficulty;
|
||||
Chain.Add(genesisBlock);
|
||||
}
|
||||
|
||||
@@ -18,6 +21,7 @@ namespace BasicBlockChain
|
||||
{
|
||||
Block lastBlock = Chain.Last();
|
||||
Block newBlock = new Block(date, lastBlock, data);
|
||||
newBlock.Mine(Difficulty);
|
||||
Chain.Add(newBlock);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,12 +10,15 @@ namespace BasicBlockChain
|
||||
|
||||
// Example BlockChain with some example data
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("#### BlockChain with sample data");
|
||||
BlockChain nullCoin = new BlockChain(new DateTime(2000, 1, 1));
|
||||
Console.WriteLine("#### Mining BlockChain with sample data");
|
||||
var startTime = DateTime.UtcNow;
|
||||
BlockChain nullCoin = new BlockChain(genesisDate: new DateTime(2000, 1, 1), difficulty: 2);
|
||||
nullCoin.AddData(new DateTime(2000, 1, 2), "{ sender: VAR, receiver: NAM, amount: 10.00}");
|
||||
nullCoin.AddData(new DateTime(2000, 1, 3), "{ sender: NAM, receiver: VAR, amount: 5.00}");
|
||||
nullCoin.AddData(new DateTime(2000, 1, 4), "{ sender: NAM, receiver: VAR, amount: 5.00}");
|
||||
Console.WriteLine(jsonWriter.Write(nullCoin));
|
||||
var endTime = DateTime.UtcNow;
|
||||
Console.WriteLine($"Duration: {endTime - startTime}");
|
||||
|
||||
// Verify
|
||||
Console.WriteLine("BlockChain is Valid? {0}", nullCoin.Verify() ? "True" : "False");
|
||||
|
||||
Reference in New Issue
Block a user