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); }
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); } }
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); }
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); }
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); }
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); }
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); }
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)); }
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; } } }
public void PutProposalValue(byte[] address, ProposalCapsule proposal) { this.proposal_cache.Put( new Key(address), new Value(proposal.Data, ValueType.VALUE_TYPE_CREATE)); }
public void PutProposalValue(byte[] address, ProposalCapsule proposal) { this.deposit.PutProposalValue(address, proposal); }