Ejemplo n.º 1
0
        private void DelegateResource(byte[] owner_address, byte[] receiver_address, bool is_bandwidth, long balance, long expire_time)
        {
            byte[] key = DelegatedResourceCapsule.CreateDatabaseKey(owner_address, receiver_address);
            DelegatedResourceCapsule delegated_resource = this.db_manager.DelegatedResource.Get(key);

            if (delegated_resource != null)
            {
                if (is_bandwidth)
                {
                    delegated_resource.AddFrozenBalanceForBandwidth(balance, expire_time);
                }
                else
                {
                    delegated_resource.AddFrozenBalanceForEnergy(balance, expire_time);
                }
            }
            else
            {
                delegated_resource = new DelegatedResourceCapsule(
                    ByteString.CopyFrom(owner_address),
                    ByteString.CopyFrom(receiver_address));
                if (is_bandwidth)
                {
                    delegated_resource.SetFrozenBalanceForBandwidth(balance, expire_time);
                }
                else
                {
                    delegated_resource.SetFrozenBalanceForEnergy(balance, expire_time);
                }
            }
            this.db_manager.DelegatedResource.Put(key, delegated_resource);

            DelegatedResourceAccountIndexCapsule delegate_account_index = this.db_manager.DelegateResourceAccountIndex.Get(owner_address);

            if (delegate_account_index == null)
            {
                delegate_account_index = new DelegatedResourceAccountIndexCapsule(
                    ByteString.CopyFrom(owner_address));
            }
            List <ByteString> to_accounts = new List <ByteString>(delegate_account_index.ToAccounts);

            if (!to_accounts.Contains(ByteString.CopyFrom(receiver_address)))
            {
                delegate_account_index.AddToAccount(ByteString.CopyFrom(receiver_address));
            }
            this.db_manager.DelegateResourceAccountIndex.Put(owner_address, delegate_account_index);


            delegate_account_index = this.db_manager.DelegateResourceAccountIndex.Get(receiver_address);
            if (delegate_account_index == null)
            {
                delegate_account_index = new DelegatedResourceAccountIndexCapsule(
                    ByteString.CopyFrom(receiver_address));
            }
            List <ByteString> fromAccountsList = delegate_account_index.FromAccounts;

            if (!fromAccountsList.Contains(ByteString.CopyFrom(owner_address)))
            {
                delegate_account_index.AddFromAccount(ByteString.CopyFrom(owner_address));
            }
            this.db_manager.DelegateResourceAccountIndex.Put(receiver_address, delegate_account_index);

            AccountCapsule receiver = this.db_manager.Account.Get(receiver_address);

            if (is_bandwidth)
            {
                receiver.AddAcquiredDelegatedFrozenBalanceForBandwidth(balance);
            }
            else
            {
                receiver.AddAcquiredDelegatedFrozenBalanceForEnergy(balance);
            }

            this.db_manager.Account.Put(receiver.CreateDatabaseKey(), receiver);
        }
