档案系统区块链集成 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;
最新文章
- python中文字符乱码(GB2312,GBK,GB18030相关的问题)
- android ListView中button点击事件盖掉onItemClick解决办法
- Module模式 - 深入了解Javascript
- ansible安装(批量执行命令
- Python根据上下限生成不重复随机数
- _Obj* __STL_VOLATILE* __my_free_list
- (二)原生JS实现 - 事件类方法
- POJ 2337 输出欧拉路径
- Day2 python基础学习
- 前端页面中如何在窗口缩放时让两个div始终在同一行显示
- iOS pch文件创建使用,和info.plis文件路径改变,路径的设置
- usb输入子系统写程序(三)
- windows版influxDB安装与配置
- c++ 集合的增删改查,与两集合的合并 缺陷(空间大小不灵活)
- Mysql 分组选择
- postgis创建空间数据库,导入shp数据
- hdu1878-并查集,欧拉回路
- 微信小程序制作家庭记账本之三
- ssh-key的复制
- (转)C++头文件顺序
热门文章
- [OpenCV实战]27 在OpenCV下使用forEach进行并行像素访问
- RocketMQ Compaction Topic的设计与实现
- Shell 基本常识
- SSM框架——Spring
- MySQL优化四,高性能优化
- Echarts自适应屏幕,无需刷新网页,可根据屏幕大小完美展现,内有详细代码注释,我可真是个小机灵~~O(∩_∩)O哈哈~
- Java 进阶P-4.8+P-4.9
- Sublime下运行javascript,并带彩色提示
- Flutter入门资料推荐
- ubuntu下yaml-cpp安装与使用