Commit graph

3689 commits

Author SHA1 Message Date
Andreas Schildbach
89f851cf75 build.gradle: update protobuf-javalite to 3.18.0 2021-10-05 17:20:29 +02:00
Andreas Schildbach
183986c980 Bech32, SegwitAddress: Implement Bech32m format for v1+ witness addresses. 2021-09-29 23:40:57 +02:00
Andreas Schildbach
4dc4cf743d ECKey: Move compressPoint()/decompressPoint() helpers to LazyECPoint.compress()/decompress().
Deprecate the old methods.
2021-09-29 22:58:05 +02:00
Andreas Schildbach
98bc701c2b ECKey: Inline getPointWithCompression() helper. 2021-09-29 22:58:05 +02:00
Andreas Schildbach
484275678d WalletTool: Implement two coin selection options for sending, --select-addr and --select-output. 2021-09-29 22:46:59 +02:00
Andreas Schildbach
d3505b8949 WalletTool: When specifying ALL as a value of an output, use the correct BalanceType suitable for the value of --allow-unconfirmed. 2021-09-29 22:46:59 +02:00
Andreas Schildbach
5b785f8c9c README.md: update API requirement to Java 8 or Android 6 2021-09-29 21:38:48 +02:00
Andreas Schildbach
d0f6e0afca build.gradle: Update Guava to 31.0.1-android. 2021-09-29 19:13:39 +02:00
Andreas Schildbach
e9b42eae6d build.gradle: produce Java 8 bytecode for the core module
It will still only use the Java 7 API.
2021-09-28 16:38:31 +02:00
Andreas Schildbach
d6851edb2f build.gradle: Update OkHttp to 3.12.13. 2021-09-25 23:36:34 +02:00
Andreas Schildbach
2882d63616 build.gradle: Update BouncyCastle to 1.69. 2021-09-25 23:23:12 +02:00
Andreas Schildbach
47660f6418 build.gradle: migrate from protobuf-java to protobuf-javalite
This commit contains rather hard to review diffs to the protobuf test datasets in .txt format.
To aid the review, this Python script can be used to convert the data from the old to the new
format:

