Esempio n. 1
0
    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)
Esempio n. 2
0
    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")