Exemple #1
0
        public JObject processClaimStatus(string mongodbConnStr, string mongodbDatabase, string txid, int n, string trTxid)
        {
            JObject ret        = new JObject();
            bool    result     = false;
            string  findFliter = "{txid:'" + txid + "',n:" + n + ",status:1}";
            JArray  array      = mh.GetData(mongodbConnStr, mongodbDatabase, "ProClaimgas", findFliter);

            if (array.Count == 0)
            {
                ret.Add("result", result);
                return(ret);
            }

            JObject txOb      = (JObject)array[0];
            int     status    = (int)txOb["status"];
            string  claimAddr = (string)txOb["claimAddr"];
            decimal gas       = (decimal)txOb["gas"];

            //2:已处理
            if (status == 2)
            {
                ret.Add("result", result);
                return(ret);
            }

            //根据trTxid查询交易是否是gas转账
            findFliter = "{txid:'" + trTxid + "'}";
            JArray txs = mh.GetData(mongodbConnStr, mongodbDatabase, "tx", findFliter);

            if (txs.Count > 0)
            {
                txOb = (JObject)txs[0];
                //ContractTransaction
                string type  = (string)txOb["type"];
                JArray vouts = (JArray)txOb["vout"];

                if (vouts.Count > 0 && type == "ContractTransaction")
                {
                    JObject voutOb  = (JObject)vouts[0];
                    string  address = (string)voutOb["address"];
                    decimal value   = (decimal)voutOb["value"];

                    if (address == claimAddr && gas.CompareTo(value) == 0)
                    {
                        var                client        = new MongoClient(mongodbConnStr);
                        var                database      = client.GetDatabase(mongodbDatabase);
                        var                coll          = database.GetCollection <ProClaimgas>("ProClaimgas");
                        BsonDocument       queryBson     = BsonDocument.Parse("{txid:'" + txid + "',n:" + n + ",status:1}");
                        List <ProClaimgas> queryBsonList = coll.Find(queryBson).ToList();

                        if (queryBsonList.Count > 0)
                        {
                            ProClaimgas pro = queryBsonList[0];
                            pro.status = 2;
                            pro.pro    = DateTime.Now;
                            coll.ReplaceOne(queryBson, pro);
                            result = true;
                        }
                    }
                }
            }
            ret.Add("result", result);
            return(ret);
        }
Exemple #2
0
        public JObject processSigleTx(string mongodbConnStr, string mongodbDatabase, string txid, int n)
        {
            decimal issueGas   = 0;
            string  findFliter = "{txid:'" + txid + "',n:" + n + ",'asset':'0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b'}";
            JArray  gasIssueJA = mh.GetData(mongodbConnStr, mongodbDatabase, "utxo", findFliter);
            JObject utxo       = (JObject)gasIssueJA[0];

            JObject gas   = new JObject();
            string  used  = (string)utxo["used"];
            int     start = (int)utxo["createHeight"];
            int     end   = -1;

            if (used.Length > 0)
            {
                end = (int)utxo["useHeight"] - 1; //转出的这块的gas属于转入地址
            }
            else
            {
                //未花费以目前高度计算
                end = (int)mh.Getdatablockheight(mongodbConnStr, mongodbDatabase).First()["blockDataHeight"];
            }
            int value = (int)utxo["value"];

            //转入的这个块,属于当前地址,由于差额计算方法,需要开始-1
            decimal issueSysfee = mh.GetTotalSysFeeByBlock(mongodbConnStr, mongodbDatabase, end) - mh.GetTotalSysFeeByBlock(mongodbConnStr, mongodbDatabase, start - 1);

            decimal issueGasInBlock = countGas(start, end);

            issueGas += (issueSysfee + issueGasInBlock) / 100000000 * value;

            ushort index    = (ushort)utxo["n"];
            string usedTxid = (string)utxo["used"];

            gas.Add("addr", (string)utxo["addr"]);
            gas.Add("txid", txid);
            gas.Add("n", index);
            gas.Add("gas", issueGas);

            string formatGas = DecimalToString(issueGas);

            Console.WriteLine("gas:" + issueGas + "/format gas:" + formatGas);

            //根据usedTxid查询原始转入地址
            //db.tx.find({"vin.0.txid":{$eq:"0x24b6752cd46aefdf036a86b8e05af7e024d15846e728d24e4a10c9e9ebf09927"}})
            findFliter = "{'vin.0.txid':{$eq:'" + usedTxid + "'}}";
            JArray result = mh.GetData(mongodbConnStr, mongodbDatabase, "tx", findFliter);

            if (result.Count > 0)
            {
                JObject txOb  = (JObject)result[0];
                JArray  vouts = (JArray)txOb["vout"];
                if (vouts.Count > 0)
                {
                    JObject voutOb    = (JObject)vouts[0];
                    string  claimAddr = (string)voutOb["address"];
                    int     v         = (int)voutOb["value"];

                    findFliter = "{txid:'" + txid + "',n:" + n + "}";
                    JArray array = mh.GetData(mongodbConnStr, mongodbDatabase, "ProClaimgas", findFliter);
                    if (array.Count > 0)
                    {
                        return(gas);
                    }
                    else
                    {
                        var         client        = new MongoClient(mongodbConnStr);
                        var         database      = client.GetDatabase(mongodbDatabase);
                        ProClaimgas pro           = new ProClaimgas(claimAddr, txid, index, usedTxid, v, issueGas, 1, DateTime.Now, DateTime.Now);
                        var         collectionPro = database.GetCollection <ProClaimgas>("ProClaimgas");
                        collectionPro.InsertOne(pro);
                    }
                }
            }
            return(gas);
        }