Commit graph

15672 commits

Author SHA1 Message Date
Steven Barclay
915a79e627
Fix BSQ swap buyer tx fee theft vulnerability
Prevent the seller from stealing the combined tx fee as change by lying
about the value of one or more of his BTC inputs, which are passed to
the buyer as raw inputs in the 'BsqSwapFinalizeTxRequest' message.

To this end, add a 'RawTransactionInput::validate' method to check the
'value' field against the output value of the respective spending tx and
run it on every seller input in 'ProcessBsqSwapFinalizeTxRequest', so
that the buyer is no longer just trusting those numbers.

Additionally, check that the spending txIds from the raw BTC inputs
supplied by the seller actually match those of his signed inputs in the
accompanying partially signed tx, thus tying the raw input values to the
seller's tx.
2021-12-02 17:19:10 +00:00
Steven Barclay
8d267520c8
Fix misleading comment: BSQ swap taker tx fee tolerance
(Actual tolerance by maker of agreed tx fee is 50%, not 10%.)
2021-12-02 14:54:57 +00:00
Christoph Atteneder
1606439144
Add support to duplicate bsq swap offers 2021-12-02 13:39:11 +01:00
jmacxx
32f057b2ad
Always use fresh address for MULTI_SIG context 2021-12-01 13:27:43 -06:00
Christoph Atteneder
9aad4d6a40
Merge pull request #5883 from ripcurlx/add-polish-translation
Add Polish translation
2021-12-01 15:13:26 +01:00
Christoph Atteneder
1f2a3234fe
Add Polish translation 2021-12-01 11:35:25 +01:00
MwithM
7f22ffedf9
Substitute Unconfirmed for Processing BSQ swap
**Unconfirmed** BSQ swap seems like something failed. **Processing** is used by some wallets for unconfirmed transactions and has no negative implications.
2021-12-01 11:25:14 +01:00
Christoph Atteneder
4657614c27
Merge pull request #5879 from Emzy/master
make all scripts executable
2021-12-01 10:47:42 +01:00
Steven Barclay
0ee6175fb2
Fix bug in Equihash.IntListMultimap & adjust constants
Fix a trivial bug in the iterator returned by 'IntListMultimap::get',
caused by mistaken use of the iterator index in place of the key when
doing lookups into the overspill map. This was causing puzzle solutions
to be invalid about 3% of the time, as well as substantially reducing
the average number of solutions found per nonce.

As the fix increases the mean solution count per nonce to the correct
value of 2.0 predicted by the paper (regardless of puzzle params k & n),
inline the affected constants to simplify 'Equihash::adjustDifficulty'.
2021-11-30 21:26:17 +00:00
Stephan Oeste
74d87d7695
make all scripts executable
Signed-off-by: Stephan Oeste <emzy@emzy.de>
2021-11-30 12:40:06 +01:00
Christoph Atteneder
c4e18fedd9
Merge pull request #5878 from jmacxx/fix_dispute_reopen_issue
Bugfix: dispute ticket reopened by mailbox message
2021-11-30 10:27:52 +01:00
jmacxx
0025609375
Bugfix: dispute ticket reopened by mailbox message 2021-11-29 09:18:55 -06:00
chimp1984
bfd45d359a
Fix incorrect start height for block request
We added 1 as with the lite monitor mode we persist the most recent block,
thus we request with the start height for the next block.
But that cause a problem at a DAO full mode which has lite monitor mode set
as then the block parsing would not be triggered.

We refactor it so that we take the chainHeight from the dao state
directly and add 1 at the requests.
We add a check if we are at chain tip, and if so we skip requests
and call the onParseBlockChainComplete directly.
2021-11-28 00:27:04 +01:00
Steven Barclay
e383edc38a
Inline predicates to simplify HashCashService & FilterManager
Remove all the 'challengeValidation', 'difficultyValidation' and
'testDifficulty' BiPredicate method params from 'HashCashService' &
'ProofOfWorkService', to simplify the API. These were originally
included to aid testing, but turned out to be unnecessary.

