コード例 #1
0
        public Task Init(Block block, DoubleEndorsingOperation doubleEndorsing)
        {
            DoubleEndorsing = doubleEndorsing;

            DoubleEndorsing.Block ??= block;
            DoubleEndorsing.Block.Baker ??= Cache.Accounts.GetDelegate(block.BakerId);

            DoubleEndorsing.Accuser ??= Cache.Accounts.GetDelegate(doubleEndorsing.AccuserId);
            DoubleEndorsing.Offender ??= Cache.Accounts.GetDelegate(doubleEndorsing.OffenderId);

            return(Task.CompletedTask);
        }
コード例 #2
0
ファイル: DoubleEndorsingCommit.cs プロジェクト: yepeek/tzkt
        public virtual Task Revert(Block block, DoubleEndorsingOperation doubleEndorsing)
        {
            #region init
            doubleEndorsing.Block ??= block;
            doubleEndorsing.Block.Baker ??= Cache.Accounts.GetDelegate(block.BakerId);

            doubleEndorsing.Accuser ??= Cache.Accounts.GetDelegate(doubleEndorsing.AccuserId);
            doubleEndorsing.Offender ??= Cache.Accounts.GetDelegate(doubleEndorsing.OffenderId);
            #endregion

            #region entities
            //var block = doubleEndorsing.Block;
            var accuser  = doubleEndorsing.Accuser;
            var offender = doubleEndorsing.Offender;

            //Db.TryAttach(block);
            Db.TryAttach(accuser);
            Db.TryAttach(offender);
            #endregion

            #region apply operation
            accuser.Balance       -= doubleEndorsing.AccuserReward;
            accuser.FrozenRewards -= doubleEndorsing.AccuserReward;

            offender.Balance        += doubleEndorsing.OffenderLostDeposit;
            offender.FrozenDeposits += doubleEndorsing.OffenderLostDeposit;
            offender.StakingBalance += doubleEndorsing.OffenderLostDeposit;

            offender.Balance       += doubleEndorsing.OffenderLostReward;
            offender.FrozenRewards += doubleEndorsing.OffenderLostReward;

            offender.Balance        += doubleEndorsing.OffenderLostFee;
            offender.FrozenFees     += doubleEndorsing.OffenderLostFee;
            offender.StakingBalance += doubleEndorsing.OffenderLostFee;

            accuser.DoubleEndorsingCount--;
            if (offender != accuser)
            {
                offender.DoubleEndorsingCount--;
            }
            #endregion

            Db.DoubleEndorsingOps.Remove(doubleEndorsing);
            return(Task.CompletedTask);
        }
コード例 #3
0
        public Task Init(Block block, RawOperation op, RawDoubleEndorsingEvidenceContent content)
        {
            DoubleEndorsing = new DoubleEndorsingOperation
            {
                Id        = Cache.AppState.NextOperationId(),
                Block     = block,
                Level     = block.Level,
                Timestamp = block.Timestamp,
                OpHash    = op.Hash,

                AccusedLevel = content.Op1.Operations.Level,
                Accuser      = block.Baker,
                Offender     = Cache.Accounts.GetDelegate(content.Metadata.BalanceUpdates.First(x => x.Change < 0).Target),

                AccuserReward       = content.Metadata.BalanceUpdates.Where(x => x.Change > 0).Sum(x => x.Change),
                OffenderLostDeposit = content.Metadata.BalanceUpdates.Where(x => x.Change < 0 && x is DepositsUpdate).Sum(x => - x.Change),
                OffenderLostReward  = content.Metadata.BalanceUpdates.Where(x => x.Change < 0 && x is RewardsUpdate).Sum(x => - x.Change),
                OffenderLostFee     = content.Metadata.BalanceUpdates.Where(x => x.Change < 0 && x is FeesUpdate).Sum(x => - x.Change)
            };

            return(Task.CompletedTask);
        }
