コード例 #1
0
ファイル: RpcApiService.cs プロジェクト: lovecpus/mineral
        public static ProposalList GetListProposalPaginated(int offset, int limit)
        {
            if (offset < 0 || limit < 0)
            {
                throw new ArgumentException("offset and limit value must be >= 0");
            }

            long latest_num = Manager.Instance.DBManager.DynamicProperties.GetLatestProposalNum();

            if (latest_num <= offset)
            {
                throw new ArgumentException("latest num is " + latest_num + ". offset num  must be smaller than latest.");
            }

            limit = limit > Parameter.DatabaseParameters.PROPOSAL_COUNT_LIMIT_MAX ? Parameter.DatabaseParameters.PROPOSAL_COUNT_LIMIT_MAX : limit;
            long end = offset + limit;

            end = end > latest_num ? latest_num : end;

            ProposalList result = new ProposalList();

            for (int i = offset; i < end; i++)
            {
                ProposalCapsule exchange = Manager.Instance.DBManager.Proposal.Get(ProposalCapsule.CalculateDatabaseKey(i));
                if (exchange != null)
                {
                    result.Proposals.Add(exchange.Instance);
                }
            }

            return(result);
        }
コード例 #2
0
        public void ProcessProposal(ProposalCapsule proposal)
        {
            List <ByteString> active_witness = this.db_manager.WitnessSchedule.GetActiveWitnesses();

            if (proposal.HasMostApprovals(active_witness))
            {
                Logger.Info(
                    string.Format("Processing proposal,id:{0},it has received most approvals, "
                                  + "begin to set dynamic parameter:{1}, "
                                  + "and set proposal state as APPROVED",
                                  proposal.Id,
                                  proposal.Parameters));

                SetDynamicParameters(proposal);
                proposal.State = Protocol.Proposal.Types.State.Approved;
                this.db_manager.Proposal.Put(proposal.CreateDatabaseKey(), proposal);
            }
            else
            {
                Logger.Info(
                    string.Format("Processing proposal,id:{0}, "
                                  + "it has not received enough approvals, set proposal state as DISAPPROVED",
                                  proposal.Id));

                proposal.State = Protocol.Proposal.Types.State.Disapproved;
                this.db_manager.Proposal.Put(proposal.CreateDatabaseKey(), proposal);
            }
        }
コード例 #3
0
        public ProposalCapsule GetProposalCapsule(byte[] id)
        {
            ProposalCapsule result = null;
            Key             key    = new Key(id);

            if (this.proposal_cache.ContainsKey(key))
            {
                result = this.proposal_cache[key].ToCapsule <ProposalCapsule, Protocol.Proposal>();
            }
            else
            {
                if (this.parent != null)
                {
                    result = this.parent.GetProposalCapsule(id);
                }
                else
                {
                    result = this.db_manager.Proposal.Get(id);
                }

                if (result != null)
                {
                    this.proposal_cache.Add(key, Value.Create(result.Data));
                }
            }

            return(result);
        }
コード例 #4
0
        public override bool Execute(TransactionResultCapsule result)
        {
            long fee = CalcFee();

            try
            {
                ProposalCreateContract proposal_create_contract = this.contract.Unpack <ProposalCreateContract>();

                long id = Deposit == null?
                          this.db_manager.DynamicProperties.GetLatestProposalNum() + 1 : Deposit.GetLatestProposalNum() + 1;

                ProposalCapsule proposal = new ProposalCapsule(proposal_create_contract.OwnerAddress, id);

                proposal.Parameters = new Dictionary <long, long>(proposal_create_contract.Parameters);

                long now = this.db_manager.GetHeadBlockTimestamp();
                long maintenance_interval = Deposit == null?
                                            this.db_manager.DynamicProperties.GetMaintenanceTimeInterval() : Deposit.GetMaintenanceTimeInterval();

                proposal.CreateTime = now;

                long current_maintenance_time = Deposit == null?
                                                this.db_manager.DynamicProperties.GetNextMaintenanceTime() : Deposit.GetNextMaintenanceTime();

                long now3            = now + (int)Args.Instance.Block.ProposalExpireTime;
                long round           = (now3 - current_maintenance_time) / maintenance_interval;
                long expiration_time = current_maintenance_time + (round + 1) * maintenance_interval;
                proposal.ExpirationTime = expiration_time;

                if (Deposit == null)
                {
                    this.db_manager.Proposal.Put(proposal.CreateDatabaseKey(), proposal);
                    this.db_manager.DynamicProperties.PutLatestProposalNum(id);
                }
                else
                {
                    Deposit.PutProposalValue(proposal.CreateDatabaseKey(), proposal);
                    Deposit.PutDynamicPropertiesWithLatestProposalNum(id);
                }

                result.SetStatus(fee, code.Sucess);
            }
            catch (InvalidProtocolBufferException e)
            {
                Logger.Debug(e.Message);
                result.SetStatus(fee, code.Failed);
                throw new ContractExeException(e.Message);
            }
            return(true);
        }