Patches committed on behalf of @chimp1984.
2021-11-27 05:59:41 +00:00
Steven Barclay
e0595aa284
Store difficulty as floating point in Filter & PoW
Change the type of the 'difficulty' field in the Filter & ProofOfWork
proto objects from int32/bytes to double and make it use a linear scale,
in place of the original logarithmic scale which counts the (effective)
number of required zeros.

This allows fine-grained difficulty control for Equihash, though for
Hashcash it simply rounds up to the nearest power of 2 internally.

NOTE: This is a breaking change to PoW & filter serialisation (unlike
the earlier PR commits), as the proto field version nums aren't updated.
2021-11-26 04:08:15 +00:00
Steven Barclay
0c94e232f8
Add+enable service to mint/verify Equihash proofs of work
Add an abstract base class, 'ProofOfWorkService', for the existing PoW
implementation 'HashCashService' and a new 'EquihashProofOfWorkService'
PoW implementation based on Equihash-90-5 (which has 72 byte solutions &
5-10 MB peak memory usage). Since the current 'ProofOfWork' protobuf
object only provides a 64-bit counter field to hold the puzzle solution
(as that is all Hashcash requires), repurpose the 'payload' field to
hold the Equihash puzzle solution bytes, with the 'challenge' field
equal to the puzzle seed: the SHA256 hash of the offerId & makerAddress.

Use a difficulty scale factor of 3e-5 (derived from benchmarking) to try
to make the average Hashcash & Equihash puzzle solution times roughly
equal for any given log-difficulty/numLeadingZeros integer chosen in the
filter.

NOTE: An empty enabled-version-list in the filter defaults to Hashcash
(= version 0) only. The new Equihash-90-5 PoW scheme is version 1.
2021-11-25 17:17:45 +00:00
Steven Barclay
647fc862d4
Fix method name typo: redoProofOfWorkAndRepublish 2021-11-25 11:45:23 +00:00
Steven Barclay
cb7481d21f
Add difficulty adjustment & benchmarking to Equihash(Test)
Provide a utility method, 'Equihash::adjustDifficulty', to linearise and
normalise the expected time taken to solve a puzzle, as a function of
the provided difficulty, by taking into account the fact that there
could be 0, 1, 2 or more puzzle solutions for any given nonce. (Wagner's
algorithm is supposed to give 2 solutions on average, but the observed
number is fewer, possibly due to duplicate removal.) For tractability,
assume that the solution count has a Poisson distribution, which seems
to have good agreement with the tests.

Also add some (disabled) benchmarks to EquihashTest. These reveal an
Equihash-90-5 solution time of ~146ms per puzzle per unit difficulty on
a Core i3 laptop, with a verification time of ~50 microseconds.
2021-11-25 11:10:02 +00:00
Christoph Atteneder
8fb8374721
Merge pull request #5864 from cd2357/add-java-15-as-supported-jdk
Update package.gradle: rely on local JDK 15
2021-11-25 11:05:26 +01:00
Christoph Atteneder
04c88223ad
Improve release build documentation 2021-11-25 10:50:05 +01:00
cd2357
3723dd32ef
Update package.gradle: rely on local JDK 15
Enforce the use of JDK 15 when packaging. This removes the need to download and unpack JDK 15 just for the use of jpackager.
2021-11-25 10:50:05 +01:00
Christoph Atteneder
55fc413ee0
Print dependency report if failure 2021-11-25 10:50:04 +01:00
Christoph Atteneder
9836c0fac2
Remove gradle cache 2021-11-25 10:50:04 +01:00
Christoph Atteneder
7727776453
Add official Java 15 support 2021-11-25 10:50:03 +01:00
Christoph Atteneder
ba6d5e2c73
Merge pull request #5842 from jmacxx/fix_exception_portfolio_history
Bug fixes: Locked Balance display; Portfolio History screen
2021-11-25 09:54:31 +01:00
Steven Barclay
d8d8ec3f97
Add PoW version(-list) fields to ProofOfWork & Filter
Add a numeric version field to the 'ProofOfWork' protobuf object, along
with a list of allowed version numbers, 'enabled_pow_versions', to the
filter. The versions are taken to be in order of preference from most to
least preferred when creating a PoW, with an empty list signifying use
of the default algorithm only (that is, version 0: Hashcash).

