Functioning messenger in Metamask
The Problem We're Solving
There isn't a simple way to send text messages between Ethereum address, which inhibits the usability of the dapp ecosystem. Consider the following two examples as use cases:
A website I used to run provided access to exclusive video content in exchange for Ethereum payments and knew nothing about the users of the site except for their public addresses. When I released a new video, I wanted to alert all subscribers that a new video was out, but there was no way to send that notification to an Ethereum address.
The ENS registry requires users to submit a bid for a domain name, then return 5 days later to reveal the bid. On the day of the reveal, there is no way for the ENS dapp to alert users with a reminder that they need to perform an action on the site within the next 24 hours leading to a significant amount of domain names never being claimed.
Decentralized identity systems for the web are an interesting area of exploration, but have not significantly taken off partly due to the challenges of building decentralized messaging systems. The problem space of sending messages between decentralized identities can be significantly simplified by running a centralized messaging relay. The idea is to use the same cryptography native to the Ethereum protocol to encrypt messages and store them in a centralized repository that any existing Ethereum wallet interface can read from, providing a simple way for messaging between Ethereum addresses to be immediately functional, while still maintaining the benefits of a fully decentralized identity system.
What We Built
A centralized web server and postgres database that has two database tables (identities, and messages). The identities table stores Ethereum addresses, their corresponding public keys, and optional nicknames. The messages table stores base64 encoded text messages (all messages are e2e encrypted with the same elliptic curve cryptography that Ethereum private keys use to sign transactions).
A fork of the Metamask chrome extension that creates a page for messages and all the necessary UI components for sending messages to other Ethereum addresses, displaying conversation history between addresses, encrypting and decrypting messages correctly, and sending browser notifications upon receipt of a new message.
Potential Next Steps for Ethereum Messaging Protocol (EMP)
While our solution is a good first step, and solves the problem of delivering a message to a user while knowing nothing about them except their Ethereum address, it needs to address a couple more things before being deployable:
spam prevention and ddos mitigation
a source of funding to maintain what would become a pretty significant database of chat messages, and to run the messaging relay servers to reliably deliver the messages to local wallet instances.
a way to obfuscate the sender and recipient address so that maintainers of the database couldn't know which addresses are communicating with eachother.