예제 #1
0
        protected override void Run(Session session, UnitSnapshotMsg message)
        {
            Debug.Log("Handle");
            ETModel.Game.Scene.GetComponent <LatencyComponent>().AddAMsgLan(message.Time - TimeHelper.GetCurrentTimeUnix());
            UnitComponent unitComponent = ETModel.Game.Scene.GetComponent <UnitComponent>();

            for (int i = 0; i < message.Units.Count; i++)
            {
                if (unitComponent.Get(message.Units[i].Id) == null)
                {
                    //UpdateInfo;
                    continue;
                }
                else
                {
                    Unit u = (unitComponent.Get(message.Units[i].Id));
                    u.mInputAssignment = (InputAssignment)message.Units[i].Info.InputAssignment;
                    //    u.GetComponent<FrameMoveComponent>().moveData.posX = message.Units[i].MoveComponentBytes.PosX;
                    //    u.GetComponent<FrameMoveComponent>().moveData.posY = message.Units[i].MoveComponentBytes.PosY;
                }
            }
        }
예제 #2
0
 public void Awake()
 {
     timer          = TimeSpanHelper.GetTimer(this.GetHashCode());
     timer.interval = restoreTimeSpan;
     timer.timing   = TimeHelper.Now();
 }
예제 #3
0
 public KService()
 {
     this.TimeNow = (uint)TimeHelper.Now();
     this.socket  = new UdpClient(new IPEndPoint(IPAddress.Any, 0));
     this.StartRecv();
 }
예제 #4
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}");
                }
            }
        }
예제 #5
0
 public long GetNodeTime()
 {
     return(TimeHelper.Now() + nodeTimeOffset);
 }
예제 #6
0
 public void AddSession(long id)
 {
     _sessionTimes.Add(id, TimeHelper.ClientNowSeconds());
 }
예제 #7
0
 public void Awake()
 {
     this.LastSendTime            = TimeHelper.Now();
     this.tcs                     = null;
     this.CancellationTokenSource = new CancellationTokenSource();
 }
예제 #8
0
        public async void Run(bool bRun)
        {
            await Task.Delay(1 * 1000);

            List <string> list = JsonHelper.FromJson <List <string> >(Program.jdNode["NodeSessions"].ToString());

            // Get Internet IP
            try
            {
                Session session = await networkInner.Get(NetworkHelper.ToIPEndPoint(list[0]));

                Q2P_IP_INFO qIPNode = new Q2P_IP_INFO();
                R2P_IP_INFO rIPNode = (R2P_IP_INFO)await session.Query(qIPNode, 0.3f);

                networkInner.ipEndPoint = NetworkHelper.ToIPEndPoint(GetIpV4() + ":" + networkInner.ipEndPoint.Port);
                if (rIPNode != null)
                {
                    networkInner.ipEndPoint = NetworkHelper.ToIPEndPoint(rIPNode.address + ":" + networkInner.ipEndPoint.Port);
                }
            }
            catch (Exception)
            {
            }
            Log.Info($"NodeManager  {networkInner.ipEndPoint.ToString()}");
            Log.Info($"NodeSessions {list[0]}");

            //
            Q2P_New_Node new_Node = new Q2P_New_Node();

            new_Node.ActorId    = GetMyNodeId();
            new_Node.address    = Wallet.GetWallet().GetCurWallet().ToAddress();
            new_Node.ipEndPoint = networkInner.ipEndPoint.ToString();

            long state     = 0;
            var  consensus = Entity.Root.GetComponent <Consensus>();

            if (consensus != null)
            {
                state |= consensus.transferShow ? EnumState.transferShow : 0;
                state |= consensus.openSyncFast ? EnumState.openSyncFast : 0;
            }
            state         |= Entity.Root.GetComponentInChild <RelayNetwork>() != null ? EnumState.RelayNetwork : 0;
            new_Node.state = state;

            while (bRun && list.Count > 0)
            {
                new_Node.version = NodeManager.networkIDCur;
                try
                {
                    for (int ii = 0; ii < list.Count; ii++)
                    {
                        bool bResponse = false;
                        new_Node.HashCode = StringHelper.HashCode(JsonHelper.ToJson(nodes));
                        Session session = await networkInner.Get(NetworkHelper.ToIPEndPoint(list[ii]));

                        if (session != null && session.IsConnect())
                        {
                            //Log.Debug($"NodeSessions connect " + r2P_New_Node.ActorId);
                            //session.Send(new_Node);

                            long         sendTime     = TimeHelper.Now();
                            R2P_New_Node r2P_New_Node = (R2P_New_Node)await session.Query(new_Node, 3f);

                            if (r2P_New_Node != null)
                            {
                                long timeNow = TimeHelper.Now();
                                nodeTimeOffset = (timeNow - sendTime) / 2 + r2P_New_Node.nodeTime - timeNow;
                                if (!string.IsNullOrEmpty(r2P_New_Node.Nodes))
                                {
                                    nodes = JsonHelper.FromJson <List <NodeData> >(r2P_New_Node.Nodes);
                                }
                                if (!string.IsNullOrEmpty(r2P_New_Node.Message))
                                {
                                    Log.Warning($"NodeSessions: {r2P_New_Node.Message}");
                                }
                                bResponse = true;
                            }
                        }
                        if (bResponse)
                        {
                            break;
                        }
                    }

                    // 等待5秒后关闭连接
                    await Task.Delay(5 * 1000);
                }
                catch (Exception)
                {
                    await Task.Delay(5 * 1000);
                }
            }
        }
