FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
chips/src/bench/coin_selection.cpp at master · https-github-com-goodman-ops/chips · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
https-github-com-goodman-ops
/
chips
Public
forked from
chips-blockchain/chips
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
chips
/
src
/
bench
/
coin_selection.cpp
Copy path
More file actions
More file actions
Latest commit
History
History
History
108 lines (93 loc) · 3.72 KB
Breadcrumbs
chips
/
src
/
bench
/
coin_selection.cpp
Copy path
File metadata and controls
108 lines (93 loc) · 3.72 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//
Copyright (c) 2012-2017 The Bitcoin Core developers
//
Distributed under the MIT software license, see the accompanying
//
file COPYING or http://www.opensource.org/licenses/mit-license.php.
#
include
<
bench/bench.h
>
#
include
<
wallet/wallet.h
>
#
include
<
wallet/coinselection.h
>
#
include
<
set
>
static
void
addCoin
(
const
CAmount& nValue,
const
CWallet& wallet, std::vector<COutput>& vCoins)
{
int
nInput =
0
;
static
int
nextLockTime =
0
;
CMutableTransaction tx;
tx.
nLockTime
= nextLockTime++;
//
so all transactions get different hashes
tx.
vout
.
resize
(nInput +
1
);
tx.
vout
[nInput].
nValue
= nValue;
CWalletTx* wtx =
new
CWalletTx
(&wallet,
MakeTransactionRef
(
std::move
(tx)));
int
nAge =
6
*
24
;
COutput
output
(wtx, nInput, nAge,
true
/*
spendable
*/
,
true
/*
solvable
*/
,
true
/*
safe
*/
);
vCoins.
push_back
(output);
}
//
Simple benchmark for wallet coin selection. Note that it maybe be necessary
//
to build up more complicated scenarios in order to get meaningful
//
measurements of performance. From laanwj, "Wallet coin selection is probably
//
the hardest, as you need a wider selection of scenarios, just testing the
//
same one over and over isn't too useful. Generating random isn't useful
//
either for measurements."
//
(https://github.com/bitcoin/bitcoin/issues/7883#issuecomment-224807484)
static
void
CoinSelection
(benchmark::State& state)
{
const
CWallet
wallet
(
"
dummy
"
,
CWalletDBWrapper::CreateDummy
());
std::vector<COutput> vCoins;
LOCK
(wallet.
cs_wallet
);
while
(state.
KeepRunning
()) {
//
Add coins.
for
(
int
i =
0
; i <
1000
; i++)
addCoin
(
1000
*
COIN
, wallet, vCoins);
addCoin
(
3
*
COIN
, wallet, vCoins);
std::set<CInputCoin> setCoinsRet;
CAmount nValueRet;
bool
bnb_used;
CoinEligibilityFilter
filter_standard
(
1
,
6
,
0
);
CoinSelectionParams
coin_selection_params
(
false
,
34
,
148
,
CFeeRate
(
0
),
0
);
bool
success = wallet.
SelectCoinsMinConf
(
1003
*
COIN
, filter_standard, vCoins, setCoinsRet, nValueRet, coin_selection_params, bnb_used)
|| wallet.
SelectCoinsMinConf
(
1003
*
COIN
, filter_standard, vCoins, setCoinsRet, nValueRet, coin_selection_params, bnb_used);
assert
(success);
assert
(nValueRet ==
1003
*
COIN
);
assert
(setCoinsRet.
size
() ==
2
);
//
Empty wallet.
for
(COutput& output : vCoins) {
delete
output.
tx
;
}
vCoins.
clear
();
}
}
typedef
std::set<CInputCoin> CoinSet;
//
Copied from src/wallet/test/coinselector_tests.cpp
static
void
add_coin
(
const
CAmount& nValue,
int
nInput, std::vector<CInputCoin>& set)
{
CMutableTransaction tx;
tx.
vout
.
resize
(nInput +
1
);
tx.
vout
[nInput].
nValue
= nValue;
set.
emplace_back
(
MakeTransactionRef
(tx), nInput);
}
//
Copied from src/wallet/test/coinselector_tests.cpp
static
CAmount
make_hard_case
(
int
utxos, std::vector<CInputCoin>& utxo_pool)
{
utxo_pool.
clear
();
CAmount target =
0
;
for
(
int
i =
0
; i < utxos; ++i) {
target += (CAmount)
1
<< (utxos+i);
add_coin
((CAmount)
1
<< (utxos+i),
2
*i, utxo_pool);
add_coin
(((CAmount)
1
<< (utxos+i)) + ((CAmount)
1
<< (utxos-
1
-i)),
2
*i +
1
, utxo_pool);
}
return
target;
}
static
void
BnBExhaustion
(benchmark::State& state)
{
//
Setup
std::vector<CInputCoin> utxo_pool;
CoinSet selection;
CAmount value_ret =
0
;
CAmount not_input_fees =
0
;
while
(state.
KeepRunning
()) {
//
Benchmark
CAmount target =
make_hard_case
(
17
, utxo_pool);
SelectCoinsBnB
(utxo_pool, target,
0
, selection, value_ret, not_input_fees);
//
Should exhaust
//
Cleanup
utxo_pool.
clear
();
selection.
clear
();
}
}
BENCHMARK
(CoinSelection,
650
);
BENCHMARK
(BnBExhaustion,
650
);
Back
|
FazBrowse Home
|
New Git URL