ECKey violates the equals/hashCode contract for Java objects. Objects that are equivalent via the equals method, _must_ have the same hash code. This is not the case for ECKeys when comparing the compressed and uncompressed forms of a public key. The implementation of the `equals` method defines these objects to be equivalent, but the hashCode method defined them to be distinct! Original implementation comes from commit 640db52cf48416db8e2b24b502b3775243ad5162 which contains this bug. [1] Note that the comment identifies the correct intent: > Public keys are random already so we can just use a part of them as the hashcode. Read from the start to > avoid picking up the type code (compressed vs uncompressed) which is tacked on the end. But the second sentence is incorrect. The first byte (index 0) is the type code (compressed vs. uncompressed), not “the end”. The code has since been refactored in commit 9219d8a9b5714cf4e65dc046c70930c86416e65d but the implementation is effectively identical. [2] The fix is simple: use the most-significant four bytes of the X-coordinate of the public key. [1](640db52cf4 (diff-b59ef8be77b9148b27a14be59762c0c5R353)
) [2](9219d8a9b5 (diff-1849449aac05f7e59de7ebd56efd7f43R1201)
)
Welcome to bitcoinj
The bitcoinj library is a Java implementation of the Bitcoin protocol, which allows it to maintain a wallet and send/receive transactions without needing a local copy of Bitcoin Core. It comes with full documentation and some example apps showing how to use it.
Technologies
- Java 6 for the core modules, Java 8 for everything else
- Maven 3+ - for building the project
- Orchid - for secure communications over TOR
- Google Protocol Buffers - for use with serialization and hardware communications
Getting started
To get started, it is best to have the latest JDK and Maven installed. The HEAD of the master
branch contains the latest development code and various production releases are provided on feature branches.
Building from the command line
To perform a full build use
mvn clean package
You can also run
mvn site:site
to generate a website with useful information like JavaDocs.
The outputs are under the target
directory.
Building from an IDE
Alternatively, just import the project using your IDE. IntelliJ has Maven integration built-in and has a free Community Edition. Simply use File | Import Project
and locate the pom.xml
in the root of the cloned project source tree.
Example applications
These are found in the examples
module.
Forwarding service
This will download the block chain and eventually print a Bitcoin address that it has generated.
If you send coins to that address, it will forward them on to the address you specified.
cd examples
mvn exec:java -Dexec.mainClass=org.bitcoinj.examples.ForwardingService -Dexec.args="<insert a bitcoin address here>"
Note that this example app does not use checkpointing, so the initial chain sync will be pretty slow. You can make an app that starts up and does the initial sync much faster by including a checkpoints file; see the documentation for more info on this technique.
Where next?
Now you are ready to follow the tutorial.