def get_result(self, request: Request): version = request.operation.get(GET_TXN_AUTHOR_AGREEMENT_VERSION) digest = request.operation.get(GET_TXN_AUTHOR_AGREEMENT_DIGEST) timestamp = request.operation.get(GET_TXN_AUTHOR_AGREEMENT_TIMESTAMP) if version is not None: path = StaticTAAHelper.state_path_taa_version(version) digest, proof = self._get_value_from_state(path, with_proof=True) return self._return_txn_author_agreement(request, proof, digest=digest) if digest is not None: path = StaticTAAHelper.state_path_taa_digest(digest) data, proof = self._get_value_from_state(path, with_proof=True) return self._return_txn_author_agreement(request, proof, data=data) if timestamp is not None: head_hash = self.database_manager.ts_store.get_equal_or_prev( timestamp, CONFIG_LEDGER_ID) if head_hash is None: return self._return_txn_author_agreement(request, None) path = StaticTAAHelper.state_path_taa_latest() digest, proof = self._get_value_from_state(path, head_hash, with_proof=True) return self._return_txn_author_agreement(request, proof, head_hash=head_hash, digest=digest) path = StaticTAAHelper.state_path_taa_latest() digest, proof = self._get_value_from_state(path, with_proof=True) return self._return_txn_author_agreement(request, proof, digest=digest)
def test_update_state(txn_author_agreement_disable_handler, taa_disable_request, txn_author_agreement_handler, tconf, domain_state, taa_pp_time): # create TAAs taa_txns = [] taa_digests = [] taa_state_datas = [] for _ in list(range(5)): txn, digest, state_data = create_taa_txn( taa_request(tconf, domain_state, taa_pp_time), taa_pp_time) taa_txns.append(txn) taa_digests.append(digest) taa_state_datas.append(state_data) assert taa_txns # create a disable txn disable_seq_no = 1 disable_txn_time = get_utc_epoch() taa_disable_txn = reqToTxn(taa_disable_request) append_txn_metadata(taa_disable_txn, disable_seq_no, disable_txn_time) # set a TAAs for index, taa_txn in enumerate(taa_txns): txn_author_agreement_handler.update_state(taa_txn, None, None) check_taa_in_state( handler=txn_author_agreement_handler, digest=taa_digests[index], version=taa_state_datas[index][0][TXN_AUTHOR_AGREEMENT_VERSION], state_data=taa_state_datas[index]) assert txn_author_agreement_disable_handler.state.get( StaticTAAHelper.state_path_taa_latest(), isCommitted=False) == taa_digests[index].encode() # disable TAAs txn_author_agreement_disable_handler.update_state(taa_disable_txn, None, None) assert txn_author_agreement_disable_handler.state.get( StaticTAAHelper.state_path_taa_latest(), isCommitted=False) is None # set a TAAs for index, state_data in enumerate(taa_state_datas): state_value = state_data[0] state_value[TXN_AUTHOR_AGREEMENT_RETIREMENT_TS] = disable_txn_time check_taa_in_state(handler=txn_author_agreement_handler, digest=taa_digests[index], version=state_value[TXN_AUTHOR_AGREEMENT_VERSION], state_data=(state_data[0], disable_seq_no, disable_txn_time))
def test_update_state(txn_author_agreement_handler, taa_request): seq_no = 1 txn_time = 1560241033 txn_id = "id" txn = reqToTxn(taa_request) payload = get_payload_data(txn) text = payload[TXN_AUTHOR_AGREEMENT_TEXT] version = payload[TXN_AUTHOR_AGREEMENT_VERSION] digest = StaticTAAHelper.taa_digest(text, version) append_txn_metadata(txn, seq_no, txn_time, txn_id) state_value = { TXN_AUTHOR_AGREEMENT_TEXT: text, TXN_AUTHOR_AGREEMENT_VERSION: version } txn_author_agreement_handler.update_state(txn, None, taa_request) assert txn_author_agreement_handler.get_from_state( StaticTAAHelper.state_path_taa_digest(digest)) == (state_value, seq_no, txn_time) assert txn_author_agreement_handler.state.get( StaticTAAHelper.state_path_taa_latest()) == digest assert txn_author_agreement_handler.state.get( StaticTAAHelper.state_path_taa_version(version)) == digest
def _add_taa_to_state(self, digest, seq_no, txn_time, text, version, ratification_ts): self._set_taa_to_state(digest, seq_no, txn_time, text, version, ratification_ts) self.state.set(StaticTAAHelper.state_path_taa_version(version), digest) self.state.set(StaticTAAHelper.state_path_taa_latest(), digest)
def update_state(self, txn, prev_result, request, is_committed=False): self._validate_txn_type(txn) seq_no = get_seq_no(txn) txn_time = get_txn_time(txn) _, taa_list = self.state.generate_state_proof_for_keys_with_prefix( StaticTAAHelper.state_path_taa_digest(""), serialize=False, get_value=True) for encode_key, encode_data in taa_list.items(): taa = rlp_decode(encode_data) taa, last_seq_no, last_update_time = self._decode_state_value( taa[0]) digest = StaticTAAHelper.get_digest_from_state_key(encode_key) if TXN_AUTHOR_AGREEMENT_RETIREMENT_TS not in taa or taa.get( TXN_AUTHOR_AGREEMENT_RETIREMENT_TS, 0) > txn_time: self._set_taa_to_state( digest, seq_no, txn_time, taa[TXN_AUTHOR_AGREEMENT_TEXT], taa[TXN_AUTHOR_AGREEMENT_VERSION], taa.get(TXN_AUTHOR_AGREEMENT_RATIFICATION_TS, last_update_time), retirement_ts=txn_time) self.state.remove(StaticTAAHelper.state_path_taa_latest())
def additional_dynamic_validation(self, request: Request, req_pp_time: Optional[int]): if not self.state.get(StaticTAAHelper.state_path_taa_latest(), isCommitted=False): raise InvalidClientRequest( request.identifier, request.reqId, "Transaction author agreement is already disabled.")
def test_update_state(txn_author_agreement_handler, taa_request, taa_pp_time): txn, digest, state_data = create_taa_txn(taa_request, taa_pp_time) txn_author_agreement_handler.update_state(txn, None, taa_request) check_taa_in_state(handler=txn_author_agreement_handler, digest=digest, version=state_data[0][TXN_AUTHOR_AGREEMENT_VERSION], state_data=state_data) assert txn_author_agreement_handler.state.get( StaticTAAHelper.state_path_taa_latest(), isCommitted=False) == digest.encode()
def _update_txn_author_agreement(self, seq_no, txn_time, text, version): digest = StaticTAAHelper.taa_digest(text, version) data = encode_state_value( { TXN_AUTHOR_AGREEMENT_TEXT: text, TXN_AUTHOR_AGREEMENT_VERSION: version }, seq_no, txn_time, serializer=config_state_serializer) self.state.set(StaticTAAHelper.state_path_taa_digest(digest), data) self.state.set(StaticTAAHelper.state_path_taa_latest(), digest) self.state.set(StaticTAAHelper.state_path_taa_version(version), digest)
def update_state(self, txn, prev_result, request, is_committed=False): self._validate_txn_type(txn) payload = get_payload_data(txn) text = payload[TXN_AUTHOR_AGREEMENT_TEXT] version = payload[TXN_AUTHOR_AGREEMENT_VERSION] seq_no = get_seq_no(txn) txn_time = get_txn_time(txn) digest = StaticTAAHelper.taa_digest(text, version) data = encode_state_value({ TXN_AUTHOR_AGREEMENT_TEXT: text, TXN_AUTHOR_AGREEMENT_VERSION: version }, seq_no, txn_time, serializer=config_state_serializer) self.state.set(StaticTAAHelper.state_path_taa_digest(digest), data) self.state.set(StaticTAAHelper.state_path_taa_latest(), digest) self.state.set(StaticTAAHelper.state_path_taa_version(version), digest)
def test_dynamic_validation_update_with_retired_taa_off( txn_author_agreement_handler, domain_state, taa_request, taa_pp_time, set_aml, retired_time): txn, digest, state_data = create_taa_txn(taa_request, taa_pp_time) txn_author_agreement_handler.update_state(txn, None, taa_request) txn_author_agreement_handler.state.remove( StaticTAAHelper.state_path_taa_latest()) if retired_time != "without": taa_request.operation[ TXN_AUTHOR_AGREEMENT_RETIREMENT_TS] = retired_time with pytest.raises( InvalidClientRequest, match= "Retirement date cannot be changed when TAA enforcement is disabled." ): txn_author_agreement_handler.dynamic_validation( taa_request, taa_pp_time)
def test_dynamic_validation(txn_author_agreement_disable_handler, taa_disable_request): txn_author_agreement_disable_handler.state.set( StaticTAAHelper.state_path_taa_latest(), "{}") txn_author_agreement_disable_handler.dynamic_validation( taa_disable_request, 0)