Electroneum
Loading...
Searching...
No Matches
ring_signature_1.cpp
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#include "chaingen.h"
33#include "ring_signature_1.h"
34
35using namespace epee;
36using namespace cryptonote;
37
38
40// class gen_ring_signature_1;
41
47
48namespace
49{
50 // To be sure that miner tx outputs don't match any bob_account and some_accounts inputs
51 const uint64_t rnd_11 = 475921;
52 const uint64_t rnd_20 = 360934;
53 const uint64_t rnd_29 = 799665;
54}
55
56bool gen_ring_signature_1::generate(std::vector<test_event_entry>& events) const
57{
58 uint64_t ts_start = 1338224400;
59
60 GENERATE_ACCOUNT(miner_account);
61
62 // events
63 MAKE_GENESIS_BLOCK(events, blk_0, miner_account, ts_start); // 0
64 MAKE_ACCOUNT(events, some_account_1); // 1
65 MAKE_ACCOUNT(events, some_account_2); // 2
66 MAKE_ACCOUNT(events, bob_account); // 3
67 MAKE_ACCOUNT(events, alice_account); // 4
68 MAKE_NEXT_BLOCK(events, blk_1, blk_0, miner_account); // 5
69 MAKE_NEXT_BLOCK(events, blk_2, blk_1, miner_account); // 6
70 MAKE_NEXT_BLOCK(events, blk_3, blk_2, miner_account); // 7
71 MAKE_NEXT_BLOCK(events, blk_4, blk_3, miner_account); // 8
72 REWIND_BLOCKS(events, blk_5, blk_4, miner_account); // <N blocks>
73 REWIND_BLOCKS(events, blk_5r, blk_5, miner_account); // <N blocks>
74 MAKE_TX_LIST_START(events, txs_blk_6, miner_account, bob_account, MK_COINS(1), blk_5); // 9 + 2N
75 MAKE_TX_LIST(events, txs_blk_6, miner_account, bob_account, MK_COINS(11) + rnd_11, blk_5); // 10 + 2N
76 MAKE_TX_LIST(events, txs_blk_6, miner_account, bob_account, MK_COINS(11) + rnd_11, blk_5); // 11 + 2N
77 MAKE_TX_LIST(events, txs_blk_6, miner_account, bob_account, MK_COINS(20) + rnd_20, blk_5); // 12 + 2N
78 MAKE_TX_LIST(events, txs_blk_6, miner_account, bob_account, MK_COINS(29) + rnd_29, blk_5); // 13 + 2N
79 MAKE_TX_LIST(events, txs_blk_6, miner_account, bob_account, MK_COINS(29) + rnd_29, blk_5); // 14 + 2N
80 MAKE_TX_LIST(events, txs_blk_6, miner_account, bob_account, MK_COINS(29) + rnd_29, blk_5); // 15 + 2N
81 MAKE_TX_LIST(events, txs_blk_6, miner_account, some_account_1, MK_COINS(11) + rnd_11, blk_5); // 16 + 2N
82 MAKE_TX_LIST(events, txs_blk_6, miner_account, some_account_1, MK_COINS(11) + rnd_11, blk_5); // 17 + 2N
83 MAKE_TX_LIST(events, txs_blk_6, miner_account, some_account_1, MK_COINS(11) + rnd_11, blk_5); // 18 + 2N
84 MAKE_TX_LIST(events, txs_blk_6, miner_account, some_account_1, MK_COINS(11) + rnd_11, blk_5); // 19 + 2N
85 MAKE_TX_LIST(events, txs_blk_6, miner_account, some_account_1, MK_COINS(20) + rnd_20, blk_5); // 20 + 2N
86 MAKE_TX_LIST(events, txs_blk_6, miner_account, some_account_2, MK_COINS(20) + rnd_20, blk_5); // 21 + 2N
87 MAKE_NEXT_BLOCK_TX_LIST(events, blk_6, blk_5r, miner_account, txs_blk_6); // 22 + 2N
88 DO_CALLBACK(events, "check_balances_1"); // 23 + 2N
89 REWIND_BLOCKS(events, blk_6r, blk_6, miner_account); // <N blocks>
90 // 129 = 11 + 11 + 20 + 29 + 29 + 29
91 MAKE_TX_MIX(events, tx_0, bob_account, alice_account, MK_COINS(129) + 2 * rnd_11 + rnd_20 + 3 * rnd_29 - TESTS_DEFAULT_FEE, 2, blk_6); // 24 + 3N
92 MAKE_NEXT_BLOCK_TX1(events, blk_7, blk_6r, miner_account, tx_0); // 25 + 3N
93 DO_CALLBACK(events, "check_balances_2"); // 26 + 3N
94
95 return true;
96}
97
98bool gen_ring_signature_1::check_balances_1(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events)
99{
100 DEFINE_TESTS_ERROR_CONTEXT("gen_ring_signature_1::check_balances_1");
101
102 m_bob_account = boost::get<account_base>(events[3]);
103 m_alice_account = boost::get<account_base>(events[4]);
104
105 std::vector<block> blocks;
106 bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_ETN_UNLOCK_WINDOW, blocks);
108
109 std::vector<cryptonote::block> chain;
110 map_hash2tx_t mtx;
111 r = find_block_chain(events, chain, mtx, get_block_hash(blocks.back()));
113 CHECK_EQ(MK_COINS(130) + 2 * rnd_11 + rnd_20 + 3 * rnd_29, get_balance(m_bob_account, chain, mtx));
114 CHECK_EQ(0, get_balance(m_alice_account, chain, mtx));
115
116 return true;
117}
118
119bool gen_ring_signature_1::check_balances_2(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events)
120{
121 DEFINE_TESTS_ERROR_CONTEXT("gen_ring_signature_1::check_balances_2");
122
123 std::vector<block> blocks;
124 bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_ETN_UNLOCK_WINDOW, blocks);
126
127 std::vector<cryptonote::block> chain;
128 map_hash2tx_t mtx;
129 r = find_block_chain(events, chain, mtx, get_block_hash(blocks.back()));
131 CHECK_EQ(MK_COINS(1), get_balance(m_bob_account, chain, mtx));
132 CHECK_EQ(MK_COINS(129) + 2 * rnd_11 + rnd_20 + 3 * rnd_29 - TESTS_DEFAULT_FEE, get_balance(m_alice_account, chain, mtx));
133
134 return true;
135}
136
137
139// class gen_ring_signature_2;
140
146
151bool gen_ring_signature_2::generate(std::vector<test_event_entry>& events) const
152{
153 uint64_t ts_start = 1338224400;
154
155 GENERATE_ACCOUNT(miner_account);
156
157 // events
158 MAKE_GENESIS_BLOCK(events, blk_0, miner_account, ts_start); // 0
159 MAKE_ACCOUNT(events, bob_account); // 1
160 MAKE_ACCOUNT(events, alice_account); // 2
161 MAKE_NEXT_BLOCK(events, blk_1, blk_0, miner_account); // 3
162 MAKE_NEXT_BLOCK(events, blk_2, blk_1, miner_account); // 4
163 MAKE_NEXT_BLOCK(events, blk_3, blk_2, miner_account); // 5
164 REWIND_BLOCKS(events, blk_3r, blk_3, miner_account); // <N blocks>
165 MAKE_TX_LIST_START(events, txs_blk_4, miner_account, bob_account, MK_COINS(13), blk_3); // 6 + N
166 MAKE_TX_LIST(events, txs_blk_4, miner_account, bob_account, MK_COINS(13), blk_3); // 7 + N
167 MAKE_TX_LIST(events, txs_blk_4, miner_account, bob_account, MK_COINS(13), blk_3); // 8 + N
168 MAKE_TX_LIST(events, txs_blk_4, miner_account, bob_account, MK_COINS(13), blk_3); // 9 + N
169 MAKE_NEXT_BLOCK_TX_LIST(events, blk_4, blk_3r, miner_account, txs_blk_4); // 10 + N
170 DO_CALLBACK(events, "check_balances_1"); // 11 + N
171 REWIND_BLOCKS(events, blk_4r, blk_4, miner_account); // <N blocks>
172 MAKE_TX_MIX(events, tx_0, bob_account, alice_account, MK_COINS(52) - TESTS_DEFAULT_FEE, 3, blk_4); // 12 + 2N
173 MAKE_NEXT_BLOCK_TX1(events, blk_5, blk_4r, miner_account, tx_0); // 13 + 2N
174 DO_CALLBACK(events, "check_balances_2"); // 14 + 2N
175
176 return true;
177}
178
179bool gen_ring_signature_2::check_balances_1(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events)
180{
181 DEFINE_TESTS_ERROR_CONTEXT("gen_ring_signature_2::check_balances_1");
182
183 m_bob_account = boost::get<account_base>(events[1]);
184 m_alice_account = boost::get<account_base>(events[2]);
185
186 std::vector<block> blocks;
187 bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_ETN_UNLOCK_WINDOW, blocks);
189
190 std::vector<cryptonote::block> chain;
191 map_hash2tx_t mtx;
192 r = find_block_chain(events, chain, mtx, get_block_hash(blocks.back()));
194 CHECK_EQ(MK_COINS(52), get_balance(m_bob_account, chain, mtx));
195 CHECK_EQ(0, get_balance(m_alice_account, chain, mtx));
196
197 return true;
198}
199
200bool gen_ring_signature_2::check_balances_2(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events)
201{
202 DEFINE_TESTS_ERROR_CONTEXT("gen_ring_signature_2::check_balances_2");
203
204 std::vector<block> blocks;
205 bool r = c.get_blocks(0, 100 + 2 * CRYPTONOTE_MINED_ETN_UNLOCK_WINDOW, blocks);
207
208 std::vector<cryptonote::block> chain;
209 map_hash2tx_t mtx;
210 r = find_block_chain(events, chain, mtx, get_block_hash(blocks.back()));
212 CHECK_EQ(0, get_balance(m_bob_account, chain, mtx));
213 CHECK_EQ(MK_COINS(52) - TESTS_DEFAULT_FEE, get_balance(m_alice_account, chain, mtx));
214
215 return true;
216}
217
218
220// class gen_ring_signature_big;
221
223 : m_test_size(100)
224 , m_tx_amount(MK_COINS(29))
225{
228}
229
237bool gen_ring_signature_big::generate(std::vector<test_event_entry>& events) const
238{
239 std::vector<account_base> accounts(m_test_size);
240 std::vector<block> blocks;
241 blocks.reserve(m_test_size + CRYPTONOTE_MINED_ETN_UNLOCK_WINDOW);
242
243 uint64_t ts_start = 1338224400;
244 GENERATE_ACCOUNT(miner_account);
245
246 MAKE_GENESIS_BLOCK(events, blk_0, miner_account, ts_start);
247
248 for (size_t i = 0; i < m_test_size; ++i)
249 {
250 MAKE_ACCOUNT(events, an_account);
251 accounts[i] = an_account;
252 }
253 MAKE_ACCOUNT(events, alice_account);
254
255 size_t blk_0r_idx = events.size();
256 REWIND_BLOCKS(events, blk_0r, blk_0, miner_account);
257 blocks.push_back(blk_0);
258 for (size_t i = blk_0r_idx; i < events.size(); ++i)
259 {
260 blocks.push_back(boost::get<block>(events[i]));
261 }
262
263 for (size_t i = 0; i < m_test_size; ++i)
264 {
265 block blk_with_unlocked_out = blocks[blocks.size() - 1 - CRYPTONOTE_MINED_ETN_UNLOCK_WINDOW];
266 MAKE_TX_LIST_START(events, txs_blk_i, miner_account, accounts[i], m_tx_amount, blk_with_unlocked_out);
267 for (size_t j = 0; j <= i; ++j)
268 {
269 MAKE_TX_LIST(events, txs_blk_i, miner_account, accounts[i], TESTS_DEFAULT_FEE, blk_with_unlocked_out);
270 }
271 MAKE_NEXT_BLOCK_TX_LIST(events, blk_i, blocks.back(), miner_account, txs_blk_i);
272 blocks.push_back(blk_i);
273
274 std::vector<cryptonote::block> chain;
275 map_hash2tx_t mtx;
276 bool r = find_block_chain(events, chain, mtx, get_block_hash(blk_i));
277 CHECK_AND_NO_ASSERT_MES(r, false, "failed to call find_block_chain");
278 std::cout << i << ": " << get_balance(accounts[i], chain, mtx) << std::endl;
279 }
280
281 DO_CALLBACK(events, "check_balances_1");
282 MAKE_TX_MIX(events, tx_0, accounts[0], alice_account, m_tx_amount, m_test_size - 1, blocks.back());
283 MAKE_NEXT_BLOCK_TX1(events, blk_1, blocks.back(), miner_account, tx_0);
284 DO_CALLBACK(events, "check_balances_2");
285
286 return true;
287}
288
289bool gen_ring_signature_big::check_balances_1(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events)
290{
291 DEFINE_TESTS_ERROR_CONTEXT("gen_ring_signature_big::check_balances_1");
292
293 m_bob_account = boost::get<account_base>(events[1]);
294 m_alice_account = boost::get<account_base>(events[1 + m_test_size]);
295
296 std::vector<block> blocks;
297 bool r = c.get_blocks(0, 2 * m_test_size + CRYPTONOTE_MINED_ETN_UNLOCK_WINDOW, blocks);
299
300 std::vector<cryptonote::block> chain;
301 map_hash2tx_t mtx;
302 r = find_block_chain(events, chain, mtx, get_block_hash(blocks.back()));
304 CHECK_EQ(m_tx_amount + TESTS_DEFAULT_FEE, get_balance(m_bob_account, chain, mtx));
305 CHECK_EQ(0, get_balance(m_alice_account, chain, mtx));
306
307 for (size_t i = 2; i < 1 + m_test_size; ++i)
308 {
309 const account_base& an_account = boost::get<account_base>(events[i]);
310 uint64_t balance = m_tx_amount + TESTS_DEFAULT_FEE * i;
311 CHECK_EQ(balance, get_balance(an_account, chain, mtx));
312 }
313
314 return true;
315}
316
317bool gen_ring_signature_big::check_balances_2(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events)
318{
319 DEFINE_TESTS_ERROR_CONTEXT("gen_ring_signature_big::check_balances_2");
320
321 std::vector<block> blocks;
322 bool r = c.get_blocks(0, 2 * m_test_size + CRYPTONOTE_MINED_ETN_UNLOCK_WINDOW, blocks);
324
325 std::vector<cryptonote::block> chain;
326 map_hash2tx_t mtx;
327 r = find_block_chain(events, chain, mtx, get_block_hash(blocks.back()));
329 CHECK_EQ(0, get_balance(m_bob_account, chain, mtx));
330 CHECK_EQ(m_tx_amount, get_balance(m_alice_account, chain, mtx));
331
332 for (size_t i = 2; i < 1 + m_test_size; ++i)
333 {
334 const account_base& an_account = boost::get<account_base>(events[i]);
335 uint64_t balance = m_tx_amount + TESTS_DEFAULT_FEE * i;
336 CHECK_EQ(balance, get_balance(an_account, chain, mtx));
337 }
338
339 std::vector<size_t> tx_outs;
340 uint64_t transfered;
341 const transaction& tx = boost::get<transaction>(events[events.size() - 3]);
342 lookup_acc_outs(m_alice_account.get_keys(), boost::get<transaction>(events[events.size() - 3]), get_tx_pub_key_from_extra(tx), get_additional_tx_pub_keys_from_extra(tx), tx_outs, transfered);
343 CHECK_EQ(m_tx_amount, transfered);
344
345 return true;
346}
bool find_block_chain(const std::vector< test_event_entry > &events, std::vector< cryptonote::block > &blockchain, map_hash2tx_t &mtx, const crypto::hash &head)
uint64_t get_balance(const cryptonote::account_base &addr, const std::vector< cryptonote::block > &blockchain, const map_hash2tx_t &mtx)
Definition chaingen.cpp:940
#define MAKE_NEXT_BLOCK(VEC_EVENTS, BLK_NAME, PREV_BLOCK, MINER_ACC)
Definition chaingen.h:839
#define REWIND_BLOCKS(VEC_EVENTS, BLK_NAME, PREV_BLOCK, MINER_ACC)
Definition chaingen.h:890
#define DEFINE_TESTS_ERROR_CONTEXT(text)
Definition chaingen.h:1056
std::unordered_map< crypto::hash, const cryptonote::transaction * > map_hash2tx_t
Definition chaingen.h:163
#define CHECK_TEST_CONDITION(cond)
Definition chaingen.h:1057
#define MAKE_TX_LIST_START(VEC_EVENTS, SET_NAME, FROM, TO, AMOUNT, HEAD)
Definition chaingen.h:935
#define MAKE_GENESIS_BLOCK(VEC_EVENTS, BLK_NAME, MINER_ACC, TS)
Definition chaingen.h:833
#define MAKE_NEXT_BLOCK_TX_LIST(VEC_EVENTS, BLK_NAME, PREV_BLOCK, MINER_ACC, TXLIST)
Definition chaingen.h:867
#define REGISTER_CALLBACK(CB_NAME, CLBACK)
Definition chaingen.h:827
#define DO_CALLBACK(VEC_EVENTS, CB_NAME)
Definition chaingen.h:820
#define MAKE_TX_LIST(VEC_EVENTS, SET_NAME, FROM, TO, AMOUNT, HEAD)
Definition chaingen.h:933
#define MK_COINS(amount)
Definition chaingen.h:1060
#define TESTS_DEFAULT_FEE
Definition chaingen.h:1061
#define MAKE_ACCOUNT(VEC_EVENTS, account)
Definition chaingen.h:815
#define GENERATE_ACCOUNT(account)
Definition chaingen.h:801
#define CHECK_EQ(v1, v2)
Definition chaingen.h:1058
#define MAKE_TX_MIX(VEC_EVENTS, TX_NAME, FROM, TO, AMOUNT, NMIX, HEAD)
Definition chaingen.h:893
#define MAKE_NEXT_BLOCK_TX1(VEC_EVENTS, BLK_NAME, PREV_BLOCK, MINER_ACC, TX1)
Definition chaingen.h:849
handles core cryptonote functionality
bool get_blocks(uint64_t start_offset, size_t count, std::vector< std::pair< cryptonote::blobdata, block > > &blocks, std::vector< cryptonote::blobdata > &txs) const
bool generate(std::vector< test_event_entry > &events) const
bool check_balances_2(cryptonote::core &c, size_t ev_index, const std::vector< test_event_entry > &events)
bool check_balances_1(cryptonote::core &c, size_t ev_index, const std::vector< test_event_entry > &events)
bool check_balances_2(cryptonote::core &c, size_t ev_index, const std::vector< test_event_entry > &events)
bool generate(std::vector< test_event_entry > &events) const
bool check_balances_1(cryptonote::core &c, size_t ev_index, const std::vector< test_event_entry > &events)
bool generate(std::vector< test_event_entry > &events) const
bool check_balances_2(cryptonote::core &c, size_t ev_index, const std::vector< test_event_entry > &events)
bool check_balances_1(cryptonote::core &c, size_t ev_index, const std::vector< test_event_entry > &events)
#define CRYPTONOTE_MINED_ETN_UNLOCK_WINDOW
#define CHECK_AND_NO_ASSERT_MES(expr, fail_ret_val, message)
Holds cryptonote related classes and helpers.
Definition ban.cpp:40
std::vector< crypto::public_key > get_additional_tx_pub_keys_from_extra(const std::vector< uint8_t > &tx_extra)
crypto::public_key get_tx_pub_key_from_extra(const std::vector< uint8_t > &tx_extra, size_t pk_index)
bool lookup_acc_outs(const account_keys &acc, const transaction &tx, std::vector< size_t > &outs, uint64_t &etn_transfered)
crypto::hash get_block_hash(uint64_t height)
unsigned __int64 uint64_t
Definition stdint.h:136