An explicit list is used instead of an upper & lower version bound, in
case a new PoW algorithm (or changed algorithm params) turns out to
provide worse resistance than an earlier version.

(The fields are unused for now, to be enabled in a later commit.)
2021-11-24 15:07:42 +00:00
Christoph Atteneder
95577501a2
Merge pull request #5860 from ghubstan/gradle-java-src-n-target-compat
Set gradle java src & target compat =  VERSION_11
2021-11-24 09:51:28 +01:00
Christoph Atteneder
3570750d0f
Merge pull request #5857 from chimp1984/add-missing-dependency
Enforce inclusion of TradeLimits for headless apps
2021-11-24 09:47:14 +01:00
Christoph Atteneder
5358ae8b50
Merge pull request #5859 from chimp1984/fix-tradestat-filter
Add date for applying filter
2021-11-24 09:44:16 +01:00
chimp1984
becb64de5a
Remove code which is already in superclass 2021-11-23 23:22:28 +01:00
chimp1984
4ec14d3694
Add date for applying filter
We had historically higher trade limits and assets which are not in the
currency list anymore, so we apply the filter only for data after
Nov 1st 2021.
2021-11-23 23:09:42 +01:00
ghubstan
37a6b42f74
Set gradle java src & target compat = VERSION_11
This change sets java source and class generation version targets to 11.
The Bisq distribution is built with JDK 11, but source target has remained at 1.10.
Upgrading allows devs to use some Java syntax features available @since 11, and it
might help anyone building the src avoid confusion over which JDK they should use
(minimum is JDK 11).

See https://docs.gradle.org/current/userguide/java_plugin.html#sec:java-extension
2021-11-23 17:43:12 -03:00
chimp1984
9c18899d66
Enforce inclusion of TradeLimits for headless apps
PaymentMethod use an instance of TradeLimits and expect that it
has been injected, which is the case for desktop but not for
headless apps, so we enforce injection in the app base classes
used for headless apps.

The validation of trade statistics use a method in PaymentMethod
where that dependency is required.

Tha hack how the PaymentMethod use TradeLimits is not nice, but
would require more effort for refactoring.
2021-11-23 21:34:43 +01:00
Christoph Atteneder
4f1f6898b8
Merge pull request #5853 from chimp1984/fix-paymentmethod-lookup
Improve TradeStatistics validation
2021-11-23 09:56:36 +01:00
Christoph Atteneder
7280b66553
Merge pull request #5855 from chimp1984/fix-dao-charts
Fix missing update of time line in dao charts
2021-11-23 09:55:17 +01:00
Steven Barclay
52f4981f15
Further Equihash optimisation: partial parallelisation
Run the initial XorTable fillup in 'Equihash::computeAllHashes' in
parallel, using a parallel stream, to get an easy speed up. (The solver
spends about half its time computing BLAKE2b hashes before iteratively
building tables of partial collisions using 'Equihash::findCollisions'.)

