Electroneum
Loading...
Searching...
No Matches
double_spend.h
Go to the documentation of this file.
1// Copyrights(c) 2017-2021, The Electroneum Project
2// Copyrights(c) 2014-2019, The Monero Project
3//
4// All rights reserved.
5//
6// Redistribution and use in source and binary forms, with or without modification, are
7// permitted provided that the following conditions are met:
8//
9// 1. Redistributions of source code must retain the above copyright notice, this list of
10// conditions and the following disclaimer.
11//
12// 2. Redistributions in binary form must reproduce the above copyright notice, this list
13// of conditions and the following disclaimer in the documentation and/or other
14// materials provided with the distribution.
15//
16// 3. Neither the name of the copyright holder nor the names of its contributors may be
17// used to endorse or promote products derived from this software without specific
18// prior written permission.
19//
20// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
21// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
23// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
28// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29//
30// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
31
32#pragma once
33#include "chaingen.h"
34
35const size_t invalid_index_value = std::numeric_limits<size_t>::max();
37
38
39template<class concrete_test>
41{
42public:
44
46
47 bool check_tx_verification_context(const cryptonote::tx_verification_context& tvc, bool tx_added, size_t event_idx, const cryptonote::transaction& tx);
49
50 bool mark_last_valid_block(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
51 bool mark_invalid_tx(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
52 bool mark_invalid_block(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
53 bool check_double_spend(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
54
55private:
56 cryptonote::block m_last_valid_block;
57 size_t m_invalid_tx_index;
58 size_t m_invalid_block_index;
59};
60
61
62template<bool txs_keeped_by_block>
63struct gen_double_spend_in_tx : public gen_double_spend_base< gen_double_spend_in_tx<txs_keeped_by_block> >
64{
66 static const bool has_invalid_tx = true;
67 static const size_t expected_pool_txs_count = 0;
70
71 bool generate(std::vector<test_event_entry>& events) const;
72};
73
74
75template<bool txs_keeped_by_block>
76struct gen_double_spend_in_the_same_block : public gen_double_spend_base< gen_double_spend_in_the_same_block<txs_keeped_by_block> >
77{
79 static const bool has_invalid_tx = !txs_keeped_by_block;
80 static const size_t expected_pool_txs_count = has_invalid_tx ? 1 : 2;
83
84 bool generate(std::vector<test_event_entry>& events) const;
85};
86
87
88template<bool txs_keeped_by_block>
89struct gen_double_spend_in_different_blocks : public gen_double_spend_base< gen_double_spend_in_different_blocks<txs_keeped_by_block> >
90{
92 static const bool has_invalid_tx = !txs_keeped_by_block;
93 static const size_t expected_pool_txs_count = has_invalid_tx ? 0 : 1;
96
97 bool generate(std::vector<test_event_entry>& events) const;
98};
99
100
101template<bool txs_keeped_by_block>
102struct gen_double_spend_in_alt_chain_in_the_same_block : public gen_double_spend_base< gen_double_spend_in_alt_chain_in_the_same_block<txs_keeped_by_block> >
103{
105 static const bool has_invalid_tx = !txs_keeped_by_block;
106 static const size_t expected_pool_txs_count = has_invalid_tx ? 1 : 2;
109
110 bool generate(std::vector<test_event_entry>& events) const;
111};
112
113
114template<bool txs_keeped_by_block>
115struct gen_double_spend_in_alt_chain_in_different_blocks : public gen_double_spend_base< gen_double_spend_in_alt_chain_in_different_blocks<txs_keeped_by_block> >
116{
118 static const bool has_invalid_tx = !txs_keeped_by_block;
119 static const size_t expected_pool_txs_count = has_invalid_tx ? 1 : 2;
122
123 bool generate(std::vector<test_event_entry>& events) const;
124};
125
126
128{
129public:
132
134
135 bool generate(std::vector<test_event_entry>& events) const;
136
137 bool check_double_spend(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
138};
139
140
141#define INIT_DOUBLE_SPEND_TEST() \
142 uint64_t ts_start = 1338224400; \
143 GENERATE_ACCOUNT(miner_account); \
144 MAKE_GENESIS_BLOCK(events, blk_0, miner_account, ts_start); \
145 MAKE_ACCOUNT(events, bob_account); \
146 MAKE_ACCOUNT(events, alice_account); \
147 REWIND_BLOCKS(events, blk_0r, blk_0, miner_account); \
148 MAKE_TX(events, tx_0, miner_account, bob_account, send_amount, blk_0); \
149 MAKE_NEXT_BLOCK_TX1(events, blk_1, blk_0r, miner_account, tx_0); \
150 REWIND_BLOCKS(events, blk_1r, blk_1, miner_account);
151
152
153#include "double_spend.inl"
#define TESTS_DEFAULT_FEE
Definition chaingen.h:1061
handles core cryptonote functionality
static const uint64_t send_amount
bool mark_invalid_block(cryptonote::core &c, size_t ev_index, const std::vector< test_event_entry > &events)
bool mark_invalid_tx(cryptonote::core &c, size_t ev_index, const std::vector< test_event_entry > &events)
bool check_double_spend(cryptonote::core &c, size_t ev_index, const std::vector< test_event_entry > &events)
bool check_block_verification_context(const cryptonote::block_verification_context &bvc, size_t event_idx, const cryptonote::block &block)
bool check_tx_verification_context(const cryptonote::tx_verification_context &tvc, bool tx_added, size_t event_idx, const cryptonote::transaction &tx)
bool mark_last_valid_block(cryptonote::core &c, size_t ev_index, const std::vector< test_event_entry > &events)
static const size_t expected_blockchain_height
bool check_double_spend(cryptonote::core &c, size_t ev_index, const std::vector< test_event_entry > &events)
bool generate(std::vector< test_event_entry > &events) const
#define CRYPTONOTE_MINED_ETN_UNLOCK_WINDOW
const size_t invalid_index_value
const uint64_t FIRST_BLOCK_REWARD
unsigned __int64 uint64_t
Definition stdint.h:136
bool generate(std::vector< test_event_entry > &events) const
bool generate(std::vector< test_event_entry > &events) const
static const size_t expected_pool_txs_count
static const uint64_t expected_bob_balance
bool generate(std::vector< test_event_entry > &events) const
static const uint64_t send_amount
static const uint64_t expected_alice_balance
static const uint64_t expected_bob_balance
static const uint64_t expected_alice_balance
static const size_t expected_pool_txs_count
bool generate(std::vector< test_event_entry > &events) const
static const uint64_t send_amount
static const uint64_t send_amount
static const uint64_t expected_bob_balance
bool generate(std::vector< test_event_entry > &events) const
static const uint64_t expected_alice_balance
static const size_t expected_pool_txs_count
static const bool has_invalid_tx