6 #ifndef IROHA_SHARED_MODEL_TRANSACTION_VALIDATOR_HPP 7 #define IROHA_SHARED_MODEL_TRANSACTION_VALIDATOR_HPP 9 #include <boost/range/adaptor/indexed.hpp> 10 #include <boost/variant.hpp> 40 namespace validation {
42 struct ValidatorsConfig;
50 template <
typename FieldVal
idator>
52 :
public boost::static_visitor<std::optional<ValidationError>> {
54 : validator_(std::move(validator)) {}
88 if (call_engine.
callee()) {
90 call_engine.
callee().value().get());
93 interface::types::EvmCodeHexStringView{call_engine.
input()});
94 return std::move(error_creator).getValidationError(
"CallEngine");
143 return std::move(error_creator).getValidationError(
"CreateRole");
200 set_account_detail.
value())});
216 "SubtractAssetQuantity",
226 {[&]() -> std::optional<std::string> {
230 "Source and destination accounts are the same."};
243 &compare_and_set_account_detail)
const {
244 using iroha::operator|;
246 "CompareAndSetAccountDetail",
249 compare_and_set_account_detail.
accountId()),
251 compare_and_set_account_detail.
key()),
253 compare_and_set_account_detail.
value()),
254 compare_and_set_account_detail.
oldValue() |
256 const auto &oldValue) -> std::optional<ValidationError> {
275 template <
typename FieldVal
idator,
typename CommandVal
idator>
279 template <
typename CreatedTimeVal
idator>
280 std::optional<ValidationError> validateImpl(
282 CreatedTimeValidator &&validator)
const {
283 using iroha::operator|;
289 "Transaction must contain at least one command.");
295 std::forward<CreatedTimeValidator>(validator)(tx.
createdTime());
296 error_creator |= field_validator_.validateQuorum(tx.
quorum());
297 error_creator |= tx.
batchMeta() | [
this](
const auto &batch_meta) {
298 return field_validator_.validateBatchMeta(*batch_meta);
301 for (
const auto &cmd : tx.
commands() | boost::adaptors::indexed(1)) {
302 boost::apply_visitor(command_validator_visitor_, cmd.value().get()) |
303 [&cmd, &error_creator](
auto error) {
305 std::string{
"Command #"} + std::to_string(cmd.index()),
316 const std::shared_ptr<ValidatorsConfig> &config)
317 : field_validator_(config), command_validator_visitor_(config) {}
326 return validateImpl(tx, [
this](
auto time) {
327 return field_validator_.validateCreatedTime(time);
338 return validateImpl(tx, [
this, current_timestamp](
auto time) {
339 return field_validator_.validateCreatedTime(time, current_timestamp);
351 #endif // IROHA_SHARED_MODEL_TRANSACTION_VALIDATOR_HPP
std::optional< ValidationError > validatePubkey(std::string_view pubkey) const
Definition: field_validator.cpp:167
Definition: compare_and_set_account_detail.hpp:21
virtual const types::AccountIdType & accountId() const =0
virtual const types::RoleIdType & roleName() const =0
std::optional< ValidationError > validateEvmHexAddress(std::string_view address) const
Definition: field_validator.cpp:139
Definition: add_signatory.hpp:19
virtual const types::AccountIdType & srcAccountId() const =0
std::optional< ValidationError > operator()(const interface::CreateRole &create_role) const
Definition: transaction_validator.hpp:135
ValidationErrorCreator & addChildError(ValidationError error)
Add a child error.
Definition: validation_error_helpers.cpp:28
std::optional< ValidationError > operator()(const interface::AddPeer &add_peer) const
Definition: transaction_validator.hpp:69
virtual const interface::Peer & peer() const =0
Represents a validation error.
Definition: validation_error.hpp:19
std::optional< ValidationError > validateAssetName(const interface::types::AssetNameType &asset_name) const
Definition: field_validator.cpp:200
virtual const types::AccountIdType & destAccountId() const =0
virtual types::QuorumType quorum() const =0
std::optional< ValidationError > validatePeer(const interface::Peer &peer) const
Definition: field_validator.cpp:150
Definition: set_quorum.hpp:18
std::optional< ValidationError > operator()(const interface::CompareAndSetAccountDetail &compare_and_set_account_detail) const
Definition: transaction_validator.hpp:241
std::optional< ValidationError > operator()(const interface::CreateAccount &create_account) const
Definition: transaction_validator.hpp:106
virtual const types::AccountIdType & accountId() const =0
Definition: subtract_asset_quantity.hpp:20
virtual const types::AccountDetailValueType & value() const =0
std::optional< ValidationError > operator()(const interface::RevokePermission &revoke_permission) const
Definition: transaction_validator.hpp:182
std::optional< ValidationError > validate(const interface::Transaction &tx) const override
Definition: transaction_validator.hpp:324
TransactionValidator(const std::shared_ptr< ValidatorsConfig > &config)
Definition: transaction_validator.hpp:315
std::optional< ValidationError > operator()(const interface::CreateAsset &create_asset) const
Definition: transaction_validator.hpp:116
Definition: abstract_validator.hpp:17
std::optional< ValidationError > validateGrantablePermission(const interface::permissions::Grantable &permission) const
Definition: field_validator.cpp:246
Definition: set_setting_value.hpp:19
std::optional< ValidationError > operator()(const interface::AddSignatory &add_signatory) const
Definition: transaction_validator.hpp:75
virtual const std::string & caller() const =0
virtual const types::AccountIdType & accountId() const =0
std::optional< ValidationError > operator()(const interface::RemoveSignatory &remove_signatory) const
Definition: transaction_validator.hpp:173
Definition: detach_role.hpp:19
virtual const types::AccountIdType & accountId() const =0
std::optional< ValidationError > validateQuorum(const interface::types::QuorumType &quorum) const
Definition: field_validator.cpp:256
Definition: remove_signatory.hpp:18
Definition: create_asset.hpp:18
virtual const Amount & amount() const =0
virtual const std::string & pubkey() const =0
virtual const types::AssetIdType & assetId() const =0
Definition: call_engine.hpp:20
std::optional< ValidationError > validateAccountDetailKey(const interface::types::AccountDetailKeyType &key) const
Definition: field_validator.cpp:205
std::optional< ValidationError > aggregateErrors(const ReasonName &name, std::vector< std::optional< ReasonType >> optional_reasons, std::vector< std::optional< ValidationError >> optional_child_errors)
Definition: validation_error_helpers.cpp:57
Definition: remove_peer.hpp:19
virtual const RolePermissionSet & rolePermissions() const =0
virtual const types::AccountIdType & accountId() const =0
Definition: append_role.hpp:19
std::optional< ValidationError > validateDomainId(const interface::types::DomainIdType &domain_id) const
Definition: field_validator.cpp:187
std::optional< ValidationError > operator()(const interface::GrantPermission &grant_permission) const
Definition: transaction_validator.hpp:155
std::optional< ValidationError > validateAccountId(const interface::types::AccountIdType &account_id) const
Definition: field_validator.cpp:129
virtual const std::optional< types::AccountDetailValueType > oldValue() const =0
Definition: transfer_asset.hpp:19
virtual types::TimestampType createdTime() const =0
virtual std::optional< std::reference_wrapper< const std::string > > callee() const =0
std::optional< ValidationError > operator()(const interface::SetQuorum &set_quorum) const
Definition: transaction_validator.hpp:203
virtual const types::AssetIdType & assetId() const =0
std::optional< ValidationError > operator()(const interface::RemovePeer &remove_peer) const
Definition: transaction_validator.hpp:165
ValidationErrorCreator & addReason(ReasonType reason)
Add a reason to error.
Definition: validation_error_helpers.cpp:23
virtual const types::AccountNameType & accountName() const =0
virtual const types::RoleIdType & roleName() const =0
virtual const types::AccountIdType & accountId() const =0
virtual const PrecisionType & precision() const =0
std::optional< ValidationError > getValidationError(const ReasonName &name) &&
Definition: validation_error_helpers.cpp:15
virtual const std::string & pubkey() const =0
std::optional< ValidationError > operator()(const interface::CreateDomain &create_domain) const
Definition: transaction_validator.hpp:126
virtual const types::AccountDetailValueType & value() const =0
virtual const types::RoleIdType & roleName() const =0
std::optional< ValidationError > validateBytecode(interface::types::EvmCodeHexStringView input) const
Definition: field_validator.cpp:144
virtual const Amount & amount() const =0
virtual const types::AccountDetailKeyType & key() const =0
std::optional< ValidationError > operator()(const interface::AddAssetQuantity &add_asset_quantity) const
Definition: transaction_validator.hpp:60
virtual std::optional< std::shared_ptr< BatchMeta > > batchMeta() const =0
Definition: create_domain.hpp:18
virtual types::QuorumType newQuorum() const =0
virtual permissions::Grantable permissionName() const =0
Definition: create_account.hpp:19
virtual const types::DomainIdType & domainId() const =0
virtual const std::string & pubkey() const =0
Definition: grant_permission.hpp:19
virtual const types::RoleIdType & userDefaultRole() const =0
std::optional< ValidationError > operator()(const interface::DetachRole &detach_role) const
Definition: transaction_validator.hpp:146
Definition: set_account_detail.hpp:19
virtual const types::AccountDetailKeyType & key() const =0
virtual CommandsType commands() const =0
std::optional< ValidationError > validateDescription(const interface::types::DescriptionType &description) const
Definition: field_validator.cpp:357
Definition: field_validator.hpp:41
std::optional< ValidationError > operator()(const interface::AppendRole &append_role) const
Definition: transaction_validator.hpp:97
virtual const types::AssetNameType & assetName() const =0
virtual const std::string & pubkey() const =0
Definition: revoke_permission.hpp:19
std::optional< ValidationError > operator()(const interface::CallEngine &call_engine) const
Definition: transaction_validator.hpp:84
virtual const types::DescriptionType & description() const =0
virtual const types::AccountIdType & accountId() const =0
Definition: transaction_validator.hpp:51
CommandValidator command_validator_visitor_
Definition: transaction_validator.hpp:345
std::optional< ValidationError > validateAccountDetailValue(const interface::types::AccountDetailValueType &value) const
Definition: field_validator.cpp:210
Helper class for ValidationError creation.
Definition: validation_error_helpers.hpp:16
std::optional< ValidationError > validate(const interface::Transaction &tx, interface::types::TimestampType current_timestamp) const
Definition: transaction_validator.hpp:335
Definition: transaction_validator.hpp:276
std::optional< ValidationError > validateAmount(const interface::Amount &amount) const
Definition: field_validator.cpp:158
void iterate(std::function< void(Perm)> f) const
Definition: permissions.cpp:140
std::optional< ValidationError > operator()(const interface::SubtractAssetQuantity &subtract_asset_quantity) const
Definition: transaction_validator.hpp:212
std::optional< ValidationError > operator()(const interface::SetSettingValue &set_setting_value) const
Definition: transaction_validator.hpp:261
std::optional< ValidationError > validateAccountName(const interface::types::AccountNameType &account_name) const
Definition: field_validator.cpp:182
virtual const types::AccountIdType & accountId() const =0
Definition: add_asset_quantity.hpp:20
virtual const Amount & amount() const =0
virtual const types::DomainIdType & domainId() const =0
Definition: create_role.hpp:19
std::optional< ValidationError > validateOldAccountDetailValue(const std::optional< interface::types::AccountDetailValueType > &old_value) const
Definition: field_validator.cpp:223
std::optional< ValidationError > operator()(const interface::SetAccountDetail &set_account_detail) const
Definition: transaction_validator.hpp:192
virtual const types::AccountIdType & creatorAccountId() const =0
Definition: command_executor.hpp:12
FieldValidator field_validator_
Definition: transaction_validator.hpp:344
std::optional< ValidationError > operator()(const interface::TransferAsset &transfer_asset) const
Definition: transaction_validator.hpp:222
std::optional< ValidationError > validateRoleId(const interface::types::RoleIdType &role_id) const
Definition: field_validator.cpp:177
virtual permissions::Grantable permissionName() const =0
virtual const types::AccountIdType & accountId() const =0
Definition: transaction.hpp:23
virtual const types::DomainIdType & domainId() const =0
std::optional< ValidationError > validateRolePermission(const interface::permissions::Role &permission) const
Definition: field_validator.cpp:237
virtual const std::string & input() const =0
std::optional< ValidationError > validateAssetId(const interface::types::AssetIdType &asset_id) const
Definition: field_validator.cpp:134
std::optional< ValidationError > validatePrecision(const interface::types::PrecisionType &precision) const
Definition: field_validator.cpp:232
Definition: add_peer.hpp:20
CommandValidatorVisitor(std::shared_ptr< ValidatorsConfig > config)
Definition: transaction_validator.hpp:57
uint64_t TimestampType
Type of timestamp.
Definition: types.hpp:67
virtual const types::AssetIdType & assetId() const =0