The last time Hackerfall tried to access this page, it returned a not found error. A cached version of the page is below, or click here to continue anyway

Storj: Not a Dropbox Killer Andreas Tries Blockchains

Storj: Not a DropboxKiller

Storj is a storage coin with over $30M of ICO funding. The thousands of investors would be outraged if Storj was anything less than a Dropbox killer. Or would they?


Today Ill be trying one of the several storage coins. Storj aims to replace Dropbox, Amazon S3, etc. with a decentralized protocol where users are paid to store files on their computers. Storj also has two coins and one ICO.

TL;DR: Storj is too complex and I was unable to use it for file storage.

Goals for the test

  1. Compile Storj from source code and run it on a Linux server
  2. Store a photo on Storj and download it from my laptop
  3. Store a 5 GB file on the Storj and download it from another machine
  4. Store 5 GB files until I run out of money or disk space
  5. BONUS: Use Storj without the centralized API server (

The Storj landing page

The landing page markets Storj as encrypted, open-source, and sustainable. Im not sure what sustainable means in thiscontext.

Lets poke around in the Github

A bit further down on the Storj landing page theres a link to their Github organization.

The Github organization has a number of projects. I dont know what farming data means, so Ill just go with core.

Storj Core has 1,340 commits by 24 contributors. Not much seems to have changed lately. We have to go deeper.

Closed issues are more interesting than open issues. Open issues are often end users asking support questions.

There are 458 closed issues, but few of them recently. The commit pulse will tell me the frequency of code changes.

A single user named bookchin has done nearly all of the work. Who is this mysterious person? Perhaps their CTO?

You can also see his website at I recommend viewing the source where he uses an old-school but effective CSS vertical and horizontal aligntrick.

I wont spend more time trying to find the person behind the username. But why has the activity stopped? My best guess is that funds have been raised. Why code when you can buy lambos?

Did someone say ICO?

There was a $30MM ICO which ended May 25th. The price of ETH was $177 at the time. Not bad! Dropbox first seed round was only $15,000.

Lets make a server

Ill create a cloud server on Amazon AWS and use it for the tests. Ubuntu is a very common Linux operating system and likely compatible with Storj.

A server with 36 CPU cores, 60 GB of RAM, and 10 a Gigabit Internet connection should be more than enough.

Im not sure how much space will be needed. Im starting with 250 GB. More can be added later.

Theres no place like

The server is running in the cloud. Ill run a couple of commands to upgrade operating system and reboot.

Finding Storj

The Storj Core README states:

However, the Storj CLI is deprecated:

Okay, so I need something called libstorj:

Surprise! Theres a completely different project than the one linked from the Storj landing page. libstorj is written entirely in C. I havent written C for many years and hope I dont need to read any today. Or ever.

C is awful to code and leads to more security issues than Solidity.

Compiling Storj

The README tells me exactly what I need to install first:

Adding ( braces ) makes it easy to input multiple commands, even with new lines, in the terminal

Then Ill download the source code.

The latest release is version v1.0.1 which came out on June29th

Downloading the source code from Github is done using the version control systemgit

To run libstorj I need to compile the source code to binary files using the instructions from the README:

This is a typical compile process for C programs. Autogen generates compilation instructions specific to my operating system and the program make runs the compiling process.

Lets see how that went:


Great! But theres something worrying me. Theres a setting named STORJ_BRIDGE which defaults to Im getting flashbacks to Ripple. Am I talking to a centralized service?

Ill continue with the centralized server for now. Ive added a bonus objective where Ill run everything myself like Satoshi intended.

Registering with the centralized Storj server

So. Many. Passwords. I make mine the command: cat /dev/urandom | head -c 10 | xxd-p

To register I need a bridge password, an encryption key, and a passphrase to unlock that encryption key.

Ive never actually seen thismovie.

Clicking the Confirm Email Address button takes me here:

Im surprised they respond with this cryptic message. It would be nicer to be redirected to theirwebsite.

Theres a lot of information here. activated: true sounds good.

Lets try to list my buckets. I dont know what a bucket is yet.

$ storj list-bucketsUnlock passphrase: ********************No buckets.

I immediately regret having chosen a random passphrase if I have to enter it for every command, so Ill just set the handy environment variable they provide:

$ export STORJ_KEYPASS=bdc1b

Lets see if that helped:

$ storj list-bucketsNo buckets.

Much better. Ill try to make a bucket:

[email protected]:~/libstorj$ storj add-bucket bucket-headID: e5ad3b426e39b581b367adee  Decrypted: true  Name: bucket-head

I now have a bucket-head bucket. Cant ask for more. Time to upload a file.

$ storj upload-file bucket-head bucket-head.pngPreparing File...Upload failure: Unable to decode hex string

Okay, maybe I have to use the long-form bucket identifier:

Better, but it crashed. I dont know what the error means. Having used computers before Ill just keep trying:

Storj prepared and uploaded the file in 17 seconds. The next step is to install storj on my laptop where Ill download the file.

While waiting for libstorj to install on my laptop, Ill look a little at the pulse of libstorj.

The activity picked up in early 2017 and then slowed down.

Retrieving the file on my laptop

Installing libstorj on macOS Sierra works perfectly using the instructions in the README. I noticed a command, storj import-keys which could be useful for logging in from my laptop:

  libstorj git:(master) storj import-keysBridge username (email): [email protected]Bridge password: ********************
If you've previously uploaded files, please enter your existing encryption key (12 to 24 words).Otherwise leave the field blank to generate a new key.
Encryption key: bubble cattle leisure glue marine split cube nut couch when patrol resource bronze tonight tomorrow door skirt chicken cool problem return pudding box parentWe now need to save these settings. Please enter a passphrase to lock your settings.
Unlock passphrase: ********************Again to verify: ********************Successfully stored bridge username, password, and encryption key to /Users/andreas/.storj/
  libstorj git:(master) storj list-bucketsID: e5ad3b426e39b581b367adee  Decrypted: true  Created: 2017-08-13T10:18:19.090Z  Name: bucket-head

And now Ill try to download the image file:

  libstorj git:(master) time storj download-file e5ad3b426e39b581b367adee a89e1f3d4fcdf9b69e8cfd2f bucket.png[======================================================================] 100.00%Download Success!storj download-file e5ad3b426e39b581b367adee a89e1f3d4fcdf9b69e8cfd2f   0.42s user 0.24s system 3% cpu 20.475 total

Lets see the result:

Brian Patrick Carroll (born May 13, 1969), known professionally as Buckethead, is an American guitarist and multi-instrumentalist who has worked within many genres ofmusic.


Storing a single photo is great, but Storj seems like it would be more useful for larger files. Like backups or a high resolution photo collection. Ill generate a 5 GB file with random data in it.

$ dd if=/dev/urandom of=random-five-gigs.bin bs=1M count=51205120+0 records in5120+0 records out5368709120 bytes (5.4 GB, 5.0 GiB) copied, 355.857 s, 15.1 MB/s[email protected]:~/random-files$ ls -lhatotal 5.1Gdrwxrwxr-x 2 ubuntu ubuntu 4.0K Aug 13 10:43 .drwxr-xr-x 7 ubuntu ubuntu 4.0K Aug 13 10:41 ..-rw-rw-r-- 1 ubuntu ubuntu 5.0G Aug 13 10:55 random-five-gigs.bin[email protected]:~/random-files$

I just searched online for generate random files in linux to find the command above.

Its time for the real test. Ill upload the 5 GB file to Storj:

Nope, that didnt work. The progress bar went fast to around 60%. After that it got slower and slower until the storj program crashed.

Im not sure what the error message Unable to receive storage offer means. Does no one want to store my file? Was there a network error? Ill just try again.

Nope, now it wont let me use the service anymore. Rate limit usually means that Im doing something too fast. I tried again after a few minutes, but the same error appeared.


Or did it fail? My storj program has been speaking to a centralized server the whole time. The server I noticed previously. For Storj to be decentralized I need to run everything myself.

Warning to readers

Its about to get very ugly veryquickly.

Most who read the draft of this post found the next sections too technical. Theyre right. Its about to get confusing and aggravating.

I suggest that you just scroll down to where it says Conclusion if you get bored.

Installing Storj Bridge

I noticed Storj Bridge earlier when I was looking at Storjs Github organization.

The README file for Storj Bridge says that it cant run alone:

Ill install Storj Complex on my server first.

I dont know what a renter node or an identity means, but lets try anyway.

Installing Storj Complex

Storj Complex does not have any release tags/numbered versions. Ill install from the latest code.

$ git clone$ cd complex

Storj Complex runs on Node.js. Ill install Node.js first.

I also need to install RabbitMQ, a message queue program. Message queues are often used to communicate between programs.

And MongoDB, a database reasonably good at storing JSON.

I also need to install some packages which Storj Complex relies on. Ill install these packages using the Node Package Manager, npm.

Okay, that was a lot of installing. Finally I can run Storj Complex.

Thats fair. I should have looked at the README file where it told me to specify a config file. I already noticed some example config files while poking around the code.

The example config files are the ones ending in.json. Theres a few different ones. I dont know what a renter or landlord is. Ill try the one named multi-config.json. It has setups for a landlord and a few renters.

Ill try running with a config file:

The MongoDB URL is invalid. Well, its not even in the config file. Without a MongoDB URL, Storj Complex wont know where the MongoDB database is running.

Ill just go ahead and open an issue for that on Github.

Maybe running only a landlord is easier:

Something is running!

It cant find the example private key. Ill move it from the example directory to the project directory and try again.

Now Im having problems with the code and not just the way Im running it. Ill submit an issue for this too. Im guessing hdIndex and hdKey refer to hierarchical deterministic (HD) keys. You probably know HD keys from your Bitcoin wallet. But where is hdIndex supposed to be specified and what should the value be?

Ill start reading the Storj Complex code.

The offending line is number 88:

The two solutions I can think of immediately are:

Ill search the Storj Complex code on Github code for hdIndex.

These code snippets do not help me at all. Maybe the answer is in some file.

Ill just edit the Storj Complex code to make the default hdIndex equal to 0. What could go wrong?

Im excited to show off my Node.jsskills.

To edit files on a server I have to use whatever editor is available. In this case thats vim. I just turned on line numbers and jumped to the correct line. Im finally being rewarded for having played so much VIM Adventures.

Its still crashing. Now Im being told I picked a badhdIndexvalue. I dont understand why. Hardened HD key indexes are really big numbers.

I havent looked at this since the first time I was working on it for Bitcoin in January 2014! Ill just try 1 instead.

And run again:

Storj Complex is running! I dont know what it does, but something is running.

And Im connecting to peers!

Installing Storj Bridge (again)

Storj Bridge is also written in Node.js. Ill install the dependencies like before. I already installed the MongoDB dependency for Storj Complex and hope they can share the installation.

That installed a lot of dependencies! 450 packages.

Next, Ill start up Storj Bridge.

The Storj Bridge is running!

But it cant connect to Redis. Thats weird. The documentation doesnt mention Redis. Ill just submit another issue for that and install Redis.

In case youre wondering, Redis is a really fast key-value database used by Twitter, Weibo, Snapchat, and many others.

Redis is installed and working. Ill try to run Storj Bridge again.

Much better. Connected to redis!

If you havent seen the movie The Bridge on the River Kwai (1957) I want you to close this tab immediately. Go watch the movie! Its spectacular.

Running Storj with my own Sotrj Bridge

I mentioned previously that storj has a STORJ_BRIDGE setting. Im not sure which port my Storj Bridge is running on. Port 8080 is already in use by Storj Complex. Ill search the Storj Bridge code for the word port.

Maybe its 6383? Ill check if somethings responding on that port:

Something is listening on port 6382! Ill runstorj with the bridge set to that port on my own server.

Im registered with my own Storj Bridge! But how will I receive the activation link? I never set the e-mail server settings for Storj Bridge. How could the bridge send me my activation link?

The Storj Bridge log shows:

{"level":"error","message":"failed to send activation email, reason: connect ECONNREFUSED","timestamp":"2017-08-13T12:27:51.642Z"}

I havent set up an outbound email server (SMTP) in a long time. If I just run one on my server theres a high risk that Gmail will block its emails as spam.

Maybe I can just find my user record in the Storj Bridge MongoDB database and see if it has my activation code.

Ill start the interactive MongoDB shell. Using the shell I can query and even modify database records.

Next Ill see what databases there are using the show dbs command.

> show dbs__storj-bridge-develop   0.000GB__storj-complex-example  0.000GBadmin                    0.000GBlocal                    0.000GB

The database containing the word bridge is the one I want. Each database has several collections like an Excel document has multiple sheets. Ill look at which collections there are in the Storj Bridge database.

> use __storj-bridge-developswitched to db __storj-bridge-develop> show collectionsbucketentriesbucketscontactsfullauditsmarketingsmirrorspartnerspointersreferralsshardsstorageeventsusernoncesusers

users is probably the one I want. Ill use the find command to display every record in it.

The output is a hard to read without formatting. After a little research I remember theres a pretty formatting option.

> db.users.find({}).pretty()

I can read the output easily now:

This looks pretty promising. Maybe the long string toward the end is the activation code? Ill look at the email I received from Storj to see what the activation link looks like:

Maybe? Lets try:

The Storj Bridge responds with a bunch of things, including activated: true. I hope it worked.

Ive activated my Storj Bridge user!

The moment Ive been waiting for is here. Ill try to upload a file.

Storj Bridge is getting stuck on Preparing File.

I start looking through the logs of everything. Theres not a lot. Storj Complex log mentions jobs timing out:

At this point I increase the amount of logging to the maximum setting in hope of finding a clue.

I find absolutely nothing.

I look through the RabbitMQ logs.


Youll end up here if you searched the page for the conclusion

The Preparing File message shows forever and there are no clues in the log.

I have spent most of my Sunday evening trying to upload a single 5 GB file.

I have compiled 4 Storj programs. For some I had to edit their source code.

I have installed two different database systems and a message queue.

Why are there so many programs? What do any of these words mean; landlord, renter, core, farm, libstorj, bridge, complex?

I give up for now.




Im open to trying again later. For now Im deleting the server. Dropbox with client-side encryption works fine for now.

If youre an investor in Storj I suggest you spend some time with the product.

Good night, blockchainers.

About The Author

Andreas Brekken is the CTO/co-founder of Helix Capital and has been obsessed with cryptocurrency since 2011. He was the CTO/co-founder of and later worked as an engineer with

Follow on Medium and Twitter for more reviews. Which coin should I review next? Write me in the comments.

Continue reading on