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