Example #1
0
        private static void ParseNeoBlock(ulong index)
        {
            var block = _getBlock(index);

            var txs = (JArray)block["tx"];

            for (int i = 0; i < txs.Count; i++)
            {
                var vout = (JArray)txs[i]["vout"];
                var txid = (string)txs[i]["txid"];

                if (neoTransRspList.Exists(x => x.txid == txid))
                {
                    continue;
                }

                for (int j = 0; j < vout.Count; j++)
                {
                    var address = (string)vout[j]["address"];

                    for (int k = 0; k < Config._neoAddrList.Count; k++)
                    {
                        if (address == Config._neoAddrList[k])
                        {
                            var assetId  = (string)vout[j]["asset"];
                            var neoTrans = new TransactionInfo();
                            if (assetId == Config._nep5TokenHashDict["neo_neo"])
                            {
                                neoTrans.coinType = "neo";
                            }
                            if (assetId == Config._nep5TokenHashDict["neo_gas"])
                            {
                                neoTrans.coinType = "gas";
                            }
                            neoTrans.toAddress    = address;
                            neoTrans.value        = (decimal)vout[j]["value"];
                            neoTrans.confirmCount = 1;
                            neoTrans.height       = index;
                            neoTrans.txid         = txid;

                            neoTransRspList.Add(neoTrans);
                            Logger.Info(index + " Have A NEO Transaction To:" + address + "; Value:" + neoTrans.value + "; Txid:" + neoTrans.txid);
                        }
                    }
                }
            }

            //int utxoDataHeight = 0;
            if (neoTransRspList.Count > 0)
            {
                TransSender.SendTransTimer(neoTransRspList);

                neoTransRspList.Clear();
            }
        }
Example #2
0
        private static void ProviderOperation()
        {
            TransSender client = new TransSender(Config.DefaultTransverterEndPoint);

            Config.Log(LogTypes.Operation, "provider working.");
            OutParam = client.Order(InParam);
            Config.Log(LogTypes.Operation, "provider work finish.");
            if (OutParam == null)
            {
                throw new Exception("provider client output paramter null.");
            }
        }
Example #3
0
        /// <summary>
        /// 解析比特币区块
        /// </summary>
        /// <param name="rpcC"></param>
        /// <param name="index">被解析区块</param>
        /// <param name="height">区块高度</param>
        /// <returns></returns>
        private static void ParseBtcBlock(NBitcoin.RPC.RPCClient rpcC, ulong index)
        {
            var block = rpcC.GetBlockAsync((int)index).Result;

            if (block.Transactions.Count > 0 && Config._btcAddrList.Count > 0)
            {
                for (var i = 0; i < block.Transactions.Count; i++)
                {
                    var tran = block.Transactions[i];
                    var txid = tran.GetHash().ToString();

                    //如果存在该 txid 了,说明这笔交易已经解析过了
                    if (btcTransRspList.Exists(x => x.txid == txid))
                    {
                        continue;
                    }
                    for (var vo = 0; vo < tran.Outputs.Count; vo++)
                    {
                        var vout    = tran.Outputs[vo];
                        var address = vout.ScriptPubKey.GetDestinationAddress(Config._nettype); //比特币地址和网络有关

                        for (int j = 0; j < Config._btcAddrList.Count; j++)
                        {
                            if (address?.ToString() == Config._btcAddrList[j])
                            {
                                var btcTrans = new TransactionInfo();
                                btcTrans.coinType     = "btc";
                                btcTrans.toAddress    = address.ToString();
                                btcTrans.value        = vout.Value.ToDecimal(MoneyUnit.BTC);
                                btcTrans.confirmCount = 1;
                                btcTrans.height       = index;
                                btcTrans.txid         = txid;

                                btcTransRspList.Add(btcTrans);
                                Logger.Info(index + " Have A BTC Transaction To:" + address + "; Value:" + btcTrans.value + "; Txid:" + btcTrans.txid);
                            }
                        }
                    }
                }
            }

            if (btcTransRspList.Count > 0)
            {
                //更新确认次数
                CheckBtcConfirm(btcTransRspList, index, rpcC);
                //发送和保存交易信息
                TransSender.SendTransTimer(btcTransRspList);
                //移除确认次数为 设定数量 和 0 的交易
                btcTransRspList.RemoveAll(x => x.confirmCount >= Config._confirmCountDict["btc"] || x.confirmCount == 0);
            }
        }
Example #4
0
        /// <summary>
        /// 解析ETH区块
        /// </summary>
        /// <param name="web3"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        private static void ParseEthBlock(Web3Geth web3, ulong index)
        {
            BlockWithTransactions block = web3.Eth.Blocks.GetBlockWithTransactionsByNumber.SendRequestAsync(new HexBigInteger(index)).Result;

            if (block.Transactions.Length > 0 && Config._ethAddrList.Count > 0)
            {
                batchGetReceipt.beginBuildPar();
                for (var i = 0; i < block.Transactions.Length; i++)
                {
                    var tran = block.Transactions[i];
                    var txid = tran.TransactionHash;

                    //如果存在该 txid 了,说明这笔交易已经解析过了
                    if (ethTransList.Exists(x => x.txid == txid))
                    {
                        continue;
                    }

                    //先處理ETH交易
                    if (tran.To != null && Config._ethAddrList.Contains(tran.To.ToLower()))
                    {
                        decimal v     = (decimal)tran.Value.Value;
                        decimal v2    = 1000000000000000000;
                        var     value = v / v2;

                        //最少充值金额0.01
                        if (value >= 0.01m)
                        {
                            var ethTrans = new TransactionInfo();
                            ethTrans.coinType     = "eth";
                            ethTrans.toAddress    = tran.To.ToString();
                            ethTrans.value        = value;
                            ethTrans.confirmCount = 1;
                            ethTrans.height       = index;
                            ethTrans.txid         = txid;

                            ethTransList.Add(ethTrans);
                            Logger.Info(index + " Have an " + ethTrans.coinType + " transaction to:" + ethTrans.toAddress + "; value:" + value + "; txid:" + ethTrans.txid);
                        }
                    }

                    //是我们监控的合约
                    if (tran.To != null && Config._erc20TokenHashDict.Values.Contains(tran.To.ToLower()))
                    {
                        batchGetReceipt.pushTxHash(txid);
                    }
                }
                batchGetReceipt.endBuildPar();

                //处理erc20交易
                Erc20TransProc(web3, index);
            }

            //Logger.Info("eth parse height:" + index + " Tx:" + block.Transactions.Length);

            if (ethTransList.Count > 0)
            {
                //更新确认次数
                CheckEthConfirm(ethTransList, index, web3);

                //发送和保存交易信息
                TransSender.SendTransTimer(ethTransList);

                //移除确认次数为 设定数量 和 0 的交易
                ethTransList.RemoveAll(x => x.confirmCount >= Config._confirmCountDict["eth"] || x.confirmCount == 0);
            }
        }