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(); } }
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."); } }
/// <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); } }
/// <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); } }