区块链模型原理入门学习1——简易模型

news/2025/2/22 6:22:03/文章来源:https://www.cnblogs.com/moegarn/p/18730512

  最近抽空学习一下区块链的设计原理,正在搭建一个非常简易的模型,上生产的模型肯定复杂的多,不过学习还是由简入难,逐步深入才行,一口吃不成胖子。

  我使用的是C#编写的。

 

  区块链的特点:

  1.分布式记账,去中心化。

  2.挖矿是按照平台规则通过大量计算对于平台算式反向求解的过程。

  当前,个人对于区块链的认识:区块链是一条链Chain,这条脸上有若干个数据块Block,每个Block里面都封装了三个部分:上一个块的哈希值PreHash、数据Data、当前块的哈希值ThisHash。

 

  计算哈希值使用Hash256计算,其特点:

  1.不同长度的数据经过计算可得定长的字符串。

  2.相同数据可以获得相同的Hash值,修改一个一个字符,Hash将大不相同,毫无规律可言,保证暂时的安全性(严谨地说)

 

  测试代码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Security.Cryptography;
  4 using System.Text;
  5 
  6 namespace TestPrj
  7 {
  8     class Program
  9     {
 10         static void Main(string[] args)
 11         {
 12             Chain chain = new Chain();
 13 
 14             Block block1 = new Block("转账10元");
 15             chain.AddNewBlock(block1);
 16             Block block2 = new Block("转账30元");
 17             chain.AddNewBlock(block2);
 18 
 19 
 20             //查看当前数据链总共数据快数
 21             chain.ViewBlockCount();
 22 
 23             //查看所有数据链
 24             chain.ViewAllBlocks();
 25 
 26             //验证数据链
 27             Console.WriteLine(chain.Validate());
 28 
 29             //模拟篡改数据
 30             chain.Blocks[1].Prehash = "";
 31 
 32             //验证数据链
 33             Console.WriteLine(chain.Validate());
 34         }
 35     }
 36 }
 37 
 38 //数据块
 39 public class Block
 40 {
 41     //数据
 42     private string data;
 43     //前一个Block的hash
 44     private string prehash;
 45     //当前Block的hash
 46     private string curhash;
 47     public Block(string data)
 48     {
 49         this.prehash = "";
 50         this.data = data;
 51         this.curhash = "";
 52     }
 53 
 54     //注意:这里为了模拟篡改数据专门封装的字段
 55     public string Data { get => data; set => data = value; }
 56     public string Prehash { get => prehash; set => prehash = value; }
 57     public string Curhash { get => curhash; set => curhash = value; }
 58 
 59     //计算当前Block的Hash
 60     public string ComputeHash(string prehash)
 61     {
 62         this.prehash = prehash;
 63         return SHA256(this.data + this.prehash);
 64     }
 65 
 66     //Hash256计算
 67     public string SHA256(string str)
 68     {
 69         //如果str有中文,不同Encoding的sha是不同的!!
 70         byte[] SHA256Data = Encoding.UTF8.GetBytes(str);
 71 
 72         SHA256Managed Sha256 = new SHA256Managed();
 73         byte[] by = Sha256.ComputeHash(SHA256Data);
 74 
 75         return BitConverter.ToString(by).Replace("-", "").ToLower();
 76     }
 77 
 78     //显示Block数据
 79     public void ViewInfo()
 80     {
 81         Console.WriteLine("====");
 82         Console.WriteLine("[prehash]->" + this.prehash);
 83         Console.WriteLine("[data]->" + this.data);
 84         Console.WriteLine("[hash]->" + this.curhash);
 85     }
 86 }
 87 
 88 public class Chain
 89 {
 90     private List<Block> blocks;
 91 
 92     public List<Block> Blocks { get => blocks; set => blocks = value; }
 93 
 94     public Chain()
 95     {
 96         this.blocks = new List<Block>();
 97         Block genesisBloc = new Block("源数据块");
 98         genesisBloc.Curhash = genesisBloc.ComputeHash("genesis");
 99         AddNewBlock(genesisBloc);
100     }
101 
102     public void ViewBlockCount()
103     {
104         Console.WriteLine("当前数据块总数->" + this.blocks.Count);
105     }
106 
107     //添加Block
108     public void AddNewBlock(Block newblock)
109     {
110         //空链的情况
111         if (this.blocks.Count == 0)
112         {
113             this.blocks.Add(newblock);
114             newblock.Curhash = newblock.ComputeHash(newblock.Prehash);
115             return;
116         }
117         /*链接新Block*/
118         //新的Block的prehash是上一个block的curhash
119         newblock.Prehash = this.blocks[this.blocks.Count - 1].Curhash;
120         newblock.Curhash = newblock.ComputeHash(newblock.Prehash);
121         /*添加新Block*/
122         this.blocks.Add(newblock);
123     }
124 
125     //查看所有Block
126     public void ViewAllBlocks()
127     {
128         foreach (var item in this.blocks)
129         {
130             item.ViewInfo();
131         }
132     }
133 
134     //验证Chain
135     public bool Validate()
136     {
137         //无任何数据块的情况
138         if (this.blocks.Count == 0)
139         {
140             Console.WriteLine("[数据链异常]->数据链为空!");
141             return false;
142         }
143         //只有源数据块的情况
144         else if (this.blocks.Count == 1)
145         {
146             Console.WriteLine("验证完毕!");
147             return true;
148         }
149 
150         //遍历校验标志
151         bool checkBlockSign = true;
152 
153         //遍历检查数据块,因为不检查源数据块,下标从1开始
154         for (int checkBlockIndex = 1; checkBlockIndex < this.blocks.Count; checkBlockIndex++)
155         {
156             //检验curhash
157             var checkBlock = this.blocks[checkBlockIndex];
158             if (checkBlock.Curhash != checkBlock.ComputeHash(checkBlock.Prehash))
159             {
160                 Console.WriteLine("[数据被篡改]->" + checkBlockIndex);
161                 checkBlockSign = false;
162                 break;
163             }
164             /*            //验证prehash
165                         if (checkBlock.Prehash != this.blocks[checkBlockIndex - 1].Curhash)
166                         {
167                             Console.WriteLine("[数据链断裂]->" + checkBlockIndex);
168                             checkBlockSign = false;
169                             break;
170                         }*/
171         }
172         Console.WriteLine("验证完毕!");
173         return checkBlockSign;
174     }
175 }

 

  代码运行:

  到这里,区块链的基础构建完成了。

  因为当前模型的数据结构构建真的不复杂,所以省略了代码构建的分析过程。