```
import sys

file = open(sys.argv[1])
outfile = open(sys.argv[1] + ".lite", "w")
line = file.readline()
lines = []

def sortAndPrint(group, removeLastLB=False, removeFirstLB=False):
    group.sort()
    if removeFirstLB and group[0] == "\n":
        group.remove("\n")
    for i in range(len(group)):
        if i == len(group) - 1 and removeLastLB:
            group[i] = group[i].rstrip()
        print(group[i], end="", file=outfile)

def sign32neg(value):
    if 0x80000000 <= value <= 0xFFFFFFFF:
        value &= 0x7FFFFFFF
        value = int(value)
        value = ~value
        value ^= 0x7FFFFFFF
    return value

def processPath(path):
    parts = path.rstrip().split(":")
    number = int(parts[1].lstrip())
    if number >= 0x80000000:
        number = sign32neg(number)
    return parts[0] + ": " + str(number) + "\n"

groupcount = 0
while len(line) > 0:
    if line.startswith("type:"):
        if len(lines):
            sortAndPrint(lines, removeFirstLB=groupcount==0)
            groupcount += 1
        lines.clear()
        lines.append(line)
    elif line.find("deterministic_key {") != -1:
        structure = line
        innerlines = []
        line = file.readline()
        while not line.startswith('}'):
            if line.find("path") != -1:  # preserve order of paths
                pathlines = processPath(line)
                line = file.readline()
                if line.startswith('}'):
                    innerlines.append(pathlines)
                    continue
                while line.find("path") != -1:
                    pathlines += processPath(line)
                    line = file.readline()
                innerlines.append(pathlines)
                if line.startswith('}'):
                    continue
            if line.startswith("  sigsRequiredToSpend"):
                line = line.replace("sigsRequiredToSpend", "sigs_required_to_spend")
            innerlines.append(line)
            line = file.readline()
        innerlines.sort()
        for l in innerlines:
            structure += l
        structure += line.rstrip() + "\n"
        lines.append(structure)
    elif line.find("path") != -1:  # preserve order of paths
        accountpathlines = processPath(line)
        line = file.readline()
        while line.find("path") != -1:
            accountpathlines += processPath(line)
            line = file.readline()
        lines.append(accountpathlines)
        lines.append(line)
    else:
        lines.append(line)
    line = file.readline()
print(file=outfile)
sortAndPrint(lines, removeLastLB=True)
file.close()
outfile.close()
```
2021-09-25 11:00:42 +02:00
Andreas Schildbach
f859f571ca BasicKeyChain, DeterministicKeyChain, WalletTool: use only protobuf API that is available also on protobuf-lite
This is meant to aid migration to protobuf-lite.
2021-09-24 11:33:06 +02:00
Sean Gilligan
da5202c3b7 GitHub Actions: add special case for Gradle 4.10/JDK11/Ubuntu
This is the “closest” Github Actions config we can get to our
target Debian build (Debian Bullseye/JDK11/Debian Gradle 4.4).
2021-09-23 21:37:30 +02:00
Sean Gilligan
744480be89 GitHub Actions: in the build matrix, update JDK 16 to JDK 17 LTS 2021-09-23 21:29:56 +02:00
Sean Gilligan
839139f8fb walletfx: Initialize scene earlier in MainController 2021-09-23 09:25:36 -07:00
Sean Gilligan
0f8cc09073 walletfx: Improve calculation of estimatedKeyDerivationTime
* Make the static field `estimatedKeyDerivationTime` private
* Refactor the calculation to a private, side-effect free function
* Replace `estimatedKeyDerivationTimeMsec()` with `initEstimatedKeyDerivationTime()`
** Don’t return a value that wasn’t unused anyway
** Make better use of CompletableFuture API
* Platform.runLater wasn’t needed because no JavaFX functions are called
2021-09-23 17:55:19 +02:00
Sean Gilligan
36243ca24e walletfx: factor out WalletApplication::startWalletAppKit 2021-09-23 07:30:15 -07:00
Sean Gilligan
188a0a7e45 walletfx: replace MainController.instance with app.mainWindowController() 2021-09-23 01:04:05 -07:00
Sean Gilligan
85725a18a6 walletfx: WalletApplication to improve encapsulation
* Make all public fields private and wrap with accessors
* Make `WalletAppKit` (was confusingly named `bitcoin`) field a member not a static
* Rename `bitcoin` to `walletAppKit`
2021-09-23 09:57:18 +02:00
Sean Gilligan
515a558ec2 walletfx: Extract MainWindowController abstract base class
* Extract `MainWindowController` from `wallettemplate.MainController`
* WalletApplication: `wallettemplate.MainController` with `MainWindowController`
2021-09-22 12:16:45 -07:00
Sean Gilligan
d1aa5e3d36 walletfx: Extract WalletApplication from WalletTemplate
* Extract abstract class `WalletApplication` from `WalletTemplate`
* `WalletTemplate` implements `loadController()` with resource names
* `MainController`: Add `scene` member and `scene()` method
2021-09-22 11:36:04 -07:00
Sean Gilligan
d8b6733c9c walletfx: Create WalletTemplate implementing AppDelegate
* Introduce `AppDelegate` class for delegating JavaFX `Application`
* Move almost all of `Main` to `WalletTemplate`

Rationale:

* The “template” JavaFX Application main class (`Main`) is now about 30 lines of code
* `Main` class allows easy switching between TestNet and MainNet (in fact it could become a command-line argument) and other configuration changes (e.g. `preferredOutputScriptType`)
* Prepares the way for the next steps of refactoring
2021-09-22 09:21:25 -07:00
Sean Gilligan
a7161eed8e walletfx: Move wallettemplate.controls to org.bitcoinj.walletfx 2021-09-21 07:56:17 -07:00
Sean Gilligan
9292bf3c43 walletfx: Refactor overlay, reduce usage of instance static globals
* OverlayController: rename init method, add rootController to params
* OverlayableStackPaneController: update to use updated initOverlay() method, 
          also pass this.getClass() into GuiUtils.getResource()
