Browse Source

Modify tumbler defaults to improve privacy

This is part of the 2/2019 Plan to improve the privacy of JoinMarket's
tumbler script:
https://gist.github.com/chris-belcher/7e92810f07328fdfdef2ce444aad0968

Also text for the eventual release notes is provided
master
chris-belcher 6 years ago
parent
commit
32479ae510
No known key found for this signature in database
GPG Key ID: EF734EA677F31129
  1. 20
      docs/release-notes/release-notes-tumbler-improve.md
  2. 2
      jmclient/jmclient/configure.py
  3. 20
      scripts/cli_options.py
  4. 2
      scripts/joinmarket-qt.py
  5. 4
      scripts/qtsupport.py

20
docs/release-notes/release-notes-tumbler-improve.md

@ -0,0 +1,20 @@
copypaste this into "release-notes" when the time comes to make a new release, then delete this file
Notable changes
===============
### Tumbler privacy improvements
The tumbler algorithm has been improved with the aim to increase privacy. This affects the `tumbler.py` script and `joinmarket-qt.py` GUI.
* At the start of the run, tumbler will now fully spend all mixdepths with coinjoin with no change address (also known as a sweep transaction) back to its own internal wallet. After these initial sweeps are done tumbler will continue with the already-existing algorithm of sending coinjoins with randomly-generated amounts.
* Tumbler will now occasionally send a round number of bitcoins, for example `0.20000000` or `0.15000000` instead of `0.24159873`. The default probability of this happening is 25% per coinjoin.
* The default wait time between coinjoins is increased from 30 minutes to 60 minutes.
* The default number of coinjoin counterparties is increased from 6 to 9.
* The default number of coinjoins per mixdepth is decreased from 4 to 2.
For a full discription and reasoning behind the changes see: [Plan to improve the privacy of JoinMarket's tumbler script](https://gist.github.com/chris-belcher/7e92810f07328fdfdef2ce444aad0968)

2
jmclient/jmclient/configure.py

@ -250,7 +250,7 @@ tx_broadcast = self
# amount of makers which we are content with for the coinjoin to # amount of makers which we are content with for the coinjoin to
# succceed. Less makers means that the whole process will restart # succceed. Less makers means that the whole process will restart
# after a timeout. # after a timeout.
minimum_makers = 2 minimum_makers = 4
############################## ##############################
#THE FOLLOWING SETTINGS ARE REQUIRED TO DEFEND AGAINST SNOOPERS. #THE FOLLOWING SETTINGS ARE REQUIRED TO DEFEND AGAINST SNOOPERS.

20
scripts/cli_options.py

@ -269,9 +269,9 @@ def get_tumbler_parser():
action='store', action='store',
dest='makercountrange', dest='makercountrange',
help= help=
'Input the mean and spread of number of makers to use. e.g. 6 1 will be a normal distribution ' 'Input the mean and spread of number of makers to use. e.g. 9 1 will be a normal distribution '
'with mean 6 and standard deviation 1 inclusive, default=6 1 (floats are also OK)', 'with mean 9 and standard deviation 1 inclusive, default=9 1 (floats are also OK)',
default=(6, 1)) default=(9, 1))
parser.add_option( parser.add_option(
'--minmakercount', '--minmakercount',
type='int', type='int',
@ -292,17 +292,17 @@ def get_tumbler_parser():
type='float', type='float',
nargs=2, nargs=2,
dest='txcountparams', dest='txcountparams',
default=(4, 1), default=(2, 1),
help= help=
'The number of transactions to take coins from one mixing depth to the next, it is' 'The number of transactions to take coins from one mixing depth to the next, it is'
' randomly chosen following a normal distribution. Should be similar to --addrask. ' ' randomly chosen following a normal distribution. Should be similar to --addrask. '
'This option controls the parameters of the normal distribution curve. (mean, standard deviation). default=4 1') 'This option controls the parameters of the normal distribution curve. (mean, standard deviation). default=2 1')
parser.add_option( parser.add_option(
'--mintxcount', '--mintxcount',
type='int', type='int',
dest='mintxcount', dest='mintxcount',
default=1, default=2,
help='The minimum transaction count per mixing level, default=1') help='The minimum transaction count per mixing level, default=2')
parser.add_option( parser.add_option(
'--donateamount', '--donateamount',
type='float', type='float',
@ -315,11 +315,11 @@ def get_tumbler_parser():
'--timelambda', '--timelambda',
type='float', type='float',
dest='timelambda', dest='timelambda',
default=30, default=60,
help= help=
'Average the number of minutes to wait between transactions. Randomly chosen ' 'Average the number of minutes to wait between transactions. Randomly chosen '
' following an exponential distribution, which describes the time between uncorrelated' ' following an exponential distribution, which describes the time between uncorrelated'
' events. default=30') ' events. default=60')
parser.add_option( parser.add_option(
'--stage1-timelambda-increase', '--stage1-timelambda-increase',
type='float', type='float',
@ -424,7 +424,7 @@ def get_sendpayment_parser():
type='int', type='int',
dest='makercount', dest='makercount',
help='how many makers to coinjoin with, default random from 4 to 6', help='how many makers to coinjoin with, default random from 4 to 6',
default=random.randint(4, 6)) default=random.randint(8, 10))
parser.add_option('-S', parser.add_option('-S',
'--schedule-file', '--schedule-file',
type='string', type='string',

2
scripts/joinmarket-qt.py

@ -136,7 +136,7 @@ def getSettingsWidgets():
sMM = ['', (2, 20), sMM = ['', (2, 20),
(0, jm_single().config.getint("GUI", "max_mix_depth") - 1), (0, jm_single().config.getint("GUI", "max_mix_depth") - 1),
(0.00000001, 100.0, 8)] (0.00000001, 100.0, 8)]
sD = ['', '3', '0', ''] sD = ['', '9', '0', '']
for x in zip(sN, sH, sT, sD, sMM): for x in zip(sN, sH, sT, sD, sMM):
ql = QLabel(x[0]) ql = QLabel(x[0])
ql.setToolTip(x[1]) ql.setToolTip(x[1])

4
scripts/qtsupport.py

@ -554,7 +554,7 @@ class SchDynamicPage1(QWizardPage):
sMM = [(0, jm_single().config.getint("GUI", "max_mix_depth") - 1), (3, 20), sMM = [(0, jm_single().config.getint("GUI", "max_mix_depth") - 1), (3, 20),
(2, 7), (0.00000001, 100.0, 8), (2, 10), (0.000001, 0.25, 6), (2, 7), (0.00000001, 100.0, 8), (2, 10), (0.000001, 0.25, 6),
(0, 10000000)] (0, 10000000)]
sD = ['0', '6', '4', '30.0', '4', '0.005', '10000'] sD = ['0', '9', '4', '60.0', '2', '0.005', '10000']
for x in zip(sN, sH, sT, sD, sMM): for x in zip(sN, sH, sT, sD, sMM):
ql = QLabel(x[0]) ql = QLabel(x[0])
ql.setToolTip(x[1]) ql.setToolTip(x[1])
@ -655,7 +655,7 @@ class SchFinishPage(QWizardPage):
sMM = [(0.0, 10.0, 2), (0.0, 10.0, 2), (2,20), sMM = [(0.0, 10.0, 2), (0.0, 10.0, 2), (2,20),
(1, 10), (100000, 100000000), (10.0, 500.0, 2), (0, 100, 1), (1, 10), (100000, 100000000), (10.0, 500.0, 2), (0, 100, 1),
(0.0, 1.0, 3)] + [(0, 10000)]*5 (0.0, 1.0, 3)] + [(0, 10000)]*5
sD = ['1.0', '1.0', '2', '1', '1000000', '20', '3', '0.25'] +\ sD = ['1.0', '1.0', '2', '2', '1000000', '20', '3', '0.25'] +\
['55', '15', '25', '65', '40'] ['55', '15', '25', '65', '40']
for x in zip(sN, sH, sT, sD, sMM): for x in zip(sN, sH, sT, sD, sMM):
ql = QLabel(x[0]) ql = QLabel(x[0])

Loading…
Cancel
Save