Exemplo n.º 1
0
        /// <summary>
        /// try to find "Transfer" event, then add record to db
        /// </summary>
        /// <param name="notification"></param>
        /// <param name="transaction"></param>
        /// <param name="block"></param>
        /// <param name="snapshot"></param>
        /// <returns></returns>
        private bool HasTransfer(NotificationInfo notification, Transaction transaction, Block block, SnapshotView snapshot)
        {
            var assetHash = UInt160.Parse(notification.Contract);
            var asset     = AssetCache.GetAssetInfo(assetHash, snapshot);

            if (asset == null)
            {
                //not nep5 asset
                return(false);
            }
            var notify = JStackItem.FromJson(notification.State);

            if (!(notify.Value is IList <JStackItem> notifyArray) || notifyArray.Count < 4)
            {
                return(false);
            }
            if (!"transfer".Equals(notifyArray[0].ValueString, StringComparison.OrdinalIgnoreCase))
            {
                return(false);
            }
            var from = notifyArray[1].Value as byte[];
            var to   = notifyArray[2].Value as byte[];

            if (from == null && to == null)
            {
                return(false);
            }
            if (!ConvertBigInteger(notifyArray[3], out var amount))
            {
                return(false);
            }

            var record = new TransferInfo
            {
                BlockHeight = block.Index,
                From        = from == null ? null : new UInt160(from),
                To          = to == null ? null : new UInt160(to),
                Asset       = asset.Asset,
                Amount      = amount,
                TxId        = transaction.Hash,
                TimeStamp   = block.Timestamp,
                AssetInfo   = asset,
            };

            _db.AddTransfer(record);

            if (record.From != null)
            {
                var fromBalance = record.From.GetBalanceOf(assetHash, snapshot);
                _db.UpdateBalance(record.From, asset, fromBalance.Value, snapshot.Height);
            }

            if (record.To != null && record.To != record.From)
            {
                var toBalance = record.To.GetBalanceOf(assetHash, snapshot);
                _db.UpdateBalance(record.To, asset, toBalance.Value, snapshot.Height);
            }
            return(true);
        }
Exemplo n.º 2
0
        private static void UpdateConsensusGas()
        {
            if (Blockchain.Singleton.Height > 0)
            {
                using var snapshot = Blockchain.Singleton.GetSnapshot();
                var validators = NativeContract.NEO.GetValidators(snapshot);
                var addresses  = new List <UInt160>();
                foreach (var ecPoint in validators)
                {
                    if (!_consensusMap.ContainsKey(ecPoint))
                    {
                        _consensusMap[ecPoint] = ecPoint.ToVerificationContract().ScriptHash;
                    }

                    addresses.Add(_consensusMap[ecPoint]);
                }
                using var db = new TrackDB();
                var gas      = AssetCache.GetAssetInfo(NativeContract.GAS.Hash);
                var balances = addresses.GetBalanceOf(NativeContract.GAS.Hash, snapshot);

                for (var index = 0; index < addresses.Count; index++)
                {
                    var address = addresses[index];
                    db.UpdateBalance(address, gas, balances[index].Value, snapshot.Height);
                }

                db.Commit();
            }
        }
Exemplo n.º 3
0
 private void UpdateBalance(UInt160 account, UInt160 asset, DataCache snapshot)
 {
     try
     {
         var balance = account.GetBalanceOf(asset, snapshot).Value;
         _db.UpdateBalance(account, asset, balance, snapshot.GetHeight());
     }
     catch
     {
         var backupBalance = _levelDb.GetBalance(account, asset);
         if (backupBalance != null)
         {
             _db.UpdateBalance(account, asset, backupBalance.Balance, backupBalance.Height);
         }
     }
 }