Jabit is a Bitmessage library for the Java environment, written in Kotlin. It is used by both Abit and Jabit-Server, and it shouldn’t be too hard to create your own Bitmessage client with it. https://dissem.ch/jabit/
Go to file
Christian Basler c8dfc3b459 Added option to save labels
and other improvements and fixes used for exports and imports
2017-08-25 21:11:10 +02:00
buildSrc/src/main Bumped gradle version to 3.4.1 2017-04-02 23:27:31 +02:00
core Added option to save labels 2017-08-25 21:11:10 +02:00
cryptography-bc Very minor code improvements 2017-08-11 12:32:20 +02:00
cryptography-sc Added dependency management and bumped gradle version 2017-07-02 11:46:27 +02:00
demo Added version to user agent info, and other minor fixes 2017-07-05 00:37:45 +02:00
exports Added option to save labels 2017-08-25 21:11:10 +02:00
extensions Some improvements for Java interoperability 2017-07-08 19:53:29 +02:00
gradle/wrapper Added exports for messages, labels and adddresses 2017-07-21 10:27:20 +02:00
networking Fixed occasional on the selector - it shouldn't crash the application 2017-07-22 08:01:59 +02:00
repositories Added option to save labels 2017-08-25 21:11:10 +02:00
wif Added dependency management and bumped gradle version 2017-07-02 11:46:27 +02:00
.editorconfig Better memory management for the in buffer (the same TODO for the out buffer. 2016-07-25 07:52:27 +02:00
.gitignore Refactored JdbcMessageRepository so that alternative implementations can be done easier 2016-05-20 23:58:08 +02:00
.travis.yml Update .travis.yml 2016-02-03 17:17:31 +01:00
Bitmessage.uml Updated UML diagram 2016-01-19 21:07:26 +01:00
build.gradle Added option to save labels 2017-08-25 21:11:10 +02:00
CONTRIBUTING.md Added CONTRIBUTING.md 2016-01-23 17:19:36 +01:00
gradle.properties Migrated core and extension modules to Kotlin 2017-06-06 16:36:07 +02:00
gradlew Added dependency management and bumped gradle version 2017-07-02 11:46:27 +02:00
gradlew.bat Added dependency management and bumped gradle version 2017-07-02 11:46:27 +02:00
LICENSE Some basic entities and project structure 2015-03-20 14:18:29 +01:00
README.md Fixes and improvements, SystemTest still broken 2017-06-16 07:03:12 +02:00
settings.gradle Added exports for messages, labels and adddresses 2017-07-21 10:27:20 +02:00

Jabit

Maven Central Javadoc Apache 2 Visit our IRC channel

A Java implementation for the Bitmessage protocol. To build, use command ./gradlew build.

Please note that it still has its limitations, but the API should now be stable. Jabit uses Semantic Versioning, meaning as long as the major version doesn't change, nothing should break if you update.

Be aware though that this doesn't necessarily applies for SNAPSHOT builds and the development branch, notably when it comes to database updates. In other words, they may break your installation!_

Master

Build Status Code Quality Test Coverage

Develop

Build Status Code Quality Test Coverage

Upgrading

Please be aware that Version 2.0.0 has some breaking changes, most notably in the repository implementations -- please take special care when upgrading them. If you don't implement your own repositories, you should be able to quickly find and fix any compilation errors caused by the few other breaking changes.

There is also a new network handler which comes highly recommended. If you're having any network problems, please make sure you use NioNetworkHandler instead of the now deprecated DefaultNetworkHandler.

Security

There are most probably some security issues, me programming this thing all by myself. Jabit doesn't do anything against timing attacks yet, for example. Please feel free to use the library, report bugs and maybe even help out. I hope the code is easy to understand and work with.

Project Status

Basically, everything needed for a working Bitmessage client is there:

  • Creating new identities (private addresses)
  • Adding contacts and subscriptions
  • Receiving broadcasts
  • Receiving messages
  • Sending messages and broadcasts
  • Managing outgoing and incoming connections
  • Initialise and manage a registry of Bitmessage network nodes
  • An easy to use API
  • A command line demo application built using the API

Setup

It is recommended to define the version like this:

ext.jabitVersion = '2.0.0'

Add Jabit as Gradle dependency:

compile "ch.dissem.jabit:jabit-core:$jabitVersion"

Unless you want to implement your own, also add the following:

compile "ch.dissem.jabit:jabit-networking:$jabitVersion"
compile "ch.dissem.jabit:jabit-repositories:$jabitVersion"
compile "ch.dissem.jabit:jabit-cryptography-bouncy:$jabitVersion"

And if you want to import from or export to the Wallet Import Format (used by PyBitmessage) you might also want to add:

compile "ch.dissem.jabit:jabit-wif:$jabitVersion"

For Android clients use jabit-cryptography-spongy instead of jabit-cryptography-bouncy.

Usage

First, you'll need to create a BitmessageContext:

JdbcConfig jdbcConfig = new JdbcConfig();
BitmessageContext ctx = new BitmessageContext.Builder()
        .addressRepo(new JdbcAddressRepository(jdbcConfig))
        .inventory(new JdbcInventory(jdbcConfig))
        .messageRepo(new JdbcMessageRepository(jdbcConfig))
        .powRepo(new JdbcProofOfWorkRepository(jdbcConfig))
        .nodeRegistry(new JdbcNodeRegistry(jdbcConfig))
        .networkHandler(new NioNetworkHandler())
        .cryptography(new BouncyCryptography())
        .listener(System.out::println)
        .build();

This creates a simple context using a H2 database that will be created in the user's home directory. In the listener you decide what happens when a message arrives. If you can't use lambdas, you may instead write

        .listener(new BitmessageContext.Listener() {
            @Override
            public void receive(Plaintext plaintext) {
                // TODO: Notify the user
            }
        })

Next you'll need to start the context:

ctx.startup()

Then you might want to create an identity

BitmessageAddress identity = ctx.createIdentity(false, Pubkey.Feature.DOES_ACK);

or add some contacts

BitmessageAddress contact = new BitmessageAddress("BM-2cTarrmjMdRicKZ4qQ8A13JhoR3Uq6Zh5j");
address.setAlias("Chris");
ctx.addContact(contact);

to which you can send some messages

ctx.send(identity, contact, "Test", "Hello Chris, this is a message.");

Housekeeping

As Bitmessage stores all currently valid messages, we'll need to delete expired objects from time to time:

ctx.cleanup();

If the client runs all the time, it might be a good idea to do this daily or at least weekly. Otherwise, you might just want to clean up on shutdown.

Also, if some messages weren't acknowledged when it expired, they can be resent:

ctx.resendUnacknowledgedMessages();

This could be triggered periodically, or manually by the user. Please be aware that if there is a message to resend, proof of work needs to be calculated, so to not annoy your users you might not want to trigger it on shutdown. As the client might have been offline for some time, it might as well be wise to wait until it caught up downloading new messages before resending those messages, after all they might be acknowledged by now.

There probably won't happen extremely bad things if you don't - at least not more than otherwise - but you can properly shutdown the network connection by calling

ctx.shutdown();