Skip to content

Commit

Permalink
Track many-to-one consolidations
Browse files Browse the repository at this point in the history
getblockstats now counts the number of transactions with at least 3
inputs and exactly one output as "many-to-one" (mto) consolidations.

It also counts the total number of outputs consolidated by mto
transactions per block.
  • Loading branch information
Marcin Jachymiak authored and jnewbery committed Jul 16, 2019
1 parent 8df785a commit cf001c1
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 4 deletions.
16 changes: 16 additions & 0 deletions src/rpc/blockchain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1887,6 +1887,8 @@ static UniValue getblockstats(const JSONRPCRequest& request)
" \"txs_batching\": xxxxx, (numeric) The total number batching transactions (defined as at least 3 outputs)\n"
" \"outcount_bins\": xxxxx, (numeric_array) The numbers of transactions that have certain numbers of outputs\n"
" \"dust_bins\": xxxxx, (numeric_array) The total number of outputs that are dust at several fee-rates\n"
" \"mto_consolidations\": xxxxx, (numeric) The total number of transactions with at least 3 inputs and exactly 1 output\n"
" \"mto_output_count\": xxxxx, (numeric) The total number of outputs spent in all mto_consolidation transactions\n"
"}\n"
},
RPCExamples{
Expand Down Expand Up @@ -1986,6 +1988,11 @@ static UniValue getblockstats(const JSONRPCRequest& request)
int64_t outputs_consolidated = 0;
int64_t txs_batching = 0;

std::vector<CTxDestination> high_consolidation_addrs;
std::vector<int64_t> cons_in_count;
int64_t many_to_one_consolidating_txs = 0;
int64_t many_to_one_consolidated_outputs = 0;

// Batch ranges = [(1), (2), (3-4), (5-9), (10-49), (50-99), (100+)]
constexpr int NUM_OUTCOUNT_BINS = 7;
int64_t output_count_bins[NUM_OUTCOUNT_BINS] = {0};
Expand Down Expand Up @@ -2066,6 +2073,12 @@ static UniValue getblockstats(const JSONRPCRequest& request)
outputs_consolidated += tx->vin.size();
}

// Look for transactions with high number of inputs and low outputs
if ((tx->vin.size() >= CONSOLIDATION_THRESHOLD) && tx->vout.size() == 1) {
++many_to_one_consolidating_txs;
many_to_one_consolidated_outputs += tx->vin.size();
}

int64_t tx_size = 0;
if (do_calculate_size) {

Expand Down Expand Up @@ -2241,6 +2254,9 @@ static UniValue getblockstats(const JSONRPCRequest& request)
}
ret_all.pushKV("dust_bins", dust_res);

ret_all.pushKV("mto_consolidations", many_to_one_consolidating_txs);
ret_all.pushKV("mto_output_count", many_to_one_consolidated_outputs);