コード例 #4
0
ファイル: DoubleEndorsingCommit.cs プロジェクト: yepeek/tzkt
        public virtual Task Apply(Block block, JsonElement op, JsonElement content)
        {
            #region init
            var balanceUpdates = content.Required("metadata").RequiredArray("balance_updates").EnumerateArray();

            var offenderAddr = balanceUpdates
                               .First(x => x.RequiredInt64("change") < 0).RequiredString("delegate");

            var rewards = balanceUpdates
                          .FirstOrDefault(x => x.RequiredString("category")[0] == 'r' && x.RequiredInt64("change") > 0);

            var lostDeposits = balanceUpdates
                               .FirstOrDefault(x => x.RequiredString("category")[0] == 'd' && x.RequiredInt64("change") < 0);

            var lostRewards = balanceUpdates
                              .FirstOrDefault(x => x.RequiredString("category")[0] == 'r' && x.RequiredInt64("change") < 0);

            var lostFees = balanceUpdates
                           .FirstOrDefault(x => x.RequiredString("category")[0] == 'f' && x.RequiredInt64("change") < 0);

            var doubleEndorsing = new DoubleEndorsingOperation
            {
                Id        = Cache.AppState.NextOperationId(),
                Block     = block,
                Level     = block.Level,
                Timestamp = block.Timestamp,
                OpHash    = op.RequiredString("hash"),

                AccusedLevel = content.Required("op1").Required("operations").RequiredInt32("level"),
                Accuser      = block.Baker,
                Offender     = Cache.Accounts.GetDelegate(offenderAddr),

                AccuserReward       = rewards.ValueKind != JsonValueKind.Undefined ? rewards.RequiredInt64("change") : 0,
                OffenderLostDeposit = lostDeposits.ValueKind != JsonValueKind.Undefined ? -lostDeposits.RequiredInt64("change") : 0,
                OffenderLostReward  = lostRewards.ValueKind != JsonValueKind.Undefined ? -lostRewards.RequiredInt64("change") : 0,
                OffenderLostFee     = lostFees.ValueKind != JsonValueKind.Undefined ? -lostFees.RequiredInt64("change") : 0,
            };
            #endregion

            #region entities
            //var block = doubleEndorsing.Block;
            var accuser  = doubleEndorsing.Accuser;
            var offender = doubleEndorsing.Offender;

            //Db.TryAttach(block);
            Db.TryAttach(accuser);
            Db.TryAttach(offender);
            #endregion

            #region apply operation
            accuser.Balance       += doubleEndorsing.AccuserReward;
            accuser.FrozenRewards += doubleEndorsing.AccuserReward;

            offender.Balance        -= doubleEndorsing.OffenderLostDeposit;
            offender.FrozenDeposits -= doubleEndorsing.OffenderLostDeposit;
            offender.StakingBalance -= doubleEndorsing.OffenderLostDeposit;

            offender.Balance       -= doubleEndorsing.OffenderLostReward;
            offender.FrozenRewards -= doubleEndorsing.OffenderLostReward;

            offender.Balance        -= doubleEndorsing.OffenderLostFee;
            offender.FrozenFees     -= doubleEndorsing.OffenderLostFee;
            offender.StakingBalance -= doubleEndorsing.OffenderLostFee;

            accuser.DoubleEndorsingCount++;
            if (offender != accuser)
            {
                offender.DoubleEndorsingCount++;
            }

            block.Operations |= Operations.DoubleEndorsings;
            #endregion

            Db.DoubleEndorsingOps.Add(doubleEndorsing);
            return(Task.CompletedTask);
        }
コード例 #5
0
        public static async Task <DoubleEndorsingCommit> Revert(ProtocolHandler proto, Block block, DoubleEndorsingOperation op)
        {
            var commit = new DoubleEndorsingCommit(proto);
            await commit.Init(block, op);

            await commit.Revert();

            return(commit);
        }