Goblin - p2p GRIN with Nostr *UPDATED*

Goblin is a Nostr- and Tor-powered peer-to-peer Grin wallet built on Grim. The UX is styled after Cash App - mobile-first, and it works with pretty much any Nostr relay in the wild that supports the NIPs Goblin uses. Usernames are handled by our own lightweight name-authority relays called Floonet Relays (https://floonet.dev) (which anyone can run if they have a valid domain). Neither the relays nor the name server ever see your IP because everything routes through Tor first.

What is Nostr?

Nostr is a dead simple, open protocol that enables truly decentralized censorship-resistant and global value-for-value publishing on the web.
As anynomous puts it:

Why Tor?

Goblin ships with Tor built in, the same embedded arti engine Grim uses, so there is no separate daemon and nothing to install. All relay traffic leaves your device over Tor, so relays see a Tor exit instead of your IP. Tor’s low-latency design keeps payments fast while still hiding who you are from every server in the path. Earlier builds routed through the Nym mixnet instead; that experiment is retired and Tor is the transport now.

How does this work?

Basically like an end-to-end encrypted nostr direct message traveling over Tor with Goblin auto-handling slatepacks. Because of our NIP implementations a receiver’s relay cannot see the sender and the timing of the message is fuzzed, greatly improving privacy.

The best part is that your identity is in no way tied to your wallet publicly. Technically you could have many identities for 1 wallet!

Full documentation of the Goblin transport layer lives at https://docs.goblin.st

Plans:

  • Improvements to UI/UX
  • following Grim’s public release upstream

Download:

Support:

If anyone feels like tipping me through Goblin here's my Goblin QR (the data is a simple nostr profile!)

And of course, disclaimer: Goblin is still in early development.

Crates Goblin adds to Grim

nostr (the messaging layer: how a slatepack becomes a DM):

  • nostr-sdk with NIP-06/44/49/59/98 (encryption, seal/gift-wrap, key storage, HTTP auth)
  • nostr-relay-pool : relay connection management
  • nip44 + secp256k1 : our NIP-44 v3 encryption crate for the NIP-17 backward-compat extension
  • async-wsocket + tokio-tungstenite : the relay WebSocket transport
  • regex, base64, hex : parsing + NIP-98 payload encoding

TLS glue:

  • rustls (ring provider pinned) + tokio-rustls + webpki-roots : TLS for the relay sockets with bundled roots, so nothing depends on the platform cert store

Transport: Goblin keeps Grim’s proven built-in Tor engine (arti), so there is nothing extra to add there. The old Nym mixnet path is retired and its crates are gone from the build.

Crates Goblin removes from Grim

Grim hosts a Tor onion service to RECEIVE slatepacks. Goblin receives over Nostr instead, so it keeps only Tor’s dialing half and drops the whole hosting stack:

  • arti-client : kept, but without the onion-service-service and pt-client features (we dial out, we do not host)
  • tor-hsservice : hosts the onion (hidden) service
  • tor-hsrproxy : reverse-proxies inbound onion traffic to the wallet
  • tor-hscrypto : onion-service crypto
  • tor-keymgr : manages the onion-service keys
  • tor-config, tor-llcrypto : config plumbing and low-level crypto for the hosted service
  • fs-mistrust, safelog : arti’s file-permission checker and log-redaction helper
  • ed25519-dalek, curve25519-dalek : the onion identity key crates

Major Update 7/2/26:

I’m really grateful for the community’s feedback since this announcement and was surprised as most of it has been positive so far. I’m excited to talk about the future of Goblin and there is a new build with some important changes (changelog below) but this is also an important announcement about the Goblin+Grin ecosystem.

Today, I’m announcing 4 new members of the Goblin ecosystem. All connect you to GRIN in new ways. All are optimized for paying and receiving GRIN over nostr, and all are shipping this week.

Floonet Relays:

Floonet relays are self-hostable Grin-native relay stacks that carry Grin payments and names as sealed, end-to-end encrypted messages over nostr, private by default through the nym mixnet, and anyone can run one. By hosting your own floonet relay you strengthen and build out the network, and you can charge GRIN for other Nostr services, such as file uploads for a hypothetical GRIN powered chat service.

Charging GRIN for certain relay usage is a great way to support yourself for hosting infrastructure and is easily integrated with the new GoblinPay!

GoblinPay:

GoblinPay is a self-hostable, receive-only payment server for Grin. Your shop or service shows a code, the customer scans with Goblin, and GRIN lands in your wallet. Customers can also complete transactions manually with slatepacks. With GoblinPay, you can immediately start charging GRIN for products and services, Floonet Relays can become a paid service for other nostr services, or you can spend your GRIN on the GRIN-only nostr-powered Magick Market:

Magick Market:

The Magick Market is a nostr-powered GRIN marketplace that allows you to login with Goblin (or use popular extensions like Alby to login) and sell, or anonymously buy. Run your own instance and it federates with existing magick market instances!

Building a circular community economy is great for GRIN and to get new people interested in GRIN, but so is potentially helping and changing lives in positive ways with GRIN. That’s why I’m also lastly introducing:

Eranos:

Eranos is GRIN crowdfunding powered by nostr. With Eranos, anyone can crowdfund important fundraisers globally and privately and empower more people with GRIN. Every donation settles straight to your wallet, with no middlemen, no chargebacks, and no platform holding your funds.

With all that, I’m wrapping it up here so I don’t spam the forums, but we can continue discussion here, in the Telegram group and anonymously at the goblin bbs.

Goblin Changelogs (from now on) @ goblin bbs

15 Likes

Wow! Extremely cool man! Well done! Hopefully the council sees fit to support your project.

3 Likes

Very interesting :yellow_heart:.

:backhand_index_pointing_up: This basically addresses all the concerns I had about using Nostr for Grin.

2 Likes

Nice to see something new for Grin! Look forward to seeing the documentation to let newbies know how to use and understand the benefits. About goblin transport layer, is it same technique like abadoned grin box GitHub - vault713/grinbox: Relay service for interactive transaction building for Grin / Mimblewimble · GitHub?

2 Likes

That’s great to hear. And security improvements will continue: I am in the process of an even more secure version of the NIP-44 implementation to further encrypt our payment messages.

Essentially they solve the same problem and both layer end to end encryption on top of a relay. The difference is what sits beneath them. Grinbox is a relay, WebSocket server and message broker, and the privacy is on the user. Goblin’s transport layer is a Nym mixnet substrate beneath a standard Nostr messaging layer and privacy is handled end to end by the mixnet and the nostr implementations which double-encrypt the slatepacks payments and fuzz the timing of the message..and that’s after the timing is fuzzed by the mixnet. For someone expecting speed it looks like the payment is being sent for a few seconds (a long time for a simple message) but the experience should feel exactly the same as cash app or venmo, which is a good side effect considering we get robust privacy.

So yeah, Goblin IS grinbox’s idea, relay-resolved slatepack exchange addressed by a keypair, but rebuilt on Nostr instead of a custom protocol and a 5-hop mixnet instead of bare TCP.

I’ll be honest I’ve used many projects from the first iterations of GRIN but I never used Grinbox.

My knowledge of federated networks including nostr comes from operating a large federated social media site for the last 5 years.

I’ll prioritize this, actually. Thank you.

4 Likes

It was a lot of work to get it working on NixOs, had to write a shell.nix to do it, but after all that work it payed off! This is hot bro!!

@dog

4 Likes

Hey, I received that in my sleep and woke up to it in the morning already confirmed! That was awesome, … And I am hearing that it works in the wild from telegram users as well. Cheers everyone, the next update will be a major one (and the documentation as well).

Thank you very much, @syntaxjak

4 Likes

Could this wallet be also a wallet listener to receive coinbase from stratum server?

It’s literally fun to pay people using Goblin, share your goblin name here and I’ll send you 150 cold hard grin coins! Unboard this mfkrs! (Upto 4 people, limited time offer lol)

4 Likes

Thanks for your generosity. My username hellogrin

1 Like

I imagine, since we could use the app with username, why don’t we have features like chat/group/marketplace… it must be fun :smiley:

1 Like

Ya that’s a good idea, a chat/boards integrated into the wallet itself would really solve the whole jumping around to different chat services, discord to keybase to telegram oh my. Also i think your wallet has to be online to receive thr pay via username @hellogrin pending “waiting for hellogrin to receive”

@dog can’t wait to see your next update man, goblin changes the game, all thanks to you, and @ardocrat for Grim and those who made the original cli node and wallet. Exciting times for GRIN!

4 Likes

LFGGGG! Well that solves this basically: Venmo/Cashapp product planning

Does the “Activity” screen show the last transactions like a Cash App history feed then? I would imagine that you let people add notes and such via nostr similar to how cash app does?

It seems to be missing some sort of contact / address book, or I might be missing it.

Here is the current Cash App UX btw. The tabs are just Wallet, Pay/Receive (combined into one), and History. Pretty slick and simple. Maybe you could combine Pay and Receive too. Just a thought.

Looks like Pay/Request is combined in Venmo too.

How are you doing receive btw? Is it the contract branch where you’re actually building an invoice?

It’s a good thought, but even Cash App and Venmo don’t bother with that.

Haha ya man, it has notes and activity, the app is fricking awesome! When you resize the app window it changes to this cool version with that smile at the bottom! Way to slick! When you joining grim-goblin gang Trab? :slight_smile:


3 Likes

Amazing! I will definitely try it.

3 Likes

And since the app is using nostr, a messaging protocol :winking_face_with_tongue:

2 Likes

And to add more pressure on @dog :grin: How cool it would to have a complete nostr client with Grin wallet functionality :smiling_face_with_sunglasses:

2 Likes

Ah so the resize combines Pay/Receive into one thing? Awesome

I’ll let you know when I set it up!

Btw @dog the wallet creation sucks. Reminds me of how annoying Iron Belly was. I think it’s better to decrease the barrier to entry during wallet creation. Don’t force them to hand write some crap down and disable the copy button and stuff. It almost made me not want to bother making a wallet at all. Can we spin up the wallet really easily and then later on improve our recoverability and such as we need? I think that’s ideal especially since people will just want to play around with Grin and test it out a bit I bet.

Heck, since we’re using nostr with this, maybe we want to use something like Horcrux for recovering wallets or something too.

3 Likes

I’ve updated the OP. I’m announcing a major update and several new products that extend GRIN’s usefulness into nostr. Enjoy!

Motivations:

Resources:

I will look into this, but it should be 1:1 what GRIM’s wallet creation is.

PS Goblin docs will be updated soon to reflect the overhaul.

Receive is split 2 ways. If someone just sends you GRIN it’s the plain standard receive_tx standard1->standard2, same as any grin wallet. It’s simply delivered via an encrypted nostr DM instead of a manual file.

If you request: yes, we build a real invoice slate using grin-wallet’s own invoice API (issue_invoice_tx/process_invoice_tx, Invoice1->2->3). No separate contracts or API involved.

I’ve created GoblinPay for this - and it works - but I need to test it more to be satisfied.

7 Likes

i’ve added this placeholder in my node toolkit, will be useful in case someone wants to join the nostre relays easily. Another suggestion is to add a box of reminder in docs that floonet is not about testnet, because in the past, grin node switched the term floonet to testnet and sometimes it could make misunderstanding.