New Huge FrostWire + Telluride Release. What we did in 2020, What we’ll do in 2021 and Beyond

  • Our New Huge first FrostWire+Telluride Release
  • What we hope to achieve in 2021
  • What’s been done in 2020
Video Demo: How to backup Instagram Livestreams or videos from hundreds of video sites

Hello friends, if you’re reading this it means you’ve survived 2020 so far. It hasn’t been easy for anybody, but we’re here to keep delivering great free open source software for the world.

Excited for FrostWire 6.8.8 and following releases

We’ve just finished a big desktop release, we’ve fixed every search source, added new ones, brought forth bleeding edge java technology and squashed several pending bugs.

We no longer bundle offers in our installers but more importantly we’ve brought back a feature many of you kept asking for, only now it’s a 100 times better than ever before.

We like to call it “Telluride Cloud Video Downloader“.

Telluride Logo
Telluride logo, courtesy of @nicole_draw

The Telluride Cloud Video downloader is in an easy to use, stand-alone, command line tool that makes use of youtube-dl library to let a user backup, archive or time-shift their cloud hosted videos.

Usually these video hosting services do not provide a convenient way for content creators to download the content they uploaded (perhaps to make it inconvenient to export user’s libraries to competitors), or there might be content of public interest that could be politically censored by a tyrannical government and it should be archived for journalistic reasons, or the user have to be away from a wireless signal for hours or days and needs to time-shift.

Also, there are hundreds of millions of public domain, creative commons and legally free videos available in these platforms.


Starting with FrostWire 6.8.8 for desktop the installation folder also comes with a telluride executable (in geek-speak: it’s a self-contained python runtime executable and python script that simplifies the use of youtube-dl for FrostWire users)

But don’t worry, you don’t need a command line to use it, all you need to do is open FrostWire and paste the URL of your video. FrostWire tells telluride the URL and reads the response to show you the download options for your video shown the same way as FrostWire search results.

It works with hundreds of sites. It’s very useful for those of us that upload original content to social media websites such as Instagram, Twitter, Facebook, Reddit, OpenTube, BitChute, DailyMotion, Vimeo and hundreds more.

Backups, Timeshifting, Archival


If you do live broadcasts on Instagram or Twitter, now you can finally download your broadcasts to your computer and easily edit a shorter version of your broadcast, or you can extract clips with the best parts so that you can post to your feed or video channel.


Just copy the link to your live IG broadcast into the FrostWire search box and you will see the available download options.

Twitter/Periscope broadcast backups will be available in future releases.

What’s Next for 2021

Now that this big Telluride ticket for desktop is finally done, we’ll be improving it and enhancing it progressively with further releases, we’ll be adding support for more advanced users that need an easy and powerful internet archiving tool (journalists, librarians, historians), and we’ll be adding a “daemon mode” for the telluride tool so it doesn’t spawn a new process every time you paste a cloud URL on FrostWire.

man wearing Sony PlayStation VR



We want to bring Telluride to Android. We tried several different approaches to put our youtube-dl python wrapper on the Android app and for now we know what not to do, but we have some clever solutions planned.

JLibtorrent Logo
JLibtorrent: A swig Java interface for libtorrent by the makers of FrostWire.
Develop libtorrent based apps with the joy of coding in Java.

jlibtorrent 2.0. There’s significant work to be done with our JLibtorrent project, the libtorrent engine Java wrapper that empowers all the bittorrent downloads on FrostWire across all platforms as well as many other bittorrent clients in the network.

The libtorrent project has now released its 2.0 branch and it seems to be very stable, it features new merkelized Bittorrent 2.0 torrents and lots of other new technology that we don’t want FrostWire users to miss-on and which will enable us to build next-gen torrenting features.

***

person performing heart hand gesture

We are also working on growing our community, we’re hoping to be able to start modernizing the user interface of our desktop client to be web-based, this will be done with a pilot parallel project, we don’t want to make anybody angry who’s already happy and doesn’t want the battle tested FrostWire user interface to change.

This is a project we had already embarked on around 2018 but things went sideways with Google Play and we had to layoff the entire team back then.

***

people walking on street during daytime



Another big and impactful goal is to simplify .torrent publishing and decentralizing .torrent indexes to circumvent all censoring efforts of torrent indices, this is a missing piece of the bittorrent ecosystem we’ve dreamed of building for years and 2021 should be the year to make it happen with your help.

***

grayscale photo of woman doing silent hand sign
“Quiet, Private zone”



Starting with 6.8.8 we have stopped monetizing our desktop installers completely. For months we’ve already been offering a bundle free mac installer and windows installer on github and sourceforge, we believe a nag free experience is one of the best incentives for community growth, a clean open-source free software experience supported by you.


What’s been done in 2020

Lastly we wanted to let you know all of what we’ve done this year for Android, Desktop and for our JLibtorrent project.

If you find FrostWire useful, if it’s made your life any better and if it’s within your means, please consider donating to the project for its continued existence and growth in 2021.
If you can’t afford to donate, please share FrostWire with all your friends and continue to share, the more the merrier.


We hope you find value in our work and we’ll try our hardest to earn your contributions, we strongly believe that if we deliver a world class software you find useful, there should be enough users and open source projects out there that care enough to help us keep going with a small donation every month, perhaps the same as buying us, your friends, one cup of coffee every month, ideally without ever needing to tap into the nasty advertising-industry.

FrostWire for Android in 2020

frostwire (6.8.8) stable; urgency=high

  • New Telluride build 6 cloud downloader technology
  • Refreshed welcome screen with search textbox
  • OpenJDK 15 runtime (Windows, MacOS)
  • New TorrentParadise search source
  • New GloTorrents search source
  • Yify search fixed
  • Torrentz2 search fixed
  • MagnetDL search fixed
  • Soundcloud search fixed
  • EZTV search fixed
  • Fixed archive.org broken downloads
  • Fixes false negative NordLynx/NordVPN detection
  • All deprecation warnings fixed along with some optimizations
  • New source renderer icons for 1337x and MagnetDL search sources by Aholicknight
  • dev: built with openjdk 15
  • dev: gradle-6.7 — FrostWire Team contact@frostwire.com Thu, 18 Nov 2020 09:56:00 -0600

frostwire (6.8.7) stable; urgency=high

  • New jlibtorrent 1.2.10.0 update
  • OpenJDK 14.0.2 update for Windows and macOS
  • lt: improve stat_file() performance on Windows
  • lt: fix issue with loading invalid torrents with only 0-sized files
  • lt: fix to avoid large stack allocations
  • lt: removed deprecated wstring overloads on non-windows systems
  • lt: drop dependency on Unicode’s ConvertUTF code (which had a license incompatible with Debian)
  • lt: fix bugs exposed on big-endian systems
  • lt: fix detection of hard-links not being supported by filesystem
  • lt: fixed resume data regression for seeds with prio 0 files
  • binaries: compiler upgraded from g++-5 to g++-7 — FrostWire Team contact@frostwire.com Tue, 15 Sep 2020 16:35:00 -0600

frostwire (6.8.6) stable; urgency=high

  • New jlibtorrent 1.2.8.0 update
  • New 1337x search (thanks to @HimanshuSharma789)
  • New iDope search (thanks to @HimanshuSharma789)
  • Fixed Torrentz2 search dates (thanks to @HimanshuSharma789)
  • Fixed SC search
  • Discontinues mplayer video playback, uses os default video player for videos
  • com.google.re2j:re2j:1.3 -> 1.4
  • com.squareup.okhttp3:okhttp:4.4.1 -> 4.8.1
  • com.h2database:h2:1.4.199 -> 200
  • lt: validate UTF-8 encoding of client version strings from peers
  • lt: don’t time out tracker announces as eagerly while resolving hostnames
  • lt: fix NAT-PMP shutdown issue
  • lt: improve hostname lookup by merging identical lookups
  • lt: fix network route enumeration for large routing tables
  • lt: fixed issue where pop_alerts() could return old, invalid alerts
  • lt: fix issue when receiving have-all message before the metadata
  • lt: don’t leave lingering part files handles open
  • lt: disallow calling add_piece() during checking
  • lt: fix incorrect filename truncation at multi-byte character
  • lt: always announce listen port 1 when using a proxy — FrostWire Team contact@frostwire.com Sun, 23 Aug 2020 10:45:00 -0600