* GuiUtils.getResource(): replace reference to MainController.class with clazz parameter
* Main: Reduce visibility to “package” of 3 static globals
* MainController: Reduce visibility of `instance` static to “package”, initialize
                  addressControl by calling 2 initialization methods
* 4 other controllers: Update for OverlayController changes
* ClickableBitcoinAddress: OverlayController changes, eliminate use of Main.APP_NAME

Rationale:

* Decrease coupling
* Eliminate cross-package use of `Main` and `MainController` static globals
* Prepare for further refactoring — moving wallettemplate.controls package
  to org.bitcoinj.walletfx.controls
2021-09-21 09:39:08 +02:00
sqrrm
d6195d584e Wallet: clone transaction before committing
Problem: A transaction received from the network is added to all wallets
that find it relevant. If two wallets find the same transaction relevant
the same Transaction instance is added to both wallets.

Spending the outputs from this transaction can cause consistiency
issues, in particular if the outputs are spent in the same transaction,
as shown in WalletTest.oneTxTwoWallets. There are probably more issues
with having the same Transaction instance handled by two different
wallets.

Fix: Clone the transaction before adding it to the wallet.
2021-09-20 23:01:31 +02:00
Sean Gilligan
7178cd3f4f Secp256k1Context: replace AccessControlException
AccessControlException is deprecated for removal in JDK 17.

its parent classes are:

`AccessControlException` <- `SecurityException` <- `RuntimeException`

It can be replaced with its parent `SecurityException` which is not deprecated and will behave almost identically in this one place where it is used.
2021-09-20 22:34:53 +02:00
Sean Gilligan
93f0bb7a54 walletfx: Extract OverlayableStackPaneController
* Extract abstract class OverlayableStackPaneController from MainController
* Rename OverlayWindowController to OverlayController (Window was misleading)

Rationale:

1. Overlay functionality is independent of MainContoller’s wallet functions
2. Increases reusability of classes in module
3. Prepares for further refactoring
2021-09-20 12:20:38 -07:00
Sean Gilligan
08a9853c40 GitHub Actions: Add JDK 16 to build matrix 2021-09-20 18:23:13 +02:00
Sean Gilligan
44ca7f6689 walletfx: Introduce OverlayWindowController interface
Rationale:

1. Stronger typing makes code more readable and refactorable
2. Eliminates “automatic” reflection in MainController
3. Makes overlayUI field in implementing classes private
4. Is a step towards further refactoring and reusability
2021-09-19 12:35:38 -07:00
Sean Gilligan
17aeea2d75 walletfx: move OverlayUI from Main to MainController
Move OverlayUI and other related functionality from Main (Application) class
to MainController.

Motivation:

1. This simplifies the Main class
2. The code more logically belongs in the controller
3. The code being in the controller increases reusability
4. Is a first step towards additional refactoring made possible
   because MainController can subclass an abstract class and Main
   can’t because it must subclass Application
2021-09-19 19:04:12 +02:00
Sean Gilligan
1e7fc7aad5 walletfx: Hook up the unused “Primary” and “Secondary” buttons
I did this for two reasons:

1. So users will know why the buttons are there and that they work
2. A convenient way to test the informational alert function.
2021-09-18 17:42:33 -07:00
Sean Gilligan
e9980e73fa wallettemplate: rename package wallettemplate.utils to org.bitcoinj.walletfx.utils
This is a step towards (a renewed effort at) separating the wallettemplate
into a JavaFX wallet library and a template application.
2021-09-18 19:03:17 +02:00
Sean Gilligan
62f5097933 build.gradle: Update JavaFX to 17.0.0.1. 2021-09-17 17:33:53 +02:00
Sean Gilligan
65e9d9523b build.gradle: Update ZXing to 3.4.1. 2021-09-17 11:57:24 +02:00
Sean Gilligan
6da10f8641 build.gradle: Update SLF4J to 1.7.32. 2021-09-17 11:51:11 +02:00
Sean Gilligan
8708f08b1b GitHub Actions: upgrade to Gradle 7 2021-09-08 20:29:36 +02:00
Sean Gilligan
41cc820ab5 GitHub Actions: parameterize JDK distro & Gradle version
Add the parameters, but don’t change what tests
are run.
2021-09-08 20:23:40 +02:00
Sean Gilligan
5a1dbd9fb6 UtilsTest: Fix not resetMocking() after MockClock test 2021-09-08 18:54:42 +02:00
Sean Gilligan
212ac5b95f BlockChainTest, ExponentialBackoffTest, BasicKeyChainTest: Use no-args Utils.setMockClock() where possible
Replace a few calls to:

