Een Bitcoin-gedreven donatiesysteem bouwen voor Satoshi Radio

Voor de populaire Nederlandse Bitcoin-podcast Satoshi Radio heb ik geholpen een maatwerk, alleen-Bitcoin donatiesysteem te bouwen. Deze post beschrijft de reis van MVP naar een volledig geïntegreerde oplossing met BTCPay Server, het Lightning Network, PHP/Symfony en een Telegram bot, trouw aan hun self-hosting ethos en zonder tussenpersonen.

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

Een overzicht van de donatie applicatie (Diagram toont interactie tussen BTCPay Server, Custom App, Telegram, Database, CoinRanking)

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:

  1. Haalt de applicatie de waarde van de donatie in EUR op via de CoinRanking API.
  2. Stelt het de podcast hosts (Bart, Peter & Bert) op de hoogte.
  3. Plaatst het een melding in het openbare Telegram-kanaal.
  4. 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

Hier zie je hoe een donatie eruitziet in het openbare community kanaal

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.