frostwire (6.8.5) stable; urgency=high

  • New MagnetDL search provider
  • Fixed Torrentz2 search
  • Search improvements
  • New ‘Retry’ transfer for failed magnet/torrent downloads with not enough peers
  • Fixes bug getting source URL from TPB search result
  • Fixes broken Library local file search
  • updated: rej2:1.3, gson:2.8.6, okhttp:4.4.1
  • New jlibtorrent 1.2.7.0 update
  • jlibtorrent upgraded to build with boost 1.73.0
  • jlibtorrent upgraded to openssl 1.1.1g
  • OpenJDK 14 runtime (Windows, Linux), macOS still on OpenJDK 13
  • lt: fix incorrect filename truncation at multi-byte character
  • lt: always announce listen port 1 when using a proxy
  • lt: add set_alert_fd in python binding, to supersede set_alert_notify
  • lt: fix bug in part files > 2 GiB
  • lt: add function to clear the peer list for a torrent
  • lt: fix resume data functions to save/restore more torrent flags
  • lt: limit number of concurrent HTTP announces
  • lt: fix queue position for force_rechecking a torrent that is not auto-managed
  • lt: improve rate-based choker documentation, and minor tweak
  • lt: undeprecate upnp_ignore_nonrouters (but refering to devices on our subnet)
  • lt: increase default tracker timeout
  • lt: retry failed socks5 server connections
  • lt: allow UPnP lease duration to be changed after device discovery
  • lt: fix IPv6 address change detection on Windows
  • lt: fix peer timeout logic
  • lt: simplify proxy handling. A proxy now overrides listen_interfaces
  • lt: fix issues when configured to use a non-default choking algorithm
  • lt: fix issue in reading resume data
  • lt: revert NXDOMAIN change from 1.2.4
  • lt: don’t open any listen sockets if listen_interfaces is empty or misconfigured
  • lt: fix bug in auto disk cache size logic
  • lt: fix issue with outgoing_interfaces setting, where bind() would be called twice
  • lt: add build option to disable share-mode
  • lt: support validation of HTTPS trackers
  • lt: deprecate strict super seeding mode
  • lt: make UPnP port-mapping lease duration configurable
  • lt: deprecate the bittyrant choking algorithm
  • lt: add build option to disable streaming — FrostWire Team contact@frostwire.com Thu, 18 Jun 2020 17:06:00 -0600

frostwire (6.8.4) stable; urgency=high

  • OpenJDK 13 runtime (windows,mac)
  • Soundcloud search and downloads fixed
  • LimeTorrents search and downloads fixed
  • New jlibtorrent 1.2.3.0 update
  • jlibtorrent updated to boost 1.72.0
  • jlibtorrent upgraded openssl to 1.1.1d
  • lt:fix erroneous event=completed tracker announce when checking files
  • lt:promote errors in parsing listen_interfaces to post listen_failed_alert
  • lt:fix bug in protocol encryption/obfuscation
  • lt:fix buffer overflow in SOCKS5 UDP logic
  • lt:fix issue of rapid calls to file_priority() clobbering each other
  • lt:clear tracker errors on success
  • lt:optimize setting with unlimited unchoke slots
  • lt:fixed restoring of trackers, comment, creation date and created-by in resume data
  • lt:fix handling of torrents with too large pieces
  • lt:fixed division by zero in anti-leech choker
  • lt:fixed bug in torrent_info::swap — FrostWire Team contact@frostwire.com Thu, 30 Jan 2020 19:30:45 -0600

Telluride in 2020

build 6 – nov/18/2020

  • python: youtube-dl 2020.11.18
  • python: pyinstaller 4.0
  • Smaller build, down 2.4MB

build 5 – nov/13/2020

  • python: youtube-dl 2020.11.12
  • lint cleanups

build 4 – nov/03/2020

  • python: youtube-dl 2020.11.1
  • python: pycryptodome 3.9.9

build 3 – oct/20/2020

  • configure.sh to setup and upgrade all build dependencies for windows, macos, linux
  • build.sh builds telluride binaries for windows, macos, linux
  • -a, –audio-only option flag to convert to mp3 if ffmpeg avaiable. strips video data from .webm if not
  • -m, –meta-only option flag to print JSON with meta data about video found in URL
  • Added Apache License 2.0
  • python: pip 20.2.4
  • python: youtube-dl 2020.9.20
  • python: pycryptodome 3.9.8
  • python: pyinstaller 4.0
  • python: pylint 2.6.0

FrostWire for Android in 2020

FrostWire 2.2.5 build 665 – NOV/18/2020

  • New: TorrentParadise search source
  • New: GloTorrents search source
  • New: Firebase Crash Analytics support
  • Yify search fixed
  • Torrentz2 search fixed
  • MagnetDL search fixed
  • Soundcloud search fixed
  • EZTV search fixed
  • Fixed archive.org connection dropped/timeout error
  • Privacy updates
  • com.google.android.gms:play-services-ads 19.4.0 -> 19.5.0
  • com.mopub:mopub-sdk-banner:5.12.0 -> 5.14.0
  • com.applovin:applovin-sdk:9.13.1 -> 9.14.5
  • com.mopub.mediation:applovin:9.13.1.0 -> 9.14.3.0
  • material 1.3.0-alpha02 -> 1.3.0-alpha03
  • browser 1.3.0-alpha05 -> 1.3.0->alpha06
  • exifinterface 1.2.0 -> 1.3.1
  • play-services 19.3.0 -> 19.4.0
  • core-ktx 1.3.1 -> 1.3.2
  • com.android.tools.build:gradle:4.0.1 -> 4.1.0
  • gradle wrapper update 6.1.1->6.6.1

