public Block GetMcBlock(long ___height) { if (___height <= 1) { return(null); } try { PoolBlock poolBlock = null; using (DbSnapshot snapshot = pool.PoolDBStore.GetSnapshot()) { var str = snapshot.Get($"PoolBlock_{___height}"); if (!string.IsNullOrEmpty(str)) { poolBlock = JsonHelper.FromJson <PoolBlock>(str); if (poolBlock != null && Wallet.CheckAddress(poolBlock.Address)) { return(new Block() { hash = poolBlock.hash, Address = poolBlock.Address, random = poolBlock.random }); } } } HttpMessage quest = new HttpMessage(); quest.map = new Dictionary <string, string>(); quest.map.Add("cmd", "GetMcBlock"); quest.map.Add("version", version); quest.map.Add("height", ___height.ToString()); var result = ComponentNetworkHttp.QueryStringSync($"http://{poolUrl}", quest, 5); if (string.IsNullOrEmpty(result)) { return(null); } poolBlock = JsonHelper.FromJson <PoolBlock>(result); if (poolBlock != null && Wallet.CheckAddress(poolBlock.Address)) { using (DbSnapshot snapshot = pool.PoolDBStore.GetSnapshot()) { snapshot.Add($"PoolBlock_{___height}", JsonHelper.ToJson(poolBlock)); snapshot.Commit(); } return(new Block() { hash = poolBlock.hash, Address = poolBlock.Address, random = poolBlock.random }); } } catch (Exception) { } return(null); }
static public bool CheckAddress(string address) { return(Wallet.CheckAddress(address)); }
public static async System.Threading.Tasks.Task OrderAsync(HttpMessage httpMessage) { Wallet.Inst = null; if (httpMessage.map["0"] == "importkey") { if (!GetParam(httpMessage, "1", "1", out string privatekey)) { httpMessage.result = "command error! \nexample: import key privatekey"; return; } string address = AddKeyBag(privatekey, Program.keyBag); httpMessage.result = $" {address}"; } else if (httpMessage.map["0"] == "showip") { httpMessage.result = JsonHelper.ToJson(Program.ruleIP); } else if (httpMessage.map["0"] == "openwallet") { Wallet wallet = new Wallet(); if (httpMessage.map.Count == 2) { httpMessage.map.Add("1", "./smartx-wallet.json"); } if (Program.wallet.keys.Count > 0) { httpMessage.result = "please close wallet first!"; return; } try { string path = httpMessage.map["1"]; Wallet wallet1 = Wallet.GetWallet(path); wallet = wallet1; } catch (Exception e) { httpMessage.result = "Please check your path"; return; } if (wallet == null) { httpMessage.result = "Password error"; return; } if (Program.keyBag.Count > 0) { if (!Program.keyBag.ContainsKey(wallet.keys[0].ToAddress())) { Program.keyBag.Add(Wallet.ToAddress(wallet.keys[0].publickey), wallet.keys[0]); } } else { Program.keyBag.Add(Wallet.ToAddress(wallet.keys[0].publickey), wallet.keys[0]); } Program.wallet = wallet; //string random = Program.wallet.keys[0].random.ToHex(); //string nonce="0"; string nonce = await GetNonceAsync(Wallet.ToAddress(Program.wallet.keys[0].publickey), httpMessage, Program.ruleIP);//0 if (nonce == "INVALID URL, set the correct url" || nonce == "false") { httpMessage.result = nonce; return; } Program.nonce = (int.Parse(nonce) + 1).ToString(); //Console.WriteLine(Program.nonce); httpMessage.result = Wallet.ToAddress(Program.wallet.keys[0].publickey) + " open"; } else if (httpMessage.map["0"] == "setwallet") { if (!GetParam(httpMessage, "1", "address", out string address)) { httpMessage.result = "command error! \nexample: setwallet address"; return; } WalletKey key = new WalletKey(); if (Program.keyBag.Count > 0) { if (Program.keyBag.ContainsKey(address)) { key = Program.keyBag[address]; } else { httpMessage.result = "The address isn't in the key bag"; return; } } else { httpMessage.result = "The address isn't in the key bag"; return; } if (Program.wallet.keys.Count != 0) { httpMessage.result = "please close wallet first!"; return; } Program.wallet.keys.Add(key); string nonce = await GetNonceAsync(address, httpMessage, Program.ruleIP);//0 if (nonce == "INVALID URL, set the correct url" || nonce == "false") { httpMessage.result = nonce; return; } Program.nonce = (int.Parse(nonce) + 1).ToString(); httpMessage.result = $"{address} set"; } else if (httpMessage.map["0"] == "list") { List <string> list = new List <string>(); foreach (KeyValuePair <string, WalletKey> k in Program.keyBag) { list.Add(k.Key); } httpMessage.result = JsonHelper.ToJson(list); } else if (httpMessage.map["0"] == "closewallet") { Wallet.Inst = null; Program.wallet = new Wallet(); Program.nonce = ""; httpMessage.result = "wallet closed"; } else if (httpMessage.map["0"] == "getprivatekey") { if (Program.wallet.keys.Count != 0) { httpMessage.result = JsonHelper.ToJson(Program.wallet.keys[0].random.ToHexString()); } else { httpMessage.result = "please set wallet"; } } else if (httpMessage.map["0"] == "exportkey") { if (Program.wallet.keys.Count == 0) { httpMessage.result = "please set wallet"; return; } if (httpMessage.map.Count <= 2) { File.WriteAllText("./private.json", Program.wallet.keys[0].random.ToHexString()); httpMessage.result = $"export key successful"; return; } else if (Program.wallet.keys.Count > 0) { try { File.WriteAllText(httpMessage.map["1"] + "/private.json", Program.wallet.keys[0].random.ToHexString()); httpMessage.result = $"export key successful"; } catch (Exception) { httpMessage.result = "Please check the path"; return; } } else { httpMessage.result = "Please set the wallet first"; } } else if (httpMessage.map["0"] == "clear") { Console.Clear(); } else if (httpMessage.map["0"] == "transfer") { if (httpMessage.map.Count <= 3) { Console.WriteLine("transfer error example transfer addressOut amount fee"); return; } if (Program.wallet.keys.Count == 0) { httpMessage.result = "Please set the wallet first"; return; } if (!Wallet.CheckAddress(httpMessage.map["1"])) { httpMessage.result = "Please check addressOut"; return; } TransferInfo(httpMessage, Program.ruleIP); HttpMessage result = await ComponentNetworkHttp.QueryCommand(Program.ruleIP + $"/{httpMessage.map["cmd"]}", httpMessage); if (result.result.Contains("true")) { Program.nonce = (int.Parse(Program.nonce) + 1).ToString(); httpMessage.result = result.result + " " + httpMessage.map["hash"]; } else { httpMessage.result = "false"; } } else if (httpMessage.map["0"] == "createkey") { Console.WriteLine("Please enter random word: "); string input = Console.ReadLine(); WalletKey walletKey = new WalletKey(); walletKey.random = CryptoHelper.Sha256(Seek().ToHexString() + "#" + input).HexToBytes(); ed25519.ed25519_create_keypair(walletKey.publickey, walletKey.privatekey, walletKey.random); if (walletKey.random != null) { Dictionary <string, string> walletinfo = new Dictionary <string, string>(); walletinfo.Add("address", walletKey.ToAddress()); walletinfo.Add("privatekey", walletKey.random.ToHexString()); httpMessage.result = JsonHelper.ToJson(walletinfo); return; } httpMessage.result = "createkey error"; } else if (httpMessage.map["0"] == "createwallet") { OnCreat(httpMessage); } else if (httpMessage.map["0"] == "mempool") { HttpMessage result = await ComponentNetworkHttp.QueryCommand(Program.ruleIP + $"/{httpMessage.map["cmd"]}", httpMessage); httpMessage.result = result.result; } else if (httpMessage.map["0"] == "getlastblock") { try { if (!GetParam(httpMessage, "1", "index", out string index)) { httpMessage.result = "command error! \nexample: getlastblock index"; return; } string height = await GetHeightAsync(); httpMessage.map["1"] = (long.Parse(height) - 19 * long.Parse(httpMessage.map["1"])) != 0 ? (long.Parse(height) - 19 * long.Parse(httpMessage.map["1"])).ToString() : "0"; HttpMessage result = await ComponentNetworkHttp.QueryCommand(Program.ruleIP + $"/{httpMessage.map["cmd"]}", httpMessage); httpMessage.result = result.result; } catch (Exception e) { httpMessage.result = "command error! \nexample: getlastblock index"; } } else if (httpMessage.map["0"] == "transfercount") { HttpMessage result = await ComponentNetworkHttp.QueryCommand(Program.ruleIP + $"/{httpMessage.map["cmd"]}", httpMessage); httpMessage.result = result.result; } else if (httpMessage.map["0"] == "search") { HttpMessage result = await ComponentNetworkHttp.QueryCommand(Program.ruleIP + $"/{httpMessage.map["cmd"]}", httpMessage); httpMessage.result = result.result; } else if (httpMessage.map["0"] == "miner") { HttpMessage result = await ComponentNetworkHttp.QueryCommand(Program.ruleIP + $"/{httpMessage.map["cmd"]}", httpMessage); httpMessage.result = result.result; } else if (httpMessage.map["0"] == "node") { HttpMessage result = await ComponentNetworkHttp.QueryCommand(Program.ruleIP + $"/{httpMessage.map["cmd"]}", httpMessage); httpMessage.result = result.result; } else if (httpMessage.map["0"] == "beruler") { HttpMessage result = await ComponentNetworkHttp.QueryCommand(Program.ruleIP + $"/{httpMessage.map["cmd"]}", httpMessage); httpMessage.result = result.result; } else if (httpMessage.map["0"] == "rules") { HttpMessage result = await ComponentNetworkHttp.QueryCommand(Program.ruleIP + $"/{httpMessage.map["cmd"]}", httpMessage); httpMessage.result = result.result; } else if (httpMessage.map["0"] == "stats") { HttpMessage result = await ComponentNetworkHttp.QueryCommand(Program.ruleIP + $"/{httpMessage.map["cmd"]}", httpMessage); httpMessage.result = result.result; } else if (httpMessage.map["0"] == "account") { HttpMessage result = await ComponentNetworkHttp.QueryCommand(Program.ruleIP + $"/{httpMessage.map["cmd"]}", httpMessage); httpMessage.result = result.result; } else if (httpMessage.map["0"] == "help") { OnHelp(httpMessage); } else { httpMessage.result = "command error"; } }
public int AddTransfer(BlockSub transfer, bool checkFull = true) { transfer.hash = transfer.ToHash(); if (!Wallet.Verify(transfer.sign, transfer.hash, transfer.addressIn)) { return(-2); } Account account = null; using (var snapshot = Entity.Root.GetComponent <LevelDBStore>().GetSnapshot()) { account = snapshot.Accounts.Get(transfer.addressIn); if (snapshot.Transfers.Get(transfer.hash) != null) { return(-9); } } if (account == null) { return(-4); } if (BigHelper.Less(account.amount, "0.002", false)) { return(-3); } if (transfer.type == "transfer") { if (BigHelper.Less(account.amount, BigHelper.Add(transfer.amount, "0.002"), false)) { return(-5); } if (!BigHelper.Equals(BigHelper.Round8(transfer.amount), transfer.amount)) { return(-6); } if (!Wallet.CheckAddress(transfer.addressOut)) { return(-10); } } else { } if (transfer.addressIn == transfer.addressOut) { return(-8); } lock (blockSubs) { if (blockSubs.Count >= 600) { blockSubQueue.Enqueue(blockSubs); blockSubs = new Dictionary <string, BlockSub>(); } if (IsTransferFull(checkFull)) { return(-1); } blockSubs.Remove(transfer.hash); blockSubs.Add(transfer.hash, transfer); } var length = JsonHelper.ToJson(transfer).Length; if (length > 1024 * 4) { return(-11); } if (!consensus.IsRule(height, Wallet.GetWallet().GetCurWallet().ToAddress())) { return(-1); } return(1); }
public async void Run() { await Task.Delay(2000); var httpRpc = Entity.Root.Find("HttpRpc")?.GetComponent <HttpRpc>(); if (httpRpc == null) { return; } var consensus = Entity.Root.GetComponent <Consensus>(); var luaVMEnv = Entity.Root.GetComponent <LuaVMEnv>(); var httpMessage = new HttpMessage(); string address = Wallet.GetWallet().GetCurWallet().ToAddress(); string consAddress = ""; int delayTime = 60 * 1000 * 2; while (true) { await Task.Delay(delayTime); try { if (consensus.IsRule(consensus.transferHeight, address)) { continue; } if (string.IsNullOrEmpty(consAddress)) { if (httpMessage.map == null) { httpMessage.map = new Dictionary <string, string>(); httpMessage.map.Add("1", consensus.PledgeFactory); httpMessage.map.Add("2", $"getPair(\"{address}\")"); } httpRpc.callFun(httpMessage); if (!httpMessage.result.Contains("error")) { consAddress = JsonHelper.FromJson <string>(httpMessage.result); using (DbSnapshot dbSnapshot = Entity.Root.GetComponent <LevelDBStore>().GetSnapshot()) { if (!luaVMEnv.IsERC(dbSnapshot, consAddress, null)) { consAddress = ""; } } } } if (string.IsNullOrEmpty(consAddress)) { continue; } if (!Wallet.CheckAddress(consAddress)) { continue; } Account account = null; using (DbSnapshot dbSnapshot = Entity.Root.GetComponent <LevelDBStore>().GetSnapshot(0)) { account = dbSnapshot.Accounts.Get(consAddress); } if (account == null) { continue; } var rulers = consensus.GetRule(consensus.transferHeight); if (rulers == null) { continue; } int rulerCount = 0; string rulerAmountMin = ""; foreach (RuleInfo info in rulers.Values) { if (info.End == -1 || info.End > consensus.transferHeight) { rulerCount++; rulerAmountMin = rulerAmountMin == "" ? info.Amount : BigHelper.Min(rulerAmountMin, info.Amount); } } if ((rulerCount < 25 && BigHelper.Greater(account.amount, "3000000", true)) || BigHelper.Greater(account.amount, rulerAmountMin, false)) { httpRpc.OnBeRulerReal(httpMessage); } } catch (Exception) { } } }