档案系统区块链集成 leveldb.net集成

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;

posted @ 2023-02-20 13:38  zwbsoft  阅读(35)  评论(0编辑  收藏  举报