FrostWire 2.2.4 build 654 – SEP/24/2020

  • New jlibtorrent 1.2.10.0 update
  • Fixes bug where frostclick promo slide would render twice
  • dev: buildToolsVersion ‘29.0.2’ -> ‘29.0.3’ (@TacoTheDank)
  • Archive search Json parsing deprecation fix (@TacoTheDank)
  • com.squareup.okhttp3:okhttp:4.8.1 -> 4.9.0
  • lt: improve stat_file() performance on Windows
  • lt: fix issue with loading invalid torrents with only 0-sized files
  • lt: fix to avoid large stack allocations
  • lt: add macro TORRENT_CXX11_ABI for clients building with C++14 against
    libtorrent build with C++11
  • lt: removed deprecated wstring overloads on non-windows systems
  • lt: drop dependency on Unicode’s ConvertUTF code (which had a license
    incompatible with Debian)
  • lt: fix bugs exposed on big-endian systems`
  • lt: fix detection of hard-links not being supported by filesystem
  • lt: fixed resume data regression for seeds with prio 0 files
  • binaries: compiler upgraded from g++-5 to g++-7
  • reverted to com.mopub:mopub-sdk-banner:5.12.0 (mopub 5.13.1 very unstable)

FrostWire 2.2.3 build 649 – AUG/23/2020

  • jlibtorrent 1.2.7.0 -> 1.2.8.0 update
  • com.squareup.okhttp3:okhttp:4.4.1 -> 4.8.1
  • com.mopub:mopub-sdk-banner:5.12.0 -> 5.13.1
  • androidx.browser:browser:1.3.0-alpha04 -> 1.3.0-alpha05
  • com.google.re2j:re2j:1.3 -> 1.4
  • com.google.android.material:material:1.3.0-alpha01 -> 1.3.0-alpha02
  • com.google.android.gms:play-services-ads:19.2.0 -> 19.3.0
  • com.applovin:applovin-sdk:9.12.6 -> 9.13.1
  • com.unity3d.ads:unity-ads:3.4.2 -> 3.4.6
  • 1337 search fixed
  • SC search fixed

FrostWire 2.2.2 build 646 – AUG/01/2020

  • Considerably faster app startup
  • .apk size reduced 2.1MB
  • New 1337x (LeetX) search (thanks to @HimanshuSharma789 for his contribution)
  • New iDope search (thanks to @HimanshuSharma789 for his contribution)
  • Fixed Torrentz2 search dates (thanks to @HimanshuSharma789 for his contribution)
  • Multiple crash fixes on My Music (Player)
  • Settings screen now includes links to official reddit, twitter, facebook, discord chat, blog, rate us
  • jlibtorrent 1.2.7.0 recompiled with Android NDK r21d
  • com.google.android.material:material:1.2.0-alpha06 -> 1.3.0-alpha01
  • com.android.tools.build:gradle:3.6.3 -> 4.0.1
  • gradle-5.6.4 -> gradle-6.1.1
  • androidx.browser:browser:1.3.0-alpha01 -> 1.3.0-alpha04
  • com.google.android.gms:play-services-ads:19.1.0 -> 19.2.0
  • com.android.billingclient:billing:2.2.0 -> 3.0.0

FrostWire 2.2.1 build 642 – JUN/17/2020

  • jlibtorrent/libtorrent 1.2.7.0 update
  • OpenSSL 1.1.1g update
  • dev: jlibtorrent build with boost 1.73.0
  • Fixes bug getting source URL from TPB search result
  • lt: fix incorrect filename truncation at multi-byte character
  • lt: always announce listen port 1 when using a proxy
  • lt: add set_alert_fd in python binding, to supersede set_alert_notify
  • lt: fix bug in part files > 2 GiB
  • lt: add function to clear the peer list for a torrent
  • lt: fix resume data functions to save/restore more torrent flags
  • lt: limit number of concurrent HTTP announces
  • lt: fix queue position for force_rechecking a torrent that is not auto-managed
  • lt: improve rate-based choker documentation, and minor tweak
  • lt: undeprecate upnp_ignore_nonrouters (but refering to devices on our subnet)
  • lt: increase default tracker timeout
  • lt: retry failed socks5 server connections
  • lt: allow UPnP lease duration to be changed after device discovery
  • lt: fix IPv6 address change detection on Windows
  • lt: fix peer timeout logic
  • lt: simplify proxy handling. A proxy now overrides listen_interfaces
  • lt: fix issues when configured to use a non-default choking algorithm
  • lt: fix issue in reading resume data
  • lt: revert NXDOMAIN change from 1.2.4
  • lt: don’t open any listen sockets if listen_interfaces is empty or misconfigured
  • lt: fix bug in auto disk cache size logic
  • lt: fix issue with outgoing_interfaces setting, where bind() would be called twice
  • lt: add build option to disable share-mode
  • lt: support validation of HTTPS trackers
  • lt: deprecate strict super seeding mode
  • lt: make UPnP port-mapping lease duration configurable
  • lt: deprecate the bittyrant choking algorithm
  • lt: add build option to disable streaming

FrostWire 2.1.10 build 640 – JUN/04/2020

  • Less interstitial ads
  • Fixes Torrentz2 search
  • Fixes music playback bug on Android 5.x (Lollypop)
  • Fixes bug where playing a Unity Video Reward didn’t pause ads
  • Fixes bug getting source URL from TPB search result
  • com.squareup.okhttp3:okhttp:3.14.0 -> 4.4.1
  • com.google.android.gms:play-services-ads:18.3.0 -> 19.1.0
  • com.android.billingclient:billing:2.1.0 -> 2.2.0
  • dev: com.android.tools.build:gradle:3.6.1->3.6.3
  • androidx.preference:preference:1.1.1
  • com.google.android.material:material:1.2.0-alpha06
  • androidx.exifinterface:exifinterface:1.2.0
  • com.applovin:applovin-sdk:9.12.6
  • com.mopub.mediation:applovin:9.12.5.0
  • com.mopub:mopub-sdk-*:5.12.0

FrostWire 2.1.9 build 637 – MAR/05/2020

  • Album art display bug fixed
  • No more annoying 300×250 ad over album art on Music Player
  • New MagnetDL search
  • Issues with search results not being displayed fixed
  • MusicPlaybackService rewritten
  • Continuous playback issues fixed
  • Repeat mode and shuffle mode issues fixed
  • Save to Playlist issue fixed
  • New Global Sequential Downloads Torrent Setting. Disabled by default
  • Transfer details file list and peer list no longer flicker when updated
  • New jlibtorrent 1.2.3
  • libtorrent 1.2.3.0 update
  • com.google.android.material:material:1.2.0-alpha04->1.2.0-alpha05 update
  • com.google.code.gson:gson:2.8.5 -> 2.8.6 update
  • boost 1.72.0 build
  • openssl 1.1.1d
  • Android NDK 21
  • R8 code minification enabled to build .apk
  • UX: New ‘Retry Download’ action for failed magnet downloads
  • UX: No more annoying ever-present Android notification, only during active transfers or music playback
  • UX: Torrent search results now show how old they are
  • EngineService and MusicPlaybackService are no longer ran as foreground services following newer android guidelines
  • Considerable CPU usage reduction through thread invocation throttling frees resources for better search and download experience
  • Removed experimental haptic feedback feature
  • Multiple crashes fixed
  • Music player and notifications framework update
  • MusicPlaybackService lifecycle rewrite
  • SoundCloud search/downloads fixed
  • LimeTorrents search/downloads fixed
  • Fixes crash searching for music in My Music screens
  • Fixes issue media scanning finished download files
  • androidx browser 1.3.0-alpha01
  • applovin and mopub mediation 9.11.4
  • mopub 5.11.0 update
  • com.unity3d.ads:unity-ads:3.4.2 update
  • lt:fix erroneous event=completed tracker announce when checking files
  • lt:promote errors in parsing listen_interfaces to post listen_failed_alert
  • lt:fix bug in protocol encryption/obfuscation
  • lt:fix buffer overflow in SOCKS5 UDP logic
  • lt:fix issue of rapid calls to file_priority() clobbering each other
  • lt:clear tracker errors on success
  • lt:optimize setting with unlimited unchoke slots
  • lt:fixed restoring of trackers, comment, creation date and created-by in resume data
  • lt:fix handling of torrents with too large pieces
  • lt:fixed division by zero in anti-leech choker
  • lt:fixed bug in torrent_info::swap

JLibtorrent in 2020

1.2.11.0 (In Progress…)

1.2.10.0

  • libtorrent 1.2.10 update (70f1de3f7ec4012aaea420ff150ef0135d397706)
  • lt: improve stat_file() performance on Windows
  • lt: fix issue with loading invalid torrents with only 0-sized files
  • lt: fix to avoid large stack allocations
  • lt: add macro TORRENT_CXX11_ABI for clients building with C++14 against
    libtorrent build with C++11
  • lt: removed deprecated wstring overloads on non-windows systems
  • lt: drop dependency on Unicode’s ConvertUTF code (which had a license
    incompatible with Debian)
  • lt: fix bugs exposed on big-endian systems
  • lt: fix detection of hard-links not being supported by filesystem
  • lt: fixed resume data regression for seeds with prio 0 files
  • binaries: compiler upgraded from g++-5 to g++-7

1.2.8.0

  • add router.utorrent.com to list of DHT bootstrap nodes
  • Android builds with new NDK r21d
  • lt: validate UTF-8 encoding of client version strings from peers
  • lt: don’t time out tracker announces as eagerly while resolving hostnames
  • lt: fix NAT-PMP shutdown issue
  • lt: improve hostname lookup by merging identical lookups
  • lt: fix network route enumeration for large routing tables
  • lt: fixed issue where pop_alerts() could return old, invalid alerts
  • lt: fix issue when receiving have-all message before the metadata
  • lt: don’t leave lingering part files handles open
  • lt: disallow calling add_piece() during checking
  • lt: fix incorrect filename truncation at multi-byte character
  • lt: always announce listen port 1 when using a proxy

1.2.7.0

  • libtorrent 1.2.7 update (ce0a85f783bec37484776a37fe3662279091ecc5)
  • upgraded to boost 1.73.0
  • upgraded to openssl 1.1.1g
  • lt: fix incorrect filename truncation at multi-byte character
  • lt: always announce listen port 1 when using a proxy
  • lt: add set_alert_fd in python binding, to supersede set_alert_notify
  • lt: fix bug in part files > 2 GiB
  • lt: add function to clear the peer list for a torrent
  • lt: fix resume data functions to save/restore more torrent flags
  • lt: limit number of concurrent HTTP announces
  • lt: fix queue position for force_rechecking a torrent that is not auto-managed
  • lt: improve rate-based choker documentation, and minor tweak
  • lt: undeprecate upnp_ignore_nonrouters (but refering to devices on our subnet)
  • lt: increase default tracker timeout
  • lt: retry failed socks5 server connections
  • lt: allow UPnP lease duration to be changed after device discovery
  • lt: fix IPv6 address change detection on Windows
  • lt: fix peer timeout logic
  • lt: simplify proxy handling. A proxy now overrides listen_interfaces
  • lt: fix issues when configured to use a non-default choking algorithm
  • lt: fix issue in reading resume data
  • lt: revert NXDOMAIN change from 1.2.4
  • lt: don’t open any listen sockets if listen_interfaces is empty or misconfigured
  • lt: fix bug in auto disk cache size logic
  • lt: fix issue with outgoing_interfaces setting, where bind() would be called twice
  • lt: add build option to disable share-mode
  • lt: support validation of HTTPS trackers
  • lt: deprecate strict super seeding mode
  • lt: make UPnP port-mapping lease duration configurable
  • lt: deprecate the bittyrant choking algorithm
  • lt: add build option to disable streaming

1.2.6.0

  • There was no 1.2.6 release, we waited and jumped all the way to 1.2.7.0

1.2.5.0

  • libtorrent 1.2.5 update (0f337b9ce7a1b0fc87f48843933b1c5c4dd5a9ec)
  • New SettingsPack::dhtUploadRate(), SettingsPack::dhtUploadRate(int)
  • lt:announce port=1 instead of port=0, when there is no listen port
  • lt:fix LSD over IPv6
  • lt:support TCP_NOTSENT_LOWAT on Linux
  • lt:fix correct interface binding of local service discovery multicast
  • lt:fix issue with knowing which interfaces to announce to trackers and DHT
  • lt:undeprecate settings_pack::dht_upload_rate_limit

1.2.4.0

  • libtorrent 1.2.4 update (ad83b1c0eb293b63c69f7879ca6ba2381369f77f)
  • Java source compatibility upgraded from 1.7 to 1.8
  • lt:fix binding TCP and UDP sockets to the same port, when specifying port 0
  • lt:fix announce_to_all_trackers and announce_to_all_tiers behavior
  • lt:fix suggest_read_cache setting
  • lt:back-off tracker hostname looksups resulting in NXDOMAIN
  • lt:lower SOCKS5 UDP keepalive timeout
  • lt:fix external IP voting for multi-homed DHT nodes
  • lt:deprecate broadcast_lsd setting. Just use multicast
  • lt:deprecate upnp_ignore_nonrouters setting
  • lt:don’t attempt sending event=stopped if event=start never succeeded
  • lt:make sure &key= stays consistent between different source IPs (as mandated by BEP7)
  • lt:fix binding sockets to outgoing interface
  • lt:add new socks5_alert to trouble shoot SOCKS5 proxies

Trust is Risk: A decentralized trust system

The FrostWire team cares deeply about the free and uncensored flow of information, this means helping solving one of the hardest computer science problems out there: creating a distributed reputation system in order to rid p2p networks from a great deal of issues created by Sybil attacks.

Once you have a way to trust the unknown peers on the network you can do things like decentralized e-commerce (think what digital goods you could sell on a P2P network), decentralized credit (think Lending Club without the central entity), or any other decentralized service where reputation is key (think decentralized Uber as another example).

Along with our friends at OB1 (creators of OpenBazaar a project which we’ve collaborated with in the past), we’ve helped sponsor and mentor a team of Ph.D students in Greece to work on a promising solution called “Trust is Risk”

The following is an explanatory post by  Dionysis Zindros

new-york-2048861_960_720
Image from Pixabay

Trust is Risk: A decentralized trust system

One of the foundational problems of a decentralized marketplace is that of trust. It’s an  inherently difficult problem: How can you trade with someone who could, in principle, be completely anonymous?

In this article, we provide a novel answer to that question, something we call Trust is Risk. It’s a new approach to solve the problem that we’re exploring and we’d like to illustrate our ideas to the community and solicit your feedback.

This post is going to give an explanation of what Trust Is Risk is and how it works with quite some detail. This post is accessible to anyone. We don’t have any math here. But if you’re interested in all the deep details, I’m providing links to our papers in the last section that you can look at.

This is novel research work we’ve been doing that has never been presented before outside of academic conferences. We’d greatly appreciate your feedback and constructive criticism of our ideas.

Before we begin, a disclaimer: Trust Is Risk is an exploratory subject.

OpenBazaar is considering it for research, but is not yet committed to adopting it. More work is needed to evaluate if this system can work in practice.

The problem and previous attempts at solving it

In a traditional brick-and-mortar store setting, you have certain insurances that will let you transact safely. If something goes wrong, for example the store rips you off, you have a whole legal arsenal that you can bring against the store. But we don’t have (and perhaps don’t want to have) that luxury in a decentralized marketplace when people can anonymously connect through Tor or use cryptocoins that ensure privacy such as monero or zcash  (which OpenBazaar already supports).

Besides, if we allowed people to be accountable towards traditional courts and law, we’re opening up pandora’s box in letting governments interfere by making their own laws about what’s “cheating in a transaction” and what isn’t, which leaves room for censorship, something OpenBazaar always wanted to avoid – which is why from OpenBazaar’s inception we considered malicious governments as part of our threat model.

Brick-and-mortar stores also have a certain cost to set up and you expect them to be there the next day for accountability. You can literally walk up to a store that sold you a faulty phone and ask for your money back. But OpenBazaar stores can appear out of nowhere and disappear in minutes. We gave a lot of thought to these features of the physical world during the first versions of OpenBazaar and came up with reputation pledges and implemented one of the first production proof-of-burn systems  or identity creation. But people feel very uncomfortable burning money to set up a  digital store and we discovered some alternative ideas like donating to charity or miners can’t work out securely.

Here are some critical questions: If you’re a buyer, how do you know that when you give them the money, they’re going to send you the product? Or if you’re a vendor, how do you know that when you ship them the product, they’ll give you the money they promised? Of course you can use transaction-based escrows such as 2-of-2 or 2-of-3 transactions or MAD, some of which OpenBazaar already implements. But the problem remains: What if as a buyer you use a 2-of-2 transaction and upon receiving the product you finalize your funds, only to find out days later that it was of bad quality and broke down?

Another idea is to use a web-of-trust and I wrote extensively about the potential of using it in OpenBazaar in my master thesis (of which the shorter version is much more palatable). But the problem there, as with GPG, is that trust is arbitrary: it’s just a number and everybody has a different idea about how much to trust others and what trust means. For example, some people are very diligent about giving out trust, while others aren’t. An arbitrary trust scale doesn’t mean the same to everybody. And so the problem remains unsolved.

Sybil attacks and stars

Currently OpenBazaar uses a reputation system which is based on ratings and stars. This is a system widely employed by centralized markets as well, from eBay to Facebook Marketplaces. The idea is to let other people rate you from 1★ to 5★ as a buyer or as a vendor after a transaction is completed. Then, an average can be extracted and displayed for everyone.

This star-based system is quite attractive due to its simplicity and ease of understanding. Centralized marketplaces can afford this system, because they can refactor it and censor users at will if they gauge that people are misbehaving. They can also employ secret heuristic mechanisms to detect and punish wrongdoing. However, a decentralized market does not have such an option, as the code and exact inner workings must be open.

This opens up a star-based system to Sybil attacks. In this attack, a malicious vendor works as follows: They create multiple fake “buyer” accounts which perform transactions with the vendor. They then have the buyer accounts positively rate the vendor, increasing their star rating. The fact that a transaction is required prior to rating someone does not help defend against this attack. The seller simply moves funds among different Bitcoin addresses all of which they control. As OpenBazaar does not require paying any fees this is essentially free (except for Bitcoin transaction fees).

Many naïve ideas can be proposed for avoiding Sybil attacks.

Here’s one: If a vendor receives many ratings simultaneously from users that all have newly created accounts, then these ratings can be discounted.

Here’s another one: A buyer must have made a minimum of 5 other purchases before they can rate this vendor.

Here’s yet another: A buyer must have already rated another vendor prior to having his ratings count. And one more: If the buyer and seller form an isolated strongly connected “island” of ratings (a so-called clique), then the ratings should be discounted. These proposals are lucrative, but can’t possibly work.

The rules for deciding which ratings are good and which ones are bad must be published in the open source code of the project. Subsequently, the malicious vendor can make sure they bypass such rules. For example, they will make sure they let their accounts “mature” before rating, they will create several fake vendor accounts so that their fake sellers can create ratings towards the fake vendors prior to making ratings to the real vendor and they will avoid forming a “clique” of ratings by not having everyone rate everyone, but rather mimic the way real people rate real vendors in terms of amount of ratings, connectedness, and so forth. The same problems arise if you try to filter by IP address or
require that people run a different OpenBazaar node version or OS version. It’s a futile cat-and-mouse game.

Trusting people

The core idea of Trust is Risk is quite simple. We believe this is the right approach for handling decentralized trust.

Here it is.

Suppose Bob shares a bank account with her friend Alice. He puts 10€ in it, which are his own, but just trusts Alice not to take it. Because Alice is his friend, she doesn’t take it. While Alice can always take it, she chooses not to. Even though it’s put in a shared account, Bob’s money is always Bob’s and he can always take it too.

In Bitcoin, we can do the same thing with a transaction that has a 1-of-2 multisig output. A 1-of-2 multisig output means that the money is spendable by either one of the two participants on their own, Alice or Bob. Alice doesn’t need Bob’s permission to spend and Bob doesn’t need Alice’s permission to spend.

Here’s what that looks like in the Bitcoin transaction graph:

A 1-of-2 multisig transaction

Here, Bob has created a transaction into which he pays 1 BTC so that the money can now belong to an account shared between Alice and Bob. Whenever we mention a “shared account” in this post, we mean such 1-of-2 multisig transaction outputs.

We call this a trust transaction, because Bob trusts Alice with his money. The use of such transactions, reminiscent of lines-of-credit in more traditional settings, for the purpose of establishing trust was a great idea invented by OpenBazaar co-founder Washington Sanchez in his post Peer-to-Peer Lending on OpenBazaar.

Suppose now, in this limited setting, that Bob wishes to purchase something from Alice, and that Bob has already entrusted Alice with 1 coin at an earlier moment in time. If what he wants to buy from Alice is worth 1 coin, then he can do it as follows: He takes the money out of the shared account and pays it directly to Alice’s account (or simply tells Alice that it’s fine to take it out of the shared account). Then Alice can get paid and ship the product.

That doesn’t sound like a big deal, because Bob and Alice were already friends, but think about what just happened: Bob was willingly trusting Alice with some money, a trust decision he took in the past. If that trust decision on Bob’s side was the right call, then Alice will not cheat on him and will not take the money out of the account. Therefore, merely by having the money in a shared account, Bob has established an amount of trust for Alice.

He can then use that money and buy something from Alice, knowing that Alice won’t steal from him in the product trade. Why? Because if Alice had wanted to steal from him, she could’ve done so previously anyway. We call this property risk invariance, because Bob’s risk exposure towards Alice does not change before and after the purchase. Before the purchase, Bob was willingly taking a risk of 1 coin, because it was in a shared account with Alice. After the purchase, Bob is again taking a risk of 1 coin, because he is waiting for a product worth 1 coin to arrive, but has removed the money from the shared account. In both cases, Bob was trusting Alice by risking 1 coin and nothing changed. When Bob receives the product, this closes the trade and he can replenish the trust by opening a new shared account with Alice, if he wants to.

The Trust is Risk wallet

Based on the very simple idea above, we know that people have friends that they are willing to trust financially. This is a very different situation from more traditional webs-of-trust, such as GPG, where trust is an arbitrary numeric value. Now trust is established as a monetary value, it is denominated in bitcoin, and everyone is equal in it. If Alice trusts Bob with 1 coin, and Charlie trusts Dave with 1 coin, that’s 1 coin everywhere. It has the same purchasing power. In this sense, we utilize money’s unit of account property to equalize what trust means for different people. Yes, maybe different people are less willing to trust others, but we now have a quantifiable means of establishing how much they trust each other without ever having to know their personality intricacies. We thus leverage the objective nature of money in order to “objectify” trust.

Imagine now that we provide a new generation of bitcoin wallets. This wallet is called the Trust is Risk wallet. You can move money back and forth between your traditional wallet and your Trust is Risk wallet to your heart’s content.

But your Trust is Risk wallet is different: In it, your money can be put in shared
accounts with your friends via trust transactions.

So, for example, if Alice has 60 mBTC stored in her Trust is Risk wallet, she could have allocated 36 mBTC of it to Charlie and 24 mBTC of it to Bob. That money is under risk: Alice is choosing her friends to put some of her own money under their control, and hopefully she’s choosing wisely. Here’s how her wallet could display her portfolio:

Pie allocation of funds

Here, she’s putting 36 mBTC in a shared account with Charlie and another 24 mBTC in a shared account with Bob, for a total of 60 mBTC.

Trust transactions have an additional cryptographic property: They can be used to prove to third parties that a trust relationship exists between two people.

Hence, if Alice and Bob maintain a shared account where Alice’s money is stored, they can publicize the respective Bitcoin transaction and everybody can know that Alice trusts Bob a certain amount of money. For reasons that will become clear below, we want to publicize all these trust relationships in OpenBazaar by default. One easy way to do that is to associate a fixed Bitcoin address with each OpenBazaar node and use that as-is in all trust transactions. There are also better ways of doing it using unique addresses that are verified to belong to their respective owners with a signature. Showing these transactions to third parties constitutes a proof-of-trust and is a powerful new primitive.

Trust transitivity

You may be asking: Why would I ever put my money in a Trust is Risk wallet? That sounds like a silly, unnecessary risk. But you get a unique benefit from that. If you’re willing to risk some money by having some exposure to known friends, then we can solve the decentralized trust problem. This is the crux of this reputation system.

Here’s how it works: You trust some money to each of your friends. They trust some money to their own friends and perhaps back to you. Their friends trust their own friends, and so on, forming a big network of trust similar to cryptographic webs-of-trust. However, this network is now associated with financial values.

Technically, we say that the web-of-trust forms a trust graph of people connected through lines-of-credit. Here’s how that graph looks like if Alice trusts Bob with 10 coins and Bob trusts Charlie with 20 coins:

A transitive trust relationship

Unlike the previous graph where we were showing a Bitcoin transaction with inputs and outputs, here the circles correspond to OpenBazaar accounts and the arrows correspond to lines-of-credit (also known as direct trusts) extended between them.

But now that we have two steps in the trust graph, something interesting happens: Alice not only trusted Bob with her money, but she also trusted Bob about his financial trust decisions. Imagine the following case: say Charlie decides to steal the money that Bob has deposited into their shared account. In this case Bob has incorrectly trusted Charlie by putting his money into their shared account. Then Bob has a spectrum of options with two extremes. In the first extreme, Bob can, in turn, take Alice’s money deposited in the account shared between Alice and Bob in order to replenish his loss. Of course, this is a worst- case scenario for Alice. The other extreme option for Bob is to decide to absorb the loss, which is a better scenario for Alice. Nevertheless, Alice is in practice exposed to some risk due to Charlie’s behavior through her trust in Bob. She not only has entrusted Bob with her money in good faith that he won’t steal it, but also gone a step further, trusting him with her money to make his own investments. But in any case, Alice’s liability is limited to the amount she has put in that account she shared with Bob. She can explicitly set a bound on how much Bob’s mishaps can cost her.

These two distinct options for Bob often arise in real-world economic scenarios. Suppose there is a client, an intermediary and a producer. The client entrusts some value to the intermediary so that the latter can buy the desired product from the producer and deliver it to the client. The intermediary in turn entrusts an equal value to the producer, who needs the value upfront to be able to complete the production process. However, for whatever reason, the producer eventually does not ship the product and neither reimburses its value. This could be due to bankruptcy or an illegal decision to exit the market with an unfair benefit. The intermediary can then choose either to reimburse the client and suffer the loss, or refuse to return the money and perhaps lose the client’s trust. Because losses can be passed down the line, we call this a transitive trust game.

Trust transitivity, especially in a decentralized financial setting, has been explored and supported by empirical sociological research of lending networks. They have independently discovered that our results, which we prove mathematically, empirically arise in real networks of people.

The flow of money

Just as an example, here’s what a slightly more complex trust graph looks like:

A trust graph

Here we have an interesting case of a trust cycle: A trusts D, who trusts B, who trusts A.

We’ve set up our trust graph. Now suppose you, the user of OpenBazaar, have a Trust is Risk wallet and some of your money is deposited to accounts shared with your friends. And, now, suppose you find some vendor who is also participating in the Trust is Risk network through his own wallet. Of course, you don’t trust that vendor directly. However, there may be indirect lines-of-credit extended to the vendor. Through your financial decision to trust your friends, a move you’ve made comfortably already knowing who they are, you have taken some calculated risk towards some pseudonymous vendor whom you’ve never met. In fact, since the trust transactions are public, your OpenBazaar node can calculate exactly how much this risk is. Calculating the exact risk value is not as easy as looking at each line-of-credit as we did in the simple case with just three people above, but regardless there’s a formula we can use to automatically evaluate it. This evaluation of risk exposure is performed using something we call the trust flow theorem. The risk is an exact value measured in bitcoin.

Here’s a fun trivia fact: The way we evaluate the total risk exposure of a buyer towards a vendor is using a fascinating classical graph theory algorithm from the 1950s called the maximum flow algorithm which was invented by Lester Ford and Delbert Fulkerson. They invented this algorithm to solve a completely different problem – the efficiency of the Soviet railway network.

Once we’ve calculated how much risk you already have towards a vendor, we can perform the same reasoning as we did previously:

  1. You willingly trusted money to your friends.
  2. This indirectly exposed you to a certain financial risk towards the vendor,
    which we calculated.
  3. If that vendor was evil and wanted to leave the market with an unfair
    advantage, which, in the worst case, could cost you your money, they could have already done so.
  4. You can now safely buy from that vendor up to a certain value without
    incurring additional risk – to pay for the product, just use some of your
    money from the account shared with your friend.

In order to buy from that vendor, you want to keep your risk the same prior to making a purchase and after completing a purchase. We have proven that this is possible in our risk invariance theorem, as long as your risk towards a vendor is higher than the price of the good you wish to purchase. Therefore, your Trust is Risk wallet will automatically pay the vendor by reducing some money you have deposited in the accounts shared with your friends and use that money to pay the vendor directly. The calculation of where to take money from in order to keep your risk constant is performed using a trust redistribution algorithm. For the user, it will be a simple matter of seeing the money leaving some shared friends’ accounts and paying the vendor.

One thing to understand is that this trust system is a new paradigm. It does not actively protect the user from mishaps in any way. There’s no way to flag the purchase as fake or talk to an escrow to have a conflict resolved. The only security insurance provided by the system is risk invariance: We’re only ensuring that the risk you were taking by trusting money to your friends is the same as the risk you are taking by making a purchase from an unknown entity. If (and that’s a big if) you have chosen to trust your friends with your money wisely, only then we make sure that the purchase is safe. But if the vendor decides to screw you, there’s nothing we can do about it, except show you a trace of why the vendor was deemed trustworthy, pointing exactly to whom of your friends you should stop trusting now (or whom of their friends they should stop trusting, and so on).

Unlike stars, the trust that the buyer is seeing for the vendor is personalized. We call this projected trust, a trust value that is potentially different when two different buyers are browsing the shop of the same vendor. This is a recurring theme in our work. We conjecture, although we have not proven, that secure decentralized trust systems must necessarily use some form of projected trust.

Putting it together

As you can see, we have approached the problem of trust, a broad and ambiguous concept, by mathematically defining it to be equal to financial risk. When Alice puts money in an account shared with Bob, we say that she directly trusts Bob. But we previously concluded that pseudonymous people far away in the network towards whom Alice has never extended any direct trust can still behave in a way that can cost Alice money – if she made a wrong decision when she decided to trust her friends. We call these indirect trusts.

This may all sound complicated, but the end user experience is simple. Let’s go through a purchase of some goods on an imaginary new version of OpenBazaar to see how this could work.

We’ll trace Alice’s steps from joining the network to successfully completing a purchase. Suppose initially all her coins, say 100 mBTC, are under her exclusive control in a traditional bitcoin wallet.

Two trustworthy friends, Bob and Charlie, persuade her to try out Trust Is Risk. She installs the Trust Is Risk wallet, perhaps even shipped as part of the OpenBazaar program, and migrates 60 mBTC of her 100 mBTC from her regular wallet, entrusting 24 mBTC to Bob and 36 mBTC to Charlie. She now exclusively controls 40 mBTC. She is risking 60 mBTC to which she has full but not exclusive access in exchange for being part of the network. Alice’s wallet is represented by the pie chart we went through above.

A few days later, she discovers an online pepper shop, Pepper Palace, owned by Dean, also a member of Trust Is Risk. She finds a nice Carolina Reaper pepper that costs 6 mBTC and checks Dean’s trustworthiness through her new wallet. Suppose Dean is deemed trustworthy up to 20 mBTC. Since 6 mBTC ≤ 20 mBTC, she confidently proceeds to purchase the pepper with her new wallet.

A pepper shop

We call these “20 mBTC” the allowance our system gives to Alice for making purchases from Dean. If she spends any money up to that amount, we can give risk invariance insurances. Spend money beyond that point and she incurs additional risk, which she can of course choose to take.

Hey, by the way, if you’re into peppers, this is a real product you can currently buy on
OpenBazaar
! 🌶

She can then see in her wallet that her exclusive coins have remained 40 mBTC. But the coins from her shared account with Charlie have been automatically reduced by 4 mBTC and are now down to 32 mBTC. And the coins in her shared account with Bob have been reduced by 2 mBTC and are now down to 22 mBTC. Dean has been paid 6 mBTC, equal to the value of the pepper. Also, her purchase is marked as pending. Under the hood, her wallet redistributed her entrusted coins in a way that ensures Dean has been paid with coins equal to the value of the purchased item and that her risk towards him has remained invariant. The “risk invariance” property is what her wallet has tried to maintain by redistributing the funds in this particular manner – always making sure she’s not exposed to more risk than before.

 Redistributed trust is risk wallet

Eventually all goes well and the pepper reaches Alice. Through her wallet, she marks the purchase as successful.

This lets the system replenish the reduced trust to Bob and Charlie, setting the entrusted coins to 24 mBTC and 36 mBTC respectively once again by moving funds from Alice’s exclusive account into the shared accounts. Alice now exclusively owns 34 mBTC. Thus, she can now use a total of 94 mBTC, which is expected, since she had to pay 6 mBTC for the pepper.

Sybil resilience

The careful reader will have noticed that this system is no longer Sybil-attackable. This  stems directly from the fact that indirect trust is projected and is based on risk.

What this means in short is that if I am a prospective buyer and have a certain amount of indirect trust (or risk) towards a certain group of malicious vendors, there is no way they can cooperate to increase the total trust I see towards them.

Regardless of how many fake trust connections they make between each other and towards others and regardless of how many new fake accounts they create, the trust I will have towards them will be the same and bounded by a specific value.

To see why, think about how it works in a simple situation with just a single step. Each trust transaction creates a limited liability. If Alice directly trusts Bob with 1 coin, there’s no way he can increase that by trusting others or creating fake accounts. He can’t create a fake shop that Alice trusts more than 1 coin, unless he solicits others to really trust the new shop more. It doesn’t matter how many good transactions he makes with himself using his fake buyers and sellers. It doesn’t even matter how many lines-of-credit he extends to himself. Adding more accounts and trust transactions himself will do him no
good. We formalize precisely what this means and prove this fact in our sybil resilience theorem. Intuitively, the only way to increase Alice’s trust towards him is to persuade people Alice trusts (or Alice herself) that he is trustworthy. He can achieve this for example by building a valid and dependable business.

Conclusion

This concludes the two pillars of security in our system: On the one hand, we give the user risk invariance, the insurance that they’re not exposed to any more risk than they were willingly exposing themselves to. On the other hand, we give the whole system sybil resilience, meaning there’s no benefit in creating fake accounts.

To summarize, we have proposed a new form of bitcoin wallet where people use shared accounts to take calculated risk towards their friends. This augments the OpenBazaar user interface with showing an “allowance” amount calculated behind the scenes using trust flow algorithms. If the user respects our recommendations, they incur no additional risk from making a purchase. For the completion of a purchase, the wallet automatically redistributes the funds in the Trust Is Risk wallet. The user can always replenish their wallet by putting in more money. The system remains resilient to Sybil attacks.

We hope one day a system like this can be made part of OpenBazaar and used by people worldwide to make safer trades in a decentralized manner without having to worry about their money being lost or stolen.

More resources and acknowledgements

We’ve been working on these concepts for quite a long time now.

These results have been developed at the Decrypto Lab, a loosely connected decentralized lab which bridges the Crypto.Sec group at the University of Athens, the Blockchain Technology Lab at the University of Edinburgh, the Department of Computing at Imperial College London, Corelab at the National Technical University of Athens and other schools and laboratories with interest in the subject.

A lot of work remains. The question of whether these security properties can be achieved without disclosing the whole trust graph to everyone is a burning open research challenge. A formal game theoretic analysis of the system would also be a much appreciated addition.

This is collaborative work with my colleagues:

  • Orfeas Stefanos Thyfronitis Litos, currently a PhD student at the University of Edinburgh worked on Trust Is Risk for completing his master thesis at the National Technical University of Athens. You can read his whole thesis [PDF]
    (of more than 70 pages), which goes in a lot of depth about all the theoretical material I presented here. He worked on most of the formalisms of the proofs and he developed all the trust redistribution algorithms. He also has a presentation of his thesis [ODP].
  • Christos Porios, currently a Software Engineer at Google Zurich worked on an implementation of Trust Is Risk as his Bachelor thesis for his graduation from Imperial College London. His whole thesis [PDF] (of 50 pages) is on the implementation of Trust is Risk and contains all the little details of how to get it done on top of Bitcoin. He also has a presentation of his thesis [PDF].

I was greatly honored to work with both of them.

I’m Dionysis Zindros, currently a cryptography/blockchains PhD student at the University of Athens and one of the original OpenBazaar co-founders.

Don’t take my word for all our claims and theorems. You can read all the formal math and proofs in our paper, Trust is Risk: A Decentralized Financial Trust Platform [PDF]. We also have a more concise proceedings version [PDF].

The paper was peer-reviewed and published in the Financial Cryptography and Data Security 2017 conference in Malta. The slides of our presentation are also available. We work in an open research setting. All our new experimental attempts at extending our theory are available on our theory GitHub repository where you can participate.

We have started working on a first version of a node.js implementation in our implementation GitHub repository, although most of the code is currently in pull requests. We’re also actively working on an SPV implementation.

All of this work was made possible through some very generous financing of our research by our partners, OB1 (the OpenBazaar company) and FrostWire – both have provided continuous support both financially but also technically. The whole team has inspired us with their work towards making trade free.

Brian Hoffman‘s, Sam Patterson‘s and Angel Leon‘s valuable input has helped us focus our research on applied topics that can be used in the real world to solve real problems. And of course our work is based on the great ideas by Washington Sanchez without whom this project wouldn’t have been born. We’re honoured to have Aggelos Kiayias as our PhD advisor, who has always encouraged us to become better scientists by understanding the problem and all the formal details behind it. Finally, this work was also made possible with the generous financing by IOHK and ERC.

Featured image from Pixabay, distributed under the Pixabay license.

FrostWire Wins 2nd Place at Miami Bitcoin Hackathon with decentralized shopping marketplace

This weekend our 2 lead developers spent 28 hours hacking away to bring home the silver at the Miami Bitcoin Hackathon organized by BitStop and Blockchain Beach.

hackathon-2nd-place

FrostWire’s project was built using the frostwire-jlibtorrent library and the Bitpay API to create a proof of concept for a p2p shopping marketplace called Seller.Trade on which customers pay with bitcoins.

Seller.Trade home page

End users just need a Bitcoin wallet to pay and web browser to search for products available, and sellers run a server side p2p app that connects to other sellers that participate in the network using the BitTorrent Mainline DHT. Nodes help route searches and products announced.

Seller.Trade search result page

We intend to create a binary release for Linux servers in the coming weeks and see where this experiment takes us.

SellerTrade product page

The project is very simple and it allows anyone in the planet to start their own store on line and accept Bitcoin payments, with the twist, that all the stores are connected to each other using a combination of the Mainline DHT we use for decentralized torrent tracking and an HTTP Rest API.

Check out our presentation to the judges (We finished early and made a video to not leave the presentation to improvisation and Murphy’s whims, and also so the world could see it anytime later on)

And here’s us accepting the prize (In bitcoins of course)

and now it will be in front of our desk to make us proud 🙂

10917564_10153018041182863_463409118_n

question… since you’re still reading all the way down here.

Would you like to see FrostWire yield search results of products that you could buy with Bitcoin?

Would you like to sell things using your own store server without paying any listing or comission fees?

Should we make Seller.Trade into a real world product?

FrostWire 6.0.3 changelog

Download FrostWire 6.0.3

frostwire (6.0.3) stable; urgency=high
  * Solves issue getting correct single file location from transfer manager.
  * Improved MD5 verification. Thanks @abderraouf-adjal
  * Important UI transfer related actions restored for Linux users.
  * Updated frostwire-jlibtorrent libraries,
    now built with older Boost 1.55, fixes Windows UI Freeze issue.
  * CPU usage reduced managing transfer items.
  * Croatian, Bulgarian, Polish, translation updates.
  * More cleanups and refactors.

 -- FrostWire Team   Wed, 3 December 2014 16:53:57 -0500

FrostWire is a free, open source BitTorrent client first released in September 2004, as a fork of LimeWire. It was initially very similar to LimeWire in appearance and functionality, but over time developers added more features, including BitTorrent support. In version 5, Gnutella support was dropped entirely, and FrostWire is only a BitTorrent client. Development of the program has been active since the program was first released in September 2004.

Preliminary SEARCH performance improvements of FrostWire 6 (beta) vs 5.7.7

Here are some results from internal performance testing between FrostWire 5.7.7 and the latest beta build for FrostWire 6.0.x

Screen Shot 2014-10-30 at 2.16.09 PM

CPU usage on search has been reduced almost by 2/3rds, search experience should be significantly better, specially on older machines which had a hard time using FrostWire.

Memory usage while searching has been reduced up to a 50%.

The Peak number of threads is now 41% of FrostWire 5’s.

And we’ve gotten rid of over 2,000 classes, and we keep getting leaner and leaner as we prepare for the first release candidate.

Screen Shot 2014-10-30 at 2.23.51 PM

Screen Shot 2014-10-30 at 2.23.39 PM

These tests were performed on a MacBook Air, 1.7GHz Intel Core i5, 4Gb 1333 MHz DDR3 of memory running on OSX 10.9.5.

Soon we’ll have results on an older machine running Windows XP.

Please Test and compare FrostWire 6 to FrostWire 5 for yourself.

We’d like to invite people passionate about testing software performance and let us know what they find independently.

We’d rather be validated by non related third parties on the fact that FrostWire 6 is a superior file sharing client than its predecessor.

FrostWire Source Code:
http://github.com/frostwire/frostwire-desktop
http://github.com/frostwire/frostwire-jlibtorrent
http://github.com/frostwire/frostwire-common

New FrostWire 5.7.7 available for Windows, Mac and Linux. Contributors now earn bitcoins instantaneously.

Download FrostWire 5.7.7 for Windows (Bitcoin enabled .torrent)
Download FrostWire 5.7.7 for MacOSX (.torrent)
Download FrostWire 5.7.7 for Debian/Ubuntu (.torrent)

This update focuses on fixing multiple user interface issues, mostly related to the media player. Libraries were updated, a nasty freeze when opening FrostWire out of a magnet link has finally been fixed, and new linux collaborators have given some love to our codebase.

Screen Shot 2014-10-02 at 9.50.11 AM

Like on Android, you can now fully stop the player
by long pressing the Play/Pause player button.

FrostWire now has a new feature in which it tries to detect wether or not you are using a VPN connection to warn you about the possibility of your privacy being at risk.

We recommend that whenever you are online you connect to the internet using an encrypted VPN connection to protect your identity and your privacy.

Build & Fix FrostWire, get paid in Bitcoins immediatly
If you are a developer/translator/graphic designer, you should know that now you can earn bitcoins when your patches and contributions are merged to the master branches of our open source projects on github.

You will automatically receive Bitcoins in your Bitcoin wallet, you just need to have a github account and a tip4commit account where you can register your Bitcoin wallet address. Payments are sent within minutes of your patches being merged.

FrostWire Bitcoin donations are being diverted into our main open source projects frostwire-desktop, frostwire-android, frostwire-common and frostwire-jlibtorrent.

Each merged commit gets 1% of what’s left on each fund.

Preparing for FrostWire 6

We are hard at work on the next generation of FrostWire 6, if you paid attention to the names of our repositories, or if you follow this blog, you may have read about the frostwire-jlibtorrent project. We have made a full featured Java wrapper API out of the C++ libtorrent library and the results of our tests have been phenomenal. We’re currently replacing all of our Bittorrent core for one that uses libtorrent and we’re pretty sure you will feel the difference.

Join the FrostWire Beta Testers group to help us release a steady FrostWire 6.

Changelog

frostwire (5.7.7) stable; urgency=high
  * New: VPN connection status indicator.
  * New: Stop media playback by long pressing play/pause button.
  * Fix: Freeze when opening FrostWire from the first time out of
    clicking on a magnet link or .torrent file.
  * Fix: Bug where files couldn't be played with the main player button.
  * Fix: Bug where the speaker icon on the library would still show
    after the media player had stopped.
  * Fix: Bug after 5.7.5 in which the buttons of the Create Torrent
    dialog were not visible unless the window was resized.
  * Fixes issue on Linux when player window pixel translucency could
    not be set. Thanks @foutrelis.
  * Fixes Null Pointer Exception when trying to shutdown and hide
    an MPlayerWindow that may have not been instantiated.
  * Fixes issue where user could not create new playlist by dropping
    songs from existing playlist into 'New Playlist' list item in
    the library.
  * Updated MigLayout source code to version 4.0

 -- FrostWire Team <contact@frostwire.com>  Wed, 01 October 2014 17:00:00 -0500

FrostWire 5.7.0 is out for Windows, Mac and Linux now at FrostWire.com

Download FrostWire 5.7.0 for Windows (torrent)

Download FrostWire 5.7.0 for Mac (torrent)

Download FrostWire 5.7.0 for Ubuntu (torrent)

Download FrostWire 5.7.0 for Red Hat/Cent OS/RPM

Download FrostWire 5.7.0 for any other Linux Distro

Salsa Sara hoops in Wynwood, Miami for the FrostWire Team
Salsa Sara hoops in Wynwood, Miami for the FrostWire Team

What’s new?

  • Updated BitTorrent Engine to the latest code from the Azureus project along with FrostWire’s Team’s tunning and hacks for energy efficiency (as we reuse this same on code on Android)
  • Updated Java Runtime to fix compatibility launch issues Windows XP users were experiencing.
  • IRC Chat replaced for an HTML5 Chat App (Kiwi IRC), bye bye pjirc client.
  • New Torrents.com search engine integration.
  • Several UI bugs, freezes and crashes fixed.

Stay tuned for our Android release…

Is FrostWire Safe?

FrostWire – free at http://www.frostwire.com – is a file sharing
application and media hub.

FrostWire, as a stand-alone application, is 100% safe to use. FrostWire
itself will not install any viruses, adware, malware or spyware. But is
there a way you can get your computer in trouble while using FrostWire?
Sure.

FrostWire connects to other computers & online servers to find the
content you are looking for. FrostWire does not itself create, host or
control the content it finds on the internet – the same way internet
browsers do not create, host, or control the websites & files you view
and download through them. There are some safeguards in place to
recognize and prevent malicious content from showing up in the search
results, but none are perfect. Before you download a file:

1) Check if the file size makes sense for the content type you wish
to download
2) Check the Source link to see file comments other
users have left on the hosting website and most importantly, if you
are a Windows user and do anything online, always
3) Make sure you have an up-to-date anti-virus software installed
and you check any file you download before opening it.

Music Credit: “The Big House” by Jason Shaw

http://freemusicarchive.org/music/Jason_Shaw/
Audionautix_Tech_Urban_Dance/TU-TheBigHouse

Licensed under a Creative Commons Attribution License (CC-BY)
http://creativecommons.org/licenses/by/3.0/us/

FrostWire for Android 1.2.0 out with a new flat user interface

Welcome to a new series of FrostWire for Android.

The first thing you will notice is our switch to flat-land design while still keeping our flavor.
A flat user interface means not using any gradients, this makes screen painting faster and more energy efficient, as well as less memory intensive.


New Search
Search now reveals a lot of search results you may have been missing.

FrostWire is a file type agnostic search tool for your mobile, on this release you will be able to see in real time the number of search results you get per file type (Audio, Video, Documents, Programs and Torrents)

We’ve also made a lot of upgrades under the hood that will make search feel faster and better than ever.
A few new search engines have been added to FrostWire’s smart meta search, and more are coming on further releases of the 1.2.x series.


Our first attempt at a navigation menu was ridden with bugs that have been solved with a completely new menu that comes on top from the left side.


Renewed Audio Player

The audio player screen got some love too, notice the new flat buttons, flat progress bar, and new long press gesture on the pause button to completely stop the current song being played.

On the top right there’s a menu with more options, including an option to delete the current track if you don’t like it, something you’d never be able to do with a iOS devices and iTunes.

Also, you can switch songs by swiping your finger to the left or right, and if you want to pause a song you can swipe down with 2 fingers.

Full Changelog
FrostWire 1.2.0 – NOV/01/2013
– New Flat Skin makes screens rendering faster.
– New, more stable, slide in navigation menu.
– Considerable memory usage optimizations.
– Fixed skip-song gesture on top of player seek bar.
– New icons.
– After opening one of My Files, FrostWire will now remember the position of the list of files, no more scrolling down to continue browsing your own files.
– Current song being played now is displayed at the bottom of the navigation menu.
– Current song being played now shows “Stop” icon when browsing your own audio files.
– Updated turkish translation, thanks @Serrae.
– New BitSnoop metasearch.
– New TorLock metasearch.
– Removed ISOHunt metasearch.
– Fixed Monova metasearch.
– French translation updated.

How to help translate FrostWire for Desktop (Windows / Mac / Linux)

Help us translate the FrostWire user interface, be part of an open source project, learn new things.

0. Get a GitHub.com account and sign in
Go to GitHub.com and sign up for a free account unless you have one already.

1. Download and install Git on your computer
If you don’t have git installed on your computer, here are instructions on how to install.

git, is a version control software which helps us keep track of all the changes on every file that belong to the FrostWire project.
GitHub.com is a site where we host our source code and its origin git repository (the official one), think of the repository as a database to keep all those file versions.

GitHub is really helpful because it makes colaboration very social, we can comment and review each other’s changes before merging them into the origin repository.

2. Fork us on github.
Go to https://github.com/frostwire/frostwire-desktop/, this is the page for our origin repo. Forking means you will be making a copy of your own inside your github account. You will wok on that one, and when you are done you will send the changes to the origin repo.

For us by clicking on the button that says “Fork” on the top right.

Once the fork is done, you can go to your github personal page, and in the list of your repositories you should have your frostwire-desktop fork.

As of now, that copy lives only at github.com, you could try and edit the files up there, but it’s very uncomfortable working that way, the text editor can be quite slow sometimes, so …

3. Clone your forked repo to your computer
Go to a command line, or with your favorite git client make a clone of YOUR repo (not ours).
If you use the command line git client, you should issue the following command

git clone https://github.com/myusername/frostwire-desktop

wait a few seconds and all the source code and assets that belong to the frostwire-desktop project will be downloaded to a folder called “frostwire-desktop” on your computer.

change directory to it…
cd frostwire-desktop

4. Create a branch for your translation
Create a branch with a name that will help us understand that this is a translation update you’re sending us, it could be named something like
“translation-french-2013-november-myname”, so that we can easily see what language you are translating, on which date you were working on it, and your name so we can give you credit for it.

You create a branch on the git command line like this (just remember to put the name of YOUR branch instead)

Create a branch locally
git branch translation-french-2013-november-myname

Push it to your remote repository
git push origin -u translation-french-2013-november-myname

now your branch lives both on your computer and at your github repository.

Switch to that branch
git checkout translation-french-2013-november-myname

Now you’re ready to start working on your branch.

After we’ve accepted your changes, next time you want to help us do another update of the translation you will have to create a new branch.

5. Make sure the latest english strings have been put into your language.po file
enter the following command to sync strings

ant gettext-extract

(this could take a while to finish as it goes through every line of code looking for translatable strings.)

6. Translate, translate, translate
Now you get to do the actual translation. Translation files are in the following folder inside the frostwire-desktop project
cd lib/messagebundles

If you’re going to translate say to arabic, you will edit the ar.po file, it should be easy to find the language file for the language you intend to work on. We recommend that you use a PO Editor software to make things easier, and always make sure to save the file using UTF-8 encoding.

7. Test your translation
To test your translation, you will need to recreate the message bundle file, for this you will need to invoke the following command

ant gettext-bundle

assuming you didn’t mess up anything in the format of the .po file this should finish after a few minutes of bundling every language file.
If you see any errors you should try to fix them, if you don’t know how to fix them you can reach us on the FrostWire forum, or right here for help.

once the bundle is built, you need to test your translation, for this you will need to build FrostWire, you can do this in one step, from the root frostwire-desktop folder type:

ant

after a couple minutes it should be done compiling everything, and then you can invoke the “run” script right there if you’re on Linux or Mac, if you’re on windows, go to gui/ and invoke the run.bat file.

FrostWire will open, switch to your language and make sure your translations are fine.

8. Time to commit and push your changes

Once you are finished, commit your changes, make sure you don’t make changes in other files than the .po of the language you are working with.
So if you’re working say with italian, you would do (from the frostwire-desktop root directory)

git commit lib/messagebundles/it.po -m "my translation update for italian users"

and then push it to your fork up on github

git push

9. Submit a pull request

Once you see your last commit on github and you are sure you’re finished, it’s time to let us know, so you will submit what’s called a “Pull Request”.
If there are any special notes please let us know, we’ll review your changes, and if everything is good to go, we’ll merge them, and you will make open source history 🙂