예제 #9
0
 public void Send(IMessage message)
 {
     message.Time = TimeHelper.GetCurrentTimeUnix();
     this.Send(0x00, message);
 }
예제 #10
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);
                }
            }
        }
예제 #11
0
        // 开启协程移动,每100毫秒移动一次,并且协程取消的时候会计算玩家真实移动
        // 比方说玩家移动了250毫秒,玩家有新的目标,这时旧的移动协程结束,将计算250毫秒移动的位置,而不是300毫秒移动的位置
        public async ETTask StartMove(CancellationToken cancellationToken)
        {
            Unit unit = this.GetParent <Unit>();

            this.StartPos  = unit.Position;
            this.StartTime = TimeHelper.Now();
            float distance = (this.Target - this.StartPos).magnitude;

            if (Math.Abs(distance) < 0.1f)
            {
                return;
            }


            this.needTime = (long)(distance / this.moveSpeed * 1000);

            TimerComponent timerComponent = Game.Scene.GetComponent <TimerComponent>();

            // 协程如果取消,将算出玩家的真实位置,赋值给玩家
            cancellationToken.Register(() =>
            {
                long timeNow = TimeHelper.Now();
                if (timeNow - this.StartTime >= this.needTime)
                {
                    unit.Position = this.Target;

                    if (this.GetParent <Unit>().UnitType == UnitType.Player)
                    {
                        Console.WriteLine(" MoveComponent-77-unitPos: " + unit.UnitType + "  " + unit.Position.ToString());
                    }
                }
                else
                {
                    float amount  = (timeNow - this.StartTime) * 1f / this.needTime;
                    unit.Position = Vector3.Lerp(this.StartPos, this.Target, amount);

                    if (this.GetParent <Unit>().UnitType == UnitType.Player)
                    {
                        Console.WriteLine(" MoveComponent-87-unitPos: " + unit.UnitType + "  " + unit.Position.ToString());
                    }
                }
            });

            while (true)
            {
                await timerComponent.WaitAsync(50, cancellationToken); ///20190728 把50改为150 又改回为50

                long timeNow = TimeHelper.Now();

                if (timeNow - this.StartTime >= this.needTime)
                {
                    unit.Position = this.Target;

                    if (this.GetParent <Unit>().UnitType == UnitType.Player)
                    {
                        Console.WriteLine(" MoveComponent-104-unitPos: " + unit.UnitType + "  " + unit.Position.ToString());
                    }

                    break;
                }

                float amount = (timeNow - this.StartTime) * 1f / this.needTime;
                unit.Position = Vector3.Lerp(this.StartPos, this.Target, amount);
            }
        }
예제 #12
0
 public void Start()
 {
     this.startTime = TimeHelper.Now();
 }
예제 #13
0
 public void Awake()
 {
     this.m_lastSimulationStepTime = TimeHelper.Now();
 }
예제 #14
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);
                            }
                        }
                    }
                }
            }
        }