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"); param.TryAdd("node", "All"); if (param.TryGetValue("index", out string index)) { param["wallet"] = param["wallet"].Replace(".json", $"{index}.json"); param["db"] = param["db"] + index; } if (param.ContainsKey("miner")) { RandomXSharp.RandomX.randomx_init(param.ContainsKey("fullmem")); Entity.Root.AddComponent <Miner>().Init(param); Update(); return; } RandomXSharp.RandomX.randomx_init(false); //RandomXSharp.RandomX.Test1(args); //return; //Wallet.Import(""); //return; //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); if (param.TryGetValue("makeSnapshot", out string _)) { LevelDBStore.MakeSnapshot(param); return; } string walletFile = param["wallet"]; Wallet wallet = Wallet.GetWallet(walletFile); if (wallet == null) { return; } if (param.TryGetValue("makeGenesis", out string _)) { Consensus.MakeGenesis(); return; } //DisbleQuickEditMode(); Console.Clear(); Console.CursorVisible = false; #if !RELEASE Console.Title = $"SmartX 配置: {param["configure"]} {index} Address: {wallet.GetCurWallet().ToAddress()} Debug"; #else Console.Title = $"SmartX 配置: {param["configure"]} {index} Address: {wallet.GetCurWallet().ToAddress()} Release"; #endif 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); // check contract var contractHash = FileHelper.HashDirectory("Data/Contract", CryptoHelper.Sha256); if (contractHash != "da4d968db3d8a7360873221cb917c9fcb073600968c2e88a22640b90c529d0f1") { Log.Debug($"contractHash error: {contractHash}"); #if RELEASE return; #endif } // 读取配置文件 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]); } 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["HttpPool"] != null) { jdNode["HttpPool"]["ComponentNetworkHttp"]["address"] = ((string)jdNode["HttpPool"]["ComponentNetworkHttp"]["address"]).Replace("9101", (9100 + int.Parse(index)).ToString()); } if (jdNode["SmartxRpc"] != null) { jdNode["SmartxRpc"]["ComponentNetworkHttp"]["address"] = ((string)jdNode["SmartxRpc"]["ComponentNetworkHttp"]["address"]).Replace("5000", ((5000 - 1) + int.Parse(index)).ToString()); } if (jdNode["ComponentNetworkInner"] != 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["HttpPoolRelay"] != null) { jdNode["HttpPoolRelay"]["number"] = jdNode["HttpPoolRelay"]["number"].ToString().Replace("Pool1", "Pool" + index); } } // 数据库路径 if (jdNode["LevelDBStore"] != null && args.Length >= 3) { jdNode["LevelDBStore"]["db_path"] = param["db"]; } Entity.Root.AddComponent <ComponentStart>(jdNode); } //TransferProcess.Test(); Update(); }
static public BlockChain GetMcBlockNext2F1(this BlockChain chain, BlockMgr bm = null, Consensus cos = null) { var blockMgr = bm ?? Entity.Root.GetComponent <BlockMgr>(); var consensus = cos ?? Entity.Root.GetComponent <Consensus>(); List <Block> blks = blockMgr.GetBlock(chain.height + 1); List <Block> blks2 = blockMgr.GetBlock(chain.height + 2); for (int ii = blks.Count - 1; ii >= 0; ii--) { if (chain.hash != blks[ii].prehash || !BlockChainHelper.IsIrreversible(consensus, blks[ii], blks2)) { blks.RemoveAt(ii); } } if (blks.Count == 0) { return(null); } Block mcBlk = blks[0]; double mcWeight = GetBlockWeight(consensus, mcBlk, blks2); for (int ii = 1; ii < blks.Count; ii++) { Block blk = blks[ii]; double weight = GetBlockWeight(consensus, blk, blks2); if (weight > mcWeight) { mcBlk = blk; mcWeight = weight; } else if (weight == mcWeight) { if (blk.hash.CompareTo(mcBlk.hash) > 0) { mcBlk = blk; mcWeight = weight; } } } return(new BlockChain() { hash = mcBlk.hash, height = mcBlk.height }); }
public override void Start() { consensus = Entity.Root.GetComponent <Consensus>(); }
public static List <BlockChain> FindtChain(BlockChain chainfrist, List <Block> blks, List <Block> blks2, ref List <BlockChain> list, BlockMgr blockMgr, Consensus consensus) { blks = blks ?? blockMgr.GetBlock(chainfrist.height + 1); for (int ii = blks.Count - 1; ii >= 0; ii--) { if (chainfrist.hash == blks[ii].prehash) { var cc = new BlockChain() { hash = blks[ii].hash, height = blks[ii].height }; if (CheckChain(cc, blks2, blockMgr, consensus) > 0) { list.Add(cc); } } } return(list); }
public static BlockChain FindtChainMost(BlockChain chainfrist, BlockMgr blockMgr, Consensus consensus = null) { blockMgr = blockMgr ?? Entity.Root.GetComponent <BlockMgr>(); consensus = consensus ?? Entity.Root.GetComponent <Consensus>(); BlockChain chain = chainfrist; List <BlockChain> list1 = new List <BlockChain>(); List <BlockChain> list2 = new List <BlockChain>(); List <BlockChain> listT = null; List <Block> blks1 = blockMgr.GetBlock(chain.height + 1); List <Block> blks2 = blockMgr.GetBlock(chain.height + 2); FindtChain(chain, blks1, blks2, ref list1, blockMgr, consensus); if (list1.Count <= 1) { return(null); } long height = chain.height + 1; while (list1.Count >= 2) { blks1 = blks2; blks2 = blockMgr.GetBlock(height + 2); for (int ii = list1.Count - 1; ii >= 0; ii--) { FindtChain(list1[ii], blks1, blks2, ref list2, blockMgr, consensus); } var exist = list2.Exists((x) => { return(x.checkWeight >= 2); }); if (exist) // 如果存在2F+1 block就删除 super block { list2.RemoveAll((x) => { return(x.checkWeight == 1); }); } listT = list2; list2 = list1; list1 = listT; list2.Clear(); height++; } if (list1.Count == 1) { return(list1[0]); } return(null); }
public static int CheckChain(BlockChain chain, List <Block> blks2, BlockMgr blockMgr, Consensus consensus) { blks2 = blks2 ?? blockMgr.GetBlock(chain.height + 1); int rel = IsIrreversible(consensus, chain.GetMcBlock(), blks2) ? 2 : 0; var blksRule = BlockChainHelper.GetRuleBlk(consensus, blks2, chain.hash); var blkSuper = blksRule.Find((x) => { return(x.Address == consensus.superAddress); }); //if (blkSuper != null && blkSuper.Address == consensus.superAddress && blksRule.Count >= Math.Min(2, consensus.GetRuleCount(chain.height + 1))) var t_2max = consensus.GetRuleCount(chain.height + 1); if (blkSuper != null && blkSuper.Address == consensus.superAddress && blksRule.Count >= Math.Max(2, (BlockChainHelper.Get2F1(t_2max) / 2))) { rel = rel + 1; } chain.checkWeight = rel; return(rel); }
static public BlockChain GetMcBlockNext(this BlockChain chain, BlockMgr bm = null, Consensus cos = null) { var blockMgr = bm ?? Entity.Root.GetComponent <BlockMgr>(); var consensus = cos ?? Entity.Root.GetComponent <Consensus>(); var chinanext = GetMcBlockNext2F1(chain, blockMgr, consensus); if (chinanext != null) { return(chinanext); } List <BlockChain> list1 = new List <BlockChain>(); List <BlockChain> list2 = new List <BlockChain>(); List <Block> blks1 = blockMgr.GetBlock(chain.height + 1); List <Block> blks2 = blockMgr.GetBlock(chain.height + 2); FindtChain(chain, blks1, blks2, ref list1, blockMgr, consensus); if (list1.Count == 1) { if (list1[0].checkWeight >= 1) { return(list1[0]); } } //var t_2max = consensus.GetRuleCount(chain.height + 1); //List<Block> blks = blockMgr.GetBlock(chain.height + 1); //var blksRule = BlockChainHelper.GetRuleBlk(consensus, blks, chain.hash); //var blkSuper = blksRule.Find((x) => { return x.Address == consensus.superAddress; }); //if (blkSuper != null && blkSuper.Address == consensus.superAddress && blksRule.Count >= Math.Max(2, (BlockChainHelper.Get2F1(t_2max) / 2))) //{ // List<Block> blksTemp = blockMgr.GetBlock(chain.height + 2); // if(blksTemp.Exists( (x) => { return x.prehash == blkSuper.hash; } )) { // return new BlockChain() { hash = blkSuper.hash, height = blkSuper.height }; // } //} return(null); }
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.dat"); param.TryAdd("db", "./Data/LevelDB"); if (param.TryGetValue("index", out string index)) { param["wallet"] = param["wallet"].Replace(".dat", $"{index}.dat"); param["db"] = param["db"] + index; } if (param.TryGetValue("miner", out string tmp1)) { Entity.Root.AddComponent <Miner>().Init(param); Update(); return; } //CalculatePower.Test(); //return; //Wallet.Test2(); //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); //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 = $"IOBft 配置: {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); // 读取配置文件 StreamReader sr = new StreamReader(new FileStream(param["configure"], FileMode.Open, FileAccess.Read, FileShare.ReadWrite), System.Text.Encoding.UTF8); string strTxt = sr.ReadToEnd(); sr.Close(); sr.Dispose(); JToken jd = JToken.Parse(strTxt); if (jd[NodeKey] != null) { jdNode = jd[NodeKey]; Log.Debug("启动: " + jdNode["appType"]); if (index != null) { jdNode["HttpRpc"]["ComponentNetworkHttp"]["address"] = ((string)jdNode["HttpRpc"]["ComponentNetworkHttp"]["address"]).Replace("8001", (8000 + int.Parse(index)).ToString()); jdNode["HttpRule"]["ComponentNetworkHttp"]["address"] = ((string)jdNode["HttpRule"]["ComponentNetworkHttp"]["address"]).Replace("9001", (9000 + int.Parse(index)).ToString()); } // 数据库路径 if (jdNode["LevelDBStore"] != null && args.Length >= 3) { jdNode["LevelDBStore"]["db_path"] = param["db"]; } Entity.Root.AddComponent <ComponentStart>(jd[NodeKey]); } Update(); }
// Miner reward, only after confirming that it cannot be rolled back public Dictionary <string, BlockSub> MinerReward_PPLNS(string today, long minHeight, long maxHeight) { Dictionary <string, BlockSub> minerTransfer = new Dictionary <string, BlockSub>(); if (httpPool != null) { WalletKey walletKey = Wallet.GetWallet().GetCurWallet(); for (long rewardheight = minHeight; rewardheight < maxHeight; rewardheight++) { Dictionary <string, MinerTask> miners = null; using (DbSnapshot snapshot = PoolDBStore.GetSnapshot()) { string json = snapshot.Get("Pool_H_" + rewardheight); if (!string.IsNullOrEmpty(json)) { miners = JsonHelper.FromJson <Dictionary <string, MinerTask> >(json); } } //var miners = httpPool.GetMiner(rewardheight); if (miners != null) { string ownerAddress = Wallet.GetWallet().GetCurWallet().ToAddress(); var mcblk = BlockChainHelper.GetMcBlock(rewardheight); if (mcblk != null && mcblk.Address == ownerAddress) { BigFloat reward = new BigFloat(Consensus.GetReward(rewardheight)); reward = reward * (1.0f - serviceFee); var miner = miners.Values.FirstOrDefault(c => c.random == mcblk.random); if (miner == null) { continue; } // Total power BigFloat diffsum = new BigFloat(0); foreach (var dic in miners.Values) { if (string.IsNullOrEmpty(dic.address)) { continue; } if (dic.diff < 0.99999f) { continue; } diffsum += new BigFloat(dic.diff); } // Reward for participation foreach (var dic in miners.Values) { if (string.IsNullOrEmpty(dic.address)) { continue; } if (dic.diff < 0.99999f) { continue; } var v = new BigFloat(dic.diff); string pay = BigHelper.Round8((v * reward / diffsum).ToString()); if (minerTransfer.TryGetValue(dic.address, out BlockSub transfer)) { transfer.amount = BigHelper.Add(transfer.amount, pay); } else if (BigHelper.Greater(pay, "0.002", false)) { transfer = new BlockSub(); transfer.addressIn = ownerAddress; transfer.addressOut = dic.address; transfer.amount = BigHelper.Sub(pay, "0.002"); // 扣除交易手续费 transfer.type = "transfer"; transfer.data = CryptoHelper.Sha256($"{today}_{maxHeight}_{ownerAddress}_{dic.address}_MinerReward"); minerTransfer.Add(transfer.addressOut, transfer); } } } } } } return(minerTransfer); }
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(); }