This proof-of-concept exhibits a representative visual fingerprint for a 20-byte address, such as those found on the Ethereum network, by using Emoji Unicode glyphs. The representation is designed to be easily visually distinguished by a human, using commonly supported and visually distinct symbols, that can be easily transmitted without having to rely on image generation/storage/serving.
For example, 0x627306090abab3a6e1400e9345bc60c78a8bef57
can be more visually
distinctly represented as:
🎡🎲🌟🌱🌲
🐱🐪🐝👚🍬
🌷🐊🍱🐳🎓
🐾🐁🐂👨🎈
Note by design this encoding provides no avalanching, e.g. a small change in the input hash will result in an equivalently small change to the visual representation, so if your goal in visual fingerprinting is to provide robust change detection for the end-user, then you must be sure to hash the input first. (For convenience, the included libraries have built-in optional hashing functions that can do this for you.)
All encoding operations are pure
functions written in inline assembly, for low
execution gas costs (or zero cost when called locally). For docs, see natspec
documentation in the source files themselves.
See the godocs.
When displaying visually to a user, I recommend splitting the string into a 4x5 grid via linebreaks, as the rectangular format makes it easier to visually parse for differences even faster.
The Go library contains a Grid()
function to do this for you.
- Replace the 256 4-byte emoji with hand-picked choices optimized for visual distinction and compatibility.
- Flesh out a JavaScript library so people can do equivalent stuff client side in the browser if desired.
This is not a new idea by any means, just adapting it to Ethereum addresses. See for example:
- "Visualizing hex dumps with Unicode Emoji" by Oona Räisänen
- base💯 authored by Adam Niederer