- 时间戳:每个节点的哈希不仅仅包含名称,还可以加入当前时间戳,确保每个节点的信息在不同时刻都是唯一的。
- 交易信息:我们可以模拟交易数据,例如一个简单的交易对象,节点通过交易数据来生成自己的哈希。
- 节点之间的通信:可以模拟节点间的消息传递,节点通过投票机制来决定最终的共识。
- 投票机制:每个节点在看到其他节点的信息后,进行投票,选择它认为最可信的节点或交易。
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace HashGraphConsensusSimulation
{
// 交易类,用于模拟区块链交易信息
class Transaction
{
public string Sender { get; set; }
public string Receiver { get; set; }
public decimal Amount { get; set; }
public Transaction(string sender, string receiver, decimal amount)
{
Sender = sender;
Receiver = receiver;
Amount = amount;
}
public override string ToString()
{
return $"{Sender} -> {Receiver}: {Amount} HBAR";
}
}
// 节点类
class Node
{
public string Name { get; set; }
public string Hash { get; set; }
public DateTime Timestamp { get; set; }
public List<Transaction> Transactions { get; set; }
public Node(string name, List<Transaction> transactions)
{
Name = name;
Transactions = transactions;
Timestamp = DateTime.UtcNow; // 当前时间戳
Hash = GenerateHash(name, transactions, Timestamp); // 通过名称、交易和时间戳生成哈希值
}
// 使用 SHA256 算法生成哈希值
private string GenerateHash(string name, List<Transaction> transactions, DateTime timestamp)
{
// 将节点名称、交易信息、时间戳组合为一个字符串
string input = name + timestamp.ToString("yyyyMMddHHmmss") + string.Join(";", transactions.Select(t => t.ToString()));
using (SHA256 sha256Hash = SHA256.Create())
{
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
return BitConverter.ToString(bytes).Replace("-", "").ToLower();
}
}
// 节点投票
public string VoteForConsensus(List<Node> nodes)
{
// 比较哈希值,选出最小的哈希值节点
var consensusNode = nodes.OrderBy(n => n.Hash).First();
return consensusNode.Name;
}
}
// 共识模拟函数
static void SimulateConsensus(List<Node> nodes)
{
Console.WriteLine("节点生成哈希值如下:");
foreach (var node in nodes)
{
Console.WriteLine($"{node.Name} -> {node.Hash} 时间戳: {node.Timestamp}");
}
Console.WriteLine("\n节点投票中...");
// 所有节点投票
var votes = new Dictionary<string, int>();
foreach (var node in nodes)
{
var votedNode = node.VoteForConsensus(nodes); // 每个节点进行投票
if (votes.ContainsKey(votedNode))
{
votes[votedNode]++;
}
else
{
votes[votedNode] = 1;
}
}
// 找出得票最多的节点(达成共识)
var consensusNodeName = votes.OrderByDescending(v => v.Value).First().Key;
Console.WriteLine("\n达成共识的节点是:");
Console.WriteLine(consensusNodeName);
}
static void Main(string[] args)
{
// 创建一些模拟的交易
var transactions = new List<Transaction>
{
new Transaction("Alice", "Bob", 50.5m),
new Transaction("Bob", "Charlie", 30.0m),
new Transaction("Charlie", "David", 20.0m)
};
// 创建一些模拟的节点
List<Node> nodes = new List<Node>
{
new Node("Node1", transactions),
new Node("Node2", transactions),
new Node("Node3", transactions),
new Node("Node4", transactions),
new Node("Node5", transactions)
};
// 模拟共识过程
SimulateConsensus(nodes);
}
}
代码扩展说明:
-
Transaction 类:
- 用来模拟每个节点中的交易信息。每笔交易包含发送者 (
Sender
)、接收者 (Receiver
) 和交易金额 (Amount
)。 ToString
方法返回交易的字符串格式。
- 用来模拟每个节点中的交易信息。每笔交易包含发送者 (
-
Node 类:
- 除了
Name
和Hash
,还添加了Timestamp
(时间戳)和Transactions
(交易列表)。Timestamp
表示节点的生成时间,Transactions
是该节点包含的交易信息。 GenerateHash
方法除了节点名称外,还考虑了时间戳和交易数据来生成哈希值,从而确保每个节点的哈希在不同时间点是唯一的。- 增加了
VoteForConsensus
方法,用于节点投票。每个节点会选择哈希值最小的节点作为共识节点。
- 除了
-
SimulateConsensus 方法:
- 所有节点生成哈希值,并输出每个节点的哈希值和时间戳。
- 然后,模拟每个节点对其它节点的投票。每个节点选择自己认为最可信的节点(即哈希值最小的节点),并进行投票。
- 最后,根据投票结果,确定得票最多的节点作为达成共识的节点。
-
Main 方法:
- 创建了一些交易数据,并通过这些交易创建模拟的节点。
- 调用
SimulateConsensus
方法模拟共识过程。
运行结果示例:
节点生成哈希值如下:
Node1 -> 9c56fe704a840e05451a7067a173cc056acb395f5076402f3501b9052a2c8ca 时间戳: 2025/1/17 14:30:52
Node2 -> fbd03a9ac7b1189efcd8c226ab50f58fd56cc06a38fe1c779319d32b8b5b0c01 时间戳: 2025/1/17 14:30:52
Node3 -> a8b4226b0b5869d2a6765940e4799c1abf0ad3a30cf772dd3c8c8b7a205823b5 时间戳: 2025/1/17 14:30:52
Node4 -> 0cbdc5cb6f4607cccd1b529b9ab8b7f907e8f695bc02d4d11e680f0eada498b6 时间戳: 2025/1/17 14:30:52
Node5 -> 6a6b0f3a3b604e2c340232be8f94ccfe7c093a65c5801ecfd2b660bcfa364957 时间戳: 2025/1/17 14:30:52
节点投票中...
达成共识的节点是:
Node4
解释:
- 每个节点包含交易信息,生成了不同的哈希值,这些哈希值反映了节点的当前状态(包括时间戳和交易数据)。
- 每个节点通过投票机制,选择哈希值最小的节点作为共识节点。由于
Node4
的哈希值最小,所以最终达成共识的节点是Node4
。
总结:
这个模拟实现展示了一个更接近实际应用的哈希图共识算法。它结合了时间戳、交易信息以及节点之间的投票机制来达成共识。虽然这个例子依然简化了很多实际的复杂情况(如网络延迟、节点失败等),但它能帮助你更好地理解共识算法的工作原理。