Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
                }
                ;
            }
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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 + "}}";
            }
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        // 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);
        }
Exemplo n.º 9
0
 static public bool AddBlockSub(this Block This, int ii, BlockSub transfer)
 {
     This.linkstran.Add(ii, transfer);
     return(true);
 }
Exemplo n.º 10
0
        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);
                }
            }
        }
Exemplo n.º 11
0
        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);
        }
Exemplo n.º 12
0
        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);
                }
            }
        }
Exemplo n.º 13
0
        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);
                }
            }
        }
Exemplo n.º 14
0
        // 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);
        }
Exemplo n.º 15
0
        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);
        }
Exemplo n.º 16
0
        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}");
                }
            }
        }
Exemplo n.º 17
0
        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);
                            }
                        }
                    }
                }
            }
        }