コード例 #5
0
        public override bool Execute(TransactionResultCapsule result)
        {
            long fee = CalcFee();

            try
            {
                ProposalApproveContract proposal_approve_contract = this.contract.Unpack <ProposalApproveContract>();
                ProposalCapsule         proposal = Deposit == null?
                                                   this.db_manager.Proposal.Get(BitConverter.GetBytes(proposal_approve_contract.ProposalId))
                                                       : Deposit.GetProposalCapsule(BitConverter.GetBytes(proposal_approve_contract.ProposalId));

                ByteString committee_address = proposal_approve_contract.OwnerAddress;
                if (proposal_approve_contract.IsAddApproval)
                {
                    proposal.AddApproval(committee_address);
                }
                else
                {
                    proposal.RemoveApproval(committee_address);
                }

                if (Deposit == null)
                {
                    this.db_manager.Proposal.Put(proposal.CreateDatabaseKey(), proposal);
                }
                else
                {
                    deposit.PutProposalValue(proposal.CreateDatabaseKey(), proposal);
                }

                result.SetStatus(fee, code.Sucess);
            }
            catch (ItemNotFoundException e)
            {
                Logger.Debug(e.Message);
                result.SetStatus(fee, code.Failed);
                throw new ContractExeException(e.Message);
            }
            catch (InvalidProtocolBufferException e)
            {
                Logger.Debug(e.Message);
                result.SetStatus(fee, code.Failed);
                throw new ContractExeException(e.Message);
            }

            return(true);
        }
コード例 #6
0
        public override bool Execute(TransactionResultCapsule result)
        {
            long fee = CalcFee();

            try
            {
                ProposalDeleteContract proposal_delete_contract = this.contract.Unpack <ProposalDeleteContract>();
                ProposalCapsule        proposal = (Deposit == null) ?
                                                  this.db_manager.Proposal.Get(BitConverter.GetBytes(proposal_delete_contract.ProposalId))
                    : Deposit.GetProposalCapsule(BitConverter.GetBytes(proposal_delete_contract.ProposalId));

                proposal.State = Proposal.Types.State.Canceled;
                if (Deposit == null)
                {
                    this.db_manager.Proposal.Put(proposal.CreateDatabaseKey(), proposal);
                }
                else
                {
                    Deposit.PutProposalValue(proposal.CreateDatabaseKey(), proposal);
                }

                result.SetStatus(fee, code.Sucess);
            }
            catch (InvalidProtocolBufferException e)
            {
                Logger.Debug(e.Message);
                result.SetStatus(fee, code.Failed);
                throw new ContractExeException(e.Message);
            }
            catch (ItemNotFoundException e)
            {
                Logger.Debug(e.Message);
                result.SetStatus(fee, code.Failed);
                throw new ContractExeException(e.Message);
            }
            return(true);
        }
