@ -42,7 +42,7 @@ using namespace cryptonote;
// Tests
bool gen_bp_tx_validation_base : : generate_with ( std : : vector < test_event_entry > & events ,
size_t mixin , size_t n_txes , const uint64_t * amounts_paid , bool valid , const rct : : R angeProofType * range_proof_type ,
size_t mixin , size_t n_txes , const uint64_t * amounts_paid , bool valid , const rct : : R CTConfig * rct_config ,
const std : : function < bool ( std : : vector < tx_source_entry > & sources , std : : vector < tx_destination_entry > & destinations , size_t tx_idx ) > & pre_tx ,
const std : : function < bool ( transaction & tx , size_t tx_idx ) > & post_tx ) const
{
@ -136,7 +136,7 @@ bool gen_bp_tx_validation_base::generate_with(std::vector<test_event_entry>& eve
std : : unordered_map < crypto : : public_key , cryptonote : : subaddress_index > subaddresses ;
subaddresses [ miner_accounts [ n ] . get_keys ( ) . m_account_address . m_spend_public_key ] = { 0 , 0 } ;
rct_txes . resize ( rct_txes . size ( ) + 1 ) ;
bool r = construct_tx_and_get_tx_key ( miner_accounts [ n ] . get_keys ( ) , subaddresses , sources , destinations , cryptonote : : account_public_address { } , std : : vector < uint8_t > ( ) , rct_txes . back ( ) , 0 , tx_key , additional_tx_keys , true , r ange_proof_type [ n ] ) ;
bool r = construct_tx_and_get_tx_key ( miner_accounts [ n ] . get_keys ( ) , subaddresses , sources , destinations , cryptonote : : account_public_address { } , std : : vector < uint8_t > ( ) , rct_txes . back ( ) , 0 , tx_key , additional_tx_keys , true , r ct_config [ n ] ) ;
CHECK_AND_ASSERT_MES ( r , false , " failed to construct transaction " ) ;
if ( post_tx & & ! post_tx ( rct_txes . back ( ) , n ) )
@ -157,7 +157,8 @@ bool gen_bp_tx_validation_base::generate_with(std::vector<test_event_entry>& eve
crypto : : secret_key amount_key ;
crypto : : derivation_to_scalar ( derivation , o , amount_key ) ;
rct : : key rct_tx_mask ;
if ( rct_txes . back ( ) . rct_signatures . type = = rct : : RCTTypeSimple | | rct_txes . back ( ) . rct_signatures . type = = rct : : RCTTypeBulletproof )
const uint8_t type = rct_txes . back ( ) . rct_signatures . type ;
if ( type = = rct : : RCTTypeSimple | | type = = rct : : RCTTypeBulletproof | | type = = rct : : RCTTypeBulletproof2 )
rct : : decodeRctSimple ( rct_txes . back ( ) . rct_signatures , rct : : sk2rct ( amount_key ) , o , rct_tx_mask , hw : : get_device ( " default " ) ) ;
else
rct : : decodeRct ( rct_txes . back ( ) . rct_signatures , rct : : sk2rct ( amount_key ) , o , rct_tx_mask , hw : : get_device ( " default " ) ) ;
@ -173,8 +174,8 @@ bool gen_bp_tx_validation_base::generate_with(std::vector<test_event_entry>& eve
CHECK_AND_ASSERT_MES ( generator . construct_block_manually ( blk_txes , blk_last , miner_account ,
test_generator : : bf_major_ver | test_generator : : bf_minor_ver | test_generator : : bf_timestamp | test_generator : : bf_tx_hashes | test_generator : : bf_hf_version | test_generator : : bf_max_outs ,
8, 8 , blk_last . timestamp + DIFFICULTY_BLOCKS_ESTIMATE_TIMESPAN * 2 , // v2 has blocks twice as long
crypto : : hash ( ) , 0 , transaction ( ) , starting_rct_tx_hashes , 0 , 6 , 8 ) ,
10, 10 , blk_last . timestamp + DIFFICULTY_BLOCKS_ESTIMATE_TIMESPAN * 2 , // v2 has blocks twice as long
crypto : : hash ( ) , 0 , transaction ( ) , starting_rct_tx_hashes , 0 , 6 , 10 ) ,
false , " Failed to generate block " ) ;
if ( ! valid )
DO_CALLBACK ( events , " mark_invalid_block " ) ;
@ -210,16 +211,16 @@ bool gen_bp_tx_valid_1::generate(std::vector<test_event_entry>& events) const
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 10000 , ( uint64_t ) - 1 } ;
const size_t bp_sizes [ ] = { 1 , ( size_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofPaddedBulletproof } ;
return generate_with ( events , mixin , 1 , amounts_paid , true , r ange_proof_type , NULL , [ & ] ( const cryptonote : : transaction & tx , size_t tx_idx ) { return check_bp ( tx , tx_idx , bp_sizes , " gen_bp_tx_valid_1 " ) ; } ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofPaddedBulletproof , 0 } } ;
return generate_with ( events , mixin , 1 , amounts_paid , true , r ct_config , NULL , [ & ] ( const cryptonote : : transaction & tx , size_t tx_idx ) { return check_bp ( tx , tx_idx , bp_sizes , " gen_bp_tx_valid_1 " ) ; } ) ;
}
bool gen_bp_tx_invalid_1_1 : : generate ( std : : vector < test_event_entry > & events ) const
{
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 5000 , 5000 , ( uint64_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofBulletproof } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ange_proof_type , NULL , NULL ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofBulletproof , 0 } } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ct_config , NULL , NULL ) ;
}
bool gen_bp_tx_valid_2 : : generate ( std : : vector < test_event_entry > & events ) const
@ -227,8 +228,8 @@ bool gen_bp_tx_valid_2::generate(std::vector<test_event_entry>& events) const
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 5000 , 5000 , ( uint64_t ) - 1 } ;
const size_t bp_sizes [ ] = { 2 , ( size_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofPaddedBulletproof } ;
return generate_with ( events , mixin , 1 , amounts_paid , true , r ange_proof_type , NULL , [ & ] ( const cryptonote : : transaction & tx , size_t tx_idx ) { return check_bp ( tx , tx_idx , bp_sizes , " gen_bp_tx_valid_2 " ) ; } ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofPaddedBulletproof , 0 } } ;
return generate_with ( events , mixin , 1 , amounts_paid , true , r ct_config , NULL , [ & ] ( const cryptonote : : transaction & tx , size_t tx_idx ) { return check_bp ( tx , tx_idx , bp_sizes , " gen_bp_tx_valid_2 " ) ; } ) ;
}
bool gen_bp_tx_valid_3 : : generate ( std : : vector < test_event_entry > & events ) const
@ -236,8 +237,8 @@ bool gen_bp_tx_valid_3::generate(std::vector<test_event_entry>& events) const
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 5000 , 5000 , 5000 , ( uint64_t ) - 1 } ;
const size_t bp_sizes [ ] = { 4 , ( size_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofPaddedBulletproof } ;
return generate_with ( events , mixin , 1 , amounts_paid , true , r ange_proof_type , NULL , [ & ] ( const cryptonote : : transaction & tx , size_t tx_idx ) { return check_bp ( tx , tx_idx , bp_sizes , " gen_bp_tx_valid_3 " ) ; } ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofPaddedBulletproof , 0 } } ;
return generate_with ( events , mixin , 1 , amounts_paid , true , r ct_config , NULL , [ & ] ( const cryptonote : : transaction & tx , size_t tx_idx ) { return check_bp ( tx , tx_idx , bp_sizes , " gen_bp_tx_valid_3 " ) ; } ) ;
}
bool gen_bp_tx_valid_16 : : generate ( std : : vector < test_event_entry > & events ) const
@ -245,24 +246,24 @@ bool gen_bp_tx_valid_16::generate(std::vector<test_event_entry>& events) const
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 500 , 500 , 500 , 500 , 500 , 500 , 500 , 500 , 500 , 500 , 500 , 500 , 500 , 500 , 500 , 500 , ( uint64_t ) - 1 } ;
const size_t bp_sizes [ ] = { 16 , ( size_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofPaddedBulletproof } ;
return generate_with ( events , mixin , 1 , amounts_paid , true , r ange_proof_type , NULL , [ & ] ( const cryptonote : : transaction & tx , size_t tx_idx ) { return check_bp ( tx , tx_idx , bp_sizes , " gen_bp_tx_valid_16 " ) ; } ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofPaddedBulletproof , 0 } } ;
return generate_with ( events , mixin , 1 , amounts_paid , true , r ct_config , NULL , [ & ] ( const cryptonote : : transaction & tx , size_t tx_idx ) { return check_bp ( tx , tx_idx , bp_sizes , " gen_bp_tx_valid_16 " ) ; } ) ;
}
bool gen_bp_tx_invalid_4_2_1 : : generate ( std : : vector < test_event_entry > & events ) const
{
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , ( uint64_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofMultiOutputBulletproof } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ange_proof_type , NULL , NULL ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofMultiOutputBulletproof , 0 } } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ct_config , NULL , NULL ) ;
}
bool gen_bp_tx_invalid_16_16 : : generate ( std : : vector < test_event_entry > & events ) const
{
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , ( uint64_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofMultiOutputBulletproof } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ange_proof_type , NULL , NULL ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofMultiOutputBulletproof , 0 } } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ct_config , NULL , NULL ) ;
}
bool gen_bp_txs_valid_2_and_2 : : generate ( std : : vector < test_event_entry > & events ) const
@ -270,25 +271,25 @@ bool gen_bp_txs_valid_2_and_2::generate(std::vector<test_event_entry>& events) c
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 1000 , 1000 , ( size_t ) - 1 , 1000 , 1000 , ( uint64_t ) - 1 } ;
const size_t bp_sizes [ ] = { 2 , ( size_t ) - 1 , 2 , ( size_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofPaddedBulletproof , rct : : RangeProofPaddedBulletproof } ;
return generate_with ( events , mixin , 2 , amounts_paid , true , r ange_proof_type , NULL , [ & ] ( const cryptonote : : transaction & tx , size_t tx_idx ) { return check_bp ( tx , tx_idx , bp_sizes , " gen_bp_txs_valid_2_and_2 " ) ; } ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofPaddedBulletproof , 0 } , { rct : : RangeProofPaddedBulletproof , 0 } } ;
return generate_with ( events , mixin , 2 , amounts_paid , true , r ct_config , NULL , [ & ] ( const cryptonote : : transaction & tx , size_t tx_idx ) { return check_bp ( tx , tx_idx , bp_sizes , " gen_bp_txs_valid_2_and_2 " ) ; } ) ;
}
bool gen_bp_txs_invalid_2_and_8_2_and_16_16_1 : : generate ( std : : vector < test_event_entry > & events ) const
{
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 1000 , 1000 , ( uint64_t ) - 1 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , ( uint64_t ) - 1 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , 1000 , ( uint64_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofMultiOutputBulletproof , rct : : RangeProofMultiOutputBulletproof , rct : : RangeProofMultiOutputBulletproof } ;
return generate_with ( events , mixin , 3 , amounts_paid , false , r ange_proof_type , NULL , NULL ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofMultiOutputBulletproof , 0 } , { rct : : RangeProofMultiOutputBulletproof , 0 } , { rct : : RangeProofMultiOutputBulletproof , 0 } } ;
return generate_with ( events , mixin , 3 , amounts_paid , false , r ct_config , NULL , NULL ) ;
}
bool gen_bp_txs_valid_2_and_3_and_2_and_4 : : generate ( std : : vector < test_event_entry > & events ) const
{
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 11111115000 , 11111115000 , ( uint64_t ) - 1 , 11111115000 , 11111115000 , 11111115001 , ( uint64_t ) - 1 , 11111115000 , 11111115002 , ( uint64_t ) - 1 , 11111115000 , 11111115000 , 11111115000 , 11111115003 , ( uint64_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofPaddedBulletproof , rct : : RangeProofPaddedBulletproof , rct : : RangeProofPaddedBulletproof , rct : : RangeProofPaddedBulletproof } ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofPaddedBulletproof , 0 } , { rct : : RangeProofPaddedBulletproof , 0 } , { rct : : RangeProofPaddedBulletproof , 0 } , { rct : : RangeProofPaddedBulletproof , 0 } } ;
const size_t bp_sizes [ ] = { 2 , ( size_t ) - 1 , 4 , ( size_t ) - 1 , 2 , ( size_t ) - 1 , 4 , ( size_t ) - 1 } ;
return generate_with ( events , mixin , 4 , amounts_paid , true , r ange_proof_type , NULL , [ & ] ( const cryptonote : : transaction & tx , size_t tx_idx ) { return check_bp ( tx , tx_idx , bp_sizes , " gen_bp_txs_valid_2_and_3_and_2_and_4 " ) ; } ) ;
return generate_with ( events , mixin , 4 , amounts_paid , true , r ct_config , NULL , [ & ] ( const cryptonote : : transaction & tx , size_t tx_idx ) { return check_bp ( tx , tx_idx , bp_sizes , " gen_bp_txs_valid_2_and_3_and_2_and_4 " ) ; } ) ;
}
bool gen_bp_tx_invalid_not_enough_proofs : : generate ( std : : vector < test_event_entry > & events ) const
@ -296,9 +297,9 @@ bool gen_bp_tx_invalid_not_enough_proofs::generate(std::vector<test_event_entry>
DEFINE_TESTS_ERROR_CONTEXT ( " gen_bp_tx_invalid_not_enough_proofs " ) ;
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 5000 , 5000 , ( uint64_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofBulletproof } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ange_proof_type , NULL , [ & ] ( cryptonote : : transaction & tx , size_t idx ) {
CHECK_TEST_CONDITION ( tx . rct_signatures . type = = rct : : RCTTypeBulletproof ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofBulletproof , 0 } } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ct_config , NULL , [ & ] ( cryptonote : : transaction & tx , size_t idx ) {
CHECK_TEST_CONDITION ( tx . rct_signatures . type = = rct : : RCTTypeBulletproof | | tx . rct_signatures . type = = rct : : RCTTypeBulletproof2 ) ;
CHECK_TEST_CONDITION ( ! tx . rct_signatures . p . bulletproofs . empty ( ) ) ;
tx . rct_signatures . p . bulletproofs . pop_back ( ) ;
CHECK_TEST_CONDITION ( ! tx . rct_signatures . p . bulletproofs . empty ( ) ) ;
@ -311,9 +312,9 @@ bool gen_bp_tx_invalid_empty_proofs::generate(std::vector<test_event_entry>& eve
DEFINE_TESTS_ERROR_CONTEXT ( " gen_bp_tx_invalid_empty_proofs " ) ;
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 50000 , 50000 , ( uint64_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofBulletproof } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ange_proof_type , NULL , [ & ] ( cryptonote : : transaction & tx , size_t idx ) {
CHECK_TEST_CONDITION ( tx . rct_signatures . type = = rct : : RCTTypeBulletproof ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofBulletproof , 0 } } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ct_config , NULL , [ & ] ( cryptonote : : transaction & tx , size_t idx ) {
CHECK_TEST_CONDITION ( tx . rct_signatures . type = = rct : : RCTTypeBulletproof | | tx . rct_signatures . type = = rct : : RCTTypeBulletproof2 ) ;
tx . rct_signatures . p . bulletproofs . clear ( ) ;
return true ;
} ) ;
@ -324,9 +325,9 @@ bool gen_bp_tx_invalid_too_many_proofs::generate(std::vector<test_event_entry>&
DEFINE_TESTS_ERROR_CONTEXT ( " gen_bp_tx_invalid_too_many_proofs " ) ;
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 10000 , ( uint64_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofBulletproof } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ange_proof_type , NULL , [ & ] ( cryptonote : : transaction & tx , size_t idx ) {
CHECK_TEST_CONDITION ( tx . rct_signatures . type = = rct : : RCTTypeBulletproof ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofBulletproof , 0 } } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ct_config , NULL , [ & ] ( cryptonote : : transaction & tx , size_t idx ) {
CHECK_TEST_CONDITION ( tx . rct_signatures . type = = rct : : RCTTypeBulletproof | | tx . rct_signatures . type = = rct : : RCTTypeBulletproof2 ) ;
CHECK_TEST_CONDITION ( ! tx . rct_signatures . p . bulletproofs . empty ( ) ) ;
tx . rct_signatures . p . bulletproofs . push_back ( tx . rct_signatures . p . bulletproofs . back ( ) ) ;
return true ;
@ -338,9 +339,9 @@ bool gen_bp_tx_invalid_wrong_amount::generate(std::vector<test_event_entry>& eve
DEFINE_TESTS_ERROR_CONTEXT ( " gen_bp_tx_invalid_wrong_amount " ) ;
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 10000 , ( uint64_t ) - 1 } ;
const rct : : R angeProofType range_proof_type [ ] = { rct : : RangeProofBulletproof } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ange_proof_type , NULL , [ & ] ( cryptonote : : transaction & tx , size_t idx ) {
CHECK_TEST_CONDITION ( tx . rct_signatures . type = = rct : : RCTTypeBulletproof ) ;
const rct : : R CTConfig rct_config [ ] = { { rct : : RangeProofBulletproof , 0 } } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , r ct_config , NULL , [ & ] ( cryptonote : : transaction & tx , size_t idx ) {
CHECK_TEST_CONDITION ( tx . rct_signatures . type = = rct : : RCTTypeBulletproof | | tx . rct_signatures . type = = rct : : RCTTypeBulletproof2 ) ;
CHECK_TEST_CONDITION ( ! tx . rct_signatures . p . bulletproofs . empty ( ) ) ;
tx . rct_signatures . p . bulletproofs . back ( ) = rct : : bulletproof_PROVE ( 1000 , rct : : skGen ( ) ) ;
return true ;
@ -352,10 +353,8 @@ bool gen_bp_tx_invalid_borromean_type::generate(std::vector<test_event_entry>& e
DEFINE_TESTS_ERROR_CONTEXT ( " gen_bp_tx_invalid_borromean_type " ) ;
const size_t mixin = 10 ;
const uint64_t amounts_paid [ ] = { 5000 , 5000 , ( uint64_t ) - 1 } ;
const rct : : RangeProofType range_proof_type [ ] = { rct : : RangeProofPaddedBulletproof } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , range_proof_type , NULL , [ & ] ( cryptonote : : transaction & tx , size_t tx_idx ) {
CHECK_TEST_CONDITION ( tx . rct_signatures . type = = rct : : RCTTypeBulletproof ) ;
tx . rct_signatures . type = rct : : RCTTypeSimple ;
const rct : : RCTConfig rct_config [ ] = { { rct : : RangeProofBorromean , 0 } } ;
return generate_with ( events , mixin , 1 , amounts_paid , false , rct_config , NULL , [ & ] ( cryptonote : : transaction & tx , size_t tx_idx ) {
return true ;
} ) ;
}