public static void Q2P_Transfer_Handle(Session session, int opcode, object msg) { Q2P_Transfer q2p_Transfer = msg as Q2P_Transfer; BlockSub transfer = JsonHelper.FromJson <BlockSub>(q2p_Transfer.transfer); R2P_Transfer r2p_Transfer = new R2P_Transfer() { rel = "-10000" }; if (transfer.CheckSign()) { var rel = Entity.Root.GetComponent <Rule>().AddTransfer(transfer); if (rel == -1) { HttpRpc.OnTransferAsync(transfer); } } session.Reply(q2p_Transfer, r2p_Transfer); }
public async void Test2Async(object o) { NodeManager nodeManager = Entity.Root.GetComponent <NodeManager>(); for (int ii = Wallet.GetWallet().keys.Count; ii < 1000; ii++) { Wallet.GetWallet().Create(); } Wallet.GetWallet().SaveWallet(); Log.Info("Test2Async start1"); Session session2 = null; for (int ii = 1; ii < 1000; ii++) { int random1 = 0; int random2 = ii; int random3 = 1000; BlockSub transfer = new BlockSub(); transfer.type = "transfer"; transfer.addressIn = Wallet.GetWallet().keys[random1].ToAddress(); transfer.addressOut = Wallet.GetWallet().keys[random2].ToAddress(); transfer.amount = random3.ToString(); transfer.data = ""; transfer.depend = ""; transfer.nonce = GetAccountNotice(transfer.addressIn, false); transfer.timestamp = TimeHelper.Now(); transfer.hash = transfer.ToHash(); transfer.sign = transfer.ToSign(Wallet.GetWallet().keys[random1]); session2 = await OnTransferAsync2(transfer, session2); while (session2 == null) { session2 = await OnTransferAsync2(transfer, session2); } ; } }
public static async void TestTransfersync() { Session session2 = null; var accountCount = Wallet.GetWallet().keys.Count; //while (true) { session2 = null; for (int ii = 0; ii < TestTransfersyncCount; ii++) { int random1 = RandomHelper.Range(1, accountCount); int random2 = RandomHelper.Range(1, accountCount); while (random1 == random2) { random2 = RandomHelper.Range(1, accountCount); } int random3 = RandomHelper.Range(1, 100); BlockSub transfer = new BlockSub(); transfer.type = "transfer"; transfer.addressIn = Wallet.GetWallet().keys[random1].ToAddress(); transfer.addressOut = Wallet.GetWallet().keys[random2].ToAddress(); transfer.amount = random3.ToString(); transfer.data = ""; transfer.depend = ""; transfer.nonce = HttpRpc.GetAccountNotice(transfer.addressIn); transfer.timestamp = TimeHelper.Now(); transfer.hash = transfer.ToHash(); transfer.sign = transfer.ToSign(Wallet.GetWallet().keys[random1]); session2 = await HttpRpc.OnTransferAsync2(transfer, session2); while (session2 == null) { session2 = await HttpRpc.OnTransferAsync2(transfer, session2); } ; } //await Task.Delay(1000); } }
static int SendTransfer(string url, BlockSub blockSub) { try { if (httpPoolRelay == null) { return(Entity.Root.GetComponent <Rule>().AddTransfer(blockSub, false)); } var quest = new HttpMessage(); quest.map = new Dictionary <string, string>(); quest.map.Clear(); quest.map.Add("cmd", "transfer"); quest.map.Add("type", blockSub.type); quest.map.Add("hash", blockSub.hash); quest.map.Add("nonce", blockSub.nonce.ToString()); quest.map.Add("addressIn", blockSub.addressIn); quest.map.Add("addressOut", blockSub.addressOut); quest.map.Add("amount", blockSub.amount); quest.map.Add("data", System.Web.HttpUtility.UrlEncode(blockSub.data)); quest.map.Add("sign", blockSub.sign.ToHexString()); quest.map.Add("fee", blockSub.gas.ToString()); quest.map.Add("timestamp", blockSub.timestamp.ToString()); quest.map.Add("remarks", System.Web.HttpUtility.UrlEncode(blockSub.remarks)); quest.map.Add("depend", System.Web.HttpUtility.UrlEncode(blockSub.depend)); quest.map.Add("extend", System.Web.HttpUtility.UrlEncode(JsonHelper.ToJson(blockSub.extend))); var result = ComponentNetworkHttp.QuerySync($"http://{url}", quest); if (result.map["success"] == "false") { return(int.Parse(result.map["rel"])); } } catch (Exception) { } return(-1); }
public void OnTransfer(HttpMessage httpMessage) { BlockSub transfer = new BlockSub(); transfer.hash = httpMessage.map["hash"]; transfer.type = httpMessage.map["type"]; transfer.nonce = long.Parse(httpMessage.map["nonce"]); transfer.addressIn = httpMessage.map["addressIn"]; transfer.addressOut = httpMessage.map["addressOut"]; transfer.amount = httpMessage.map["amount"]; transfer.data = System.Web.HttpUtility.UrlDecode(httpMessage.map["data"]); transfer.timestamp = long.Parse(httpMessage.map["timestamp"]); transfer.sign = httpMessage.map["sign"].HexToBytes(); transfer.depend = httpMessage.map["depend"]; transfer.remarks = System.Web.HttpUtility.UrlDecode(httpMessage.map["remarks"]); //string hash = transfer.ToHash(); //string sign = transfer.ToSign(Wallet.GetWallet().GetCurWallet()).ToHexString(); var rel = Entity.Root.GetComponent <Rule>().AddTransfer(transfer); if (rel == -1) { OnTransferAsync(transfer); } if (rel == -1 || rel == 1) { using (DbSnapshot dbSnapshot = Entity.Root.GetComponent <LevelDBStore>().GetSnapshot(0)) { long index = dbSnapshot.List.GetCount($"TFA__{transfer.addressIn}{""}"); httpMessage.result = "{\"success\":true,\"accindex\":" + index + "} "; } } else { httpMessage.result = "{\"success\":false,\"rel\":{" + rel + "}}"; } }
static public string GetSymbol(string conAddress) { var symbol = "unknown"; try { if (cacheSymbol.TryGetValue(conAddress, out symbol)) { return(symbol); } var consensus = Entity.Root.GetComponent <Consensus>(); var luaVMEnv = Entity.Root.GetComponent <LuaVMEnv>(); var levelDBStore = Entity.Root.GetComponent <LevelDBStore>(); object[] result = null; bool rel; var blockSub = new BlockSub(); blockSub.addressIn = consensus.auxiliaryAddress; blockSub.addressOut = conAddress; blockSub.data = "symbol()"; using (DbSnapshot dbSnapshot = levelDBStore.GetSnapshot(0, true)) { rel = luaVMEnv.Execute(dbSnapshot, blockSub, consensus.transferHeight, out result); if (rel && result != null && result.Length >= 1) { symbol = ((string)result[0]) ?? "unknown"; cacheSymbol.TryRemove(conAddress, out string _); cacheSymbol.TryAdd(conAddress, symbol); } } } catch (Exception) { } return(symbol); }
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); }
// Miner reward, only after confirming that it cannot be rolled back public Dictionary <string, BlockSub> GetMinerReward_PPLNS(long minHeight, long maxHeight) { Dictionary <string, BlockSub> minerTransfer = new Dictionary <string, BlockSub>(); if (httpPool != null) { string addressIn = Wallet.GetWallet().GetCurWallet().ToAddress(); for (long rewardheight = minHeight; rewardheight < maxHeight; rewardheight++) { Dictionary <string, MinerTask> miners = null; using (DbSnapshot snapshot = PoolDBStore.GetSnapshot()) { string json = snapshot.Get("Pool_H2_" + rewardheight); if (!string.IsNullOrEmpty(json)) { miners = JsonHelper.FromJson <Dictionary <string, MinerTask> >(json); } } if (miners != null) { var mcblk = GetMcBlock(rewardheight); if (mcblk == null) { throw new Exception($"GetMcBlock({rewardheight}) return null"); } if (mcblk != null && mcblk.Address == ownerAddress) { double reward = Consensus.GetReward(rewardheight); reward = reward * (1.0f - GetServiceFee()); var miner = miners.Values.FirstOrDefault(c => c.random.IndexOf(mcblk.random) != -1); if (miner == null) { continue; } // Total power double powerSum = 0; var Values = miners.Values.ToList(); for (var ii = 0; ii < Values.Count; ii++) { var dic = Values[ii]; if (string.IsNullOrEmpty(dic.address)) { continue; } double power = CalculatePower.Power(dic.diff); if (power < HttpPool.ignorePower) { continue; } powerSum += power; } // Reward for participation BlockSub transfer = null; for (var ii = 0; ii < Values.Count; ii++) { var dic = Values[ii]; if (string.IsNullOrEmpty(dic.address)) { continue; } double power = CalculatePower.Power(dic.diff); double pay = Math.Round(power * reward / powerSum, 8); if (minerTransfer.TryGetValue(dic.address, out transfer)) { if (power < HttpPool.ignorePower) { transfer.height += 1; // 这里表示无效提交数 continue; } transfer.nonce += 1; // 这里表示有效提交数 transfer.amount = BigHelper.Add(transfer.amount, pay.ToString("N8")); } else if (pay >= 0.002) { transfer = new BlockSub(); transfer.nonce = 1; // 这里表示有效提交数 transfer.addressIn = addressIn; transfer.addressOut = dic.address; transfer.amount = BigHelper.Sub(pay.ToString("N8"), "0.002"); // 扣除交易手续费 transfer.data = CryptoHelper.Sha256($"{mcblk.hash}_{maxHeight}_{ownerAddress}_{dic.address}_MinerReward"); if (power < HttpPool.ignorePower) { transfer.height += 1; // 这里表示无效提交数 continue; } minerTransfer.Add(transfer.addressOut, transfer); } } } } } // 有效提交次数越多收益越高 var totalAmount1 = "0"; // 总账1 var totalAmount2 = "0"; // 总账2 foreach (var transfer in minerTransfer.Values) { try { totalAmount1 = BigHelper.Add(totalAmount1, transfer.amount); var totalSubmit = transfer.nonce + transfer.height; var share = (float)transfer.nonce / (float)totalSubmit; transfer.type = $"{Math.Round(share * 100, 2)}%"; // 有效提交百分比 share *= share; transfer.remarks = BigHelper.Mul(share.ToString(), transfer.amount); totalAmount2 = BigHelper.Add(totalAmount2, transfer.remarks); } catch (Exception) { transfer.type = "0%"; transfer.remarks = "0"; } } var totalAmount3 = "0"; // 总账3 foreach (var transfer in minerTransfer.Values) { try { transfer.amount = BigHelper.Div(BigHelper.Mul(transfer.remarks, totalAmount1), totalAmount2); totalAmount3 = BigHelper.Add(totalAmount3, transfer.amount); } catch (Exception) { } } //if (BigHelper.Greater(BigHelper.Abs(BigHelper.Sub(totalAmount1, totalAmount3)), "0.002", true)) //{ // Log.Warning($"|totalAmount1 - totalAmount3| > 0.002 {BigHelper.Sub(totalAmount1, totalAmount3)}"); //} } return(minerTransfer); }
static public bool AddBlockSub(this Block This, int ii, BlockSub transfer) { This.linkstran.Add(ii, transfer); return(true); }
public void OnContract(HttpMessage httpMessage) { httpMessage.result = "command error! \nexample: contract consAddress callFun"; GetParam(httpMessage, "1", "consAddress", out string consAddress); GetParam(httpMessage, "1", "depend", out string depend); if (!GetParam(httpMessage, "2", "callFun", out string callFun)) { return; } WalletKey key = Wallet.GetWallet().GetCurWallet(); var sender = key.ToAddress(); if (callFun.IndexOf("create(") != -1) { var consensus = Entity.Root.GetComponent <Consensus>(); var blockMgr = Entity.Root.GetComponent <BlockMgr>(); long notice = 1; using (var dbSnapshot = Entity.Root.GetComponent <LevelDBStore>().GetSnapshot(0)) { var account = dbSnapshot.Accounts.Get(sender); if (account != null) { notice = account.nonce + 1; } } BlockSub transfer = new BlockSub(); transfer.addressIn = sender; transfer.addressOut = null; transfer.amount = "0"; transfer.nonce = notice; transfer.type = "contract"; transfer.depend = depend; transfer.data = callFun; var luaVMCall = LuaVMCall.Decode(transfer.data); Log.Info(JsonHelper.ToJson(luaVMCall)); //transfer.timestamp = TimeHelper.Now(); //transfer.hash = transfer.ToHash(); //transfer.sign = transfer.ToSign(key); //var rel = Entity.Root.GetComponent<Rule>().AddTransfer(transfer); //if (rel == -1) //{ // OnTransferAsync(transfer); //} //httpMessage.result = $"accepted transfer:{transfer.hash}"; } else { using (DbSnapshot dbSnapshot = Entity.Root.GetComponent <LevelDBStore>().GetSnapshot()) { var consensus = Entity.Root.GetComponent <Consensus>(); var luaVMEnv = Entity.Root.GetComponent <LuaVMEnv>(); var blockSub = new BlockSub(); blockSub.addressIn = sender; blockSub.addressOut = consAddress; blockSub.data = callFun; bool rel = luaVMEnv.Execute(dbSnapshot, blockSub, consensus.transferHeight, out object[] result); httpMessage.result = JsonHelper.ToJson(result); } } }
public int AddTransfer(BlockSub transfer) { if (!consensus.IsRule(height, Wallet.GetWallet().GetCurWallet().ToAddress())) { return(-1); } transfer.hash = transfer.ToHash(); if (!Wallet.Verify(transfer.sign, transfer.hash, transfer.addressIn)) { return(-2); } if (transfer.type == "transfer") { if (BigHelper.Less(transfer.amount, "0", false)) { return(-3); } Account account = null; using (var snapshot = Entity.Root.GetComponent <LevelDBStore>().GetSnapshot()) { account = snapshot.Accounts.Get(transfer.addressIn); } if (account == null) { return(-4); } if (BigHelper.Less(account.amount, transfer.amount, false)) { return(-5); } if (BigHelper.Round8(transfer.amount) != transfer.amount) { return(-6); } } else { } if (transfer.addressIn == transfer.addressOut) { return(-6); } lock (blockSubs) { // 出块权限 if (blockSubs.Count > 6000) { return(-7); } blockSubs.Remove(transfer.hash); blockSubs.Add(transfer.hash, transfer); } return(1); }
public bool Execute(DbSnapshot dbSnapshot, BlockSub transfer, long height, out object[] result) { lock (this) { using (LuaVMDB luaVMDB = new LuaVMDB(dbSnapshot)) { result = null; LuaVMCall luaVMCall = new LuaVMCall(); LuaVMScript luaVMScript = null; LuaVMContext LuaVMContext = null; try { string consAddress = GetContractAddress(transfer); LuaEnv luaenv = GetLuaEnv(consAddress, "Execute"); //LuaEnv Global LuaVMStack.Reset(transfer, luaVMDB, consAddress, transfer.addressIn); luaenv.DoString(initScript); if (string.IsNullOrEmpty(transfer.addressOut)) { // 已存在 if (luaVMDB.Contracts.Get(consAddress) != null) { return(false); } luaVMScript = new LuaVMScript() { script = FileHelper.GetFileData($"./Data/Contract/{transfer.depend}.lua").ToByteArray(), tablName = transfer.depend }; LuaVMContext = new LuaVMContext() { jsonData = "{}".ToByteArray() }; luaVMCall = LuaVMCall.Decode(transfer.data); luaVMDB.Contracts.Add(consAddress, luaVMScript); luaenv.DoString(luaVMScript.script); } else { luaVMScript = LuaVMScript.Get(luaVMDB, consAddress); LuaVMContext = luaVMDB.Storages.Get(consAddress); luaVMCall = LuaVMCall.Decode(transfer.data); luaenv.DoString(luaVMScript.script, transfer.addressOut); luaenv.DoString($"Storages = rapidjson.decode('{LuaVMContext.jsonData.ToStr()}')\n"); } object[] args = luaVMCall.args.Select(a => a.GetValue()).ToArray(); LuaFunction luaFun = luaenv.Global.Get <LuaFunction>(luaVMCall.fnName); luaenv.Global.Set("curHeight", height); luaenv.Global.Set("sender", transfer.addressIn); luaenv.Global.Set("addressThis", consAddress); if (luaFun != null) { result = luaFun.Call(args); // rapidjson luaenv.DoString("StoragesJson = rapidjson.encode(Storages)\n"); LuaVMContext.jsonData = luaenv.Global.Get <string>("StoragesJson").ToByteArray(); luaVMDB.Storages.Add(consAddress, LuaVMContext); luaVMDB.Commit(); luaenv.GC(); return(true); } } catch (Exception e) { #if !RELEASE Log.Error(e); Log.Info($"LuaVMEnv.Execute Error, transfer.hash: {transfer.hash} , contract: {transfer.addressOut} func:{luaVMCall.fnName}"); #endif var array = e.Message.Split("\n"); if (array != null && array.Length > 0) { array[0] = array[0].Replace("c# exception:XLua.LuaException: c# exception:System.Exception: ", ""); LuaVMStack.Add2TransferTemp(array[0]); } } finally { LuaVMStack.Reset(null, null, null, null); } return(false); } } }
public static async void TestPledge(HttpMessage httpMessage) { if (Wallet.GetWallet().keys.Count < 1000) { for (int ii = Wallet.GetWallet().keys.Count; ii < 1000; ii++) { Wallet.GetWallet().Create("123"); } Wallet.GetWallet().SaveWallet(); Log.Info("TestPledge create"); Session session2 = null; for (int ii = 1; ii < 1000; ii++) { int random1 = 0; int random2 = ii; int random3 = 100000; BlockSub transfer = new BlockSub(); transfer.type = "transfer"; transfer.addressIn = Wallet.GetWallet().keys[random1].ToAddress(); transfer.addressOut = Wallet.GetWallet().keys[random2].ToAddress(); transfer.amount = random3.ToString(); transfer.data = $""; transfer.depend = ""; transfer.nonce = HttpRpc.GetAccountNotice(transfer.addressIn, false); transfer.timestamp = TimeHelper.Now(); transfer.hash = transfer.ToHash(); transfer.sign = transfer.ToSign(Wallet.GetWallet().keys[random1]); session2 = await HttpRpc.OnTransferAsync2(transfer, session2); while (session2 == null) { session2 = await HttpRpc.OnTransferAsync2(transfer, session2); } ; } } else { var consensus = Entity.Root.GetComponent <Consensus>(); var accountCount = Wallet.GetWallet().keys.Count; Session session2 = null; while (true) { Log.Info("TestPledge start"); session2 = null; for (int ii = 0; ii < 200; ii++) { int random1 = RandomHelper.Range(1, accountCount); int random2 = RandomHelper.Range(1, accountCount); while (random1 == random2) { random2 = RandomHelper.Range(1, accountCount); } BlockSub transfer = new BlockSub(); transfer.type = "contract"; transfer.addressIn = Wallet.GetWallet().keys[random1].ToAddress(); transfer.amount = ""; transfer.depend = ""; transfer.nonce = HttpRpc.GetAccountNotice(transfer.addressIn); transfer.timestamp = TimeHelper.Now(); var rules = consensus.GetRule(consensus.transferHeight).Select(x => x.Value.Contract).ToList(); rules.Remove(""); rules.Remove(null); int callFunIndex = RandomHelper.Range(0, 3); if (callFunIndex == 0) { int random3 = RandomHelper.Range(1, 1000); transfer.data = $"addLiquidity(\"{random3}\",\"{random3}\")"; transfer.addressOut = rules[RandomHelper.Range(0, rules.Count) % rules.Count]; } else if (callFunIndex == 1) { int random3 = RandomHelper.Range(1, 1000); transfer.data = $"removeLiquidity(\"{random3}\")"; transfer.addressOut = rules[RandomHelper.Range(0, rules.Count) % rules.Count]; } else if (callFunIndex == 2) { int random3 = (int)consensus.transferHeight - RandomHelper.Range(1, 10); transfer.data = $"retrieved(\"{random3}\",\"{random3}\")"; transfer.addressOut = rules[RandomHelper.Range(0, rules.Count) % rules.Count]; } else if (callFunIndex == 3) { int random3 = (int)consensus.transferHeight - RandomHelper.Range(1, 10); transfer.data = $"diversionLiquidity(\"{random3}\",\"{rules[RandomHelper.Range(0, rules.Count) % rules.Count]}\")"; transfer.addressOut = rules[RandomHelper.Range(0, rules.Count) % rules.Count]; } else if (callFunIndex == 4) { int random3 = (int)consensus.transferHeight - RandomHelper.Range(1, 10); transfer.data = $"cancel(\"{rules[RandomHelper.Range(0, rules.Count) % rules.Count]}\",\"{random3}\")"; transfer.addressOut = consensus.PledgeFactory; } transfer.hash = transfer.ToHash(); transfer.sign = transfer.ToSign(Wallet.GetWallet().keys[random1]); session2 = await HttpRpc.OnTransferAsync2(transfer, session2); while (session2 == null) { session2 = await HttpRpc.OnTransferAsync2(transfer, session2); } ; } await Task.Delay(1000); } } }
// 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); }
public bool Execute(DbSnapshot dbSnapshot, BlockSub transfer, long height, out object[] result) { LuaVMCall luaVMCall = new LuaVMCall(); LuaVMScript luaVMScript = null; LuaVMContext LuaVMContext = null; result = null; try { string address = GetContractAddress(transfer); LuaEnv luaenv = GetLuaEnv(address); //LuaEnv Global s_consAddress = address; s_transfer = transfer; s_dbSnapshot = dbSnapshot; luaenv.DoString(initScript); if (string.IsNullOrEmpty(transfer.addressOut)) { // 已存在 if (dbSnapshot.Contracts.Get(address) != null) { return(false); } luaVMScript = new LuaVMScript() { script = FileHelper.GetFileData($"./Data/Contract/{transfer.depend}.lua").ToByteArray() }; LuaVMContext = new LuaVMContext() { jsonData = "{}".ToByteArray() }; luaVMCall = LuaVMCall.Decode(transfer.data); dbSnapshot.Contracts.Add(address, luaVMScript); luaenv.DoString(luaVMScript.script); } else { luaVMScript = dbSnapshot.Contracts.Get(address); LuaVMContext = dbSnapshot.Storages.Get(address); luaVMCall = LuaVMCall.Decode(transfer.data); luaenv.DoString(luaVMScript.script, transfer.addressOut); luaenv.DoString($"Storages = rapidjson.decode('{LuaVMContext.jsonData.ToStr()}')\n"); } object[] args = luaVMCall.args.Select(a => a.GetValue()).ToArray(); LuaFunction luaFun = luaenv.Global.Get <LuaFunction>(luaVMCall.fnName); luaenv.Global.Set("curHeight", height); luaenv.Global.Set("sender", transfer.addressIn); result = luaFun?.Call(args); // rapidjson luaenv.DoString("StoragesJson = rapidjson.encode(Storages)\n"); LuaVMContext.jsonData = luaenv.Global.Get <string>("StoragesJson").ToByteArray(); dbSnapshot.Storages.Add(address, LuaVMContext); luaenv.GC(); s_consAddress = ""; s_dbSnapshot = null; return(true); } catch (Exception e) { Log.Error(e); Log.Info($"LuaVMEnv.Execute Error, transfer.hash: {transfer.hash} , contract: {transfer.addressOut} func:{luaVMCall.fnName}"); } s_consAddress = ""; s_dbSnapshot = null; return(false); }
public void ThreadRun(object data) { System.Threading.Thread.Sleep(1000); // check url rulerRpc = rulerRpc ?? Entity.Root.Find("SmartxRpc")?.GetComponent <SmartxRpc>()?.GetIPEndPoint(); if (httpPoolRelay != null && GetHeight(rulerRpc, 5) == 0) { Log.Error($"rulerRpc: {rulerRpc} can't connect"); System.Diagnostics.Process.GetCurrentProcess().Kill(); return; } LoadTransferFromDB(); List <TransferHandle> transfersDel = new List <TransferHandle>(); Dictionary <string, Account> accounts = new Dictionary <string, Account>(); var timePassInfo = new TimePass(15 * 6); while (true) { System.Threading.Thread.Sleep(1000); // Query success try { lock (this) { if (runAction != null) { runAction?.Invoke(); runAction = null; SaveTransferToDB(); } } if (!timePassInfo.IsPassSet()) { continue; } transfersDel.Clear(); for (int ii = 0; ii < transfers.Count; ii++) { if (transfers[ii].sendCount <= 5) { if (string.IsNullOrEmpty(transfers[ii].unique)) { transfersDel.Add(transfers[ii]); continue; } var transfer = GetUniqueTransfer(rulerRpc, transfers[ii].unique); if (transfer != null) { if (transfer.data == transfers[ii].unique && transfer.height != 0) { transfers[ii].hash = transfer.hash; transfersDel.Add(transfers[ii]); } } } else { File.AppendAllText("./TransferBad.csv", JsonHelper.ToJson(transfers[ii]) + "\n", Encoding.UTF8); transfersDel.Add(transfers[ii]); } } using (DbSnapshot snapshot = Entity.Root.GetComponent <Pool>().PoolDBStore.GetSnapshot()) { bool remove = transfersDel.Count != 0; // Successfully deleted from table foreach (var it in transfersDel) { if (!string.IsNullOrEmpty(it.unique) && !string.IsNullOrEmpty(it.hash)) { snapshot.Add($"unique_{it.unique}", it.hash); // Add to transaction cross reference table } transfers.Remove(it); } if (remove) { snapshot.Commit(); } } accounts.Clear(); long curHeight = GetHeight(rulerRpc); if (curHeight == 0) { Log.Warning($"rulerRpc: {rulerRpc} can't connect"); continue; } // Start a new deal bool bSaveDb = false; for (int ii = transfers.Count - 1; ii >= 0; ii--) { if (transfers[ii].lastHeight < curHeight - 18 && transfers[ii].sendCount <= 5) { transfers[ii].lastHeight = curHeight; transfers[ii].sendCount++; if (BigHelper.Less(transfers[ii].amount, "0", true)) { transfers.RemoveAt(ii); continue; } Account account = null; if (!accounts.TryGetValue(transfers[ii].addressIn, out account)) { account = GetAccount(rulerRpc, transfers[ii].addressIn); if (account == null) { continue; } accounts.Add(transfers[ii].addressIn, account); } BlockSub transfer = new BlockSub(); transfer.addressIn = transfers[ii].addressIn; transfer.addressOut = transfers[ii].addressOut; transfer.amount = transfers[ii].amount; transfer.type = "transfer"; transfer.nonce = ++account.nonce; transfer.timestamp = TimeHelper.Now(); transfer.data = transfers[ii].unique; transfer.extend = new List <string>(); //transfer.extend.Add($"deadline:{curHeight + 16}"); transfer.extend.Add($"unique"); transfer.hash = transfer.ToHash(); transfer.sign = transfer.ToSign(Wallet.GetWallet().GetCurWallet()); //int rel = Entity.Root.GetComponent<Rule>().AddTransfer(transfer, false); int rel = SendTransfer(rulerRpc, transfer); if (rel == -1) { transfers[ii].sendCount--; continue; } if (rel != 1) { File.AppendAllText("./TransferBad.csv", JsonHelper.ToJson(transfers[ii]) + "\n", Encoding.UTF8); Log.Error($"TransferProcess: aAddTransfer Error! {rel}"); transfers.RemoveAt(ii); } bSaveDb = true; } } if (bSaveDb) { SaveTransferToDB(); } } catch (Exception) { Log.Warning($"TransferProcess throw Exception: {rulerRpc}"); } } }
public async void Run() { await Task.Delay(1000); LoadTransferFromDB(); List <TransferHandle> transfersDel = new List <TransferHandle>(); var rule = Entity.Root.GetComponent <Rule>(); while (true) { await Task.Delay(15000 * 6); // Query success using (var dbSnapshot = Entity.Root.GetComponent <LevelDBStore>().GetSnapshot(0)) { transfersDel.Clear(); for (int ii = 0; ii < transfers.Count; ii++) { if (transfers[ii].sendCount <= 5) { string hasht = dbSnapshot.Get($"unique_{transfers[ii].unique}"); if (!string.IsNullOrEmpty(hasht)) { var transfer = dbSnapshot.Transfers.Get(hasht); if (transfer != null) { if (transfer.data == transfers[ii].unique) { transfers[ii].hash = hasht; transfersDel.Add(transfers[ii]); } } } } else { transfersDel.Add(transfers[ii]); } } using (DbSnapshot snapshot = Entity.Root.GetComponent <Pool>().PoolDBStore.GetSnapshot()) { bool remove = transfersDel.Count != 0; // Successfully deleted from table foreach (var it in transfersDel) { if (!string.IsNullOrEmpty(it.unique) && !string.IsNullOrEmpty(it.hash)) { snapshot.Add($"unique_{it.unique}", it.hash); // Add to transaction cross reference table } transfers.Remove(it); } if (remove) { snapshot.Commit(); } } // Start a new deal for (int ii = transfers.Count - 1; ii >= 0; ii--) { if (transfers[ii].lastHeight < rule.height + 6 && transfers[ii].sendCount <= 5) { transfers[ii].lastHeight = rule.height; transfers[ii].sendCount++; var account = dbSnapshot.Accounts.Get(transfers[ii].addressIn); BlockSub transfer = new BlockSub(); transfer.addressIn = transfers[ii].addressIn; transfer.addressOut = transfers[ii].addressOut; transfer.amount = transfers[ii].amount; transfer.type = "transfer"; transfer.nonce = ++account.nonce; transfer.timestamp = TimeHelper.Now(); transfer.data = transfers[ii].unique; transfer.hash = transfer.ToHash(); transfer.sign = transfer.ToSign(Wallet.GetWallet().GetCurWallet()); dbSnapshot.Accounts.Add(transfers[ii].addressIn, account); // account.nonce Count accumulation int rel = Entity.Root.GetComponent <Rule>().AddTransfer(transfer); if (rel != 1) { Log.Error($"TransferProcess: aAddTransfer Error! {transfers[ii]}"); transfers.RemoveAt(ii); } } } } } }