コード例 #7
0
        public override bool Validate()
        {
            if (this.contract == null)
            {
                throw new ContractValidateException("No contract!");
            }
            if (this.db_manager == null && (Deposit == null || Deposit.DBManager == null))
            {
                throw new ContractValidateException("No this.db_manager!");
            }
            if (this.contract.Is(ProposalDeleteContract.Descriptor))
            {
                ProposalDeleteContract contract = null;

                try
                {
                    contract = this.contract.Unpack <ProposalDeleteContract>();
                }
                catch (InvalidProtocolBufferException e)
                {
                    throw new ContractValidateException(e.Message);
                }

                byte[] owner_address = contract.OwnerAddress.ToByteArray();
                if (!Wallet.IsValidAddress(owner_address))
                {
                    throw new ContractValidateException("Invalid address");
                }

                if (Deposit != null)
                {
                    if (Deposit.GetAccount(owner_address) == null)
                    {
                        throw new ContractValidateException(
                                  ActuatorParameter.ACCOUNT_EXCEPTION_STR + owner_address.ToHexString() + ActuatorParameter.NOT_EXIST_STR);
                    }
                }
                else if (!this.db_manager.Account.Contains(owner_address))
                {
                    throw new ContractValidateException(
                              ActuatorParameter.ACCOUNT_EXCEPTION_STR + owner_address.ToHexString() + ActuatorParameter.NOT_EXIST_STR);
                }

                long latest_proposal = Deposit == null?
                                       this.db_manager.DynamicProperties.GetLatestProposalNum() : Deposit.GetLatestProposalNum();

                if (contract.ProposalId > latest_proposal)
                {
                    throw new ContractValidateException(
                              ActuatorParameter.PROPOSAL_EXCEPTION_STR + contract.ProposalId + ActuatorParameter.NOT_EXIST_STR);
                }

                ProposalCapsule proposal = null;
                try
                {
                    proposal = Deposit == null?
                               this.db_manager.Proposal.Get(BitConverter.GetBytes(contract.ProposalId))
                                   : Deposit.GetProposalCapsule(BitConverter.GetBytes(contract.ProposalId));
                }
                catch (ItemNotFoundException e)
                {
                    throw new ContractValidateException(
                              ActuatorParameter.PROPOSAL_EXCEPTION_STR + contract.ProposalId + ActuatorParameter.NOT_EXIST_STR, e);
                }

                long now = this.db_manager.GetHeadBlockTimestamp();
                if (!proposal.Address.SequenceEqual(contract.OwnerAddress))
                {
                    throw new ContractValidateException(
                              ActuatorParameter.PROPOSAL_EXCEPTION_STR + contract.ProposalId + "] " + "is not proposed by " + owner_address.ToHexString());
                }
                if (now >= proposal.ExpirationTime)
                {
                    throw new ContractValidateException(
                              ActuatorParameter.PROPOSAL_EXCEPTION_STR + contract.ProposalId + "] expired");
                }
                if (proposal.State == Proposal.Types.State.Canceled)
                {
                    throw new ContractValidateException(
                              ActuatorParameter.PROPOSAL_EXCEPTION_STR + contract.ProposalId + "] canceled");
                }
            }
            else
            {
                throw new ContractValidateException(
                          "contract type error,expected type [ProposalDeleteContract],real type[" + contract.GetType().Name + "]");
            }

            return(true);
        }
コード例 #8
0
        public void ProcessProposals()
        {
            long latest_num = this.db_manager.DynamicProperties.GetLatestProposalNum();

            if (latest_num == 0)
            {
                Logger.Info("latestProposalNum is 0,return");
                return;
            }

            long proposal_num = latest_num;

            ProposalCapsule proposal = null;

            while (proposal_num > 0)
            {
                try
                {
                    proposal = this.db_manager.Proposal.Get(ProposalCapsule.CalculateDatabaseKey(proposal_num));
                }
                catch (System.Exception e)
                {
                    Logger.Error(e.Message);
                    continue;
                }

                if (proposal.HasProcessed)
                {
                    Logger.Info(
                        string.Format("Proposal has processed,id:[{0}],skip it and before it",
                                      proposal.Id));
                    break;
                }

                if (proposal.HasCanceled)
                {
                    Logger.Info(
                        string.Format("Proposal has canceled,id:[{0}],skip it",
                                      proposal.Id));
                    proposal_num--;
                    continue;
                }

                long current_time = this.db_manager.DynamicProperties.GetNextMaintenanceTime();
                if (proposal.HasExpired(current_time))
                {
                    ProcessProposal(proposal);
                    proposal_num--;
                    continue;
                }

                proposal_num--;
                Logger.Info(
                    string.Format("Proposal has not expired,id:[{0}],skip it",
                                  proposal.Id));
            }

            Logger.Info(
                string.Format("Processing proposals done, oldest proposal[{0}]",
                              proposal_num));
        }