Ejemplo n.º 2
0
        public override bool Execute(TransactionResultCapsule result)
        {
            long fee = CalcFee();
            UnfreezeBalanceContract unfreeze_balance_contract;

            try
            {
                unfreeze_balance_contract = contract.Unpack <UnfreezeBalanceContract>();
            }
            catch (InvalidProtocolBufferException e)
            {
                Logger.Debug(e.Message);
                result.SetStatus(fee, code.Failed);
                throw new ContractExeException(e.Message);
            }
            byte[] owner_address = unfreeze_balance_contract.OwnerAddress.ToByteArray();

            AccountCapsule account          = this.db_manager.Account.Get(owner_address);
            long           old_balance      = account.Balance;
            long           unfreeze_balance = 0L;

            byte[] receiver_address = unfreeze_balance_contract.ReceiverAddress.ToByteArray();
            if (receiver_address != null && receiver_address.Length > 0 && this.db_manager.DynamicProperties.SupportDR())
            {
                byte[] key = DelegatedResourceCapsule.CreateDatabaseKey(unfreeze_balance_contract.OwnerAddress.ToByteArray(),
                                                                        unfreeze_balance_contract.ReceiverAddress.ToByteArray());

                DelegatedResourceCapsule delegated_resource = this.db_manager.DelegatedResource.Get(key);
                AccountCapsule           receiver           = this.db_manager.Account.Get(receiver_address);

                switch (unfreeze_balance_contract.Resource)
                {
                case ResourceCode.Bandwidth:
                {
                    unfreeze_balance = delegated_resource.FrozenBalanceForBandwidth;
                    delegated_resource.SetFrozenBalanceForBandwidth(0, 0);
                    receiver.AddAcquiredDelegatedFrozenBalanceForBandwidth(-unfreeze_balance);
                    account.AddDelegatedFrozenBalanceForBandwidth(-unfreeze_balance);
                }
                break;

                case ResourceCode.Energy:
                {
                    unfreeze_balance = delegated_resource.FrozenBalanceForEnergy;
                    delegated_resource.SetFrozenBalanceForEnergy(0, 0);
                    receiver.AddAcquiredDelegatedFrozenBalanceForEnergy(-unfreeze_balance);
                    account.AddDelegatedFrozenBalanceForEnergy(-unfreeze_balance);
                }
                break;

                default:
                    break;
                }

                account.Balance = old_balance + unfreeze_balance;
                this.db_manager.Account.Put(receiver.CreateDatabaseKey(), receiver);

                if (delegated_resource.FrozenBalanceForBandwidth == 0 && delegated_resource.FrozenBalanceForEnergy == 0)
                {
                    this.db_manager.DelegatedResource.Delete(key);

                    DelegatedResourceAccountIndexCapsule delegate_account_index =
                        this.db_manager.DelegateResourceAccountIndex.Get(owner_address);

                    if (delegate_account_index != null)
                    {
                        List <ByteString> to_accounts = new List <ByteString>(delegate_account_index.ToAccounts);
                        to_accounts.Remove(ByteString.CopyFrom(receiver_address));

                        delegate_account_index.ToAccounts = to_accounts;
                        this.db_manager.DelegateResourceAccountIndex.Put(owner_address, delegate_account_index);
                    }

                    delegate_account_index = this.db_manager.DelegateResourceAccountIndex.Get(receiver_address);
                    if (delegate_account_index != null)
                    {
                        List <ByteString> from_accounts = new List <ByteString>(delegate_account_index.FromAccounts);
                        from_accounts.Remove(ByteString.CopyFrom(owner_address));

                        delegate_account_index.FromAccounts = from_accounts;
                        this.db_manager.DelegateResourceAccountIndex.Put(receiver_address, delegate_account_index);
                    }
                }
                else
                {
                    this.db_manager.DelegatedResource.Put(key, delegated_resource);
                }
            }
            else
            {
                switch (unfreeze_balance_contract.Resource)
                {
                case ResourceCode.Bandwidth:
                {
                    List <Frozen> frozens = new List <Frozen>();
                    frozens.AddRange(account.FrozenList);

                    long now = this.db_manager.GetHeadBlockTimestamp();
                    foreach (Frozen frozen in frozens)
                    {
                        if (frozen.ExpireTime <= now)
                        {
                            unfreeze_balance += frozen.FrozenBalance;
                            frozens.Remove(frozen);
                        }
                    }

                    account.Balance = old_balance + unfreeze_balance;
                    account.FrozenList.Clear();
                    account.FrozenList.AddRange(frozens);
                }
                break;

                case ResourceCode.Energy:
                {
                    unfreeze_balance = account.AccountResource.FrozenBalanceForEnergy.FrozenBalance;

                    account.AccountResource.FrozenBalanceForEnergy = new Frozen();
                    account.Balance = old_balance + unfreeze_balance;
                }
                break;

                default:
                    break;
                }
            }

            switch (unfreeze_balance_contract.Resource)
            {
            case ResourceCode.Bandwidth:
            {
                this.db_manager.DynamicProperties.AddTotalNetWeight(-unfreeze_balance / 1000_000L);
            }
            break;

            case ResourceCode.Energy:
            {
                this.db_manager.DynamicProperties.AddTotalEnergyWeight(-unfreeze_balance / 1000_000L);
            }
            break;

            default:
                break;
            }

            VotesCapsule votes = null;

            if (!this.db_manager.Votes.Contains(owner_address))
            {
                votes = new VotesCapsule(unfreeze_balance_contract.OwnerAddress, account.GetVotesList());
            }
            else
            {
                votes = this.db_manager.Votes.Get(owner_address);
            }

            account.ClearVotes();
            votes.ClearNewVotes();

            this.db_manager.Account.Put(owner_address, account);
            this.db_manager.Votes.Put(owner_address, votes);

            result.UnfreezeAmount = unfreeze_balance;
            result.SetStatus(fee, code.Sucess);

            return(true);
        }