Utils.setMockClock(Utils.setCurrentTimeSeconds())

with

Utils.setMockClock()

The behavior of the first is slightly different
and possibly pathological, and I believe that in
all three cases in this PR, it is the later behavior
that is intended.
2021-09-08 18:50:21 +02:00
Sean Gilligan
185f880e78 NetworkParameters: Move genesis block construction to lazy getter
This refactoring breaks the cyclic dependency of NetworkParameters constructors
on the constructors in Block and will allow us to migrate the code
now in the getGenesisBlock() methods into (atomic) factories/constructors
in `Block` allowing us to create block objects that are unmodifiable/immutable.
2021-09-08 11:07:11 +02:00
Sean Gilligan
787c9caced Block, AbstractBitcoinNetParams subclasses: Constants
* Add Block.STANDARD_MAX_DIFFICULTY_TARGET and use in subclasses
* Always define maxTarget in terms of a nBits constant and use
  Utils.decodeCompactBits()
* Define constants for GENESIS_TIME and GENESIS_NONCE
2021-09-08 00:51:24 +02:00
Sean Gilligan
01efcea5ea RegTestParams: Set RegTest MAX_TARGET to match EASIEST_DIFFICULTY_TARGET
Clear the lowest 232 bits.
2021-09-08 00:34:46 +02:00
Sean Gilligan
9fa36d495f UnitTestParams: Set UnitTest maxTarget to EASIEST_DIFFICULTY_TARGET
The tests are currently using a custom value for maxTarget
that can’t be generated via CompactBits format.

This commit changes the string constant to match what would be
generated by using Utils.decodeCompactBits(EASIEST_DIFFICULTY_TARGET).
2021-09-08 00:29:53 +02:00
Sean Gilligan
42bb5b386e AbstractBitcoinNetParams subclasses: Improve Genesis hash checking
1. Define Sha256 constants for expected hashes
2. Compare hashes in binary form
3. Move hash comparison to immediately follow Block creation
4. Add error message to the check state call
2021-09-08 00:24:11 +02:00
Sean Gilligan
34184f0949 ChainSplitTest: Use getGenesisBlock() getter
This is the only place where getGenesisBlock() is
not being used.
2021-09-08 00:20:10 +02:00
Sean Gilligan
0cb686481f Block: Fix JavaDoc comment on EASIEST_DIFFICULTY_TARGET
It said “half of all possible hash solutions” which
led me to believe that decodeCompactBits() would
extend 1’s all the way out to the least significant
bit.
2021-09-07 12:27:54 +02:00
Sean Gilligan
6412db3319 UtilsTest: Add CompactBits test cases for common difficulties 2021-09-07 12:23:19 +02:00
Sean Gilligan
a19986d475 RegTestParams: remove redundant init of genesis block
(It looks like the override of getGenesisBlock() was added
back in 2013 when RegTestParams was a subclass of
TestNet2Params.)
2021-09-06 23:15:49 +02:00
Sean Gilligan
eb74d8aae4 Reorganize NetworkParameters subclass for easy diffs
Reorganize the initialization of the constants in each NetworkParameters
subclass so we can easily do diffs of `MainNetParms` vs `TestNet3Params`
and easily see how they are the same and how they are different.

I also reorganized the import statements so they “diff” better as well.

Other than those changes the only code I actually changed is
using the constant `PAYMENT_PROTOCOL_ID_UNIT_TESTS` instead of “unittest”
in getPaymentProcolId in UnitTestParams.

This will help us with the next step which is to create symbolic constants
for some of the parameters for the genesis blocks.
2021-09-05 13:38:59 -07:00