コード例 #9
0
        public void SetDynamicParameters(ProposalCapsule proposal)
        {
            foreach (KeyValuePair <long, long> pair in proposal.Instance.Parameters)
            {
                switch ((int)pair.Key)
                {
                case (0):
                {
                    this.db_manager.DynamicProperties.PutMaintenanceTimeInterval((int)pair.Value);
                }
                break;

                case (1):
                {
                    this.db_manager.DynamicProperties.PutAccountUpgradeCost((int)pair.Value);
                }
                break;

                case (2):
                {
                    this.db_manager.DynamicProperties.PutCreateAccountFee((int)pair.Value);
                }
                break;

                case (3):
                {
                    this.db_manager.DynamicProperties.PutTransactionFee((int)pair.Value);
                }
                break;

                case (4):
                {
                    this.db_manager.DynamicProperties.PutAssetIssueFee((int)pair.Value);
                }
                break;

                case (5):
                {
                    this.db_manager.DynamicProperties.PutWitnessPayPerBlock((int)pair.Value);
                }
                break;

                case (6):
                {
                    this.db_manager.DynamicProperties.PutWitnessStandbyAllowance((int)pair.Value);
                }
                break;

                case (7):
                {
                    this.db_manager.DynamicProperties.PutCreateNewAccountFeeInSystemContract((int)pair.Value);
                }
                break;

                case (8):
                {
                    this.db_manager.DynamicProperties.PutCreateNewAccountBandwidthRate((int)pair.Value);
                }
                break;

                case (9):
                {
                    this.db_manager.DynamicProperties.PutAllowCreationOfContracts((int)pair.Value);
                }
                break;

                case (10):
                {
                    if (this.db_manager.DynamicProperties.GetRemoveThePowerOfTheGr() == 0)
                    {
                        this.db_manager.DynamicProperties.PutRemoveThePowerOfTheGr((int)pair.Value);
                    }
                }
                break;

                case (11):
                {
                    this.db_manager.DynamicProperties.PutEnergyFee((int)pair.Value);
                }
                break;

                case (12):
                {
                    this.db_manager.DynamicProperties.PutExchangeCreateFee((int)pair.Value);
                }
                break;

                case (13):
                {
                    this.db_manager.DynamicProperties.PutMaxCpuTimeOfOneTx((int)pair.Value);
                }
                break;

                case (14):
                {
                    this.db_manager.DynamicProperties.PutAllowUpdateAccountName((int)pair.Value);
                }
                break;

                case (15):
                {
                    this.db_manager.DynamicProperties.PutAllowSameTokenName((int)pair.Value);
                }
                break;

                case (16):
                {
                    this.db_manager.DynamicProperties.PutAllowDelegateResource((int)pair.Value);
                }
                break;

                case (17):
                {
                    this.db_manager.DynamicProperties.PutTotalEnergyLimit((int)pair.Value);
                }
                break;

                case (18):
                {
                    this.db_manager.DynamicProperties.PutAllowTvmTransferTrc10((int)pair.Value);
                }
                break;

                case (19):
                {
                    this.db_manager.DynamicProperties.PutTotalEnergyLimit2((int)pair.Value);
                }
                break;

                case (20):
                {
                    if (this.db_manager.DynamicProperties.GetAllowMultiSign() == 0)
                    {
                        this.db_manager.DynamicProperties.PutAllowMultiSign((int)pair.Value);
                    }
                }
                break;

                case (21):
                {
                    if (this.db_manager.DynamicProperties.GetAllowAdaptiveEnergy() == 0)
                    {
                        this.db_manager.DynamicProperties.PutAllowAdaptiveEnergy((int)pair.Value);
                    }
                }
                break;

                case (22):
                {
                    this.db_manager.DynamicProperties.PutUpdateAccountPermissionFee((int)pair.Value);
                }
                break;

                case (23):
                {
                    this.db_manager.DynamicProperties.PutMultiSignFee((int)pair.Value);
                }
                break;

                case (24):
                {
                    this.db_manager.DynamicProperties.PutAllowProtoFilterNum((int)pair.Value);
                }
                break;

                case (25):
                {
                    this.db_manager.DynamicProperties.PutAllowAccountStateRoot((int)pair.Value);
                }
                break;

                case (26):
                {
                    this.db_manager.DynamicProperties.PutAllowTvmConstantinople((int)pair.Value);
                    this.db_manager.DynamicProperties.AddSystemContractAndSetPermission(48);
                }
                break;

                default:
                    break;
                }
            }
        }
コード例 #10
0
 public void PutProposalValue(byte[] address, ProposalCapsule proposal)
 {
     this.proposal_cache.Put(
         new Key(address),
         new Value(proposal.Data, ValueType.VALUE_TYPE_CREATE));
 }
コード例 #11
0
ファイル: ContractState.cs プロジェクト: lovecpus/mineral
 public void PutProposalValue(byte[] address, ProposalCapsule proposal)
 {
     this.deposit.PutProposalValue(address, proposal);
 }