DEV Community

Gerardo Enrique Arriaga Rendon
Gerardo Enrique Arriaga Rendon

Posted on

Contributing to rust-libp2p

For Hacktoberfest, our professor assigned us the task to work on several open source projects that we could find in GitHub, and submit pull requests to those project.

The project: rust-libp2p

This time I worked on a Rust project, heavily focused on network technologies, more specifically, peer-to-peer networking.

That project is rust-libp2p, an implementation of libp2p, a networking stack for supporting peer-to-peer (p2p) networks.

The issue: PeerId and its representation

Before going into the actual issue, I believe it would be a good idea to talk about what a PeerId is and how it is involved in the issue and the project overall.

A PeerId is a hash of the public key of the peer. You can view a peer as a member of a network, that communicate to other members in that network, which are also considered peers. Each peer has a pair of keys, a public one and a private one, to carry out encrypted communication.

Previously, a PeerId was internally represented as a multihash, a scheme to specify different hashes with their respective hashing methods. These hashes were then encoded in base58btc.

However, there were some issues related to this internal representation. One of them was the case-sensibility. If one wanted to use a PeerId as a domain name, then several valid PeerIds would collapse into a single PeerId, because domain names are case insensitive.

Thus, the issue #2259: Support and output peer IDs as CIDs focuses on changing this representation to be a Content IDentifier (CID).

Setting the project

Fortunately, setting the project was not a huge hassle, thanks to cargo.

After I cloned the repository, I fired the tests found in the core repository. This triggered the fetching and installation of the dependencies, and after compilation was finished, all the tests ran.

Writing the PR

Having the project ready, I started to write my code.

Most of the code I had to write was very straightforward: I did not have to write a lot of logic-heavy code, mostly calling the proper functions that took care of what I wanted.

Of course, I spent more time reading the documentation of the rust-cid project to know how to use it, than actually writing code.

After writing most of the changes, I wrote back to one of the maintainers of the project, Max Inden, asking some questions and guidance for the next steps of my code. He followed up, writing a concise explanation for each of my concerns. This helped me to finish the changes necessary, since I learned what we should be expecting from the PR and its changes.

The only major problem I encountered was figuring out what to return for the Err variant, since I was not super clear about how Rust was deciding for the returning value.

After researching a little, I found out I could create an enum that would serve the role of the value for the Err variant. This new enum type, called PeerIdError basically grouped the errors from two crates (libraries), the crate for multihash, and the crate for cid.

Submitting my PR

After finishing my code and running the tests, I squashed my commits because I forgot to run clippy and rustfmt before committing. Thus, instead of leaving the commit and dirtying the history, I decided to squash those minor changes.

Top comments (0)