Exemplo n.º 1
0
        public static async Task <BlockWithTransactions> getTransactions(HexBigInteger blockNumber, Web3 web3)
        {
            var blockTransactions = await web3.Eth.Blocks.GetBlockWithTransactionsByNumber.SendRequestAsync(blockNumber);

            ExceptionDispatchInfo capturedException = null;

            try
            {
                while (blockTransactions == null)
                {
                    System.Threading.Thread.Sleep(5000);
                    Console.WriteLine("Block count 5000 ms");
                }

                return(blockTransactions);
            }
            catch (Exception ex)
            {
                capturedException = ExceptionDispatchInfo.Capture(ex);
                errors.Add(capturedException, blockNumber.ToUlong().ToString());
                return(null);
            }
        }
Exemplo n.º 2
0
        private async void DoWork(object state)
        {
            try
            {
                _timer.Change(Timeout.Infinite, Timeout.Infinite);
                _logger.LogInformation("EthWatcher is working");
                const string burnerContract = "0x0000000000000000000000000000000000000000";

                using (var scope = _services.CreateScope())
                {
                    using (var context = scope.ServiceProvider.GetService <Storage.KeepIndexerContext>())
                    {
                        var contract = context.Contract.FirstOrDefault(o => o.Active);
                        if (contract != null)
                        {
                            var           web3          = scope.ServiceProvider.GetService <Web3>();
                            var           etherScan     = scope.ServiceProvider.GetService <EtherScanClient>();
                            HexBigInteger toBlockNumber = await web3.Eth.Blocks.GetBlockNumber.SendRequestAsync();

                            if (contract.LastBlock == toBlockNumber.ToUlong())
                            {
                                return;
                            }

                            var result = await etherScan.GetErc20TokenTransfers(contract.Address, contract.LastBlock + 1, toBlockNumber.ToUlong(), limit : 5000);

                            foreach (var transfer in result.result)
                            {
                                if (transfer.value == 0 || context.Op.Any(o => o.Tx == transfer.hash))
                                {
                                    continue;
                                }
                                if (transfer.from == burnerContract ||
                                    transfer.to == burnerContract)
                                {
                                    var transaction = web3.Eth.Transactions.GetTransactionByHash.SendRequestAsync(transfer.hash).ConfigureAwait(true).GetAwaiter().GetResult();

                                    string tdt_id = "0x" + transaction.Input.Substring(34, 40);

                                    var op = new Storage.Op
                                    {
                                        Tx        = transfer.hash,
                                        Block     = transfer.blockNumber,
                                        Contract  = contract,
                                        Sender    = transaction.From.ToLower(),
                                        Amount    = result.result.Where(o => o.hash == transfer.hash).Sum(o => o.DecimalValue),
                                        TDT_ID    = tdt_id,
                                        Timestamp = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(transfer.timeStamp),
                                        Type      = transfer.from == burnerContract ? 0 : 1,
                                        TDTUsed   = transfer.to == burnerContract
                                    };
                                    context.Add(op);
                                    if (op.Type == 1)
                                    {
                                        var deposit = context.Op.FirstOrDefault(o => o.TDT_ID == op.TDT_ID && o.Type == 0);
                                        deposit.TDTUsed = true;
                                    }
                                    contract.LastBlock = op.Block;
                                    _logger.LogInformation(JsonConvert.SerializeObject(op));
                                    context.SaveChanges();
                                }
                            }
                            if (result.result.Count == 5000)
                            {
                                contract.LastBlock = result.result.Last().blockNumber;
                            }
                            else
                            {
                                contract.LastBlock = toBlockNumber.ToUlong();
                            }
                            context.SaveChanges();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                _logger.LogError(e, e.Message);
            }
            finally
            {
                _timer.Change(TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15));
            }
        }
Exemplo n.º 3
0
        public static MultiDimDictList errors = new MultiDimDictList(); //Keeps all the hashes that failed
        static void Main(string[] args)
        {
            string path           = @"C:\Users\jsveistrup\source\repos\QuorumResults\QuorumResults\";
            string fileName       = "5slaves_1000users_puretrans-200003-300002_1.xml";
            string outputFileName = "1000users_puretrans_part7";
            string nodeIp         = "51.141.118.214";

            if (args.Length != 0)
            {
                path           = args[0];
                fileName       = args[1];
                outputFileName = args[2];
                nodeIp         = args[3];
            }
            else
            {
                Console.WriteLine("No args has been inputed. Defaults loaded.");
            }


            Console.WriteLine("Starting: " + DateTime.Now);

            ArrayList inputs  = getHashsesAndTimestamps(path + fileName);
            ArrayList results = new ArrayList();


            var web3 = new Web3("http://" + nodeIp + ":22000");

            Console.WriteLine("Number of hashses found: " + inputs.Count.ToString());

            /*loops through all hashes in the result file and prepares the output array*/
            foreach (Result rsObj in inputs)
            {
                Boolean       skipToNextItem = false;
                HexBigInteger hexBlockNum    = getBlockNum(rsObj.hash, web3).Result;
                if (hexBlockNum != null)
                {
                    rsObj.blockNumber = (int)hexBlockNum.ToUlong();
                }
                else
                {
                    continue; //Error, and therefor skip to next item
                }


                /*Check if the block already has been retrieved */
                foreach (Result obj in results)
                {
                    if (obj.blockNumber == rsObj.blockNumber)
                    {
                        rsObj.txPerBlock     = obj.txPerBlock;
                        rsObj.minedTimestamp = obj.minedTimestamp;
                        break;
                    }
                    else
                    {
                        BlockWithTransactions bc = getTransactions(hexBlockNum, web3).Result;
                        if (bc != null)
                        {
                            rsObj.txPerBlock = bc.TransactionCount();
                            ulong ts = bc.Timestamp.ToUlong() * 1000; //multipies with 1000 to match format of sent timestamp
                            rsObj.minedTimestamp = ts.ToString();
                        }
                        else
                        {
                            skipToNextItem = true;
                            break;
                        }
                    }
                }

                //First time
                if (results.Count == 0)
                {
                    BlockWithTransactions bc = getTransactions(hexBlockNum, web3).Result;
                    rsObj.txPerBlock = bc.TransactionCount();
                    ulong ts = bc.Timestamp.ToUlong() * 1000; //multipies with 1000 to match format of sent timestamp
                    rsObj.minedTimestamp = ts.ToString();
                }

                if (!skipToNextItem)
                {
                    results.Add(rsObj);
                    writeToFile(rsObj, path, outputFileName);
                    Console.WriteLine("Count of results: " + results.Count.ToString() + ". Wrote to file: " + DateTime.Now + ": " + rsObj.hash + ", " + rsObj.sendTimestamp + ", " + rsObj.minedTimestamp + ", " + rsObj.blockNumber + ", " + rsObj.txPerBlock);
                }
                else
                {
                    Console.WriteLine("Error: " + rsObj.hash);
                }
            }

            Console.WriteLine("End: " + DateTime.Now);
        }