首页 > 其他分享 >leveldb.net区块链技术

leveldb.net区块链技术

时间:2023-02-20 13:58:35浏览次数:48  
标签:leveldb return db key new net 区块 block

leveldb.net工作原理:leveldb为键值对数据库,具有增加,删除,查询功能,利用加密链式结构存储和查询数据。

区块(block):在区块链技术中,数据以电子记录的形式被永久储存下来,存放这些电子记录的文件我们就称之为“区块(block)”。区块是按时间顺序一个一个先后生成的,每一个区块记录下它在被创建期间发生的所有价值交换活动,所有区块汇总起来形成一个记录合集。 

区块结构有两个非常重要的特点:第一,每一个区块上记录的是上一个区块形成之后、该区块被创建前发生的所有活动,这个特点保证了数据库的完整性。第二,在绝大多数情况下,一旦新区块完成后被加入到区块链的最后,则此区块的数据记录就再也不能改变或删除。这个特点保证了数据库的严谨性,即无法被篡改。

区块+链=时间戳,这是区块链数据库的最大创新点。区块链数据库让全网的记录者在每一个区块中都盖上一个时间戳来记账,表示这个信息是这个时间写入的,形成了一个不可篡改、不可伪造的数据库 。

详细开发代码:

1.创建block结构体

public struct Block(

{

  public int Index{get;set;}  //区块ID

  public string TimeStamp{get;set;}//时间戳

  public string BPM{get;set;}//实际存储内容

  public string Hash{get;set;}//sha256哈希值

  public string PrevHash{get;set;}//前一个区块的sha256哈希值

}

2.生成时间戳 CalculateCUrrentTimeUTC

DateTime startTime = new DateTime(1970,1,1,0,0,0,0);

DateTime nowTime = DateTime.Now;

long unixTiem = (long)Math.Round((nowTime -startTime).TotalMilliseconds,MidpointRounding.AwayFromZero);

return unixTiem;

3.计算区块hash值 CalculateHash(Block block)

string calculationStr = $"{block.Index}{block.TimeStamp}{block.BPM}{block.PrevHash}";

SHA256 sha256Generator = SHA256.Create();

byte[] sha256hashBytes = sha256Generator.ComputeHash(Encoding.UTF8.GetBytes(calculationStr));

StringBuilder sha256StrBuider = new StringBuilder();

foreach(byte @byte in sha256hashBytes)

{

  sha256StrBuider.Append(@byte.Tostring("x2"));

}

return sha256StrBuider.Tosring();

4.检验区块是否有效1index是否递增,2.hash是否正确,3.prehash与旧的区块hash是否匹配 IsBlockValid(Block oldblock,Block newBlock)

if(oldblock.Index + 1 != newBlock.Index)

  return false;

if(oldBlock.Hash != newBlock.PrevHash)

  return false;

if(CalculateHash(newBlock) != newBlock.Hash)

  return false;

return true;

5.生成新的区块GenerateBlock(string oldBlockHash,string BPM,int key)

Block newBlock = new Block()

{

  Index = key,

  TimeStamp = CalculateCurrentTimeUTC(),

  BPM = BPM,

  PrevHash = oldBlockHash

}

newBlock.Hash = CalculateHash(newBlock);

6.leveldb写入WriteDate(string value)

var db = LevelDB.DB.Open("D:\\wenjianjia",new Options{CreateIfMissing = true});

var oldblock = "";

int count = int.Parse(GetDataCount(db).ToString());

int key = count + 1

if(key > 1)

{

  oldblock = GetFirstValue(db,count);

}

else

{

  key = 1;

}

Block block = GenerateBlock(oldblcok,value,key);

db.Put(new WriteOptions(),key,block.Hash);

db.Dispose();

return  block;

7.leveldb查询GetFirstValue(DB db,int key)

string val = db.Get(new ReadOptions(),key).ToString();

return val;

8.leveldb删除DelDataWithKey(int key)

var db = LevelDB.DB.Open("D:\\文件夹",new Options{CreateIfMissing = true});

db.Delete(new WriteOptions(){Sync = true},key);

db.Dispose();

9.统计长度GetDataCount(DB db)

long dataCount  = 0;

Iterator iterator = db.NewIterator(new ReadOptions());

iterator.SeeToFirst();

while(iterator.Valid())

{

  datacount++;

  byte[] valBytes = Convert.FromBase64String(iteartor.Value().Tostring());

  iteartor,Next();

}

return dataCount;

10.统计大小GetDataSize(DB db)]

long dataSize  = 0;

Iterator iterator = db.NewIterator(new ReadOptions());

iterator.SeeToFirst();

while(iterator.Valid())

{

  byte[] valBytes = Convert.FromBase64String(iteartor.Value().Tostring());

  dataSize += valBytes.length

  iteartor,Next();

}

return dataSize;

标签:leveldb,return,db,key,new,net,区块,block
From: https://www.cnblogs.com/Net191111/p/17136808.html

相关文章

  • 档案系统leveldb.net集成
    leveldb.net工作原理:leveldb为键值对数据库,具有增加,删除,查询功能,利用加密链式结构存储和查询数据。区块(block):在区块链技术中,数据以电子记录的形式被永久储存下来,存放这些......
  • 5900系列和TG-NET系列等交换机恢复出厂教程
    在串口下使用命令恢复出厂设置:通过Console线连接交换机并加电,超级终端CRT/PuTTY(波特率9600或者115200)显示如下 当启动到这里的时候按Ctrl+p(不停的按)  这时进入......
  • c#和.net 初见学习笔记(1)
    c#和.net背景介绍之类的就不再重复了,本次随笔记录从零开始学习c#和.net,有过java和python基础版本.net6、visualstudio2022接口和路由个人习惯,学习时先看项目代码,看......
  • 基于minikube快速搭建kubernetes单节点环境
    一、说明本文主要介绍在Centos7环境下基于Minikube来快速部署Kubernetes单节点集群环境,并在浏览器上访问部署在k8s上的dashboard服务。 二、Minikube介绍......
  • python基于telnet验证的交换机配置导出打包脚本
    前置条件python3.10需要在配置文件输入的主机上起一个tftp服务交换这里是锐捷交换机这里的认证协议是telnet需要准备一个交换机IP地址的文件供脚本读取代码部分im......
  • Visual Sudio 2022 为什么安装 2.2 .net SDK、3.1 .netSDK 找不到目标文件
     下面是对VisualStudio2022编译器的讲解  下载SDK链接https://dotnet.microsoft.com/zh-cn/download/visual-studio-sdks?cid=getdotnetsdk 打开这个链接,对应......
  • NET MVC接口服务如何运行在容器中
    有些公司内部存在一些NET项目,而公司服务器后期都换成了Linux,若单纯为这一个项目占用一台Windows服务器显得极其浪费,因此需要将NET项目嵌入到Linux服务器中,为了后期方便......
  • 【译】.NET 7 中的性能改进(一)
    原文|StephenToub翻译|郑子铭一年前,我发布了.NET6中的性能改进,紧接着是.NET5、.NETCore3.0、.NETCore2.1和.NETCore2.0的类似帖子。我喜欢写这些帖子,也喜......
  • .NET Core中批量注册上下文
    1.定义一个静态类HostBuilderExtend作为扩展1publicstaticclassHostBuilderExtend2{3publicstaticvoidRegister(thisWebApplicationBuilder......
  • 关于CMCC连接后显示无Internet解决方法
    (1)(2)(3) ......