【学习是人类进步的阶梯】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887894.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python小技巧 收集

2的三次方:2**37除以3的整数商:7//3

VUE3 + Vite 编译部署后不报错,但显示空白页面

1、在 vite.config.js 中添加(ts版本则为 vite.config.ts)base: ./ 2、将路由模式改为 hash 模式history: createWebHashHistory() 3、注意检查路由文件需要由函数导入 (我的是未使用箭头函数导入,本地运行正常,但部署后无法正确加载路由,也不报错,找死人。。。)

今日排错

上图错误的解决办法:application.yml中的mybatis plus配置中去掉configlocation即可。

开源一款串口舵机驱动扩展板-FreakStudio多米诺系列

总线舵机扩展板通过UART接口控制多个舵机,支持堆叠级联,最多连接4个扩展板。具备小尺寸设计、供电保护、全双工转半双工通信、稳定供电等特点,适用于多舵机控制系统。原文链接: FreakStudio的博客 摘要 总线舵机扩展板通过UART接口控制多个舵机,支持堆叠级联,最多连接4个…

Radialix 汉化

配置属性如下直接翻译文本即可留待后查,同时方便他人 联系我:renhanlinbsl@163.com

pycharm激活码免费分享2025最新

申明:本教程 Pycharm 破解补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 !PS: 本教程最新更新时间: 2025年2月1日~前言 笔者几乎试了网上几乎所有的 Pycharm 破解方案,废了好大气力,汇总了目前网上比较靠…

2025牛客寒假算法基础集训营第二场补题

H-一起画很大的圆 原题:H-一起画很大的圆 题意 给定一个矩形区域,在矩形的边界上找到 3 个整数点,使得过这 3 个点画出的圆面积最大,输出这三个点的坐标。 思路 三个不共线的点确定一个圆。 如果这三个点越接近一条直线,这个圆最大。 要使得圆尽可能大,那么这三个点尽量趋…

Level-729-易画行-复现

hgame 易画行复现此题是为了让⼤家稍微了解⼀下区块链。需要的知识是区块链的⼀些基本知识和ipfs的⼀些知识。这道题确实不难,可惜我没有认真学Blockchain,做这个题也没有投入精力,只是看了看,赛后9CVoid师傅给我写了一份解析,在此致谢! 题目给了一个Typescript文件 impo…

Python实现URL自动转二维码的高效方法

Python实现URL自动转二维码的高效方法 安装包依赖 pip install qrcode pip install pillow程序 import qrcode data = "https://www.cnblogs.com/tianwuyvlianshui/"#网址 img = qrcode.make(data) img.save("blogs.png")#生成图片命名运行后将在工程文件夹…

百万架构师第四十二课:Nginx:Nginx 的初步认识|JavaGuide

百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 公众号:不止极客 Nginx 的初步认识及配置 课程目标Nginx 在分布式架构中的应用分析 常用的 Web 服务器及差异 Nginx 的安装以及配置分析 Nginx 虚拟主机配置 详解 Location 的匹配规则背景 早期用 F5 做负载…

清华大学第5弹: 《DeepSeek与AI幻觉》 - 清华大学DeepSeek全套资料完整版 - 持续更新 - PDF免费下载

《DeepSeek与AI幻觉》报告探讨了AI幻觉的成因、评测方法及其影响,并以DeepSeek模型为例,分析数据偏差、知识固化等问题如何导致幻觉现象。报告还提出缓解策略,如联网搜索、提示词优化,并探讨AI幻觉在科学创新和艺术创作中的潜在价值。由清华大学新闻与传播学院与人工智能学…

win系统查看wife连接密码

win系统查看wife连接密码 1、win+R ,打开cmd 2、查看本机连过的WiFi名 netsh wlan show profiles3、获取WIFI密码 netsh wlan show profiles “WIFI名” key=clear密码如下