static void test_db_enumblock(string[] words) { try { Console.WriteLine("test_db_enumblock"); using (var snap = db.UseSnapShot()) { Console.WriteLine("now snap height=" + snap.DataHeight); var keyfinder = snap.CreateKeyFinder(LightDB.systemtable_block); foreach (byte[] key in keyfinder) { var longkey = BitConverter.ToUInt64(key); Console.WriteLine("got a key:" + longkey); var data = snap.GetValue(LightDB.systemtable_block, key); var task = WriteTask.FromRaw(data.value); Console.WriteLine(" task count=" + task.items.Count); foreach (var item in task.items) { Console.WriteLine(" item:" + item.op + ":" + item.key.Length + "," + item.value.Length); } } } } catch (Exception err) { Console.WriteLine("error:" + err.Message); } }
static void DBGetBlock(string[] words) { UInt64 blockid = UInt64.Parse(words[1]); var msg = client.Post_snapshot_getblock(lastSnapheight.Value, blockid); //var msg = client.Post_snapshot_getvalue(lastSnapheight.Value, protocol_Helper.systemtable_block, BitConverter.GetBytes(blockid)); var v = DBValue.FromRaw(msg.data); var task = WriteTask.FromRaw(v.value); Console.WriteLine("got info=" + msg.ToString()); foreach (var i in task.items) { Console.WriteLine("item=" + i.ToString()); } if (task.extData != null) { foreach (var e in task.extData) { Console.WriteLine("extdata=" + e.Key + " len=" + e.Value.Length); } } }
static void ShowDBBlock(string[] words) { uint blockid = uint.Parse(words[1]); using (var snap = storage.maindb.UseSnapShot()) { var blockiddata = BitConverter.GetBytes((UInt64)blockid); var blockhash = snap.GetValue(StorageService.tableID_BlockID2Hash, blockiddata).value.ToString_Hex(); Console.WriteLine("block:" + blockid + " hash=" + blockhash); var value = snap.GetValue(LightDB.systemtable_block, blockiddata); if (value != null && value.type != DBValue.Type.Deleted) { var task = WriteTask.FromRaw(value.value); Console.WriteLine("block:" + blockid + " len=" + value.value.Length); Console.WriteLine("==blockitems=="); foreach (var i in task.items) { Console.WriteLine(i.ToString()); } if (task.extData != null) { Console.WriteLine("==blockext=="); foreach (var i in task.extData) { Console.WriteLine(i.Key + "=" + i.Value?.ToString_Hex()); } } } else { Console.WriteLine("block:" + blockid + " not exist."); } } }
public async Task OnDB_Write(NetMessage msgRecv, byte[] id) { var msg = NetMessage.Create("_db.write.back"); msg.Params["_id"] = id; try { var data = msgRecv.Params["taskdata"]; var signdata = msgRecv.Params["signdata"]; var writetask = WriteTask.FromRaw(data); if (writetask.extData?.ContainsKey("lasthash") == true) { var lastblockhashRecv = writetask.extData["lasthash"]; lock (dblock) { using (var snap = Program.storage.maindb.UseSnapShot()) { var blockidlast = BitConverter.GetBytes((UInt64)(snap.DataHeight - 1)); byte[] taskhash = Helper.CalcHash256(data);//.Sha256.ComputeHash(data); //不够用,还需要block高度 var lasthashFind = snap.GetValue(StorageService.tableID_BlockID2Hash, blockidlast).value; if (Helper.BytesEquals(lastblockhashRecv, lasthashFind)) { //数据追加处理 Action <WriteTask, byte[], IWriteBatch> afterparser = (_task, _data, _wb) => { if (_wb.snapshot.DataHeight != snap.DataHeight) { throw new Exception("sync problem,diff snap found."); } _wb.Put(StorageService.tableID_BlockID2Hash, snap.DataHeightBuf, DBValue.FromValue(DBValue.Type.Bytes, taskhash)); }; //写入数据 Program.storage.maindb.Write(writetask, afterparser); //进表 msg.Params["blockid"] = snap.DataHeightBuf; msg.Params["blockhash"] = taskhash; } else { msg.Params["_error"] = "block hash is error".ToBytes_UTF8Encode(); } } } } else { msg.Params["_error"] = "no last block hash.".ToBytes_UTF8Encode(); } } catch (Exception err) { msg.Params["_error"] = err.Message.ToBytes_UTF8Encode(); } //这个完全可以不要等待呀 SendToClient(msg); }