if (do_all) {
return ret_all;
}
Expand Down
14 changes: 10 additions & 4 deletions test/functional/data/rpc_getblockstats.json
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@
"00000020f44e7a48b9f221af95f3295c8dcefc5358934a68dc79e2933dc0794b350cad0a90fad2cd50b41d4ef45e76c2a456b98c180632bb4b44e0cd18ce90679fe54e552b4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401630101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
"0000002087454276cce83f4d19e0120f6e9728ac5905f7adaf6b27e3f5bbe43ab823f85db7d1f44666531483df3d67c15f2c231718ad93b63b851dce5ff4c4a67f524ffa2b4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401640101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
"000000202cdc3e99f07a80252dd6097faa0eddf3f2dde5ae390610e0bca94ecc25931551d31fceb8fe0a682f6017ca3dbb582f3a2f06e5d99ec99c42c8a744dd4c9216b82b4ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401650101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
"000000209b3ace9bd510918d20e87518c0cf5976cab3e28cc7af41259a89c6dd7668a329b2159c690c3d26bac97db6fdc007d09a6baa0970200c29672363959ab2b63f7c2b4ae75affff7f200100000002020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401660101ffffffff02b40b062a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9edf10de93e843de623967e9f76209d3821fb16819ce9e9c14395ead2d2aa2fcff40120000000000000000000000000000000000000000000000000000000000000000000000000020000000128394022bf44bff30d7399cb5a16e3b94fed67dc174c2e1d77df91bad5a51cb3000000006a4730440220307c456eca922c856d6ea5774b080ccc204822aa969e10d8702ae5b22e3c4e9b0220635330323c39ebb9c3843725874a1cacdd2eb69c761d5c0378db29f3d55e65bb01210227d85ba011276cf25b51df6a188b75e604b38770a462b2d0e9fb2fc839ef5d3ffeffffff0500c2eb0b00000000220020cbf88465a82c23aaff901309dd7f0ba070cae5820a4b8cc4633717ad2348ebade8030000000000001976a9141eb326334925bd0725f361b0e88309383d954dcf88ac0084d7170000000017a9140acf7e041c48ea385480b758e3689313839b5f3a8764307253000000001600145fc85246a9177233384cbb7e5506c0659cc511d2005ed0b20000000017a91444c590a21488fe81aaf7de749252209a705ddee58765000000",
"000000201100d4f08385bd81bc374f5163166670c379034f8f413b6829d37ffa0836c96e4898ae5f79660c38796db650e3c121bdda4b2e160509e1daed1c55812ae10f6e2b4ae75affff7f200000000003020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401670101ffffffff023420082a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ed515507d11b038b1e70f208e76b49a7d09cfed8d276be66fcf02619bc383019f001200000000000000000000000000000000000000000000000000000000000000000000000000200000000010612d2f07672102dc6f099c4be308f598e4c4da1a7e0cb462ae14f0444525a1332000000006a4730440220203b2d5c38410e8533c43b5507f7ee1f914dcbe7a945f6a9cf2c536ac558180f02202a9276288d78dbd19c50e2dbaa0526381f555ef1cbe75bce77abd8fa32c4f95d01210227d85ba011276cf25b51df6a188b75e604b38770a462b2d0e9fb2fc839ef5d3ffdffffffaa68b2a13cf06716194c22fb4b855a1c5068fc19075dad7ebb460b31204b70550000000000fdffffffaa68b2a13cf06716194c22fb4b855a1c5068fc19075dad7ebb460b31204b7055010000006a47304402201270126b1879ddd09c9860d53859a87aba1851d834bc94ea3a86a0cacb056d0402207aba7461df911db49227809f1b440d1ad3d1d79dc50d407ae1fefb523af7e004012103d6fcbbfa5493c8937728535ece1f9fd0e271aeb976810d3df8507875fc3fbe2afdffffffaa68b2a13cf06716194c22fb4b855a1c5068fc19075dad7ebb460b31204b70550200000017160014bbe4d8fdfd93e566cbdf4e8ca9db319e1c8c636cfdffffffaa68b2a13cf06716194c22fb4b855a1c5068fc19075dad7ebb460b31204b70550300000000fdffffffaa68b2a13cf06716194c22fb4b855a1c5068fc19075dad7ebb460b31204b70550400000023220020cbf88465a82c23aaff901309dd7f0ba070cae5820a4b8cc4633717ad2348ebadfdffffff01ac430a54020000001600149798d5b9d9cb17a801ef6198d807cceaead68b9200040047304402202824f7ed87ea7ea5b66709f9f61090b38a5d221ccbf67e86e2910775733a5dcf0220324b9530d47894a2467912d036ca35fbe34965f7ccf2e68fa410b4aae61ace960147304402202e14436c67e8f5df71049ec880847a7f08a05c33a85dfa82e0d4b87c2a216c0c0220657a5f56a86d46e6fb44970dde2afdb57ffa0c79d17505834061c7fddcdf74a8014752210388eda2b3e6ef95f2f44ddc1ed7d61e23bc0f7c1281812042d22a5b8cbe78b1392102a59ddbd487aacaf1878fc7fa358281f7026ed587e6dd4c6dc92a88380ed3d5f952ae0002473044022015f67c3894873b0721b6e3ad9de598393ce732f9422d122e0a44ac828aca01cf022076c0bd102e16c58856004ccf16af80fbc98f59eb3233531a0c7b4e34074ad6050121023fbded53550835cda519b5b4c0a6a0f2aaa46430b22b943a0938c11ea128ee8302473044022003b9db390a408686785330d3ae52d731dbdde57f770dc7f4ca60cfe965f94e2d02202b8fe5a85d7b261dec82c58a5b574aeb88778045f828531c8ac50856307a8b1b012103743243c99e85ecb74f15aeec24c05338f6f88e45794966115f0ccff207879ff8040047304402204de3abbabe45e251de256c542dcb455318a3dace1260f951acc0851d8331f655022006a81c26c576d9f0f5b009fdba30ca6c5e25c12fa6f1b0dc07cdf47ce8d212420147304402202100c2fe289fcc5eb6883948a1c60f4c7c38d3eb4632ba3ca9a4917ecff5ef40022065964ed83329c319ae2d415300397f3fa7e3c98dc387d5bf9002e0d91635794d014752210388eda2b3e6ef95f2f44ddc1ed7d61e23bc0f7c1281812042d22a5b8cbe78b1392102a59ddbd487aacaf1878fc7fa358281f7026ed587e6dd4c6dc92a88380ed3d5f952ae000000000200000000010118317b3d6a5da1e08eea34578e5598c6b3ba87a31878cdf8a9bd79811e53fbc60000000000feffffff026c39f5050000000017a9140acf7e041c48ea385480b758e3689313839b5f3a87ac62144e0200000017a914e1344d65420a6c7952a04a5fe1b17c17f44f7a62870247304402201fb07b1300e0eb22c670513306b1705ee82880c98264a978d7dc4fe32a2a5d0202203b7a03c99b98e8593429bd2a7ca29b6c9c87cc90a8371025ca797d728a6754d0012103c3047d22d3ba9bef8b6f9043959b54201a6e025c907229a2f6bcd67029260ff166000000"
"000000209b3ace9bd510918d20e87518c0cf5976cab3e28cc7af41259a89c6dd7668a3292245df05049f21b07e53d9490ef7d5f02892ac6bbdcb01fc2544ad88850d74e72b4ae75affff7f200000000002020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401660101ffffffff02b40b062a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ed89baf03637b91ce1e94e3411a04a9dfc941e2e94c5b653cf1c00bfc2f1b968050120000000000000000000000000000000000000000000000000000000000000000000000000020000000128394022bf44bff30d7399cb5a16e3b94fed67dc174c2e1d77df91bad5a51cb3000000006a47304402204e5d35fd3140a3beeddda5a13bb38252521162ce9d18e4bdf3d518e7b7a6590102200f5838f0fdc0afb85071e25ca680c2faf413eef92721f459695996df45f23c8b01210227d85ba011276cf25b51df6a188b75e604b38770a462b2d0e9fb2fc839ef5d3ffeffffff05e8030000000000001976a91432a25d4cdc38c16d4ac7e8fe3680a69505e8093888ac6430725300000000160014fa467fc5d5fa2017ce0fc2bbcd0f3da6a7cce077005ed0b20000000017a91420be05930d6a0c3f7e9fecda76a16c95a5fcdd538700c2eb0b000000002200202394533a3429735445f4b0fd6a7048f09eb0d35c2de560493fa7d3ed8119c6e20084d7170000000017a9148d10b6cda5df70b60a63283fef06d6d6d5fc020a8765000000",
"00000020365f3ea0037eab534a3f636bd83d39b834b53ce8f41dfed2c54cf3e08317753a4dd497350e65d76e04387e192f6c2ba37bd1a941f7ac08ad9e96c9fad12d3cd82b4ae75affff7f200000000003020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401670101ffffffff023420082a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9eda66bfdcf6943011c57472ff7b0e5518d531879158bf31ccb7fb866450e355b7201200000000000000000000000000000000000000000000000000000000000000000000000000200000000010612d2f07672102dc6f099c4be308f598e4c4da1a7e0cb462ae14f0444525a1332000000006a47304402200e463fe414e8e9aefeaa8a91164c5fe49f04b141bf3e9c1eb763f04c35adf91002201aeb7a0ca66b10efec7946cdfe72693fd4a8c68970ff3a73fa527cde10b6f44001210227d85ba011276cf25b51df6a188b75e604b38770a462b2d0e9fb2fc839ef5d3ffdffffff1a6195ed2b1711b5cb6549601d91e8689d7a9c769ce114d28991cdd59431e8b0000000006a47304402207c04b5d01c2b2ab299866e7463d95f06647730e6b79f99ac6e6441e1b88d5eb102206f9a64c7974818eef5ef99aea8a81d18f89401b539e76405505aa13bad51ed29012102c763c0ce8cef6e882b986246ea20127fcf942d1130d72008e4d7120bc6093bf6fdffffff1a6195ed2b1711b5cb6549601d91e8689d7a9c769ce114d28991cdd59431e8b00100000000fdffffff1a6195ed2b1711b5cb6549601d91e8689d7a9c769ce114d28991cdd59431e8b002000000232200202394533a3429735445f4b0fd6a7048f09eb0d35c2de560493fa7d3ed8119c6e2fdffffff1a6195ed2b1711b5cb6549601d91e8689d7a9c769ce114d28991cdd59431e8b00300000000fdffffff1a6195ed2b1711b5cb6549601d91e8689d7a9c769ce114d28991cdd59431e8b004000000171600143886e0a009ce10b1ec011a11559d7c3d89af00cdfdffffff01ac430a5402000000160014e491d2261fcf16de5ddde0b80f027b0501f141c400000247304402202573d5741fa8b17741512ade5a0b95b6d105d50b8613ed697d7b807f538cdef802205cca7f6cd7270d2cde8a33678e446dd20499699acbf6f4d1a701b47cf5867b140121034cdffc9628d1b2234d034af9163b26ed20126cac81147c7364443e8c9011a65804004730440220726962bae73942a69c7f60bfe68947ff4860cdc52d74f535aa0d60fd4f80a7e0022065d6be399f6b58ea4195c9b341241276cf96ac96d1c01420aa80df3118190b6a0147304402203d206c415b6a9e503a0e3279ca4fde9b85c7b188199925d19ac252ee70bbc62a022034753b533d9cf77261780e6011f2e64fecd5fc75f22283f158a51694bb763ceb01475221024dcc074523c0a250bcabea0917cc2fd9186b130af809c6495967a6e911b431212102c0693774adf1d3132274144db29b9666f6366b1ee5464c85d88f6bea8ea1c78752ae04004730440220593a87ee34fac94569771358fd8fe901672dabcc915b8e0bb5d98a9b2cd0df4002202ea13f6fdd2d1d87391c7c482737b6ac73a714aa85d9f2eee89ba86e9c63193b01473044022079061bf2a5b70da3a2136018ccbd70a95b9843ba45221d1fcefff14ca622de2a02201991b3cb51d8ca4b3ac8a2e5aa0a0a5d98737d77b782d9e45c4b9c9f90a0f14201475221024dcc074523c0a250bcabea0917cc2fd9186b130af809c6495967a6e911b431212102c0693774adf1d3132274144db29b9666f6366b1ee5464c85d88f6bea8ea1c78752ae02473044022018c4b2344fa58c2e60f8a13337bc912d8c4ff5d775aff96fa402454ec5deb7a402206b06deaeafd712afca9f426f7b199f5283d058a0019f050eaed4bedb66b0e8d50121031e07ec8bf74f62f45b18d4922ff9675041bfdc9dc6b8ddad63151ef2d7ae09fc0000000002000000000101405c06b2c41e81782dfb05079c0bef7a5ca5a46499230595fbaf2bfa525ecf6e0000000000feffffff02ac62144e0200000017a91453fba20ce8d7e73f22a9d33114645bfccbd4fac7876c39f5050000000017a9148d10b6cda5df70b60a63283fef06d6d6d5fc020a870247304402201e7a98447e4c4f898973308d5dc592f32fd6ea7e4addd52929471d23796b82ae022045b2ed302065e348f496d74d2eecb41be7b70d35998b813626719f35988925f601210317c93f81017c43006e33ad386695c40675b85d40deef8984f8ac746dfa5b630666000000"
],
"mocktime": 1525107225,
"stats": [
Expand Down Expand Up @@ -154,6 +154,8 @@
"minfee": 0,
"minfeerate": 0,
"mintxsize": 0,
"mto_consolidations": 0,
"mto_output_count": 0,
"native_p2wpkh_outputs_spent": 0,
"native_p2wsh_outputs_spent": 0,
"nested_p2wpkh_outputs_spent": 0,
Expand Down Expand Up @@ -197,7 +199,7 @@
"avgfee": 6580,
"avgfeerate": 20,
"avgtxsize": 329,
"blockhash": "6ec93608fa7fd329683b418f4f0379c370661663514f37bc81bd8583f0d40011",
"blockhash": "3a751783e0f34cc5d2fe1df4e83cb534b8393dd86b633f4a53ab7e03a03e5f36",
"dust_bins": [
0,
0,
Expand Down Expand Up @@ -240,6 +242,8 @@
"minfee": 6580,
"minfeerate": 20,
"mintxsize": 329,
"mto_consolidations": 0,
"mto_output_count": 0,
"native_p2wpkh_outputs_spent": 0,
"native_p2wsh_outputs_spent": 0,
"nested_p2wpkh_outputs_spent": 0,
Expand Down Expand Up @@ -283,7 +287,7 @@
"avgfee": 71450,
"avgfeerate": 165,
"avgtxsize": 717,
"blockhash": "06012e43a4192440b1d27c5ec53d2e55b6388289e14b7d504d14a83c536f28ca",
"blockhash": "5d8b3154ad6a27ab9c26b77d87f4565503d9e45061eea910da4cb300191bbccf",
"dust_bins": [
0,
0,
Expand Down Expand Up @@ -326,6 +330,8 @@
"minfee": 42900,
"minfeerate": 138,
"mintxsize": 224,
"mto_consolidations": 1,
"mto_output_count": 6,
"native_p2wpkh_outputs_spent": 2,
"native_p2wsh_outputs_spent": 1,
"nested_p2wpkh_outputs_spent": 1,
Expand Down

0 comments on commit cf001c1

Please sign in to comment.