From ecfd59ac774a0232dfc0d71e19c2b391a6304cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D1=81=D0=BB=D0=B0=D0=B2=20?= =?UTF-8?q?=D0=A7=D0=B0=D1=81=D1=82=D1=83=D1=85=D0=B8=D0=BD?= Date: Wed, 4 Jan 2023 17:26:14 +1000 Subject: [PATCH 1/3] Tx class has completed --- DltNode/DltNode.Blockchain/Class1.cs | 9 --------- .../DltNode.Blockchain/DltNode.Blockchain.csproj | 8 ++++++-- DltNode/DltNode.Blockchain/Transaction.cs | 16 ++++++++++++++++ DltNode/DltNode.Hash/DltNode.Hash.csproj | 7 +++++++ DltNode/DltNode.Hash/PureHash.cs | 15 +++++++++++++++ DltNode/DltNode.Main/DltNode.Main.csproj | 2 +- DltNode/DltNode.Main/Program.cs | 5 +++++ DltNode/DltNode.sln | 10 ++++++++-- 8 files changed, 58 insertions(+), 14 deletions(-) delete mode 100644 DltNode/DltNode.Blockchain/Class1.cs create mode 100644 DltNode/DltNode.Blockchain/Transaction.cs create mode 100644 DltNode/DltNode.Hash/DltNode.Hash.csproj create mode 100644 DltNode/DltNode.Hash/PureHash.cs diff --git a/DltNode/DltNode.Blockchain/Class1.cs b/DltNode/DltNode.Blockchain/Class1.cs deleted file mode 100644 index 8e8bc27..0000000 --- a/DltNode/DltNode.Blockchain/Class1.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace DltNode.Blockchain -{ - public class Class1 - { - // example - } -} diff --git a/DltNode/DltNode.Blockchain/DltNode.Blockchain.csproj b/DltNode/DltNode.Blockchain/DltNode.Blockchain.csproj index cb63190..818cb8d 100644 --- a/DltNode/DltNode.Blockchain/DltNode.Blockchain.csproj +++ b/DltNode/DltNode.Blockchain/DltNode.Blockchain.csproj @@ -1,7 +1,11 @@ - + - netcoreapp3.1 + net5.0 + + + + diff --git a/DltNode/DltNode.Blockchain/Transaction.cs b/DltNode/DltNode.Blockchain/Transaction.cs new file mode 100644 index 0000000..7544088 --- /dev/null +++ b/DltNode/DltNode.Blockchain/Transaction.cs @@ -0,0 +1,16 @@ +using System; +using System.Text; +using DltNode.Hash; + +namespace DltNode.Blockchain +{ + public class Transaction + { + public readonly String info; + public Transaction(string info) + { + this.info = info; + } + public Byte[] GetHash() => PureHash.computeHash(Encoding.UTF8.GetBytes(info)); + } +} diff --git a/DltNode/DltNode.Hash/DltNode.Hash.csproj b/DltNode/DltNode.Hash/DltNode.Hash.csproj new file mode 100644 index 0000000..d4c395e --- /dev/null +++ b/DltNode/DltNode.Hash/DltNode.Hash.csproj @@ -0,0 +1,7 @@ + + + + netstandard2.1 + + + diff --git a/DltNode/DltNode.Hash/PureHash.cs b/DltNode/DltNode.Hash/PureHash.cs new file mode 100644 index 0000000..b7282f8 --- /dev/null +++ b/DltNode/DltNode.Hash/PureHash.cs @@ -0,0 +1,15 @@ +using System; +using System.Security.Cryptography; + +namespace DltNode.Hash +{ + public static class PureHash + { + public static byte[] computeHash(byte[] input) + { + var hashing = SHA256.Create(); + return hashing.ComputeHash(input); + } + + } +} diff --git a/DltNode/DltNode.Main/DltNode.Main.csproj b/DltNode/DltNode.Main/DltNode.Main.csproj index 5312c73..3281960 100644 --- a/DltNode/DltNode.Main/DltNode.Main.csproj +++ b/DltNode/DltNode.Main/DltNode.Main.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 diff --git a/DltNode/DltNode.Main/Program.cs b/DltNode/DltNode.Main/Program.cs index 968f589..1b52d60 100644 --- a/DltNode/DltNode.Main/Program.cs +++ b/DltNode/DltNode.Main/Program.cs @@ -1,4 +1,6 @@ using System; +using DltNode.Blockchain; +using System.Text; namespace DltNode.Main { @@ -9,6 +11,9 @@ static void Main(string[] args) Console.WriteLine("Hello World!"); Console.WriteLine(); Console.WriteLine(1); + Transaction tx = new Transaction("Product X has moved from A to B"); + Console.WriteLine(tx.info); + Console.WriteLine(Encoding.Default.GetString(tx.GetHash())); } } } diff --git a/DltNode/DltNode.sln b/DltNode/DltNode.sln index 076bbac..a6a7b54 100644 --- a/DltNode/DltNode.sln +++ b/DltNode/DltNode.sln @@ -3,9 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30804.86 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DltNode.Main", "DltNode.Main\DltNode.Main.csproj", "{B8E636E8-B130-42C2-A2D9-24E95AAB97AA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DltNode.Main", "DltNode.Main\DltNode.Main.csproj", "{B8E636E8-B130-42C2-A2D9-24E95AAB97AA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DltNode.Blockchain", "DltNode.Blockchain\DltNode.Blockchain.csproj", "{15EB2A24-0420-4CB0-9D46-EE8E84534BF1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DltNode.Blockchain", "DltNode.Blockchain\DltNode.Blockchain.csproj", "{15EB2A24-0420-4CB0-9D46-EE8E84534BF1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DltNode.Hash", "DltNode.Hash\DltNode.Hash.csproj", "{EB5C4CEC-BB8C-4EF5-8AA5-43FA3070108A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,6 +23,10 @@ Global {15EB2A24-0420-4CB0-9D46-EE8E84534BF1}.Debug|Any CPU.Build.0 = Debug|Any CPU {15EB2A24-0420-4CB0-9D46-EE8E84534BF1}.Release|Any CPU.ActiveCfg = Release|Any CPU {15EB2A24-0420-4CB0-9D46-EE8E84534BF1}.Release|Any CPU.Build.0 = Release|Any CPU + {EB5C4CEC-BB8C-4EF5-8AA5-43FA3070108A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB5C4CEC-BB8C-4EF5-8AA5-43FA3070108A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB5C4CEC-BB8C-4EF5-8AA5-43FA3070108A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB5C4CEC-BB8C-4EF5-8AA5-43FA3070108A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From efbb01915eb3a1cf451cc59afaee242be3479c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D1=81=D0=BB=D0=B0=D0=B2=20?= =?UTF-8?q?=D0=A7=D0=B0=D1=81=D1=82=D1=83=D1=85=D0=B8=D0=BD?= Date: Wed, 4 Jan 2023 17:43:07 +1000 Subject: [PATCH 2/3] Class Blockchain, Block and Program have been completed! --- DltNode/DltNode.Blockchain/Block.cs | 53 ++++++++++++++++++++++++ DltNode/DltNode.Blockchain/Blockchain.cs | 32 ++++++++++++++ DltNode/DltNode.Main/Program.cs | 30 +++++++++++--- 3 files changed, 109 insertions(+), 6 deletions(-) create mode 100644 DltNode/DltNode.Blockchain/Block.cs create mode 100644 DltNode/DltNode.Blockchain/Blockchain.cs diff --git a/DltNode/DltNode.Blockchain/Block.cs b/DltNode/DltNode.Blockchain/Block.cs new file mode 100644 index 0000000..8fa8583 --- /dev/null +++ b/DltNode/DltNode.Blockchain/Block.cs @@ -0,0 +1,53 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DltNode.Hash; + +namespace DltNode.Blockchain +{ + public class Block + { + public readonly Byte[] blockHash; + + public readonly Byte[] previousBlockHash; + + public readonly List transactions; + + public readonly Byte[] zero; + public Block(List transactions, Block previousBlock) + { + zero = new byte[32]; + this.previousBlockHash = previousBlock?.blockHash ?? zero; + this.transactions = transactions; + + List hashes = new List(); + hashes.Add(previousBlockHash); + foreach (var tx in transactions) + { + + hashes.Add(tx.GetHash()); + } + blockHash = computeMerkleTreeHash(hashes); + } + public Byte[] computeMerkleTreeHash(List hashes) + { + if (hashes.Count == 1) + return hashes[0]; + else if (hashes.Count == 2) + return PureHash.computeHash(hashes[0].Concat(hashes[1]).ToArray()); + else + { + List firstPart = hashes.GetRange(0, hashes.Count / 2); + List secondPart = hashes.GetRange(hashes.Count / 2, hashes.Count - 1); + var hashOfLeft = computeMerkleTreeHash(firstPart); + var hashOfRight = computeMerkleTreeHash(secondPart); + return PureHash.computeHash(hashOfLeft.Concat(hashOfRight).ToArray()); + } + + return Array.Empty(); + } + } +} \ No newline at end of file diff --git a/DltNode/DltNode.Blockchain/Blockchain.cs b/DltNode/DltNode.Blockchain/Blockchain.cs new file mode 100644 index 0000000..1dd9b06 --- /dev/null +++ b/DltNode/DltNode.Blockchain/Blockchain.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DltNode.Blockchain +{ + public class Blockchain + { + public List blockchain; + + public Blockchain(Block genesisBlock) + { + blockchain = new List(); + blockchain.Add(genesisBlock); + } + public Boolean AddNewBlock(Block newBlock) + { + if (newBlock.previousBlockHash != blockchain[blockchain.Count() - 1].blockHash) + { + return false; + } + else + { + blockchain.Add(newBlock); + return true; + } + } + public Int32 Height => blockchain.Count(); + } +} \ No newline at end of file diff --git a/DltNode/DltNode.Main/Program.cs b/DltNode/DltNode.Main/Program.cs index 1b52d60..17a4fdc 100644 --- a/DltNode/DltNode.Main/Program.cs +++ b/DltNode/DltNode.Main/Program.cs @@ -1,19 +1,37 @@ using System; -using DltNode.Blockchain; +using System.Collections.Generic; using System.Text; - +using DltNode.Blockchain; namespace DltNode.Main { class Program { static void Main(string[] args) { - Console.WriteLine("Hello World!"); + Console.WriteLine("Hello World"); Console.WriteLine(); Console.WriteLine(1); - Transaction tx = new Transaction("Product X has moved from A to B"); - Console.WriteLine(tx.info); - Console.WriteLine(Encoding.Default.GetString(tx.GetHash())); + Transaction tx1 = new Transaction("Product X has moved from A to B"); + Transaction tx2 = new Transaction("Product Y has moved from C to D"); + + List transactions = new List(); + transactions.Add(tx1); + transactions.Add(tx2); + + Block firstBlock = new Block(transactions, null); + Console.WriteLine(BitConverter.ToString(firstBlock.blockHash)); + Transaction tx0 = new Transaction("Product Z has moved from E to F"); + List transactions1 = new List(); + transactions1.Add(tx0); + + Block secondBlock = new Block(transactions1, firstBlock); + Console.WriteLine(BitConverter.ToString(secondBlock.previousBlockHash)); + Console.WriteLine(BitConverter.ToString(secondBlock.blockHash)); + + Blockchain.Blockchain blockchain = new Blockchain.Blockchain(firstBlock); + Console.WriteLine(blockchain.Height); + Console.WriteLine(blockchain.AddNewBlock(secondBlock)); + Console.WriteLine(blockchain.Height); } } } From c81b7982d8517223c89aa1f068b6a412a15b4739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D1=81=D0=BB=D0=B0=D0=B2=20?= =?UTF-8?q?=D0=A7=D0=B0=D1=81=D1=82=D1=83=D1=85=D0=B8=D0=BD?= Date: Wed, 4 Jan 2023 18:06:00 +1000 Subject: [PATCH 3/3] Changed Block, Blockchain and Program projects due to simple ProofOfWork stage --- DltNode/DltNode.Blockchain/Block.cs | 35 ++++++++++++++++--- .../DltNode.Consensus.csproj | 11 ++++++ DltNode/DltNode.Consensus/ProofOfWork.cs | 22 ++++++++++++ DltNode/DltNode.Main/Program.cs | 21 ++++++++--- DltNode/DltNode.sln | 8 ++++- 5 files changed, 87 insertions(+), 10 deletions(-) create mode 100644 DltNode/DltNode.Consensus/DltNode.Consensus.csproj create mode 100644 DltNode/DltNode.Consensus/ProofOfWork.cs diff --git a/DltNode/DltNode.Blockchain/Block.cs b/DltNode/DltNode.Blockchain/Block.cs index 8fa8583..8be7156 100644 --- a/DltNode/DltNode.Blockchain/Block.cs +++ b/DltNode/DltNode.Blockchain/Block.cs @@ -1,22 +1,30 @@ - -using System; +using System; using System.Collections.Generic; using System.Linq; +using System.Numerics; using System.Text; using System.Threading.Tasks; using DltNode.Hash; +using DltNode.Consensus; namespace DltNode.Blockchain { public class Block { - public readonly Byte[] blockHash; + public Byte[] blockHash; public readonly Byte[] previousBlockHash; public readonly List transactions; + public UInt64 nonce = 0; + public readonly Byte[] zero; + /// + /// + /// + /// + /// Put null in to first block constructor public Block(List transactions, Block previousBlock) { zero = new byte[32]; @@ -30,7 +38,25 @@ public Block(List transactions, Block previousBlock) hashes.Add(tx.GetHash()); } - blockHash = computeMerkleTreeHash(hashes); + var preBlockHash = computeMerkleTreeHash(hashes); + blockHash = PureHash.computeHash(BitConverter.GetBytes(nonce).Concat(preBlockHash).ToArray()); + } + public void ComputeHashWithTarget(BigInteger target) + { + List hashes = new List(); + hashes.Add(previousBlockHash); + foreach (var tx in transactions) + { + + hashes.Add(tx.GetHash()); + } + var preBlockHash = computeMerkleTreeHash(hashes); + nonce = ProofOfWork.SolveComputationProblem(target, preBlockHash); + blockHash = PureHash.computeHash(BitConverter.GetBytes(nonce).Concat(preBlockHash).ToArray()); + } + public Boolean CheckHash(BigInteger target) + { + return BigInteger.Abs(new BigInteger(blockHash)) < target; } public Byte[] computeMerkleTreeHash(List hashes) { @@ -46,7 +72,6 @@ public Byte[] computeMerkleTreeHash(List hashes) var hashOfRight = computeMerkleTreeHash(secondPart); return PureHash.computeHash(hashOfLeft.Concat(hashOfRight).ToArray()); } - return Array.Empty(); } } diff --git a/DltNode/DltNode.Consensus/DltNode.Consensus.csproj b/DltNode/DltNode.Consensus/DltNode.Consensus.csproj new file mode 100644 index 0000000..304ff82 --- /dev/null +++ b/DltNode/DltNode.Consensus/DltNode.Consensus.csproj @@ -0,0 +1,11 @@ + + + + netstandard2.1 + + + + + + + diff --git a/DltNode/DltNode.Consensus/ProofOfWork.cs b/DltNode/DltNode.Consensus/ProofOfWork.cs new file mode 100644 index 0000000..1d5027f --- /dev/null +++ b/DltNode/DltNode.Consensus/ProofOfWork.cs @@ -0,0 +1,22 @@ +using System; +using System.Linq; +using System.Numerics; +using DltNode.Hash; +namespace DltNode.Consensus +{ + public static class ProofOfWork + { + public static UInt64 SolveComputationProblem(BigInteger target, Byte[] preBlockHash) + { + UInt64 nonce = 0; + var newHash = PureHash.computeHash(BitConverter.GetBytes(nonce).Concat(preBlockHash).ToArray()); + do + { + nonce++; + newHash = PureHash.computeHash(BitConverter.GetBytes(nonce).Concat(preBlockHash).ToArray()); + } + while (BigInteger.Abs(new BigInteger(newHash)) >= target); + return nonce; + } + } +} \ No newline at end of file diff --git a/DltNode/DltNode.Main/Program.cs b/DltNode/DltNode.Main/Program.cs index 17a4fdc..b4da23e 100644 --- a/DltNode/DltNode.Main/Program.cs +++ b/DltNode/DltNode.Main/Program.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Numerics; using System.Text; using DltNode.Blockchain; namespace DltNode.Main @@ -8,9 +9,6 @@ class Program { static void Main(string[] args) { - Console.WriteLine("Hello World"); - Console.WriteLine(); - Console.WriteLine(1); Transaction tx1 = new Transaction("Product X has moved from A to B"); Transaction tx2 = new Transaction("Product Y has moved from C to D"); @@ -20,6 +18,7 @@ static void Main(string[] args) Block firstBlock = new Block(transactions, null); Console.WriteLine(BitConverter.ToString(firstBlock.blockHash)); + Transaction tx0 = new Transaction("Product Z has moved from E to F"); List transactions1 = new List(); transactions1.Add(tx0); @@ -32,6 +31,20 @@ static void Main(string[] args) Console.WriteLine(blockchain.Height); Console.WriteLine(blockchain.AddNewBlock(secondBlock)); Console.WriteLine(blockchain.Height); + + BigInteger target = new BigInteger(UInt64.MaxValue); + target = BigInteger.Pow(target, 3); + target = target * UInt32.MaxValue; + target = target * UInt16.MaxValue / 128; + firstBlock.ComputeHashWithTarget(target); + Console.WriteLine(BitConverter.ToString(firstBlock.blockHash)); + Console.WriteLine(firstBlock.nonce); + Console.WriteLine(firstBlock.CheckHash(target)); + + secondBlock.ComputeHashWithTarget(target); + Console.WriteLine(BitConverter.ToString(secondBlock.blockHash)); + Console.WriteLine(secondBlock.nonce); + Console.WriteLine(secondBlock.CheckHash(target)); } } -} +} \ No newline at end of file diff --git a/DltNode/DltNode.sln b/DltNode/DltNode.sln index a6a7b54..5faaccd 100644 --- a/DltNode/DltNode.sln +++ b/DltNode/DltNode.sln @@ -7,7 +7,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DltNode.Main", "DltNode.Mai EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DltNode.Blockchain", "DltNode.Blockchain\DltNode.Blockchain.csproj", "{15EB2A24-0420-4CB0-9D46-EE8E84534BF1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DltNode.Hash", "DltNode.Hash\DltNode.Hash.csproj", "{EB5C4CEC-BB8C-4EF5-8AA5-43FA3070108A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DltNode.Hash", "DltNode.Hash\DltNode.Hash.csproj", "{EB5C4CEC-BB8C-4EF5-8AA5-43FA3070108A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DltNode.Consensus", "DltNode.Consensus\DltNode.Consensus.csproj", "{49C23B35-DAE0-4CA2-A268-C940A3FF97E6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -27,6 +29,10 @@ Global {EB5C4CEC-BB8C-4EF5-8AA5-43FA3070108A}.Debug|Any CPU.Build.0 = Debug|Any CPU {EB5C4CEC-BB8C-4EF5-8AA5-43FA3070108A}.Release|Any CPU.ActiveCfg = Release|Any CPU {EB5C4CEC-BB8C-4EF5-8AA5-43FA3070108A}.Release|Any CPU.Build.0 = Release|Any CPU + {49C23B35-DAE0-4CA2-A268-C940A3FF97E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49C23B35-DAE0-4CA2-A268-C940A3FF97E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49C23B35-DAE0-4CA2-A268-C940A3FF97E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49C23B35-DAE0-4CA2-A268-C940A3FF97E6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE