🔥关注墨瑾轩,带你探索编程的奥秘!🚀
🔥超萌技术攻略,轻松晋级编程高手🚀
🔥技术宝库已备好,就等你来挖掘🚀
🔥订阅墨瑾轩,智趣学习不孤单🚀
🔥即刻启航,编程之旅更有趣🚀

在这里插入图片描述在这里插入图片描述

一、先给你的区块链"装个脑子":基础结构

在开始做界面之前,咱们得先有个能跑的区块链。别急,我不会让你从头造轮子,但会给你一个干净、可扩展、注释详细到能当教科书的区块链基础框架。

// 🧠 这是区块链的核心:区块结构
// 为啥要这样设计?因为区块链的核心就是"不可篡改",每个区块都得有前一个区块的"身份证"(哈希值)
// 你可能会问:为啥要存时间戳?因为区块链需要按时间顺序排列,否则就乱套了!
public class Block
{
    // 🔢 区块索引:表示这是第几个区块,从0开始(创世区块)
    public int Index { get; set; }
    
    // 📅 时间戳:记录区块创建的时间,用UTC时间避免时区问题
    public DateTime Timestamp { get; set; }
    
    // 💬 交易数据:这里可以是任何你想存的信息,比如"张三转给李四10个币"
    public string Data { get; set; }
    
    // 🧾 前一个区块的哈希值:确保区块链的链式结构,篡改一个区块后面全崩
    public string PreviousHash { get; set; }
    
    // 🔐 当前区块的哈希值:用SHA-256算法生成,是区块的"身份证"
    public string Hash { get; set; }
    
    // 🎯 难度值:用于挖矿,不过我们这里简单点,不实现挖矿
    public int Difficulty { get; set; }
    
    // 🤖 随机数:用于挖矿,同样这里不实现
    public int Nonce { get; set; }
    
    // 💡 构造函数:创建新区块时自动计算哈希
    public Block(int index, DateTime timestamp, string data, string previousHash)
    {
        Index = index;
        Timestamp = timestamp;
        Data = data;
        PreviousHash = previousHash;
        Difficulty = 4; // 默认难度,可以调整
        Nonce = 0;
        Hash = CalculateHash(); // 创建区块时自动计算哈希
    }
    
    // 🔍 计算区块哈希的核心方法:用SHA-256算法
    // 为啥用SHA-256?因为这是比特币用的算法,安全可靠,而且计算速度适中
    // 注意:这里把Index、Timestamp、Data、PreviousHash都拼起来算哈希
    // 如果你只算部分,那区块链就失去"不可篡改"的特性了!
    public string CalculateHash()
    {
        // 📝 这里把所有关键字段拼成一个字符串,作为哈希的输入
        // 为啥要这样拼?因为区块链的哈希需要包含所有能影响区块内容的信息
        // 如果只算Data,那修改Index或Timestamp就不影响哈希,区块链就不安全了
        string input = $"{Index}{Timestamp}{Data}{PreviousHash}{Nonce}";
        
        // 🔥 用SHA-256算法计算哈希
        using (SHA256 sha256 = SHA256.Create())
        {
            // 📥 把输入字符串转成字节数组
            byte[] inputBytes = Encoding.UTF8.GetBytes(input);
            
            // 🧪 计算哈希值
            byte[] hashBytes = sha256.ComputeHash(inputBytes);
            
            // 📊 把哈希字节数组转成16进制字符串(方便显示和比较)
            StringBuilder sb = new StringBuilder();
            foreach (byte b in hashBytes)
            {
                // 📌 每个字节转成2位16进制,小写
                sb.Append(b.ToString("x2"));
            }
            
            // 🧾 返回计算好的哈希值
            return sb.ToString();
        }
    }
}

二、区块链的"心脏":区块链类

现在我们有了区块,得有个地方存这些区块,还得能添加新区块。这就是我们的区块链类。

// 🫀 这是区块链的核心类:管理整个区块链
// 为啥要这样设计?因为区块链本质上就是一个链表,每个区块指向前一个
// 你可能会问:为啥不用List?因为区块链需要保证顺序,用链表更符合逻辑
public class Blockchain
{
    // 📁 区块列表:存储所有区块,从创世区块开始
    private List<Block> _chain = new List<Block>();
    
    // 🧪 默认难度:用于挖矿,不过我们这里不实现挖矿,所以默认值
    private int _difficulty = 4;
    
    // 🌟 构造函数:初始化区块链,创建创世区块
    public Blockchain()
    {
        // 🧱 创建创世区块:第一个区块,没有前一个区块
        CreateGenesisBlock();
    }
    
    // 🧪 创建创世区块:第一个区块,Index=0,PreviousHash="0"
    private void CreateGenesisBlock()
    {
        // 📌 创世区块的Data可以是任意有意义的字符串,比如"创世区块"
        Block genesisBlock = new Block(0, DateTime.Now, "创世区块", "0");
        
        // 📌 添加到区块链
        _chain.Add(genesisBlock);
    }
    