As part of this, replace the use of 'java.nio.ByteBuffer' array wrapping
in 'Utilities::(bytesToIntsBE|intsToBytesBE)' with manual for-loops, as
profiling reveals an unexpected bottleneck in the former when used in a
multithreaded setting. (Lock contention somewhere in unsafe code?)
2021-11-23 08:54:55 +00:00
Christoph Atteneder
0e1030845a
Simplify warn logging 2021-11-23 09:48:10 +01:00
Christoph Atteneder
c7e0efc336
Merge pull request #5854 from chimp1984/improve-filtermanager
Improve FilterManager
2021-11-23 09:37:12 +01:00
Steven Barclay
6bb0f27807
Further Equihash optimisation: avoid lambda+stream in tight loop
Manually iterate over colliding table rows using a while- loop and a
custom 'PrimitiveIterator.OfInt' implementation, instead of a foreach
lambda called on an IntStream, in 'Equihash::findCollisions'. Profiling
shows that this results in a slight speedup.
2021-11-23 07:57:07 +00:00
Steven Barclay
a5f5a55775
Add Equihash.IntListMultimap (private) class for speedup
Provide a (vastly cut down) drop-in replacement for the Guava multimap
instance 'indexMultimap', of type 'ListMultimap<Integer, Integer>', used
to map table row indices to block values, to detect collisions at a
given block position (that is, in a given table column).

The replacement stores (multi-)mappings from ints to ints in a flat int-
array, only spilling over to a ListMultimap if there are more than 4
values added for a given key. This vastly reduces the amount of boxing
and memory usage when running 'Equihash::findCollisions' to build up the
next table as part of Wagner's algorithm.
2021-11-23 07:34:52 +00:00
Steven Barclay
c2b3a078ff
Add Equihash implementation for use in ASIC-resistant PoW
Implement the Equihash (https://eprint.iacr.org/2015/946.pdf) algorithm
for solving/verifying memory-hard client-puzzles/proof-of-work problems
for ASIC-resistant DoS attack protection. The scheme is asymmetric, so
that even though solving a puzzle is slow and memory-intensive, needing
100's of kB to MB's of memory, the solution verification is instant.

Instead of a single 64-bit counter/nonce, as in the case of Hashcash,
Equihash solutions are larger objects ranging from 10's of bytes to a
few kB, depending on the puzzle parameters used. These need to be
stored in entirety, in the proof-of-work field of each offer payload.

Include logic for fine-grained difficulty control in Equihash with a
double-precision floating point number. This is based on lexicographic
comparison with a target hash, like in Bitcoin, instead of just
counting the number of leading zeros of a hash.

The code is unused at present. Also add some simple unit tests.
2021-11-23 06:27:33 +00:00
chimp1984
cb474c57da
Rename getPaymentMethodById to getPaymentMethod 2021-11-23 00:40:59 +01:00
chimp1984
091f82477b
Rename getPaymentMethod to getPaymentMethodId 2021-11-23 00:39:38 +01:00
chimp1984
9569e5a600
Rename getActivePaymentMethodById to getActivePaymentMethod
Rename variables
2021-11-23 00:39:18 +01:00
chimp1984
9d52ddbf96
Add warn log 2021-11-23 00:34:12 +01:00
chimp1984
069b3a9d8e
Fix missing update of time line in dao charts 2021-11-23 00:29:35 +01:00
chimp1984
22c7b2d876
Only try to remove invalid filter from network if it's our own.
This avoids unnecessary/confusing warning logs in data storage.
2021-11-22 22:43:31 +01:00
chimp1984
b6b2d939a1
Only apply maxTradeLimit from PaymentMethod if the PaymentMethod is
found in the active list. Otherwise the 2 BTC default is used.
We get TradeStatistics3 objects from old retired PaymentMethods
which are not found in the active list.
2021-11-22 22:41:32 +01:00
jmacxx
e59596d1a1
Add new block listener to update locked balance display 2021-11-22 09:46:41 -06:00
Steven Barclay
5da8df266a
Code cleanup: replace (Bi)Function<..,Boolean> with (Bi)Predicate<..>
Replace 'BiFunction<T, U, Boolean>' with the primitive specialisation
'BiPredicate<T, U>' in HashCashService & FilterManager.

As part of this, replace similar predicate constructs found elsewhere.
NOTE: This touches the DAO packages (trivially @ VoteResultService).
2021-11-21 17:46:15 +00:00