Inspiration

After using the uOttawa internet and failing to download a few large files due to terrible connection stability, we decided there must be a better way. On top of all of the data breaches nowadays, we wanted a solution that was fast, secure, and extremely robust.

What it does

Mound is a decentralized, peer-to-peer file-sharing platform that focuses on being robust and secure. With limitless network sizes, Mound can be used to share files between your close family, school, or entire city. When a file is uploaded to a Mound network, it is compressed, split into chunks, and each chunk is sent to at least two nodes to guard against loss of data. To stick with our goal of being robust, Mound computes one checksum for each file chunk, and one (larger) checksum for each complete file - that way you know you're getting exactly what you asked for. It also includes failover rules to fallback to a different peer if a certain chunk cannot be downloaded (or was transmitted badly), ensuring your downloads never stop mid-way again. On top of everything, we implemented smart routing and AI-based network instability detection, ensuring you stay protected against loss of connection, unstable peers, and dropped packets.

How we built it

Mound has two parts: the mound command-line tool, and the Mound user interface. For technical users, the command-line tool can be launched and interacted with using a protocol similar to JSON-RPC. For non-technical users, the user interface exposes all Mound functionality by launching the mound process in the background and wrapping it into an enjoyable experience.

The mound command-line tool was built with Rust for its reliability, performance, and low-level networking control. We used the TCP protocol at the lowest level, building our own packet and data transmission protocol on top of it for maximum control.

The Mound user interface is built on Electron for its simplicity and compatibility with the Rust command-line tool using Electron's IPC protocol. It's also extremely portable, allowing you to run Mound everywhere you go.

Challenges we ran into

Whiteboarding a design that was both performant and extensible was very difficult: we had to take into account all three stages of the Ciena challenge in order to avoid re-designing our system multiple times. However, this effort paid off, as we were able to utilize this design and bring it straight to the finish line without many refactorings, performance problems, or glaring errors.

Accomplishments that we're proud of

We're proud of how far we made it into the Ciena challenge stages: completing all three and adding a few goodies on top. We were able to integrate our own AI model to determine network stability issues, add a compression layer with zlib, and create a novel chunking algorithm to increase throughput - all on top of our original design.

What we learned

For the mound command-line tool, we learned a lot about networking, TCP, various different protocol designs and algorithms, and AI models for regression analysis. For our frontend, we had never used Electron before, so integrating it with the IPC protocol, designing a stream-based interface, and making it all fit together was a difficult task.

When making the mound tool reliable, we learned a lot about checksums, hashing, and failover algorithms and how their use significantly improves the reliability and integrity of data. This allowed us to feel confident that Mound would work under the vast majority of network conditions.

What's next for Mound

The next step for Mound is focused on security and multi-network setups. For security, we're looking to implemented password-protected networks with 2FA to safeguard files against malicious actors. To improve the experience for more advanced users who join multiple networks, we'll implement a "profile switcher" to switch between different networks on the fly.

Built With

Share this project:

Updates