Skip to content
This repository has been archived by the owner on Apr 17, 2019. It is now read-only.

Commit

Permalink
Proposal and block txs validation (#1506)
Browse files Browse the repository at this point in the history
* Update proposal and block validators

Signed-off-by: kamilsa <kamilsa16@gmail.com>
  • Loading branch information
kamilsa authored and l4l committed Jul 25, 2018
1 parent de433dd commit 2c674f3
Show file tree
Hide file tree
Showing 11 changed files with 151 additions and 38 deletions.
15 changes: 14 additions & 1 deletion shared_model/interfaces/iroha_internal/transaction_sequence.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,34 @@
*/

#include "interfaces/iroha_internal/transaction_sequence.hpp"
#include "validators/field_validator.hpp"
#include "validators/transaction_validator.hpp"

namespace shared_model {
namespace interface {

template <typename TransactionValidator>
iroha::expected::Result<TransactionSequence, std::string>
TransactionSequence::createTransactionSequence(
const types::TransactionsForwardCollectionType &transactions,
const validation::TransactionsCollectionValidator &validator) {
const validation::TransactionsCollectionValidator<TransactionValidator>
&validator) {
auto answer = validator.validate(transactions);
if (answer.hasErrors()) {
return iroha::expected::makeError(answer.reason());
}
return iroha::expected::makeValue(TransactionSequence(transactions));
}

template iroha::expected::Result<TransactionSequence, std::string>
TransactionSequence::createTransactionSequence(
const types::TransactionsForwardCollectionType &transactions,
const validation::TransactionsCollectionValidator<
validation::TransactionValidator<
validation::FieldValidator,
validation::CommandValidatorVisitor<
validation::FieldValidator>>> &validator);

types::TransactionsForwardCollectionType
TransactionSequence::transactions() {
return transactions_;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@ namespace shared_model {
* @return Result containing transaction sequence if validation successful
* and string message containing error otherwise
*/
template <typename TransactionValidator>
static iroha::expected::Result<TransactionSequence, std::string>
createTransactionSequence(
const types::TransactionsForwardCollectionType &transactions,
const validation::TransactionsCollectionValidator &validator);
const validation::TransactionsCollectionValidator<
TransactionValidator> &validator);

/**
* Get transactions collection
Expand Down
21 changes: 13 additions & 8 deletions shared_model/validators/block_validator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,21 +33,26 @@ namespace shared_model {
/**
* Class that validates block
*/
template <typename FieldValidator, typename TransactionValidator>
class BlockValidator : public ContainerValidator<interface::Block,
FieldValidator,
TransactionValidator> {
template <typename FieldValidator,
typename TransactionValidator,
typename TransactionsCollectionValidator>
class BlockValidator
: public ContainerValidator<interface::Block,
FieldValidator,
TransactionValidator,
TransactionsCollectionValidator> {
public:
/**
* Applies validation on block
* @param block
* @return Answer containing found error if any
*/
Answer validate(const interface::Block &block) const {
return ContainerValidator<interface::Block,
FieldValidator,
TransactionValidator>::validate(block,
"Block");
return ContainerValidator<
interface::Block,
FieldValidator,
TransactionValidator,
TransactionsCollectionValidator>::validate(block, "Block");
}
};

Expand Down
19 changes: 14 additions & 5 deletions shared_model/validators/container_validator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ namespace shared_model {
*/
template <typename Iface,
typename FieldValidator,
typename TransactionValidator>
typename TransactionValidator,
typename TransactionsCollectionValidator>
class ContainerValidator {
protected:
void validateTransaction(
Expand All @@ -50,18 +51,25 @@ namespace shared_model {
ReasonsGroupType &reason,
const interface::types::TransactionsCollectionType &transactions)
const {
for (const auto &tx : transactions) {
validateTransaction(reason, tx);
auto answer = transactions_collection_validator_.validate(transactions);
if (answer.hasErrors()) {
reason.second.push_back(answer.reason());
}
}

public:
ContainerValidator(
explicit ContainerValidator(
const TransactionsCollectionValidator
&transactions_collection_validator =
TransactionsCollectionValidator(),
const TransactionValidator &transaction_validator =
TransactionValidator(),
const FieldValidator &field_validator = FieldValidator())
: transaction_validator_(transaction_validator),
: transactions_collection_validator_(
transactions_collection_validator),
transaction_validator_(transaction_validator),
field_validator_(field_validator) {}

Answer validate(const Iface &cont, std::string reason_name) const {
Answer answer;
ReasonsGroupType reason;
Expand All @@ -76,6 +84,7 @@ namespace shared_model {
}

private:
TransactionsCollectionValidator transactions_collection_validator_;
TransactionValidator transaction_validator_;

protected:
Expand Down
22 changes: 13 additions & 9 deletions shared_model/validators/default_validator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,29 @@
#include "validators/query_validator.hpp"
#include "validators/signable_validator.hpp"
#include "validators/transaction_validator.hpp"
#include "validators/transactions_collection/signed_transactions_collection_validator.hpp"
#include "validators/transactions_collection/unsigned_transactions_collection_validator.hpp"

namespace shared_model {
namespace validation {
using DefaultTransactionValidator =
TransactionValidator<FieldValidator,
CommandValidatorVisitor<FieldValidator>>;

using DefaultQueryValidator =
QueryValidator<FieldValidator, QueryValidatorVisitor<FieldValidator>>;

using DefaultBlocksQueryValidator = BlocksQueryValidator<FieldValidator>;
using DefaultProposalValidator =
ProposalValidator<FieldValidator, DefaultTransactionValidator>;

using DefaultBlockValidator =
BlockValidator<FieldValidator, DefaultTransactionValidator>;
using DefaultProposalValidator = ProposalValidator<
FieldValidator,
DefaultTransactionValidator,
UnsignedTransactionsCollectionValidator<DefaultTransactionValidator>>;

using DefaultBlockValidator = BlockValidator<
FieldValidator,
DefaultTransactionValidator,
SignedTransactionsCollectionValidator<DefaultTransactionValidator>>;

using DefaultEmptyBlockValidator = EmptyBlockValidator<FieldValidator>;

Expand All @@ -57,11 +66,6 @@ namespace shared_model {
const interface::Query &,
FieldValidator>;

using DefaultSignableProposalValidator =
SignableModelValidator<DefaultProposalValidator,
const interface::Proposal &,
FieldValidator>;

using DefaultSignableBlockValidator =
SignableModelValidator<DefaultBlockValidator,
const interface::Block &,
Expand Down
21 changes: 13 additions & 8 deletions shared_model/validators/proposal_validator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,21 +33,26 @@ namespace shared_model {
/**
* Class that validates proposal
*/
template <typename FieldValidator, typename TransactionValidator>
class ProposalValidator : public ContainerValidator<interface::Proposal,
FieldValidator,
TransactionValidator> {
template <typename FieldValidator,
typename TransactionValidator,
typename TransactionsCollectionValidator>
class ProposalValidator
: public ContainerValidator<interface::Proposal,
FieldValidator,
TransactionValidator,
TransactionsCollectionValidator> {
public:
/**
* Applies validation on proposal
* @param proposal
* @return Answer containing found error if any
*/
Answer validate(const interface::Proposal &prop) const {
return ContainerValidator<interface::Proposal,
FieldValidator,
TransactionValidator>::validate(prop,
"Proposal");
return ContainerValidator<
interface::Proposal,
FieldValidator,
TransactionValidator,
TransactionsCollectionValidator>::validate(prop, "Proposal");
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,44 @@

#include "validators/transactions_collection/signed_transactions_collection_validator.hpp"

#include <boost/format.hpp>
#include "validators/field_validator.hpp"
#include "validators/transaction_validator.hpp"

namespace shared_model {
namespace validation {

Answer SignedTransactionsCollectionValidator::validate(
template <typename TransactionValidator>
Answer
SignedTransactionsCollectionValidator<TransactionValidator>::validate(
const interface::types::TransactionsForwardCollectionType &transactions)
const {
return Answer();
ReasonsGroupType reason;
reason.first = "Transaction list";
for (const auto &tx : transactions) {
auto answer =
SignedTransactionsCollectionValidator::transaction_validator_
.validate(tx);
if (answer.hasErrors()) {
auto message =
(boost::format("Tx %s : %s") % tx.hash().hex() % answer.reason())
.str();
reason.second.push_back(message);
}
}

Answer res;
if (not reason.second.empty()) {
res.addReason(std::move(reason));
}
return res;
}

template Answer SignedTransactionsCollectionValidator<
TransactionValidator<FieldValidator,
CommandValidatorVisitor<FieldValidator>>>::
validate(const interface::types::TransactionsForwardCollectionType
&transactions) const;

} // namespace validation
} // namespace shared_model
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@ namespace shared_model {
* transaction from the collection to be unsigned. Batch logic should be
* checked
*/
template <typename TransactionValidator>
class SignedTransactionsCollectionValidator
: public TransactionsCollectionValidator {
: public TransactionsCollectionValidator<TransactionValidator> {
public:
using TransactionsCollectionValidator<
TransactionValidator>::TransactionsCollectionValidator;
Answer validate(const interface::types::TransactionsForwardCollectionType
&transactions) const override;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,17 @@ namespace shared_model {
* Validator of transaction's collection, this is not fair implementation
* now, it always returns empty answer
*/
template <typename TransactionValidator>
class TransactionsCollectionValidator {
protected:
TransactionValidator transaction_validator_;

public:
TransactionsCollectionValidator(
const TransactionValidator &transactions_validator =
TransactionValidator())
: transaction_validator_(transactions_validator) {}

/**
* Validates collection of transactions
* @param transactions collection of transactions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,44 @@

#include "validators/transactions_collection/unsigned_transactions_collection_validator.hpp"

#include <boost/format.hpp>
#include "validators/field_validator.hpp"
#include "validators/transaction_validator.hpp"

namespace shared_model {
namespace validation {

Answer UnsignedTransactionsCollectionValidator::validate(
template <typename TransactionValidator>
Answer
UnsignedTransactionsCollectionValidator<TransactionValidator>::validate(
const interface::types::TransactionsForwardCollectionType &transactions)
const {
return Answer();
ReasonsGroupType reason;
reason.first = "Transaction list";
for (const auto &tx : transactions) {
auto answer =
UnsignedTransactionsCollectionValidator::transaction_validator_
.validate(tx);
if (answer.hasErrors()) {
auto message =
(boost::format("Tx %s : %s") % tx.hash().hex() % answer.reason())
.str();
reason.second.push_back(message);
}
}

Answer res;
if (not reason.second.empty()) {
res.addReason(std::move(reason));
}
return res;
}

template Answer UnsignedTransactionsCollectionValidator<
TransactionValidator<FieldValidator,
CommandValidatorVisitor<FieldValidator>>>::
validate(const interface::types::TransactionsForwardCollectionType
&transactions) const;

} // namespace validation
} // namespace shared_model
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@ namespace shared_model {
* Unsigned transactions collection validator allows to some transaction
* from the collection to be unsigned. Batch logic should be checked
*/
template <typename TransactionValidator>
class UnsignedTransactionsCollectionValidator
: public TransactionsCollectionValidator {
: public TransactionsCollectionValidator<TransactionValidator> {
public:
using TransactionsCollectionValidator<
TransactionValidator>::TransactionsCollectionValidator;
Answer validate(const interface::types::TransactionsForwardCollectionType
&transactions) const override;
};
Expand Down

0 comments on commit 2c674f3

Please sign in to comment.