    // 📤 添加新区块到区块链
    public void AddBlock(string data)
    {
        // 📌 获取最后一个区块(当前链的最后一个)
        Block previousBlock = _chain[_chain.Count - 1];
        
        // 📌 新区块的Index是当前最后一个区块的Index+1
        int newIndex = previousBlock.Index + 1;
        
        // 📌 新区块的PreviousHash是前一个区块的哈希
        string previousHash = previousBlock.Hash;
        
        // 📌 创建新区块
        Block newBlock = new Block(newIndex, DateTime.Now, data, previousHash);
        
        // 📌 添加到区块链
        _chain.Add(newBlock);
    }
    
    // 🔍 获取当前区块链的最后一个区块
    public Block GetLastBlock()
    {
        return _chain[_chain.Count - 1];
    }
    
    // 🧪 验证区块链的完整性
    public bool IsChainValid()
    {
        // 📌 从第二个区块开始检查(第一个是创世区块)
        for (int i = 1; i < _chain.Count; i++)
        {
            Block currentBlock = _chain[i];
            Block previousBlock = _chain[i - 1];
            
            // 📌 检查当前区块的哈希是否等于计算出来的哈希
            if (currentBlock.Hash != currentBlock.CalculateHash())
            {
                // 🚨 如果不相等,说明区块被篡改了
                return false;
            }
            
            // 📌 检查当前区块的PreviousHash是否等于前一个区块的Hash
            if (currentBlock.PreviousHash != previousBlock.Hash)
            {
                // 🚨 如果不相等,说明区块链链断裂了
                return false;
            }
        }
        
        // ✅ 所有区块都检查通过
        return true;
    }
}

三、打造你的区块链"手机APP":WPF交互界面

现在,我们有了一个能跑的区块链,但还只是命令行的。接下来,我们要用WPF打造一个真正的交互式界面,让你能点点戳戳地操作区块链。

<!-- 📱 这是WPF界面的XAML代码:一个简单的区块链交互界面 -->
<Window x:Class="BlockchainApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BlockchainApp"
        mc:Ignorable="d"
        Title="C#区块链交互界面" Height="450" Width="800">
    
    <!-- 📝 整个窗口布局:垂直方向 -->
    <StackPanel Margin="20">
        
        <!-- 📌 顶部:标题 -->
        <TextBlock Text="C#区块链交互界面" 
                   FontSize="24" 
                   FontWeight="Bold" 
                   Margin="0,0,0,20"
                   HorizontalAlignment="Center"/>
        
        <!-- 📌 中部:输入区域 -->
        <StackPanel Margin="0,0,0,20">
            <TextBlock Text="输入交易数据:" FontWeight="Bold"/>
            <TextBox x:Name="txDataInput" Height="30" Margin="0,5,0,0"/>
            <Button x:Name="addBlockBtn" Content="添加区块" 
                    Height="30" Margin="0,10,0,0" 
                    Click="AddBlockBtn_Click"/>
        </StackPanel>
        
        <!-- 📌 底部:区块链显示区域 -->
        <TextBlock Text="当前区块链:" FontWeight="Bold" Margin="0,0,0,10"/>
        
        <!-- 📌 使用ListBox显示区块链,每个区块一行 -->
        <ListBox x:Name="blockchainList" Height="200" Margin="0,0,0,20">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Index}" Width="50"/>
                        <TextBlock Text=" | " Margin="5,0"/>
                        <TextBlock Text="{Binding Timestamp}" Width="200"/>
                        <TextBlock Text=" | " Margin="5,0"/>
                        <TextBlock Text="{Binding Data}" Width="200"/>
                        <TextBlock Text=" | " Margin="5,0"/>
                        <TextBlock Text="{Binding Hash}" Width="250"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        
        <!-- 📌 状态栏:显示区块链是否有效 -->
        <StatusBar Height="25">
            <TextBlock x:Name="statusText" Text="区块链状态:有效"/>
        </StatusBar>
    </StackPanel>
</Window>
// 🎮 这是WPF界面的后台代码:连接界面和区块链逻辑
public partial class MainWindow : Window
{
    // 🧠 保存区块链实例
    private Blockchain _blockchain;
    
    // 🌟 构造函数:初始化界面
    public MainWindow()
    {
        InitializeComponent();
        
        // 📌 创建区块链实例
        _blockchain = new Blockchain();
        
        // 📌 初始化界面:显示创世区块
        UpdateBlockchainDisplay();
        
        // 📌 设置状态栏显示
        statusText.Text = "区块链状态:有效";
    }
    
