From df264442da652b9c8c6c59caf697fc47e07ab9df Mon Sep 17 00:00:00 2001 From: Anzhy Cherrnyavski Date: Fri, 25 Jan 2019 13:46:40 +0300 Subject: [PATCH] Added sign_btc_transaction_operation and sign_btc_transaction_evaluator --- libraries/app/impacted.cpp | 4 + .../chain/bitcoin_transaction_evaluator.cpp | 107 ++++++++ libraries/chain/db_init.cpp | 1 + libraries/chain/db_notify.cpp | 4 + .../chain/bitcoin_transaction_evaluator.hpp | 22 +- .../chain/protocol/bitcoin_transaction.hpp | 21 ++ .../graphene/chain/protocol/operations.hpp | 3 +- .../include/sidechain/bitcoin_address.hpp | 1 - .../sidechain/include/sidechain/utils.hpp | 3 + libraries/sidechain/utils.cpp | 8 + tests/tests/bitcoin_sign_tests.cpp | 241 ++++++++++++++++-- 11 files changed, 390 insertions(+), 25 deletions(-) diff --git a/libraries/app/impacted.cpp b/libraries/app/impacted.cpp index 65d73906..7e4ff990 100644 --- a/libraries/app/impacted.cpp +++ b/libraries/app/impacted.cpp @@ -294,6 +294,10 @@ struct get_impacted_account_visitor { _impacted.insert( op.payer ); } + void operator()( const bitcoin_transaction_sign_operation& op ) + { + _impacted.insert( op.payer ); + } }; void operation_get_impacted_accounts( const operation& op, flat_set& result ) diff --git a/libraries/chain/bitcoin_transaction_evaluator.cpp b/libraries/chain/bitcoin_transaction_evaluator.cpp index 0b90a8e2..55573c88 100644 --- a/libraries/chain/bitcoin_transaction_evaluator.cpp +++ b/libraries/chain/bitcoin_transaction_evaluator.cpp @@ -3,11 +3,18 @@ #include #include #include +#include +#include +#include #include +#include + namespace graphene { namespace chain { +using namespace sidechain; + void_result bitcoin_transaction_send_evaluator::do_evaluate( const bitcoin_transaction_send_operation& op ) { // FC_ASSERT( db().get_sidechain_account_id() == op.payer ); @@ -77,4 +84,104 @@ void bitcoin_transaction_send_evaluator::send_bitcoin_transaction( const bitcoin } } +void_result bitcoin_transaction_sign_evaluator::do_evaluate( const bitcoin_transaction_sign_operation& op ) +{ + database& d = db(); + + const auto& sidechain_proposal_idx = d.get_index_type().indices().get(); + const auto& sidechain_proposal_itr = sidechain_proposal_idx.find( op.sidechain_proposal_id ); + FC_ASSERT( sidechain_proposal_idx.end() != sidechain_proposal_itr, + "sidechain_proposal not found"); + + witness_id_type scheduled_witness = d.get_scheduled_witness( 1 ); + const auto& witness_obj = d.get< witness_object >( scheduled_witness ); + FC_ASSERT( witness_obj.witness_account == op.payer, "Incorrect witness." ); + + sidechain::bytes public_key( public_key_data_to_bytes( witness_obj.signing_key.key_data ) ); + const auto& proposal = sidechain_proposal_itr->proposal_id( d ); + auto btc_send_op = proposal.proposed_transaction.operations[0].get(); + FC_ASSERT( check_sigs( public_key, op.signatures, btc_send_op.vins, btc_send_op.transaction ) ); // Add pw_vin + + // const auto& proposal = sidechain_proposal_itr->proposal_id( d ); + // FC_ASSERT( d.check_witness( witness_obj, *btc_tx, proposal ), "Can't sign this transaction" ); + + return void_result(); +} + +void_result bitcoin_transaction_sign_evaluator::do_apply( const bitcoin_transaction_sign_operation& op ) +{ + database& d = db(); + + const auto& sidechain_proposal = op.sidechain_proposal_id( d ); + const auto& proposal = sidechain_proposal.proposal_id( d ); + + d.modify( proposal, [&]( proposal_object& po ) { + auto bitcoin_transaction_send_op = po.proposed_transaction.operations[0].get(); + for( size_t i = 0; i < op.signatures.size(); i++ ) { + bitcoin_transaction_send_op.transaction.vin[i].scriptWitness.push_back( op.signatures[i] ); + } + po.proposed_transaction.operations[0] = bitcoin_transaction_send_op; + }); + + update_proposal( op ); + + return void_result(); +} + +void bitcoin_transaction_sign_evaluator::update_proposal( const bitcoin_transaction_sign_operation& op ) +{ + database& d = db(); + proposal_update_operation update_op; + + update_op.fee_paying_account = op.payer; + update_op.proposal = op.sidechain_proposal_id( d ).proposal_id; + update_op.active_approvals_to_add = { op.payer }; + + bool skip_fee_old = trx_state->skip_fee; + bool skip_fee_schedule_check_old = trx_state->skip_fee_schedule_check; + trx_state->skip_fee = true; + trx_state->skip_fee_schedule_check = true; + + d.apply_operation( *trx_state, update_op ); + + trx_state->skip_fee = skip_fee_old; + trx_state->skip_fee_schedule_check = skip_fee_schedule_check_old; +} + +bool bitcoin_transaction_sign_evaluator::check_sigs( const bytes& key_data, const std::vector& sigs, + const std::vector& info_for_vins, + const bitcoin_transaction& tx ) +{ + FC_ASSERT( sigs.size() == info_for_vins.size() && sigs.size() == tx.vin.size() ); + + for( size_t i = 0; i < tx.vin.size(); i++ ) { + const bytes& script = info_for_vins[i].script; + const auto& sighash_str = get_signature_hash( tx, script, static_cast( info_for_vins[i].out.amount ), i, 1, true ).str(); + const bytes& sighash_hex = parse_hex( sighash_str ); + + if( !verify_sig( sigs[i], key_data, sighash_hex, db().context_verify ) ) { + return false; + } + + size_t count_sigs = 0; + for( auto& s : tx.vin[i].scriptWitness ) { + if( verify_sig( s, key_data, sighash_hex, db().context_verify ) ) { + count_sigs++; + } + } + + std::vector pubkeys = get_pubkey_from_redeemScript( script ); + size_t count_pubkeys = std::count( pubkeys.begin(), pubkeys.end(), key_data ); + if( count_sigs >= count_pubkeys ) { + return false; + } + + uint32_t position = std::find( op_num.begin(), op_num.end(), script[0] ) - op_num.begin(); + if( !( position >= 0 && position < op_num.size() ) || tx.vin[i].scriptWitness.size() == position + 1 ) { + return false; + } + } + return true; +} + } } diff --git a/libraries/chain/db_init.cpp b/libraries/chain/db_init.cpp index 0fab1944..d21fbec0 100644 --- a/libraries/chain/db_init.cpp +++ b/libraries/chain/db_init.cpp @@ -250,6 +250,7 @@ void database::initialize_evaluators() register_evaluator(); register_evaluator(); register_evaluator(); + register_evaluator(); } void database::initialize_indexes() diff --git a/libraries/chain/db_notify.cpp b/libraries/chain/db_notify.cpp index fd02ba23..023d4bd7 100644 --- a/libraries/chain/db_notify.cpp +++ b/libraries/chain/db_notify.cpp @@ -281,6 +281,10 @@ struct get_impacted_account_visitor { _impacted.insert( op.payer ); } + void operator()( const bitcoin_transaction_sign_operation& op ) + { + _impacted.insert( op.payer ); + } }; void operation_get_impacted_accounts( const operation& op, flat_set& result ) diff --git a/libraries/chain/include/graphene/chain/bitcoin_transaction_evaluator.hpp b/libraries/chain/include/graphene/chain/bitcoin_transaction_evaluator.hpp index c402b503..9a9364d4 100644 --- a/libraries/chain/include/graphene/chain/bitcoin_transaction_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/bitcoin_transaction_evaluator.hpp @@ -2,6 +2,8 @@ #include +namespace sidechain { class info_for_vin; } + namespace graphene { namespace chain { class bitcoin_transaction_send_evaluator : public evaluator @@ -18,4 +20,22 @@ public: void send_bitcoin_transaction( const bitcoin_transaction_object& btc_tx ); }; -} } // graphene::chain +class bitcoin_transaction_sign_evaluator : public evaluator +{ + +public: + + typedef bitcoin_transaction_sign_operation operation_type; + + void_result do_evaluate( const bitcoin_transaction_sign_operation& op ); + + void_result do_apply( const bitcoin_transaction_sign_operation& op ); + + void update_proposal( const bitcoin_transaction_sign_operation& op ); + + bool check_sigs( const sidechain::bytes& key_data, const std::vector& sigs, + const std::vector& info_for_vins, const sidechain::bitcoin_transaction& tx ); + +}; + +} } // graphene::chain \ No newline at end of file diff --git a/libraries/chain/include/graphene/chain/protocol/bitcoin_transaction.hpp b/libraries/chain/include/graphene/chain/protocol/bitcoin_transaction.hpp index ca444952..61129c73 100644 --- a/libraries/chain/include/graphene/chain/protocol/bitcoin_transaction.hpp +++ b/libraries/chain/include/graphene/chain/protocol/bitcoin_transaction.hpp @@ -31,7 +31,28 @@ namespace graphene { namespace chain { } }; + + struct bitcoin_transaction_sign_operation : public base_operation + { + struct fee_parameters_type { + uint64_t fee = 0; + uint32_t price_per_kbyte = 0; + }; + + asset fee; + account_id_type payer; + sidechain_proposal_id_type sidechain_proposal_id; + std::vector signatures; + + account_id_type fee_payer()const { return payer; } + void validate()const {} + share_type calculate_fee( const fee_parameters_type& k )const { return 0; } + }; + } } // graphene::chain FC_REFLECT( graphene::chain::bitcoin_transaction_send_operation::fee_parameters_type, (fee)(price_per_kbyte) ) FC_REFLECT( graphene::chain::bitcoin_transaction_send_operation, (fee)(payer)(vins)(vouts)(transaction)(fee_for_size) ) + +FC_REFLECT( graphene::chain::bitcoin_transaction_sign_operation::fee_parameters_type, (fee)(price_per_kbyte) ) +FC_REFLECT( graphene::chain::bitcoin_transaction_sign_operation, (fee)(payer)(sidechain_proposal_id)(signatures) ) diff --git a/libraries/chain/include/graphene/chain/protocol/operations.hpp b/libraries/chain/include/graphene/chain/protocol/operations.hpp index e88e8ee8..dcd2f01c 100644 --- a/libraries/chain/include/graphene/chain/protocol/operations.hpp +++ b/libraries/chain/include/graphene/chain/protocol/operations.hpp @@ -135,7 +135,8 @@ namespace graphene { namespace chain { affiliate_referral_payout_operation, // VIRTUAL withdraw_pbtc_operation, bitcoin_address_create_operation, - bitcoin_transaction_send_operation + bitcoin_transaction_send_operation, + bitcoin_transaction_sign_operation > operation; /// @} // operations group diff --git a/libraries/sidechain/include/sidechain/bitcoin_address.hpp b/libraries/sidechain/include/sidechain/bitcoin_address.hpp index 08225439..d3216544 100644 --- a/libraries/sidechain/include/sidechain/bitcoin_address.hpp +++ b/libraries/sidechain/include/sidechain/bitcoin_address.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include diff --git a/libraries/sidechain/include/sidechain/utils.hpp b/libraries/sidechain/include/sidechain/utils.hpp index 21427a26..276f888f 100644 --- a/libraries/sidechain/include/sidechain/utils.hpp +++ b/libraries/sidechain/include/sidechain/utils.hpp @@ -2,6 +2,7 @@ #include #include +#include namespace sidechain { @@ -9,4 +10,6 @@ bytes parse_hex( const std::string& str ); std::vector get_pubkey_from_redeemScript( bytes script ); +bytes public_key_data_to_bytes( const fc::ecc::public_key_data& key ); + } diff --git a/libraries/sidechain/utils.cpp b/libraries/sidechain/utils.cpp index fff59cbc..b13c63fb 100644 --- a/libraries/sidechain/utils.cpp +++ b/libraries/sidechain/utils.cpp @@ -24,4 +24,12 @@ std::vector get_pubkey_from_redeemScript( bytes script ) return result; } +bytes public_key_data_to_bytes( const fc::ecc::public_key_data& key ) +{ + bytes result; + result.resize( key.size() ); + std::copy( key.begin(), key.end(), result.begin() ); + return result; +} + } diff --git a/tests/tests/bitcoin_sign_tests.cpp b/tests/tests/bitcoin_sign_tests.cpp index c524d0f3..17605e16 100644 --- a/tests/tests/bitcoin_sign_tests.cpp +++ b/tests/tests/bitcoin_sign_tests.cpp @@ -4,10 +4,15 @@ #include #include #include +#include +#include +#include +#include "../common/database_fixture.hpp" using namespace sidechain; +using namespace fc::ecc; -BOOST_AUTO_TEST_SUITE( bitcoin_sign_tests ) +BOOST_FIXTURE_TEST_SUITE( bitcoin_sign_tests, database_fixture ) inline bytes get_privkey_bytes( const std::string& privkey_base58 ) { @@ -42,14 +47,11 @@ BOOST_AUTO_TEST_CASE( btc_tx_witness_signature_test ) vin.out.amount = amount; vin.script = redeemScript; - secp256k1_context_t* context_sign = secp256k1_context_create( SECP256K1_CONTEXT_SIGN ); - tx.vin[0].scriptWitness.push_back( sign_witness_transaction_part( tx, { vin }, privkey_1, context_sign, hash_type)[0] ); - tx.vin[0].scriptWitness.push_back( sign_witness_transaction_part( tx, { vin }, privkey_2, context_sign, hash_type)[0] ); + tx.vin[0].scriptWitness.push_back( sign_witness_transaction_part( tx, { vin }, privkey_1, db.context_sign, hash_type)[0] ); + tx.vin[0].scriptWitness.push_back( sign_witness_transaction_part( tx, { vin }, privkey_2, db.context_sign, hash_type)[0] ); sign_witness_transaction_finalize( tx, { vin } ); BOOST_CHECK( fc::to_hex( pack( tx ) ) == "0100000000010145310e878941a1b2bc2d33797ee4d89d95eaaf2e13488063a2aa9a74490f510a0100000023220020b6744de4f6ec63cc92f7c220cdefeeb1b1bed2b66c8e5706d80ec247d37e65a1ffffffff01002d3101000000001976a9143ebc40e411ed3c76f86711507ab952300890397288ac0400473044022001dd489a5d4e2fbd8a3ade27177f6b49296ba7695c40dbbe650ea83f106415fd02200b23a0602d8ff1bdf79dee118205fc7e9b40672bf31563e5741feb53fb86388501483045022100f88f040e90cc5dc6c6189d04718376ac19ed996bf9e4a3c29c3718d90ffd27180220761711f16c9e3a44f71aab55cbc0634907a1fa8bb635d971a9a01d368727bea10169522103b3623117e988b76aaabe3d63f56a4fc88b228a71e64c4cc551d1204822fe85cb2103dd823066e096f72ed617a41d3ca56717db335b1ea47a1b4c5c9dbdd0963acba621033d7c89bd9da29fa8d44db7906a9778b53121f72191184a9fee785c39180e4be153ae00000000" ); - - secp256k1_context_destroy( context_sign ); } BOOST_AUTO_TEST_CASE( verify_sig_test ) @@ -63,15 +65,12 @@ BOOST_AUTO_TEST_CASE( verify_sig_test ) std::string sig( "3044022051641c36fc6bc1e7ddd0022259c3f3a8dce0ac7fa4538c8b303c49e14b216b5302204e64c88a7f0279d902ccb338ffd42941ccdbbd7ddf8ba17d1ebf693f1f0b3ed901" ); bytes vec_sig( parse_hex( sig ) ); - secp256k1_context_t* context_verify = secp256k1_context_create( SECP256K1_CONTEXT_VERIFY ); - BOOST_CHECK( verify_sig( vec_sig, vec_key1, vec_hash, context_verify ) ); + BOOST_CHECK( verify_sig( vec_sig, vec_key1, vec_hash, db.context_verify ) ); std::string key2( "02c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435ca" ); bytes vec_key2( parse_hex( key2 ) ); - BOOST_CHECK( !verify_sig( vec_sig, vec_key2, vec_hash, context_verify ) ); - - secp256k1_context_destroy( context_verify ); + BOOST_CHECK( !verify_sig( vec_sig, vec_key2, vec_hash, db.context_verify ) ); } BOOST_AUTO_TEST_CASE( get_pubkey_from_redeemScript_test ) @@ -117,13 +116,10 @@ std::vector create_info_vins( const std::vector& scripts, c } void test_sort_sigs( const bitcoin_transaction& trx, const std::vector& scripts, - const std::vector& amounts, const std::vector>& results ) + const std::vector& amounts, const std::vector>& results, secp256k1_context_t* context_verify ) { std::vector info_vins( create_info_vins( scripts, amounts ) ); - - secp256k1_context_t* context_verify = secp256k1_context_create( SECP256K1_CONTEXT_VERIFY ); auto new_stacks = sort_sigs( trx, info_vins, context_verify ); - secp256k1_context_destroy( context_verify ); for( size_t i = 0; i < trx.vin.size(); i++ ) { BOOST_CHECK( new_stacks[i] == results[i] ); @@ -137,37 +133,238 @@ BOOST_AUTO_TEST_CASE( sort_sig_test ) std::vector amounts( fc::json::from_string( "[5993981520,1200000000,1200000000,1200000000]" ).as< std::vector >() ); std::vector> results( fc::json::from_string( "[[\"30440220098d274e3de29da36577f88ff851d030051b417a0309b61ba1c90d1750eee432022013946f9434893e4d9cbc23b68ec8243ed935823948d701f007edb6ccc46ac29801\",\"3045022100c2cb782558909109d5971ff29e23011b8eb4cd99e86030ac81a15b3312d897530220690080ce113caf84373ac04cc16e7f62ee5eeaf47b26d8017d2509c5d5510c0201\",\"3045022100888c5c9b5d2a4f3a17713cf665c2c65f3b9e954c2bcf3506deb9e410a33f6ca50220604f2a37e3650aded4c5811826098f8fa18af62fe07273c138440c16bdae074401\",\"3045022100cd4e8db4154b100077a30063654c4fc8473c3856064264293b931968fff9cee9022028ab2c8694218853756cca3e5ef5857694037e56e559a0004b292c7122ab355401\",\"30440220772bd2e8afe8c39d28e0c08ea81281d14239033cb93c92edf52250da542fa7c2022059ca93f98b194c9bcc8017ba3de19893fad06c8ea74430dc5fbe7eb81844598d01\"],[\"3044022010a60381cdb91d1f45579cc1d06df44b57c5af98b475089c8b349ad96a9d84fd02200840cff73d4053521dc4e7b210d20114ca82926ae96eb74633284f03f9d9861c01\",\"304402205639d8b13a6d912a3fd086abd34eb7455320aeb6b7ff148452a469f90fe636c80220035aad331677b67590845a5c6e9f8a6805d7add98cbab7047362a91717934e0001\",\"304402202945a632fe13b14099c80eb29fe6144597ca33b6fe10995a4b8756725149b5d902202b2e6a2b7bb39c7441877feaa1be68d144859ac755099704bd49eac41e12c92e01\",\"304402200e4fd2d3001736fbdabc65d50a3a04b6f99a80dc7a50b7257d65d7ced844c2320220613d8704833c50c445f56769b27067ca68299f8a462e2b62fb9e55d7c3e7046701\",\"3045022100b93623da6ed9a3f75082dbd77fab5492e64ae96ad4cdbb70f5a9ff1b2b30aa2602205df026319f3f21ba6f69f0be2469155c62dcf54ddfaf5f7d489d969b8364a3e401\"],[\"30450221009f1c1053f45450a9e20c7735b645eb3825587ecd9dcb39a0d6de35926dbb252802204bad14928faacca9481d69960d5add5acbf7072e5230a146a7ecb6d9193b7d5001\",\"3045022100f32581419b4b46b3aa3bab0ad80202ba559fa1b086b6b02d003a2aac19782d6b02204e3132c43a12411e52f0d8b3714cb77d82136752a1e939af87d865ccda75b0ec01\",\"3045022100e145ab07653d0b2d472ebc393b5e82eee725c65573dfb458c36c7717aba5994002201cd00d40dca3120db7b38239da801765f042e248785c8d44ce4a0b8b1d57b36901\",\"3045022100f7f48205bdbb5e1690e635bf02205e4790c57aadb3f65adabd4890eb4285cfd5022056a0013f35f59c73dc2048697e0330a439e7b35804b655dbda938bdfc77ced9301\",\"30440220762212bfd15454036502ecd635314f7f81be982ea16dddf892693815745b32c7022069846f5b22b0246737396834123439556c9f8cd640006ad1ef8c70d86ca70a3e01\"],[\"304402202c1bcbd436f95e42364122f9f552466122597050962524850434bfeb0b1a721e02200f5f7cfc4d7c43c550a59918d43ee52e76e04c8da381303558f4fc83cc64e19201\",\"304402201669a5580624132b2f1e8d2a51831816846c5f93505623dc03ea6a9f01f023ed022054c69ae28483cd40ac144b7d4af4ff29292813cda425373eabd8d14624c61aae01\",\"3045022100f1b787c0466e88bbc663df7f5584dfa68416c106ab806e0b9f959c6f51b7221b022042633dfc95cde470690a52d5cc468e2f9a745fc1db2fee692b8f31cfce28c0cb01\",\"304402206468ea767ad5aa2fbe837c29ae2fee4f87063d25b9e97fc6f7f679a036a892bf022055e78030476a78d8fc9177bf2e64ccece65005493a8fc6bd1352741153e7eea601\",\"3045022100c8a830255c4ea9ca205126701fc435d39993eca2d7024817958beea76ad3785102201cb27c7613031a4f55bc3c43683aa57f04a4f73291ad9c1076c5281bc49dc4d101\"]]" ).as< std::vector> >() ); - test_sort_sigs( trx, scripts, amounts, results ); + test_sort_sigs( trx, scripts, amounts, results, db.context_verify ); } -BOOST_AUTO_TEST_CASE( already_sorted_sigs ) +BOOST_AUTO_TEST_CASE( already_sorted_sigs_test ) { bitcoin_transaction trx( fc::json::from_string( "{\"nVersion\":1,\"vin\":[{\"prevout\":{\"hash\":\"e937fd2942f0f14dd46a122e138d00cfabd93572b4876da77ab57c2a76ee73af\",\"n\":0},\"scriptSig\":\"\",\"nSequence\":4294967295,\"scriptWitness\":[\"30440220098d274e3de29da36577f88ff851d030051b417a0309b61ba1c90d1750eee432022013946f9434893e4d9cbc23b68ec8243ed935823948d701f007edb6ccc46ac29801\",\"3045022100c2cb782558909109d5971ff29e23011b8eb4cd99e86030ac81a15b3312d897530220690080ce113caf84373ac04cc16e7f62ee5eeaf47b26d8017d2509c5d5510c0201\",\"3045022100888c5c9b5d2a4f3a17713cf665c2c65f3b9e954c2bcf3506deb9e410a33f6ca50220604f2a37e3650aded4c5811826098f8fa18af62fe07273c138440c16bdae074401\",\"3045022100cd4e8db4154b100077a30063654c4fc8473c3856064264293b931968fff9cee9022028ab2c8694218853756cca3e5ef5857694037e56e559a0004b292c7122ab355401\",\"30440220772bd2e8afe8c39d28e0c08ea81281d14239033cb93c92edf52250da542fa7c2022059ca93f98b194c9bcc8017ba3de19893fad06c8ea74430dc5fbe7eb81844598d01\"]},{\"prevout\":{\"hash\":\"ae34ad50ab112e6cc51e6e3a87c48798b67255f8c8a8af9d427cbf55207ecfd1\",\"n\":0},\"scriptSig\":\"220020d85971e91d6e46473104e3f7e5eb67d885304a08dd17b3e1a0eeebe5a15f54a6\",\"nSequence\":4294967295,\"scriptWitness\":[\"3044022010a60381cdb91d1f45579cc1d06df44b57c5af98b475089c8b349ad96a9d84fd02200840cff73d4053521dc4e7b210d20114ca82926ae96eb74633284f03f9d9861c01\",\"304402205639d8b13a6d912a3fd086abd34eb7455320aeb6b7ff148452a469f90fe636c80220035aad331677b67590845a5c6e9f8a6805d7add98cbab7047362a91717934e0001\",\"304402202945a632fe13b14099c80eb29fe6144597ca33b6fe10995a4b8756725149b5d902202b2e6a2b7bb39c7441877feaa1be68d144859ac755099704bd49eac41e12c92e01\",\"304402200e4fd2d3001736fbdabc65d50a3a04b6f99a80dc7a50b7257d65d7ced844c2320220613d8704833c50c445f56769b27067ca68299f8a462e2b62fb9e55d7c3e7046701\",\"3045022100b93623da6ed9a3f75082dbd77fab5492e64ae96ad4cdbb70f5a9ff1b2b30aa2602205df026319f3f21ba6f69f0be2469155c62dcf54ddfaf5f7d489d969b8364a3e401\"]},{\"prevout\":{\"hash\":\"e04ee70b6aa2180caa32aaa4ff00c80b62e5572c369e05986d3a0e0b6d9d7455\",\"n\":0},\"scriptSig\":\"220020d85971e91d6e46473104e3f7e5eb67d885304a08dd17b3e1a0eeebe5a15f54a6\",\"nSequence\":4294967295,\"scriptWitness\":[\"30450221009f1c1053f45450a9e20c7735b645eb3825587ecd9dcb39a0d6de35926dbb252802204bad14928faacca9481d69960d5add5acbf7072e5230a146a7ecb6d9193b7d5001\",\"3045022100f32581419b4b46b3aa3bab0ad80202ba559fa1b086b6b02d003a2aac19782d6b02204e3132c43a12411e52f0d8b3714cb77d82136752a1e939af87d865ccda75b0ec01\",\"3045022100e145ab07653d0b2d472ebc393b5e82eee725c65573dfb458c36c7717aba5994002201cd00d40dca3120db7b38239da801765f042e248785c8d44ce4a0b8b1d57b36901\",\"3045022100f7f48205bdbb5e1690e635bf02205e4790c57aadb3f65adabd4890eb4285cfd5022056a0013f35f59c73dc2048697e0330a439e7b35804b655dbda938bdfc77ced9301\",\"30440220762212bfd15454036502ecd635314f7f81be982ea16dddf892693815745b32c7022069846f5b22b0246737396834123439556c9f8cd640006ad1ef8c70d86ca70a3e01\"]},{\"prevout\":{\"hash\":\"6bc22ed725ba7c164df3a878113a11e4fbc3d1bbffee0083e75cb14e7bb5bd38\",\"n\":1},\"scriptSig\":\"220020d85971e91d6e46473104e3f7e5eb67d885304a08dd17b3e1a0eeebe5a15f54a6\",\"nSequence\":4294967295,\"scriptWitness\":[\"304402202c1bcbd436f95e42364122f9f552466122597050962524850434bfeb0b1a721e02200f5f7cfc4d7c43c550a59918d43ee52e76e04c8da381303558f4fc83cc64e19201\",\"304402201669a5580624132b2f1e8d2a51831816846c5f93505623dc03ea6a9f01f023ed022054c69ae28483cd40ac144b7d4af4ff29292813cda425373eabd8d14624c61aae01\",\"3045022100f1b787c0466e88bbc663df7f5584dfa68416c106ab806e0b9f959c6f51b7221b022042633dfc95cde470690a52d5cc468e2f9a745fc1db2fee692b8f31cfce28c0cb01\",\"304402206468ea767ad5aa2fbe837c29ae2fee4f87063d25b9e97fc6f7f679a036a892bf022055e78030476a78d8fc9177bf2e64ccece65005493a8fc6bd1352741153e7eea601\",\"3045022100c8a830255c4ea9ca205126701fc435d39993eca2d7024817958beea76ad3785102201cb27c7613031a4f55bc3c43683aa57f04a4f73291ad9c1076c5281bc49dc4d101\"]}],\"vout\":[{\"value\":\"9590365272\",\"scriptPubKey\":\"00206a19177b8e4d76408c574118681f204c1a7065040636d5288af41f67c25a85f0\"},{\"value\":240000,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":240000,\"scriptPubKey\":\"2102ec74848d166af51b430f6d130606896e1436688e935dd8407c3aa15c38d4471bac\"},{\"value\":240000,\"scriptPubKey\":\"2102cd19bf004e5d533de24bcc55d8573fe5fada438860512a9bbe37118733b34c80ac\"},{\"value\":240000,\"scriptPubKey\":\"21021d2559f259df45f16287d8f55ab41c1c2fb7099a75cc99a3f250611d99390091ac\"},{\"value\":240000,\"scriptPubKey\":\"2103e4857a5da1e9483ba14644421489790120555baccb9cf130848e0261464bb7b0ac\"},{\"value\":240000,\"scriptPubKey\":\"21028ba26c831fb21084c9bbb7059f76debbf442822adc286ee43ea3092fd666bcfaac\"},{\"value\":240000,\"scriptPubKey\":\"21030d9f1f4be73391d5814bb00cdb6ae10b4a1182a32a77672b5b744efa2e88dcdeac\"},{\"value\":240000,\"scriptPubKey\":\"2102096d78d32f51a1051c8e4f58ea99427ce335e76f6ea00c915cf6d7ac1270de51ac\"},{\"value\":240000,\"scriptPubKey\":\"2103b0184a0323802226dfaa767d0bc93e261762d3ae4457c04ca2613215365d2dc6ac\"},{\"value\":240000,\"scriptPubKey\":\"210226d279da5bfd81f7ab9ab804a3d0b44a06dd883a1f29d4671d4da4793b9d0d29ac\"},{\"value\":240000,\"scriptPubKey\":\"2103c6206bca3492f93b27a877362ffc25a57177fe0be4a7aaad661daead7703232fac\"}],\"nLockTime\":0}" ).as< bitcoin_transaction >() ); std::vector scripts( fc::json::from_string( "[\"552102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102ec74848d166af51b430f6d130606896e1436688e935dd8407c3aa15c38d4471b2102cd19bf004e5d533de24bcc55d8573fe5fada438860512a9bbe37118733b34c8021021d2559f259df45f16287d8f55ab41c1c2fb7099a75cc99a3f250611d993900912103e4857a5da1e9483ba14644421489790120555baccb9cf130848e0261464bb7b021028ba26c831fb21084c9bbb7059f76debbf442822adc286ee43ea3092fd666bcfa21030d9f1f4be73391d5814bb00cdb6ae10b4a1182a32a77672b5b744efa2e88dcde2102096d78d32f51a1051c8e4f58ea99427ce335e76f6ea00c915cf6d7ac1270de512103b0184a0323802226dfaa767d0bc93e261762d3ae4457c04ca2613215365d2dc6210226d279da5bfd81f7ab9ab804a3d0b44a06dd883a1f29d4671d4da4793b9d0d292103c6206bca3492f93b27a877362ffc25a57177fe0be4a7aaad661daead7703232f5bae\",\"5521025feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e92102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102ec74848d166af51b430f6d130606896e1436688e935dd8407c3aa15c38d4471b2102cd19bf004e5d533de24bcc55d8573fe5fada438860512a9bbe37118733b34c8021021d2559f259df45f16287d8f55ab41c1c2fb7099a75cc99a3f250611d993900912103e4857a5da1e9483ba14644421489790120555baccb9cf130848e0261464bb7b021028ba26c831fb21084c9bbb7059f76debbf442822adc286ee43ea3092fd666bcfa21030d9f1f4be73391d5814bb00cdb6ae10b4a1182a32a77672b5b744efa2e88dcde2102096d78d32f51a1051c8e4f58ea99427ce335e76f6ea00c915cf6d7ac1270de512103b0184a0323802226dfaa767d0bc93e261762d3ae4457c04ca2613215365d2dc6210226d279da5bfd81f7ab9ab804a3d0b44a06dd883a1f29d4671d4da4793b9d0d295bae\",\"5521025feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e92102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102ec74848d166af51b430f6d130606896e1436688e935dd8407c3aa15c38d4471b2102cd19bf004e5d533de24bcc55d8573fe5fada438860512a9bbe37118733b34c8021021d2559f259df45f16287d8f55ab41c1c2fb7099a75cc99a3f250611d993900912103e4857a5da1e9483ba14644421489790120555baccb9cf130848e0261464bb7b021028ba26c831fb21084c9bbb7059f76debbf442822adc286ee43ea3092fd666bcfa21030d9f1f4be73391d5814bb00cdb6ae10b4a1182a32a77672b5b744efa2e88dcde2102096d78d32f51a1051c8e4f58ea99427ce335e76f6ea00c915cf6d7ac1270de512103b0184a0323802226dfaa767d0bc93e261762d3ae4457c04ca2613215365d2dc6210226d279da5bfd81f7ab9ab804a3d0b44a06dd883a1f29d4671d4da4793b9d0d295bae\",\"5521025feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e92102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102ec74848d166af51b430f6d130606896e1436688e935dd8407c3aa15c38d4471b2102cd19bf004e5d533de24bcc55d8573fe5fada438860512a9bbe37118733b34c8021021d2559f259df45f16287d8f55ab41c1c2fb7099a75cc99a3f250611d993900912103e4857a5da1e9483ba14644421489790120555baccb9cf130848e0261464bb7b021028ba26c831fb21084c9bbb7059f76debbf442822adc286ee43ea3092fd666bcfa21030d9f1f4be73391d5814bb00cdb6ae10b4a1182a32a77672b5b744efa2e88dcde2102096d78d32f51a1051c8e4f58ea99427ce335e76f6ea00c915cf6d7ac1270de512103b0184a0323802226dfaa767d0bc93e261762d3ae4457c04ca2613215365d2dc6210226d279da5bfd81f7ab9ab804a3d0b44a06dd883a1f29d4671d4da4793b9d0d295bae\"]" ).as< std::vector >() ); std::vector amounts( fc::json::from_string( "[5993981520,1200000000,1200000000,1200000000]" ).as< std::vector >() ); std::vector> results( fc::json::from_string( "[[\"30440220098d274e3de29da36577f88ff851d030051b417a0309b61ba1c90d1750eee432022013946f9434893e4d9cbc23b68ec8243ed935823948d701f007edb6ccc46ac29801\",\"3045022100c2cb782558909109d5971ff29e23011b8eb4cd99e86030ac81a15b3312d897530220690080ce113caf84373ac04cc16e7f62ee5eeaf47b26d8017d2509c5d5510c0201\",\"3045022100888c5c9b5d2a4f3a17713cf665c2c65f3b9e954c2bcf3506deb9e410a33f6ca50220604f2a37e3650aded4c5811826098f8fa18af62fe07273c138440c16bdae074401\",\"3045022100cd4e8db4154b100077a30063654c4fc8473c3856064264293b931968fff9cee9022028ab2c8694218853756cca3e5ef5857694037e56e559a0004b292c7122ab355401\",\"30440220772bd2e8afe8c39d28e0c08ea81281d14239033cb93c92edf52250da542fa7c2022059ca93f98b194c9bcc8017ba3de19893fad06c8ea74430dc5fbe7eb81844598d01\"],[\"3044022010a60381cdb91d1f45579cc1d06df44b57c5af98b475089c8b349ad96a9d84fd02200840cff73d4053521dc4e7b210d20114ca82926ae96eb74633284f03f9d9861c01\",\"304402205639d8b13a6d912a3fd086abd34eb7455320aeb6b7ff148452a469f90fe636c80220035aad331677b67590845a5c6e9f8a6805d7add98cbab7047362a91717934e0001\",\"304402202945a632fe13b14099c80eb29fe6144597ca33b6fe10995a4b8756725149b5d902202b2e6a2b7bb39c7441877feaa1be68d144859ac755099704bd49eac41e12c92e01\",\"304402200e4fd2d3001736fbdabc65d50a3a04b6f99a80dc7a50b7257d65d7ced844c2320220613d8704833c50c445f56769b27067ca68299f8a462e2b62fb9e55d7c3e7046701\",\"3045022100b93623da6ed9a3f75082dbd77fab5492e64ae96ad4cdbb70f5a9ff1b2b30aa2602205df026319f3f21ba6f69f0be2469155c62dcf54ddfaf5f7d489d969b8364a3e401\"],[\"30450221009f1c1053f45450a9e20c7735b645eb3825587ecd9dcb39a0d6de35926dbb252802204bad14928faacca9481d69960d5add5acbf7072e5230a146a7ecb6d9193b7d5001\",\"3045022100f32581419b4b46b3aa3bab0ad80202ba559fa1b086b6b02d003a2aac19782d6b02204e3132c43a12411e52f0d8b3714cb77d82136752a1e939af87d865ccda75b0ec01\",\"3045022100e145ab07653d0b2d472ebc393b5e82eee725c65573dfb458c36c7717aba5994002201cd00d40dca3120db7b38239da801765f042e248785c8d44ce4a0b8b1d57b36901\",\"3045022100f7f48205bdbb5e1690e635bf02205e4790c57aadb3f65adabd4890eb4285cfd5022056a0013f35f59c73dc2048697e0330a439e7b35804b655dbda938bdfc77ced9301\",\"30440220762212bfd15454036502ecd635314f7f81be982ea16dddf892693815745b32c7022069846f5b22b0246737396834123439556c9f8cd640006ad1ef8c70d86ca70a3e01\"],[\"304402202c1bcbd436f95e42364122f9f552466122597050962524850434bfeb0b1a721e02200f5f7cfc4d7c43c550a59918d43ee52e76e04c8da381303558f4fc83cc64e19201\",\"304402201669a5580624132b2f1e8d2a51831816846c5f93505623dc03ea6a9f01f023ed022054c69ae28483cd40ac144b7d4af4ff29292813cda425373eabd8d14624c61aae01\",\"3045022100f1b787c0466e88bbc663df7f5584dfa68416c106ab806e0b9f959c6f51b7221b022042633dfc95cde470690a52d5cc468e2f9a745fc1db2fee692b8f31cfce28c0cb01\",\"304402206468ea767ad5aa2fbe837c29ae2fee4f87063d25b9e97fc6f7f679a036a892bf022055e78030476a78d8fc9177bf2e64ccece65005493a8fc6bd1352741153e7eea601\",\"3045022100c8a830255c4ea9ca205126701fc435d39993eca2d7024817958beea76ad3785102201cb27c7613031a4f55bc3c43683aa57f04a4f73291ad9c1076c5281bc49dc4d101\"]]" ).as< std::vector> >() ); - test_sort_sigs( trx, scripts, amounts, results ); + test_sort_sigs( trx, scripts, amounts, results, db.context_verify ); } -BOOST_AUTO_TEST_CASE( all_signatures_are_same ) +BOOST_AUTO_TEST_CASE( all_signatures_are_same_test ) { bitcoin_transaction trx( fc::json::from_string( "{\"nVersion\":1,\"vin\":[{\"prevout\":{\"hash\":\"e35635fce1cbe1e347a5f8a3c5dccd79db9d43a6fb4b27991894a8bce1a70e03\",\"n\":0},\"scriptSig\":\"\",\"nSequence\":4294967295,\"scriptWitness\":[\"304402205370c8999e097e4018b04fa3be9c27e2ff16f0c21ef363c35dfd45b4290bf0740220775506660ece404703801a3f5a13fe24c96821c7d7eb42448abe35a1035cd8c801\",\"304402205370c8999e097e4018b04fa3be9c27e2ff16f0c21ef363c35dfd45b4290bf0740220775506660ece404703801a3f5a13fe24c96821c7d7eb42448abe35a1035cd8c801\",\"304402205370c8999e097e4018b04fa3be9c27e2ff16f0c21ef363c35dfd45b4290bf0740220775506660ece404703801a3f5a13fe24c96821c7d7eb42448abe35a1035cd8c801\",\"304402205370c8999e097e4018b04fa3be9c27e2ff16f0c21ef363c35dfd45b4290bf0740220775506660ece404703801a3f5a13fe24c96821c7d7eb42448abe35a1035cd8c801\",\"304402205370c8999e097e4018b04fa3be9c27e2ff16f0c21ef363c35dfd45b4290bf0740220775506660ece404703801a3f5a13fe24c96821c7d7eb42448abe35a1035cd8c801\"]},{\"prevout\":{\"hash\":\"1826f1ba0ed5034806cf1cb3eaa5dc9abf04a319048ae1e73e3df75dcc9f0bca\",\"n\":1},\"scriptSig\":\"2200203b9e077c0043e8f394a273baffc0aed01d10d8c894ad39810257d63be9a315e0\",\"nSequence\":4294967295,\"scriptWitness\":[\"3045022100ced739a6c04cf3c5e5bc760272bb6f41ecb3fa3671aa78ac1bc47629e39bb7ba02207a8693778d3b5a0c045fddc1ab23fcd971640460f150252b39993587151ff27d01\",\"3045022100ced739a6c04cf3c5e5bc760272bb6f41ecb3fa3671aa78ac1bc47629e39bb7ba02207a8693778d3b5a0c045fddc1ab23fcd971640460f150252b39993587151ff27d01\",\"3045022100ced739a6c04cf3c5e5bc760272bb6f41ecb3fa3671aa78ac1bc47629e39bb7ba02207a8693778d3b5a0c045fddc1ab23fcd971640460f150252b39993587151ff27d01\",\"3045022100ced739a6c04cf3c5e5bc760272bb6f41ecb3fa3671aa78ac1bc47629e39bb7ba02207a8693778d3b5a0c045fddc1ab23fcd971640460f150252b39993587151ff27d01\",\"3045022100ced739a6c04cf3c5e5bc760272bb6f41ecb3fa3671aa78ac1bc47629e39bb7ba02207a8693778d3b5a0c045fddc1ab23fcd971640460f150252b39993587151ff27d01\"]}],\"vout\":[{\"value\":1997997990,\"scriptPubKey\":\"0020a40e801531fdca0fb550013a9140aaaf8d9eb106c427258fbc86d0e0c52c432d\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"}],\"nLockTime\":0}" ).as< bitcoin_transaction >() ); std::vector scripts( fc::json::from_string( "[\"552102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf5bae\",\"5521025feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e92102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf5bae\"]" ).as< std::vector >() ); std::vector amounts( fc::json::from_string( "[998998995,1000000000]" ).as< std::vector >() ); std::vector> results( fc::json::from_string( "[[\"304402205370c8999e097e4018b04fa3be9c27e2ff16f0c21ef363c35dfd45b4290bf0740220775506660ece404703801a3f5a13fe24c96821c7d7eb42448abe35a1035cd8c801\",\"304402205370c8999e097e4018b04fa3be9c27e2ff16f0c21ef363c35dfd45b4290bf0740220775506660ece404703801a3f5a13fe24c96821c7d7eb42448abe35a1035cd8c801\",\"304402205370c8999e097e4018b04fa3be9c27e2ff16f0c21ef363c35dfd45b4290bf0740220775506660ece404703801a3f5a13fe24c96821c7d7eb42448abe35a1035cd8c801\",\"304402205370c8999e097e4018b04fa3be9c27e2ff16f0c21ef363c35dfd45b4290bf0740220775506660ece404703801a3f5a13fe24c96821c7d7eb42448abe35a1035cd8c801\",\"304402205370c8999e097e4018b04fa3be9c27e2ff16f0c21ef363c35dfd45b4290bf0740220775506660ece404703801a3f5a13fe24c96821c7d7eb42448abe35a1035cd8c801\"],[\"3045022100ced739a6c04cf3c5e5bc760272bb6f41ecb3fa3671aa78ac1bc47629e39bb7ba02207a8693778d3b5a0c045fddc1ab23fcd971640460f150252b39993587151ff27d01\",\"3045022100ced739a6c04cf3c5e5bc760272bb6f41ecb3fa3671aa78ac1bc47629e39bb7ba02207a8693778d3b5a0c045fddc1ab23fcd971640460f150252b39993587151ff27d01\",\"3045022100ced739a6c04cf3c5e5bc760272bb6f41ecb3fa3671aa78ac1bc47629e39bb7ba02207a8693778d3b5a0c045fddc1ab23fcd971640460f150252b39993587151ff27d01\",\"3045022100ced739a6c04cf3c5e5bc760272bb6f41ecb3fa3671aa78ac1bc47629e39bb7ba02207a8693778d3b5a0c045fddc1ab23fcd971640460f150252b39993587151ff27d01\",\"3045022100ced739a6c04cf3c5e5bc760272bb6f41ecb3fa3671aa78ac1bc47629e39bb7ba02207a8693778d3b5a0c045fddc1ab23fcd971640460f150252b39993587151ff27d01\"]]" ).as< std::vector> >() ); - test_sort_sigs( trx, scripts, amounts, results ); + test_sort_sigs( trx, scripts, amounts, results, db.context_verify ); } -BOOST_AUTO_TEST_CASE( same_signatures ) +BOOST_AUTO_TEST_CASE( same_signatures_test ) { bitcoin_transaction trx( fc::json::from_string( "{\"nVersion\":1,\"vin\":[{\"prevout\":{\"hash\":\"f8d70d29817a78e160c53dcffcf6a783008f1cc43c64f7efb49e4de3a23ef016\",\"n\":0},\"scriptSig\":\"\",\"nSequence\":4294967295,\"scriptWitness\":[\"30440220228c930388a0420aa9a17acdf414763bec0f57f92ecf8db51f02e3f8d82428aa0220417f2d0fbc5fd00d5d158a2e7fe7188857119b8d16d11f82f513594a28dbcbfa01\",\"304402204cc6d437f1f46263c36bc0605686b6072f0fb7c5991690e8ea06e8126f06a77f02205cfaa0f2e05ab9187fde9b10fbfee3ad06ae8b7120d455277186d1f8fd31b16c01\",\"3045022100d95008906e848a8165fbc0d3ed6d11643bc4814d4f8ae84c8c84a97c8c14885002206a2d703ffcca22309b843b55b746994fb08c15fbbf0aadbf900398e8768c62dc01\",\"304402204cc6d437f1f46263c36bc0605686b6072f0fb7c5991690e8ea06e8126f06a77f02205cfaa0f2e05ab9187fde9b10fbfee3ad06ae8b7120d455277186d1f8fd31b16c01\",\"304402204cc6d437f1f46263c36bc0605686b6072f0fb7c5991690e8ea06e8126f06a77f02205cfaa0f2e05ab9187fde9b10fbfee3ad06ae8b7120d455277186d1f8fd31b16c01\"]},{\"prevout\":{\"hash\":\"dd54a8c470be54b02cd937a1758761863c2faf920b2645d2dd35bd0308ef0dfb\",\"n\":1},\"scriptSig\":\"220020f38dc1aecea9e28bea4410e6aa807be49cf6472b9a718750080b9703e80d9fe9\",\"nSequence\":4294967295,\"scriptWitness\":[\"3045022100bdc4d1151d0567bb4e377b473100eaf41544bb547bc6d82b0a0dae8e8e833a6d022013caa911c553558abe6fdf1a6853ca6bab6912d90676595cfd4d11afd4f7966301\",\"3045022100c4d233c9183d91fd9f1821fb68e1180bbd6493eb66caf36438bccd8cb46a247302200d3a16ff3180fb9ffe8dd16c8ea71f461e7b940baea4c302c8d8e2ba9bf74b9201\",\"3045022100e1262b0e14df0f6f99d850651caa6b8881f7cbf811ad549cb0d6a1b1369beec902204232af72b6bfcb21a83d555374dc622275b7c2cac31b4f56d76b87d88fdc586e01\",\"3045022100c4d233c9183d91fd9f1821fb68e1180bbd6493eb66caf36438bccd8cb46a247302200d3a16ff3180fb9ffe8dd16c8ea71f461e7b940baea4c302c8d8e2ba9bf74b9201\",\"3045022100c4d233c9183d91fd9f1821fb68e1180bbd6493eb66caf36438bccd8cb46a247302200d3a16ff3180fb9ffe8dd16c8ea71f461e7b940baea4c302c8d8e2ba9bf74b9201\"]}],\"vout\":[{\"value\":2996996985,\"scriptPubKey\":\"0020a4d938999fff18a140d830009f8c9a2c5ab00d61cc3ffea10ee703b7d9b24b9a\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cfac\"},{\"value\":66667,\"scriptPubKey\":\"21030d9f1f4be73391d5814bb00cdb6ae10b4a1182a32a77672b5b744efa2e88dcdeac\"},{\"value\":66667,\"scriptPubKey\":\"2102096d78d32f51a1051c8e4f58ea99427ce335e76f6ea00c915cf6d7ac1270de51ac\"},{\"value\":66667,\"scriptPubKey\":\"2103b0184a0323802226dfaa767d0bc93e261762d3ae4457c04ca2613215365d2dc6ac\"},{\"value\":66667,\"scriptPubKey\":\"210226d279da5bfd81f7ab9ab804a3d0b44a06dd883a1f29d4671d4da4793b9d0d29ac\"},{\"value\":66667,\"scriptPubKey\":\"2103c6206bca3492f93b27a877362ffc25a57177fe0be4a7aaad661daead7703232fac\"}],\"nLockTime\":0}" ).as< bitcoin_transaction >() ); std::vector scripts( fc::json::from_string( "[\"552102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf21030d9f1f4be73391d5814bb00cdb6ae10b4a1182a32a77672b5b744efa2e88dcde2102096d78d32f51a1051c8e4f58ea99427ce335e76f6ea00c915cf6d7ac1270de512103b0184a0323802226dfaa767d0bc93e261762d3ae4457c04ca2613215365d2dc6210226d279da5bfd81f7ab9ab804a3d0b44a06dd883a1f29d4671d4da4793b9d0d292103c6206bca3492f93b27a877362ffc25a57177fe0be4a7aaad661daead7703232f5bae\",\"5521025feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e92102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf2102c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf21030d9f1f4be73391d5814bb00cdb6ae10b4a1182a32a77672b5b744efa2e88dcde2102096d78d32f51a1051c8e4f58ea99427ce335e76f6ea00c915cf6d7ac1270de512103b0184a0323802226dfaa767d0bc93e261762d3ae4457c04ca2613215365d2dc6210226d279da5bfd81f7ab9ab804a3d0b44a06dd883a1f29d4671d4da4793b9d0d295bae\"]" ).as< std::vector >() ); std::vector amounts( fc::json::from_string( "[1997997990,1000000000]" ).as< std::vector >() ); std::vector> results( fc::json::from_string( "[[\"304402204cc6d437f1f46263c36bc0605686b6072f0fb7c5991690e8ea06e8126f06a77f02205cfaa0f2e05ab9187fde9b10fbfee3ad06ae8b7120d455277186d1f8fd31b16c01\",\"304402204cc6d437f1f46263c36bc0605686b6072f0fb7c5991690e8ea06e8126f06a77f02205cfaa0f2e05ab9187fde9b10fbfee3ad06ae8b7120d455277186d1f8fd31b16c01\",\"304402204cc6d437f1f46263c36bc0605686b6072f0fb7c5991690e8ea06e8126f06a77f02205cfaa0f2e05ab9187fde9b10fbfee3ad06ae8b7120d455277186d1f8fd31b16c01\"\"30440220228c930388a0420aa9a17acdf414763bec0f57f92ecf8db51f02e3f8d82428aa0220417f2d0fbc5fd00d5d158a2e7fe7188857119b8d16d11f82f513594a28dbcbfa01\",\"3045022100d95008906e848a8165fbc0d3ed6d11643bc4814d4f8ae84c8c84a97c8c14885002206a2d703ffcca22309b843b55b746994fb08c15fbbf0aadbf900398e8768c62dc01\"],[\"3045022100c4d233c9183d91fd9f1821fb68e1180bbd6493eb66caf36438bccd8cb46a247302200d3a16ff3180fb9ffe8dd16c8ea71f461e7b940baea4c302c8d8e2ba9bf74b9201\",\"3045022100c4d233c9183d91fd9f1821fb68e1180bbd6493eb66caf36438bccd8cb46a247302200d3a16ff3180fb9ffe8dd16c8ea71f461e7b940baea4c302c8d8e2ba9bf74b9201\",\"3045022100c4d233c9183d91fd9f1821fb68e1180bbd6493eb66caf36438bccd8cb46a247302200d3a16ff3180fb9ffe8dd16c8ea71f461e7b940baea4c302c8d8e2ba9bf74b9201\",\"3045022100bdc4d1151d0567bb4e377b473100eaf41544bb547bc6d82b0a0dae8e8e833a6d022013caa911c553558abe6fdf1a6853ca6bab6912d90676595cfd4d11afd4f7966301\",\"3045022100e1262b0e14df0f6f99d850651caa6b8881f7cbf811ad549cb0d6a1b1369beec902204232af72b6bfcb21a83d555374dc622275b7c2cac31b4f56d76b87d88fdc586e01\"]]" ).as< std::vector> >() ); - test_sort_sigs( trx, scripts, amounts, results ); + test_sort_sigs( trx, scripts, amounts, results, db.context_verify ); +} + +class bitcoin_transaction_sign_evaluator_test : public bitcoin_transaction_sign_evaluator +{ + +public: + + bitcoin_transaction_sign_evaluator_test( transaction_evaluation_state& state ) + { + trx_state = &state; + + private_keys = generate_priv_keys( 15 ); + public_keys = get_public_keys( private_keys ); + + keys_map = create_keys_map( public_keys ); + } + + std::vector generate_priv_keys( const size_t& n ) + { + std::vector result; + for( size_t i = 0; i < n; i++ ) { + result.push_back( private_key::regenerate( fc::digest( i ) ) ); + } + return result; + } + + std::vector get_public_keys( const std::vector& keys ) + { + std::vector result; + for( size_t i = 0; i < keys.size(); i++ ) { + result.push_back( keys[i].get_public_key() ); + } + return result; + } + + accounts_keys create_keys_map( const std::vector& public_keys ) + { + accounts_keys keys_map{ { account_id_type(0), public_key_type( public_key_data( public_keys[0] ) ) }, + { account_id_type(1), public_key_type( public_key_data( public_keys[1] ) ) }, + { account_id_type(2), public_key_type( public_key_data( public_keys[2] ) ) }, + { account_id_type(3), public_key_type( public_key_data( public_keys[3] ) ) }, + { account_id_type(4), public_key_type( public_key_data( public_keys[4] ) ) }, + { account_id_type(5), public_key_type( public_key_data( public_keys[5] ) ) }, + { account_id_type(6), public_key_type( public_key_data( public_keys[6] ) ) }, + { account_id_type(7), public_key_type( public_key_data( public_keys[7] ) ) }, + { account_id_type(8), public_key_type( public_key_data( public_keys[8] ) ) }, + { account_id_type(9), public_key_type( public_key_data( public_keys[9] ) ) }, + { account_id_type(10), public_key_type( public_key_data( public_keys[10] ) ) }, + { account_id_type(11), public_key_type( public_key_data( public_keys[11] ) ) }, + { account_id_type(12), public_key_type( public_key_data( public_keys[12] ) ) }, + { account_id_type(13), public_key_type( public_key_data( public_keys[13] ) ) } }; + return keys_map; + } + + std::vector private_keys; + std::vector public_keys; + + accounts_keys keys_map; +}; + +std::vector create_info_for_vins( const btc_multisig_segwit_address& addr ) +{ + std::vector result; + for( size_t i = 0; i < 5; i++ ) { + info_for_vin vin; + vin.out.hash_tx = "1111111111111111111111111111111111111111111111111111111111111111"; + vin.out.n_vout = static_cast( i ); + vin.out.amount = static_cast( i ); + std::string address = addr.get_address(); + vin.script = addr.get_redeem_script(); + result.push_back( vin ); + } + return result; +} + +void sign_transaction( bitcoin_transaction& tx, const private_key& priv_key, const std::vector& info_vins, secp256k1_context_t* context_sign ) +{ + const auto secret = priv_key.get_secret(); + bytes key( secret.data(), secret.data() + secret.data_size() ); + auto sigs = sign_witness_transaction_part( tx, info_vins, key, context_sign, 1 ); + for( size_t j = 0; j < tx.vin.size(); j++ ) { + tx.vin[j].scriptWitness.push_back( sigs[j] ); + } +} + +BOOST_AUTO_TEST_CASE( check_sigs_normal_sigs_test ) +{ + transaction_evaluation_state trx_eval( &db ); + bitcoin_transaction_sign_evaluator_test sign_eval( trx_eval ); + + btc_multisig_segwit_address address( 5, sign_eval.keys_map ); + std::vector info_for_vins = create_info_for_vins( address ); + sidechain_condensing_tx ct( info_for_vins, std::vector() ); + bitcoin_transaction transaction = ct.get_transaction(); + + for( size_t i = 0; i < 4; i++ ) { + sign_transaction( transaction, sign_eval.private_keys[i], info_for_vins, db.context_sign ); + } + + const auto secret = sign_eval.private_keys[4].get_secret(); + bytes key( secret.data(), secret.data() + secret.data_size() ); + auto sigs = sign_witness_transaction_part( transaction, info_for_vins, key, db.context_sign, 1 ); + + const auto pub_key = sign_eval.keys_map[account_id_type(4)].key_data; + bytes key_hex( public_key_data_to_bytes( pub_key ) ); + BOOST_CHECK( sign_eval.check_sigs( key_hex, sigs, info_for_vins, transaction ) ); +} + +BOOST_AUTO_TEST_CASE( check_sigs_extra_signature_test ) +{ + transaction_evaluation_state trx_eval( &db ); + bitcoin_transaction_sign_evaluator_test sign_eval( trx_eval ); + + btc_multisig_segwit_address address( 5, sign_eval.keys_map ); + std::vector info_for_vins = create_info_for_vins( address ); + sidechain_condensing_tx ct( info_for_vins, std::vector() ); + bitcoin_transaction transaction = ct.get_transaction(); + + for( size_t i = 0; i < 5; i++ ) { + sign_transaction( transaction, sign_eval.private_keys[i], info_for_vins, db.context_sign ); + } + + const auto secret = sign_eval.private_keys[5].get_secret(); + bytes key(secret.data(), secret.data() + secret.data_size()); + auto sigs = sign_witness_transaction_part( transaction, info_for_vins, key, db.context_sign, 1 ); + + const auto pub_key = sign_eval.keys_map[account_id_type(5)].key_data; + bytes key_hex( public_key_data_to_bytes( pub_key ) ); + BOOST_CHECK( !sign_eval.check_sigs( key_hex, sigs, info_for_vins, transaction ) ); +} + +BOOST_AUTO_TEST_CASE( check_sigs_sign_not_match_key_test ) +{ + transaction_evaluation_state trx_eval( &db ); + bitcoin_transaction_sign_evaluator_test sign_eval( trx_eval ); + + btc_multisig_segwit_address address( 5, sign_eval.keys_map ); + std::vector info_for_vins = create_info_for_vins( address ); + sidechain_condensing_tx ct( info_for_vins, std::vector() ); + bitcoin_transaction transaction = ct.get_transaction(); + + const auto secret = sign_eval.private_keys[3].get_secret(); + bytes key(secret.data(), secret.data() + secret.data_size()); + auto sigs = sign_witness_transaction_part( transaction, info_for_vins, key, db.context_sign, 1 ); + + const auto pub_key = sign_eval.keys_map[account_id_type(5)].key_data; + bytes key_hex( public_key_data_to_bytes( pub_key ) ); + BOOST_CHECK( !sign_eval.check_sigs( key_hex, sigs, info_for_vins, transaction ) ); +} + +BOOST_AUTO_TEST_CASE( check_sigs_identical_keys_normal_tests ) +{ + transaction_evaluation_state trx_eval( &db ); + bitcoin_transaction_sign_evaluator_test sign_eval( trx_eval ); + + sign_eval.keys_map[account_id_type( 4 )] = sign_eval.keys_map[account_id_type( 3 )]; + + btc_multisig_segwit_address address( 5, sign_eval.keys_map ); + std::vector info_for_vins = create_info_for_vins( address ); + sidechain_condensing_tx ct( info_for_vins, std::vector() ); + bitcoin_transaction transaction = ct.get_transaction(); + + for( size_t i = 0; i < 4; i++ ) { + sign_transaction( transaction, sign_eval.private_keys[i], info_for_vins, db.context_sign ); + } + + const auto secret = sign_eval.private_keys[3].get_secret(); + bytes key(secret.data(), secret.data() + secret.data_size()); + auto sigs = sign_witness_transaction_part( transaction, info_for_vins, key, db.context_sign, 1 ); + + const auto pub_key = sign_eval.keys_map[account_id_type(3)].key_data; + bytes key_hex( public_key_data_to_bytes( pub_key ) ); + BOOST_CHECK( sign_eval.check_sigs( key_hex, sigs, info_for_vins, transaction ) ); +} + +BOOST_AUTO_TEST_CASE( check_sigs_identical_keys_not_normal_tests ) +{ + transaction_evaluation_state trx_eval( &db ); + bitcoin_transaction_sign_evaluator_test sign_eval( trx_eval ); + + sign_eval.keys_map[account_id_type( 4 )] = sign_eval.keys_map[account_id_type( 3 )]; + + btc_multisig_segwit_address address( 5, sign_eval.keys_map ); + std::vector info_for_vins = create_info_for_vins( address ); + sidechain_condensing_tx ct( info_for_vins, std::vector() ); + bitcoin_transaction transaction = ct.get_transaction(); + + for( size_t i = 0; i < 4; i++ ) { + sign_transaction( transaction, sign_eval.private_keys[i], info_for_vins, db.context_sign ); + } + + const auto secret = sign_eval.private_keys[3].get_secret(); + bytes key(secret.data(), secret.data() + secret.data_size()); + auto sigs = sign_witness_transaction_part( transaction, info_for_vins, key, db.context_sign, 1 ); + for( size_t j = 0; j < transaction.vin.size(); j++ ) { + transaction.vin[j].scriptWitness.push_back( sigs[j] ); + } + + const auto pub_key = sign_eval.keys_map[account_id_type(3)].key_data; + bytes key_hex( public_key_data_to_bytes( pub_key ) ); + BOOST_CHECK( !sign_eval.check_sigs( key_hex, sigs, info_for_vins, transaction ) ); } BOOST_AUTO_TEST_SUITE_END()