def _apply_proposal(self, pubkey, config_proposal_data, state): config_proposal = ConfigProposal() config_proposal.ParseFromString(config_proposal_data) proposal_id = hashlib.sha256(config_proposal_data).hexdigest() approval_threshold = _get_approval_threshold(state) _validate_setting(config_proposal.setting, config_proposal.value) if approval_threshold >= 1: config_candidates = _get_config_candidates(state) existing_candidate = _first( config_candidates.candidates, lambda candidate: candidate.proposal_id == proposal_id) if existing_candidate is not None: raise InvalidTransaction('Duplicate proposal for {}'.format( config_proposal.setting)) record = ConfigCandidate.VoteRecord(public_key=pubkey, vote=ConfigVote.ACCEPT) config_candidates.candidates.add(proposal_id=proposal_id, proposal=config_proposal, votes=[record]) LOGGER.debug('Proposal made to set %s to %s', config_proposal.setting, config_proposal.value) _save_config_candidates(state, config_candidates) else: _set_config_value(state, config_proposal.setting, config_proposal.value)
def _apply_noauth_config(self, pubkey, config_payload, state): if config_payload.action == ConfigPayload.PROPOSE: config_proposal = ConfigProposal() config_proposal.ParseFromString(config_payload.data) _validate_setting(config_proposal.setting, config_proposal.value) _set_config_value(state, config_proposal.setting, config_proposal.value) else: raise InvalidTransaction("'action' must be PROPOSE in 'None' mode")