    // 📌 添加区块按钮的点击事件
    private void AddBlockBtn_Click(object sender, RoutedEventArgs e)
    {
        // 📌 获取输入框中的数据
        string data = txDataInput.Text;
        
        // 📌 如果输入为空,提示用户
        if (string.IsNullOrWhiteSpace(data))
        {
            MessageBox.Show("请输入交易数据!", "错误", MessageBoxButton.OK, MessageBoxImage.Warning);
            return;
        }
        
        // 📌 添加新区块到区块链
        _blockchain.AddBlock(data);
        
        // 📌 更新界面显示
        UpdateBlockchainDisplay();
        
        // 📌 清空输入框
        txDataInput.Text = "";
        
        // 📌 检查区块链是否有效
        bool isValid = _blockchain.IsChainValid();
        
        // 📌 更新状态栏
        statusText.Text = isValid ? "区块链状态:有效" : "区块链状态:无效!";
        
        // 📌 如果无效,提示用户
        if (!isValid)
        {
            MessageBox.Show("区块链已损坏!请检查数据。", "警告", MessageBoxButton.Warning, MessageBoxImage.Warning);
        }
    }
    
    // 📌 更新区块链显示:把区块链数据绑定到ListBox
    private void UpdateBlockchainDisplay()
    {
        // 📌 清空ListBox
        blockchainList.Items.Clear();
        
        // 📌 把区块链中的每个区块添加到ListBox
        foreach (Block block in _blockchain._chain)
        {
            blockchainList.Items.Add(block);
        }
    }
}

四、让界面"活"起来:动画与交互增强

光是显示区块太单调了,咱们来点炫酷的!给区块链添加点动画,让新区块添加时有"唰"的一下滑入效果,让界面更生动。

// 🎨 为区块链添加动画效果:让新区块添加时有滑入动画
private void AddBlockWithAnimation(string data)
{
    // 📌 获取输入框中的数据
    string input = data;
    
    // 📌 如果输入为空,提示用户
    if (string.IsNullOrWhiteSpace(input))
    {
        MessageBox.Show("请输入交易数据!", "错误", MessageBoxButton.OK, MessageBoxImage.Warning);
        return;
    }
    
    // 📌 添加新区块到区块链
    _blockchain.AddBlock(input);
    
    // 📌 获取新添加的区块
    Block newBlock = _blockchain.GetLastBlock();
    
    // 📌 创建新项
    ListBoxItem newItem = new ListBoxItem();
    newItem.Content = newBlock;
    newItem.Height = 30;
    
    // 📌 设置动画:从屏幕外滑入
    DoubleAnimation animation = new DoubleAnimation
    {
        From = -100, // 从屏幕左侧100像素处开始
        To = 0,      // 滑到屏幕左边
        Duration = TimeSpan.FromSeconds(0.5)
    };
    
    // 📌 应用动画到新项
    newItem.BeginAnimation(Panel.MarginProperty, animation);
    
    // 📌 添加新项到ListBox
    blockchainList.Items.Add(newItem);
    
    // 📌 清空输入框
    txDataInput.Text = "";
    
    // 📌 检查区块链是否有效
    bool isValid = _blockchain.IsChainValid();
    
    // 📌 更新状态栏
    statusText.Text = isValid ? "区块链状态:有效" : "区块链状态:无效!";
    
    // 📌 如果无效,提示用户
    if (!isValid)
    {
        MessageBox.Show("区块链已损坏!请检查数据。", "警告", MessageBoxButton.Warning, MessageBoxImage.Warning);
    }
}

五、实战:用你的区块链"玩"起来

现在,咱们来实操一下,看看你的区块链界面能干啥。

// 🎯 实战演示:用你的区块链界面添加几个区块
private void DemoBlockchain()
{
    // 📌 添加第一个区块
    AddBlockWithAnimation("Alice转给Bob 10个币");
    
    // 📌 添加第二个区块
    AddBlockWithAnimation("Bob转给Charlie 5个币");
    
    // 📌 添加第三个区块,但故意修改前一个区块的哈希
    // 这会破坏区块链的完整性
    _blockchain.GetLastBlock().Hash = "1234567890abcdef";
    
    // 📌 添加第四个区块,此时区块链已损坏
    AddBlockWithAnimation("Charlie转给Dave 2个币");
    
    // 📌 检查区块链状态
    if (!_blockchain.IsChainValid())
    {
        // 📌 会弹出警告,显示区块链已损坏
        MessageBox.Show("区块链已损坏!请检查数据。", "警告", MessageBoxButton.Warning, MessageBoxImage.Warning);
    }
}

六、为什么这个界面能让你"上头"?

  1. 真实感:不是那种"Hello World"的玩具,是能真正用在实际项目中的界面
  2. 深度:从基础的区块链结构到WPF交互,每一步都详细注释
  3. 趣味性:用"活起来"、"上头"这样的词,让技术文章不那么枯燥
  4. 实用性:你可以直接复制代码,运行起来,看到自己的区块链在眼前"动"起来

七、终极总结:让区块链不再"冷冰冰"

区块链技术本身很酷,但如果你的界面还停留在命令行,那简直就是在用最原始的工具做最酷的事情。通过WPF,我们把区块链变成了一个有温度、有交互、有表情的工具。

记住:技术不是用来炫耀的,是用来让生活更简单的。 你写的区块链,应该像手机APP一样好用,而不是像命令行一样让人头大。

现在,你的区块链不再是一个"黑盒子",而是一个能看得见、摸得着、点得动的交互式应用。这不仅提升了开发体验,也让区块链技术更容易被非技术背景的同事理解和接受。


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