We’re presenting today the latest v0.6.3. This version presents a few important improvements listed below.

New “GxsTrans” service

This new service uses GXS (the system that otherwise distributes forum and channel posts) to asynchronously send authenticated pieces of data to any distant identity accross the connected network. The data is encrypted and the actual destination is hidden. In short, GxsTrans uses GXS groups that are distributed to friend nodes,and clients posts GXS messages in these groups which are accessed by every peer in the network to pick their own message. As a “meta service” GxsTrans forwards data to other client services in Retroshare (e.g. Messages). As GXS service, GxsTrans benefits from the spam control system and authentication of message’s sender.

Messages in GxsTrans groups are encrypted using the public key of their destination, and are signed by the sender. The encrypted packet only contains a symmetric AES128 key encrypted using the public key of the destination ID without header. Consequently there is no way to know who can decrypt this plain 16-bytes key and peers need to try their own keys to check whether they are the destination or not. A hint system however allows to limit the cost of trying all possible keys without fully disclosing the destination. We’re currently working on a way to implement Perfect Forward Secrecy within this system.

The Statistics/GxsTrans widget shows the list of messages currently sent by your own node with their status (top view) as well as the list of GxsTrans groups and their messages.

In order to make all peers agree on which groups to use (for efficiency reasons) subscription to groups is automatic and post are always sent into the group of largest ID. Because peers who do not already have a transport group will create one when needed, it’s expected to see a few subscribed GxsTrans groups in the statistics window.

GxsTrans can be used by any service to exchange long distance data asynchronously. It is currently used as a transport vector for distant messages. Messages however still partly rely on the Global Router, which uses tunnels/routing matrix and is therefore faster but less reliable. It is unclear at this point whether we will keep the global router or not. In any case, messages now are very reliable and fully asynchronous.

Forum/Channel post editing

Users can now edit their own forum/channel posts. This is done by posting a new message with the mOrigMsgId field set to the previous version of the message. The tree of message versions is then unfolded by the GUI at the time of display, and all messages are packed into a single post with a list of version times for you to choose:

Old Retroshare versions will however not be able to see post edits, since they do not take are of the mOrigMsgId value properly. In channels, comments are merged between all versions of the same post and all displayed consistently:

Renamed executables and packages

In order to comply with standard unix naming systems, we had to rename a few things. We hope it’s not cause too much inconvenience. If you have scripts launching Retroshare, just make sure to update them with the correct executable names:

RetroShare06 -> retroshare

RetroShare06-nogui -> retroshare-nogui

ubuntu packages

The new packages have a different name that drop the “06” suffix (which was originally here to allow a smooth transition between v0.5 and v0.6). Because new and old packages contain common files, they are declared as incompatible. In practice that means you need to remove the old packages, and then install the new ones:

sudo apt-get remove retroshare06 sudo apt-get install retroshare

The new executables are /usr/bin/retroshare and /usr/bin/retroshare-nogui. These procedures *will not* impact your retroshare data. It’s quite similar to upgrading the package.

New serialization system

The serialization system has been re-wrote from scratch with the following goals: (1) serialization should be easy to implement, (2) consistent by design, and (3) 100% backward compatible.

The new system, implements a single method that overrides RsItem::serial_process() which does 4 different tasks with the same piece of code: serialize, deserialize, size computation and print (that’s the role of the SerialzeJob variable in the code below). Therefore, all 4 tasks are consistent by design, and it’s impossible to implement a serializer that e.g. forgets to deserialize a member, etc.

Declaring a new RsItem subsclass and its serializer only requires two actions:

(1) overload the RsItem::serial_process method:

class MyRsItemType: public RsItem { public: virtual void serial_process(RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx) { RsTypeSerializer::serial_process<uint32_t>(j,ctx,sendTime,"sendTime") ; RsTypeSerializer::serial_process<uint32_t>(j,ctx,status ,"status") ; } };

(2) write a serializer that only provides an object creator:

class RsStatusSerialiser: public RsServiceSerializer { public: RsStatusSerialiser() :RsServiceSerializer(RS_SERVICE_TYPE_STATUS) {} virtual RsItem *create_item(uint16_t service,uint8_t item_subtype) const { if(item_subtype == RS_PKT_SUBTYPE_DEFAULT) return new RsStatusItem(); .... } };

RsTypeSerializer::serial_process handles all traditional types (including stl container types, see the code in libretroshare/serializer/ for numerous examples). It is also possible to specialize this method to serialize additional types on demand. We will document this more extensively soon.

All existing classes have been converted to the new system, which should go absolutely transparent to the end user.

Improved command line tool

The command line tool needs to manage the login step of both the web interface and the terminal input, which makes it pretty complicated. We tried to make it as clear and smooth as possible. The -U option now only takes a location ID (the 160bits hash) which are listed when no options are specified on the command line.

Improved GUI

Login and certificate creation dialogs have been simplified to their strict minimum. Channel comments (including the ones that load in the news feed) are loaded asynchronously when displayed while keeping the filtering and search capabilities, which allows a much faster loading of channels.

Group network stats now show the last message time and count of forum posts more accurately. New settings allow to tweak “direct downloads” globally to override the friend-level setting.

Statistics have been improved in order to show individual packets (as bullets) and graphs are both less costly and better looking.

Of course the usual pass of code cleaning includes valgrind against memory leaks, and cppcheck for code consistency.

Upcoming tasks

The two upcoming tasks are:

re-design the chat system. This has been already started. The goal is to consistently merge chat rooms, distant chat, and broadcast into variants of the same object, which will allow for instance to add friends to a conversation, create private multi-peers conversations, etc.

expose GXS API. We have a really powerful tool, but only the devs know about it. This is going to change, and we plan to offer developpers a way to implement applications on top of Retroshare.

Files

The software is available for windows, OSX, and all Ubuntu distributions.

[EDIT Aug 10, 2017] Because of a bug in the current version of sqlcipher on Debian stretch (See here) we need to provide special packages. You’ll find here the packages with dependency on libsqlcipher0-3.4.1 as well as the correct sqlcipher package to use.

[EDIT 2, Aug 20, 2017] Release on MacOS has been made possible through Travis-CI, which does both compilation and packaging. We’ve tested it: It works perfectly. Although we trust Travis, we cannot guaranty what is in the package.

Summary

One more release! The dev team would like to thank all contributors, testers and users for their valuable suggestions (Thanks to Ghibli for his really good advice on how to improve the GUI) and pull requests (especially Phenom for all his contributions).