Satoshi Radio is een populaire, wekelijkse Nederlandse podcast die diep ingaat op Bitcoin & Cryptocurrencies – ze bespreken nieuws, technologie en gebeurtenissen in de sector. Als voorstanders van "je eigen bank zijn," voelde het voor hen vanzelfsprekend om te onderzoeken hoe ze steun van de community rechtstreeks via Bitcoin konden ontvangen.
De uitdaging: Donaties op de Bitcoin-manier
Begin 2020 zette Bart, een van de hosts, zijn eerste Bitcoin node op met MyNode software op een Raspberry Pi – om echt "skin in the game" te hebben. MyNode bevat handige tools zoals BTCPay Server, Mempool explorers en Lightning wallets. Zodra de node gesynchroniseerd was, ontstond al snel het idee binnen de community: zouden ze BTCPay Server kunnen gebruiken voor donaties?
Dit sloot naadloos aan bij het ethos van Satoshi Radio. Waarom vertrouwen op traditionele betalingsgateways die een deel van de opbrengst inpikken, als Bitcoin een grenzeloze, vertrouwensloze, peer-to-peer manier biedt om steun rechtstreeks te ontvangen? Het gaat om het uitschakelen van de tussenpersoon en het omarmen van de technologie die ze elke week bespreken.
Van MVP naar geïntegreerd systeem
Als iemand die actief betrokken is bij Bitcoin en experimenteert met de componenten ervan, hoorde ik over Barts node en het donatie-idee. Ik nam contact op om te zien of mijn technische achtergrond kon helpen. We begonnen eenvoudig: met het opzetten van een minimum viable product (MVP) – in wezen een basis donatieknop op hun website, verbonden met BTCPay Server.
De MVP was een succes! Het bewees dat het concept werkte en dat de community de show graag op deze manier wilde steunen. Bart en ik gingen daarna samen zitten om te brainstormen over de volgende evolutie. We zagen een meer gepolijst systeem voor ons:
- Een visueel aantrekkelijke donatieknop, geïntegreerd in de website.
- Een Telegram bot om donaties af te handelen en de community op de hoogte te stellen.
- Een database om donatiegegevens bij te houden voor transparantie en rapportage.
De kernvraag was: zelf bouwen of gebruikmaken van diensten van derden? Gezien de wens voor nauwe integratie en het trouw blijven aan de zelf-gehoste Bitcoin-filosofie, besloten we het zelf te bouwen – en creëerden zo wat misschien wel 's werelds eerste, speciaal voor een podcast gebouwde, alleen-Bitcoin donatiesysteem is.
Deze post beschrijft de componenten die we hebben gebruikt en hoe ze technisch samenwerken.
Kerntechnologieën
Twee belangrijke technologieën maken dit mogelijk:
Het Bitcoin Lightning Network
Het Lightning Network is een 'second-layer' oplossing gebouwd bovenop Bitcoin. Het gebruikt microbetalingskanalen om snellere, goedkopere transacties mogelijk te maken – essentieel voor het verwerken van potentieel veel kleine donaties. We hebben binnen de Satoshi Radio community gezien dat aanzienlijke bedragen vrijwel onmiddellijk werden overgemaakt met minimale kosten via Lightning. Aangezien veel luisteraars hun eigen nodes draaien, kunnen ze direct communiceren. Voor degenen die dat liever niet doen, zijn er ook custodial oplossingen beschikbaar.
BTCPay Server
BTCPay Server vormt het hart van de betalingsverwerking. Het is een zelf-gehost, open-source platform – veilig, privé, censuurbestendig en gratis. Het draait als een verzameling Docker-containers, waaronder:
- Een Bitcoin Daemon (verbonden met het hoofdnetwerk van Bitcoin).
- Een Lightning Daemon (LND)` (verbonden met het Lightning Network).
- Een block explorer (NBXplorer) voor het indexeren van transacties.
- Een PostgreSQL database voor o.a. winkelgegevens en facturen.
Hoewel BTCPay Server veel add-ons biedt, zijn dit de kerncomponenten die we hebben gebruikt.
De maatwerk donatie-applicatie
Om alles aan elkaar te knopen, heb ik een maatwerk applicatie gebouwd met PHP en het Symfony framework. Deze applicatie luistert naar gebeurtenissen (events) van BTCPay Server via beveiligde HTTPS webhooks (met client & server SSL-certificaten).
Wanneer BTCPay Server een donatie bevestigt:
- Haalt de applicatie de waarde van de donatie in EUR op via de CoinRanking API.
- Stelt het de podcast hosts (Bart, Peter & Bert) op de hoogte.
- Plaatst het een melding in het openbare Telegram-kanaal.
- Slaat het relevante details (herkomst, EUR/Satoshi-bedrag op moment van donatie, bericht) op in zijn eigen PostgreSQL-database, voornamelijk voor het genereren van belastingrapporten.
Telegram Integratie: Community & Bot
De Telegram-community van Satoshi Radio is ongelooflijk actief (ongeveer 2.270 leden toen ik dit schreef!). Het is dé plek voor discussie. Om donaties direct naar deze hub te brengen, hebben we de applicatie geïntegreerd met Telegram.
Wanneer een donatie binnenkomt, plaatst de app een bericht met de naam van de donateur, het bedrag (Sats eerst, natuurlijk!), en een eventueel persoonlijk bericht. Deze berichten leiden vaak tot interessante discussies, en de hosts gaan tijdens de opname van de podcast vaak dieper in op de aangesneden onderwerpen. Bart koos treffend de "Pamp it"-meme van Igor Bogdanoff als profielfoto voor de bot.
De applicatie bevat ook een Telegram bot component waarmee gebruikers direct kunnen interageren. Het controleert continu de Telegram API op nieuwe berichten met behulp van een loop-functie:
protected function loop($lastUpdateId = null): void
{
// [...] irrelevante code
$updates = $this->api->getUpdates($updatesMethod);
foreach ($updates as $update) {
try {
switch ('private' === $update->message->chat->type) {
case 'private':
$account = $this->createOrFetchAccountForTelegramUser($update);
$event = new TelegramPrivateMessageUpdateEvent($update, $account);
break;
default:
continue 2;
}
$this->dispatcher->dispatch($event);
} catch (Throwable $exception) {
// [...] error handling
}
$lastUpdateId = $update->updateId + 1;
}
$lastUpdate->setValue($lastUpdateId);
$this->entityManager->persist($lastUpdate);
$this->entityManager->flush();
// herstart de bot-loop na een uur om geheugenlekken te voorkomen
if (time() > ($this->start + 3600)) {
$this->logger->info('bot poll cycle! (1 uur cutoff)');
return;
}
$this->loop($lastUpdateId);
}
Binnen de applicatie heb ik een eenvoudig framework gebouwd om verschillende Telegram-commando's te verwerken, die elk verschillend gedrag triggeren.
Het website donatieformulier
Hoewel de Telegram-integratie essentieel is, begint de reis nog steeds vaak op de Satoshi Radio website. Bezoekers kunnen een eenvoudig formulier gebruiken om hun naam, donatiebedrag en een bericht in te voeren voordat ze worden doorgestuurd naar BTCPay Server om de Bitcoin/Lightning-betaling te voltooien.
Event-Driven Architectuur
De maatwerk applicatie maakt intensief gebruik van een event-driven aanpak
(gebouwd met Symfony's EventDispatcher component). Wanneer bijvoorbeeld een
donatie succesvol is betaald, wordt een DonationPaidEvent
verstuurd:
class DonationPaidEvent extends Event
{
protected Donation $donation;
public function __construct(Donation $donation)
{
$this->donation = $donation;
}
public function getDonation(): Donation
{
return $this->donation;
}
}
Meerdere 'listeners' reageren op deze gebeurtenis: één slaat de gegevens op, een andere verstuurt Telegram-meldingen, enzovoort. Dit maakt het systeem zeer uitbreidbaar. Het toevoegen van nieuwe functies, zoals de recent toegevoegde mogelijkheid om fysieke bonnetjes te printen om voor te lezen in de show, vereist simpelweg het creëren van een nieuwe listener voor de relevante gebeurtenis. Het is een coole manier om de digitale en fysieke wereld te overbruggen.
Conclusie: Impact en potentieel
Het is nu ruim een jaar geleden dat we de eerste versie van dit donatiesysteem uitrolden. In die tijd heeft het betrouwbaar meer dan 1.000 donaties verwerkt, met een totaal van bijna 0,25 BTC (destijds bijna $12.000 waard).
Belangrijker nog, het heeft de band met de Satoshi Radio community aanzienlijk versterkt en gezorgd voor een efficiëntere inkomstenstroom voor de podcast, perfect in lijn met hun op Bitcoin gerichte waarden. Dit project toonde aan dat het uitschakelen van de tussenpersoon met gratis, open-source tools zoals BTCPay Server, gecombineerd met wat maatwerk "softwarelijm," echt potentieel ontsluit voor makers.
Ik heb met veel plezier aan dit project gewerkt. Als je een interessant projectidee hebt of hulp nodig hebt om je eigen concept tot leven te brengen, bekijk dan mijn diensten of neem contact op.