Exemple #1
0
 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);
                }
            }
        }
Exemple #3
0
        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.");
                }
            }
        }
Exemple #4
0
        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);
        }