public async void Run() { //Entity.Root.GetComponent<LevelDBStore>().Undo(100); await Task.Delay(3000); long.TryParse(levelDBStore.Get("UndoHeight"), out height); Log.Debug($"Rule.Run at height {height}"); Wallet wallet = Wallet.GetWallet(); P2P_NewBlock p2p_NewBlock = new P2P_NewBlock(); Block blk = null; Block preblk = null; TimePass timePass = new TimePass(1); var httpRule = Entity.Root.GetComponent <HttpPool>(); state = 0xff; while (true) { try { if (state < 0xff) { await Task.Delay(1000); } long time = (nodeManager.GetNodeTime() / 1000) % pooltime; if (blk == null && time < broadcasttime && timePass.IsPassSet()) { // 找到最新的Mc块 preblk = GetLastMcBlock(); // 是否在裁决节点列表中 if (consensus.IsRule(preblk.height + 1, wallet.GetCurWallet().ToAddress())) { // 生成主块 blk = CreateBlock(preblk); diff_max = 0; hashmining = blk.ToHashMining(); httpRule?.SetMinging(blk.height, hashmining, consensus.calculatePower.GetPower()); } else { long.TryParse(levelDBStore.Get("UndoHeight"), out height); await Task.Delay(1000); } } if (blk != null && httpRule == null) { // 挖矿 这里是提交算力 by sxh Mining(blk, hashmining); } // 广播块 if (blk != null && time >= broadcasttime) { if (httpRule != null) { Dictionary <string, MinerTask> miners = httpRule.GetMiner(blk.height); if (miners != null) { double diff = miners.Values.Max(t => t.diff); var miner = miners.Values.First(c => c.diff == diff); blk.random = miner.random; httpRule?.SetMinging(blk.height, "", consensus.calculatePower.GetPower()); } } height = blk.height; blk.hash = blk.ToHash(); blk.sign = blk.ToSign(Wallet.GetWallet().GetCurWallet()); blockMgr.AddBlock(blk); p2p_NewBlock.block = JsonHelper.ToJson(blk); p2p_NewBlock.ipEndPoint = networkInner.ipEndPoint.ToString(); nodeManager.Broadcast(p2p_NewBlock); diff_max = 0; Log.Debug($"Rule.Broadcast {blk.height} {blk.hash}"); calculatePower.Insert(blk); blk = null; hashmining = ""; } await Task.Delay(10); } catch (Exception) { await Task.Delay(1000); } } }
public Dictionary <string, BlockSub> MinerReward_PPLNS(bool saveDB = true) { var lastday = DateTime.Now.AddHours(-36).ToString("yyyy-MM-dd"); var today = DateTime.Now.ToString("yyyy-MM-dd"); long counted = 0; long minHeight = -1; long maxHeight = -1; using (DbSnapshot snapshot = PoolDBStore.GetSnapshot()) { string str_Counted = snapshot.Get("Pool_Counted"); long.TryParse(str_Counted, out counted); string str_MR = snapshot.Get($"Pool_MR_{str_Counted}"); MinerRewardDB minerRewardLast = null; if (!string.IsNullOrEmpty(str_MR)) { minerRewardLast = JsonHelper.FromJson <MinerRewardDB>(str_MR); } if (minerRewardLast == null) { snapshot.Add("Pool_Counted", "0"); var minerRewardNew = new MinerRewardDB(); minerRewardNew.counted = 0; minerRewardNew.minHeight = httpPool.height; minerRewardNew.maxHeight = httpPool.height; minerRewardNew.time = TimeHelper.time.ToString(); snapshot.Add($"Pool_MR_{0}", JsonHelper.ToJson(minerRewardNew)); snapshot.Commit(); return(null); } minHeight = minerRewardLast.maxHeight; string json = snapshot.Get("Pool_H_Miner"); if (!string.IsNullOrEmpty(json)) { long.TryParse(json, out maxHeight); } } if (maxHeight - minHeight < RewardInterval && saveDB) { return(null); } var minerTransfer = MinerReward_PPLNS(today, minHeight, maxHeight); if (saveDB) { using (DbSnapshot snapshot = PoolDBStore.GetSnapshot()) { foreach (var it in minerTransfer) { transferProcess.AddTransferHandle(it.Value.addressIn, it.Value.addressOut, it.Value.amount, it.Value.data); } counted += 1; snapshot.Add("Pool_Counted", counted.ToString()); var minerRewardNew = new MinerRewardDB(); minerRewardNew.counted = counted; minerRewardNew.minHeight = minHeight; minerRewardNew.maxHeight = maxHeight; minerRewardNew.time = DateTime.Now.Ticks.ToString(); snapshot.Add($"Pool_MR_{counted}", JsonHelper.ToJson(minerRewardNew)); snapshot.Add($"Pool_MT_{counted}", JsonHelper.ToJson(minerTransfer)); snapshot.Commit(); } transferProcess.SaveTransferToDB(); } return(minerTransfer); }
/// <summary> /// 调用处理方法 /// </summary> /// <param name="context"></param> private async ETTask InvokeHandler(HttpListenerContext context) { context.Response.StatusCode = 404; MethodInfo methodInfo = null; IHttpHandler httpHandler = null; string postbody = ""; switch (context.Request.HttpMethod) { case "GET": this.getHandlers.TryGetValue(context.Request.Url.AbsolutePath, out methodInfo); if (methodInfo != null) { this.handlersMapping.TryGetValue(methodInfo, out httpHandler); } break; case "POST": this.postHandlers.TryGetValue(context.Request.Url.AbsolutePath, out methodInfo); if (methodInfo != null) { this.handlersMapping.TryGetValue(methodInfo, out httpHandler); using (StreamReader sr = new StreamReader(context.Request.InputStream)) { postbody = sr.ReadToEnd(); } } break; default: context.Response.StatusCode = 405; break; } if (httpHandler != null) { object[] args = InjectParameters(context, methodInfo, postbody); // 自动把返回值,以json方式响应。 object resp = methodInfo.Invoke(httpHandler, args); object result = resp; if (resp is ETTask <HttpResult> t) { await t; result = t.GetType().GetProperty("Result").GetValue(t, null); } if (result != null) { using (StreamWriter sw = new StreamWriter(context.Response.OutputStream, Encoding.UTF8)) { if (result.GetType() == typeof(string)) { sw.Write(result.ToString()); } else { sw.Write(JsonHelper.ToJson(result)); } } } } }
// http://127.0.0.1:8088/mining?cmd=Submit public void OnSubmit(HttpMessage httpMessage) { // submit Dictionary <string, string> map = new Dictionary <string, string>(); try { map.Add("report", "refuse"); // 版本检查 string version = httpMessage.map["version"]; if (version != Miner.version) { map.Remove("report"); map.Add("report", "error"); map.Add("tips", $"Miner.version: {Miner.version}"); httpMessage.result = JsonHelper.ToJson(map); return; } // 矿池登记检查 if (Pool.registerPool && HttpPoolRelay.poolIpAddress.IndexOf(httpMessage.request.RemoteEndPoint.Address.ToString()) == -1) { map.Add("tips", "need register Pool"); httpMessage.result = JsonHelper.ToJson(map); return; } long minerHeight = long.Parse(httpMessage.map["height"]); string address = httpMessage.map["address"]; string number = httpMessage.map["number"]; MinerTask minerTask = GetMyTaskID(minerHeight, address, number, httpMessage.map["taskid"]); if (minerHeight == height && !string.IsNullOrEmpty(hashmining) && minerTask != null && TimeHelper.time - minerTask.time > 0.1) { minerTask.time = TimeHelper.time; string random = httpMessage.map["random"]; string hash = BlockDag.ToHash(height, hashmining, random); double diff = Helper.GetDiff(hash); double power = CalculatePower.Power(diff); if (power >= HttpPool.ignorePower && diff > minerTask.diff && !string.IsNullOrEmpty(random) && (Pool.registerPool || random.IndexOf(minerTask.taskid) == 0)) { ///Log.Info($"OnSubmit: Height:{height} A:{address} P:{power} H:{hash}"); minerTask.diff = diff; minerTask.random.Add(random); minerTask.power = power; minerTask.power_average = httpMessage.map["average"]; map.Remove("report"); map.Add("report", "accept"); } } if (minerHeight != height && !string.IsNullOrEmpty(hashmining)) { bool limitNewNext = true; // 矿池人数限制 if (!Miners.TryGetValue(height - 1, out Dictionary <string, MinerTask> list_1) || list_1.Count < minerLimit || list_1.TryGetValue($"{address}_{number}", out MinerTask temp)) { limitNewNext = false; } if (Miners.TryGetValue(height, out Dictionary <string, MinerTask> list_0) && list_0.Count >= minerLimit) { limitNewNext = true; } if (!limitNewNext) { MinerTask newMinerTask = NewNextTakID(height, address, number); // new task map.Add("height", height.ToString()); map.Add("hashmining", hashmining); map.Add("taskid", newMinerTask.taskid); map.Add("power", minerTask?.power.ToString()); map.Add("nodeTime", GetNodeTime().ToString()); if (newMinerTask.number != number) { map.Add("number", newMinerTask.number); } } else { map.Add("minerLimit", minerLimit.ToString()); } } } catch (Exception) { map.Remove("report"); map.Add("report", "error"); } httpMessage.result = JsonHelper.ToJson(map); }
public void GetPool(HttpMessage httpMessage) { Dictionary <string, BlockSub> transfers = Entity.Root.GetComponent <Rule>().GetTransfers(); httpMessage.result = JsonHelper.ToJson(transfers); }
// console 支持 public void OnStats(HttpMessage httpMessage) { if (!GetParam(httpMessage, "1", "style", out string style)) { style = ""; } Dictionary <string, object> result = new Dictionary <string, object>(); string address = Wallet.GetWallet().GetCurWallet().ToAddress(); Account account = null; using (DbSnapshot dbSnapshot = Entity.Root.GetComponent <LevelDBStore>().GetSnapshot(0)) { account = dbSnapshot.Accounts.Get(address); } var rule = Entity.Root.GetComponent <Rule>(); var pool = Entity.Root.GetComponent <Pool>(); var amount = account != null ? account.amount : "0"; long.TryParse(Entity.Root.GetComponent <LevelDBStore>().Get("UndoHeight"), out long UndoHeight); long PoolHeight = rule.height; string power1 = rule.calculatePower.GetPower(); string power2 = Entity.Root.GetComponent <Consensus>().calculatePower.GetPower(); int NodeCount = Entity.Root.GetComponent <NodeManager>().GetNodeCount(); if (style == "") { result.Add("AlppyHeight", UndoHeight); result.Add("PoolHeight", PoolHeight); result.Add("Calculate Power", $"{power1}of{power2}"); result.Add("Account", $"{ address},{amount}"); result.Add("Node", NodeCount); result.Add("Rule.Transfer", rule?.GetTransfersCount()); result.Add("Pool.Transfer", pool?.GetTransfersCount()); httpMessage.result = JsonHelper.ToJson(result); //httpMessage.result = $" AlppyHeight: {UndoHeight}\n" + // $" PoolHeight: {PoolHeight}\n" + // $" Calculate Power: {power1} of {power2}\n" + // $" Account: {address}, {amount}\n" + // $" Node: {NodeCount}\n" + // $" Rule.Transfer: {rule?.GetTransfersCount()}\n" + // $" Pool.Transfer: {pool?.GetTransfersCount()}"; } else if (style == "1") { result.Add("H", UndoHeight); result.Add("P", power2); httpMessage.result = JsonHelper.ToJson(result); //httpMessage.result = $"H:{UndoHeight} P:{power2}"; } else if (style == "2") { var httpPool = Entity.Root.GetComponent <HttpPool>(); var miners = httpPool.GetMinerReward(out long miningHeight); result.Add("H", UndoHeight); result.Add("P", power2); result.Add("P1", power1); result.Add("Miner", miners?.Count); httpMessage.result = JsonHelper.ToJson(result); //httpMessage.result = $"H:{UndoHeight} P:{power2} Miner:{miners?.Count}"; } }
private static void Main(string[] args) { Dictionary <string, string> param = new Dictionary <string, string>(); for (int i = 0; i < args.Length; i++) { int jj = args[i].IndexOf(':'); if (jj != -1) { param.TryAdd(args[i].Substring(0, jj).Replace("-", ""), args[i].Substring(jj + 1, args[i].Length - (jj + 1))); } else { param.TryAdd(args[i].Replace("-", ""), "true"); } } param.TryAdd("configure", ""); param.TryAdd("node", "All"); param.TryAdd("wallet", "./Data/wallet.json"); param.TryAdd("db", "./Data/LevelDB"); if (param.TryGetValue("index", out string index)) { param["wallet"] = param["wallet"].Replace(".json", $"{index}.json"); param["db"] = param["db"] + index; } if (param.TryGetValue("miner", out string tmp1)) { Entity.Root.AddComponent <Miner>().Init(param); Update(); return; } //// DAG 创建测试 //char[] dag = new char[1024*1024*10]; //var hash = CryptoHelper.Sha256("sat dag"); //var count = dag.Length / hash.Length; //int dagIndex = 0; //for (int ii = 0; ii < count; ii++) //{ // hash = CryptoHelper.Sha256(hash); // for (int jj = 0; jj < hash.Length; jj++) // { // dag[dagIndex++] = hash[jj]; // } //} //BigHelper.Test(); //return; //CalculatePower.Test(); //return; //Wallet.Test2(); //return; //Wallet.Test3(); //return; // 测试代码 //LuaVMEnv.TestRapidjson(args); //LuaVMEnv.TestLib(args); //LuaVMEnv.TestCoroutine(args); //LuaVMEnv.Test_number(args); //LevelDBStore.test_delete(args); //LevelDBStore.test_undo(args); //LevelDBStore.Export2CSV_Block(args); //LevelDBStore.test_ergodic(args); //return; //Log.Info(Environment.CurrentDirectory); string walletFile = param["wallet"]; Wallet wallet = Wallet.GetWallet(walletFile); if (wallet == null) { return; } if (param.TryGetValue("makeGenesis", out string tmp2)) { Consensus.MakeGenesis(); return; } //DisbleQuickEditMode(); Console.Clear(); Console.CursorVisible = false; Console.Title = $"SmartX 配置: {param["configure"]} {index} Address: {wallet.GetCurWallet().ToAddress()}"; Log.Debug($"address: {wallet.GetCurWallet().ToAddress()}"); string NodeKey = param["node"]; // 异步方法全部会回调到主线程 SynchronizationContext.SetSynchronizationContext(OneThreadSynchronizationContext.Instance); AssemblyHelper.AddAssembly("Base", typeof(AssemblyHelper).Assembly); AssemblyHelper.AddAssembly("App", typeof(Program).Assembly); // 读取配置文件 try { StreamReader sr = new StreamReader(new FileStream(param["configure"], FileMode.Open, FileAccess.Read, FileShare.ReadWrite), System.Text.Encoding.UTF8); string strTxt = sr.ReadToEnd(); strTxt = strTxt.Replace("0.0.0.0", NodeManager.GetIpV4()); sr.Close(); sr.Dispose(); JToken jd = JToken.Parse(strTxt); jdNode = jd[NodeKey]; } catch (Exception e) { Log.Info(e.ToString()); Log.Error($"configure file: {param["configure"]} on exists ro json foramt error."); Console.ReadKey(); return; } if (jdNode != null) { Log.Debug("启动: " + jdNode["appType"]); // DNS List <string> list = JsonHelper.FromJson <List <string> >(jdNode["NodeSessions"].ToString()); for (int ii = 0; ii < list.Count; ii++) { list[ii] = NetworkHelper.DnsToIPEndPoint(list[ii]).ToString(); } jdNode["NodeSessions"] = JsonHelper.ToJson(list); if (!string.IsNullOrEmpty(index)) { if (jdNode["HttpRpc"] != null) { jdNode["HttpRpc"]["ComponentNetworkHttp"]["address"] = ((string)jdNode["HttpRpc"]["ComponentNetworkHttp"]["address"]).Replace("8101", (8100 + int.Parse(index)).ToString()); } if (jdNode["HttpRpc"] != null) { jdNode["HttpPool"]["ComponentNetworkHttp"]["address"] = ((string)jdNode["HttpPool"]["ComponentNetworkHttp"]["address"]).Replace("9101", (9100 + int.Parse(index)).ToString()); } if (jdNode["HttpRpc"] != null) { jdNode["SmartxRpc"]["ComponentNetworkHttp"]["address"] = ((string)jdNode["SmartxRpc"]["ComponentNetworkHttp"]["address"]).Replace("5000", ((5000 - 1) + int.Parse(index)).ToString()); } if (jdNode["HttpRpc"] != null) { jdNode["ComponentNetworkInner"]["address"] = ((string)jdNode["ComponentNetworkInner"]["address"]).Replace("58601", (58600 + int.Parse(index)).ToString()); } if (jdNode["RelayNetwork"] != null) { jdNode["RelayNetwork"]["ComponentNetworkInner"]["address"] = ((string)jdNode["RelayNetwork"]["ComponentNetworkInner"]["address"]).Replace("57601", (57600 + int.Parse(index)).ToString()); } if (jdNode["Pool"] != null) { jdNode["Pool"]["db_path"] = ((string)jdNode["Pool"]["db_path"]) + index; } } // 数据库路径 if (jdNode["LevelDBStore"] != null && args.Length >= 3) { jdNode["LevelDBStore"]["db_path"] = param["db"]; } Entity.Root.AddComponent <ComponentStart>(jdNode); } Update(); }