Revbank

From RevSpace
Jump to navigation Jump to search

"Banking in the Netherlands does correspond to Dutch stereotypes — which is a great thing. You can always split a check in a restaurant and they have some slick mobile apps to keep track of who paid for what during trips and outings that also provide ways for everyone to be reimbursed easily. So it’s no surprise to learn that a Dutch hackerspace has developed their own accounting and funds transfer system to help members pay and get paid. And that would be RevBank.

The public-facing part of RevBank is a terminal sitting right next to the fridge and the snacks, with a barcode scanner attached so you can scan your item, then scan or type your name, and you’re done. The source is here. It’s written in .. uhm, perl. Have fun with that.

I gave it a whirl while I was there, and was able to top up my account with a bank transfer (this statement makes sense in Europe — you can also do cash instead). And then I used it to pay for all my snacks that day. Worked great, quite efficient."

https://www.nycresistor.com/2019/01/12/hackerspace-envy-a-visit-to-revspace-in-the-hague/

Source

https://github.com/revspace/revbank

Implementatie bij RevSpace

Revbank staat op de server gateway onder de gebruiker bar (we hadden ooit een bar).

Er draaien 2 permanente revbank-instances:

  • De oude seriële terminal, die met een aantal interessante hacks met GNU Screen een seriële barcodescanner als tweede input heeft.
  • De laptop in de keuken, met USB-barcodescanner. Deze verbindt via mosh.

Gebruikers

  • Sinds 2011: RevSpace
  • Sinds 2013: TechInc
  • Sinds 2014: Bitlair
  • Sinds 2014: eth0
  • Sinds 2015: Pixelbar
  • Sinds 2017: Hackalot
  • Sinds 2018: Hackerspace Nijmegen
  • Sinds 2019: Frack
  • Sinds 2019: Coredump

Voormalig gebruikers: Hack42, Sk1llz, Hackerspace Gent

FAQ

Is revbank stabiel?
In de betekenis van "werkt betrouwbaar": ja, we gebruiken het nu sinds 2011. In de betekenis van "wijzigt niet": nee, er wordt nog steeds wel eens aan gesleuteld. Daarbij wordt zo veel mogelijk geprobeerd om de commandostructuur gelijk te houden omdat veel gebruikers het systeem gebruiken zonder daar nog bij na te denken.
Is een CLI niet te moeilijk voor newbies?
Nee, zelfs absolute beginners leren hier binnen enkele minuten mee werken; we hebben hier nu vele jaren ervaring mee. Een GUI is soms makkelijker te verkennen, maar kan ook overweldigend werken doordat veel mogelijkheden tegelijk aangeboden worden.
Maar touchscreens!!!1
Touchscreens zijn bij hackerspaces in het algemeen "apparaat zoekt project". Als je een bank-GUI maakt ligt een touchscreen voor de hand, maar revbank is nu eenmaal CLI-gebaseerd.
Wat heb je nodig om revbank te kunnen draaien?
Een linuxcomputer met toetsenbord en scherm, liefst ook met een barcodescanner. Qua software heb je perl en de module Term::ReadLine::Gnu (Debian-package libterm-readline-gnu-perl) nodig, en liefst ook vim en busybox.
Kun je meerdere revbanks tegelijk draaien op dezelfde databestanden?
Ja, revbank leest z'n bestanden steeds opnieuw en laat caching helemaal aan de kernel over in plaats van dat zelf te doen, en schrijft nieuwe dingen met een atomische rename voor consistentie. Er zit (nog?) geen locking in, dus er zijn zeker theoretische race conditions (laatst uitgevoerde actie overschrijft iets eerdere actie), maar in de praktijk zal het extreem onwaarschijnlijk zijn dat je daar last van hebt. Wel zijn momenteel de transaction ID's niet gegarandeerd uniek als twee transacties binnen dezelfde seconde worden gedaan, maar ook dat levert waarschijnlijk niet echt problemen op in de realistische praktijk.
Is revbank veilig?
Nee, revbank is volledig gebaseerd op vertrouwen. De revbank-terminal staat in het algemeen in de buurt van de voorraden en een open geldkistje, en is daarom alleen geschikt als je je bezoekers kunt vertrouwen. Je kunt afrekenen op naam van iemand anders ("Kun je voor mij een cola meenemen?"), geld van andere gebruikers afnemen, en de databestanden verpesten. Beheerders wordt geadviseerd veel backups te maken.
Ondersteunt revbank ook korting voor leden/deelnemers?
Nee, want de maker vindt dat stom. Korting voor leden klinkt lief, maar is eigenlijk gewoon een middelvinger naar incidentele bezoekers, als de meeste transacties door leden/deelnemers worden gedaan.
Waarom...
gebruikt revbank geen echte database?
De data wordt opgeslagen in tekstbestanden omdat je die kunt gebruiken met tools zoals git en diff. Ze zijn ontzettend simpel, en daardoor wanneer dat nodig blijkt ook gewoon met een teksteditor te bewerken. Het scheelt ook een dependency, maar dat is bijzaak.
eerst de producten en dan je naam, in plaats van eerst je naam en dan de producten?
Omdat je dan zou moeten aangeven wanneer je klaar bent met je lijst producten. Doordat revbank onderscheid maakt tussen product-id's en accountnamen, kan de accountnaam worden gebruikt als indicatie dat je klaar bent met de producten.
is het take naam naam naam 4.20 en niet take 4.20 naam naam naam?
Om dezelfde reden, maar dan omgekeerd: omdat je dan zou moeten aangeven dat je klaar bent met de namen. Door eerst de namen te doen, en dan pas het bedrag, kan het bedrag worden gebruikt als herkenning van het einde van de namen.
is het give Juerd 4.20 en niet give 4.20 Juerd?
Vanwege consistentie met take.
zijn de commando's dan niet take-from en give-to?
Dat zou wel duidelijker zijn, maar ook meer typwerk.
mag ik geen negatieve bedragen gebruiken?
Het is niet nodig, en zou verwarrend kunnen zijn.
wordt "?" niet geaccepteerd als alternatief voor "help"?
Veel systemen die "?" snappen, ondersteunen dat bij élke vraag. Als je dat gewend bent, en merkt dat "?" werkt in revbank, denk je waarschijnlijk ook dat "?" je gaat uitleggen wat er bedoeld wordt met bijvoorbeeld de vraag "Beneficiary:" van het commando "give", maar zo geavanceerd is het hulpsysteem niet.
zitten er foeilelijke shell oneliners in de plugin "users"?
Dat was makkelijker en leuker.
Hoe...
krijg ik een lijstje van alle commando's?
Met het commando "help"
maak ik een nieuw account?
Met het commando "adduser"
reken ik iets af?
Scan eerst de producten, typ/scan daarna je accountnaam.
reken ik iets af op andermans rekening?
Door de naam van diegene te typen/scannen in plaats van die van jezelf.
reken ik meerdere van hetzelfde af?
Door voor het product "2x" of "2*" te typen, of na het product "x2" of "*2". Er mag eventueel een spatie tussen het vermenigvuldigingsteken en het aantal.
bekijk ik mijn saldo van mijn account?
Typ/scan je accountnaam, zonder eerst producten te scannen. Je krijgt dan je laatste transacties en je saldo.
bekijk ik mijn laatste transacties?
Typ/scan je accountnaam, zonder eerst producten te scannen. Je krijgt dan je laatste transacties en je saldo.
kijk ik verder terug dan bovenstaande me laat zien?
Dat kan niet via revbank zelf. Je kunt in het logbestand .revbank.log kijken. Vraag eventueel iemand die Linux snapt om hulp.
stort ik meer geld op mijn account?
Met het commando "deposit"
neem ik geld op van mijn account?
Door het bedrag in te typen
geef ik geld aan een andere gebruiker?
Met het commando "give"
jat ik geld van een andere gebruiker?
Met het commando "steal" (ook bekend als "take")
deel ik de rekening van het eten dat ik in de supermarkt heb ingekocht voor een groep?
Ook met het commando "take". Om de kookbonus toe te passen, type je "kookbonus" tussen de take en je accountnaam.
deel ik de kosten van een pizza?
Door na het scannen van de pizza, het commando "split" te typen.
herstel ik een foutje als ik nog niks heb afgerekend?
Met het commando "abort" begin je opnieuw met een schone lei. Dit commando werkt overal in revbank, ongeacht de vraag die je krijgt.
herstel ik een foutje nadat ik heb afgerekend?
Door een tegenovergestelde transactie te doen, die je saldo weer fixt. Het is handig als je in de omschrijving zet dat het bedoeld is als herstel. Om geld toe te voegen aan je account, gebruik je "deposit" met als methode "other" om een beschrijvende tekst te kunnen invoeren. Om geld van je account te halen, gebruik je "unlisted". Als de fout nog in beeld staat, kun je ook een tegengestelde transactie krijgen met het commando "undo" in combinatie met het transactie-ID van de ongewenste transactie.
bied ik een product te koop aan in de market?
Verzin een product-ID en check of die nog niet in revbank wordt gebruikt. Plak op alle producten een barcode met dat ID. Met het commando "market" beland je in vim. Daar kun je een regel aan het tekstbestand toevoegen. Heb je geen idee hoe vim werkt, vraag dan om hulp. Let op: de prijs van een product in de market is de optelsom van het bedrag dat naar de verkoper gaat, en het bedrag dat naar de space gaat. Beide componenten van de prijs zijn verplicht hoger dan 0.
sluit ik revbank af?
Revbank heeft daar opzettelijk geen commando voor, omdat de primaire betaalterminal altijd moet blijven werken. Als je een extra revbank-proces hebt gestart, kun je 'm veilig killen; als je via een shell werkt kom je terug in je shell door revbank te stoppen met ctrl+Z; dat geeft een job id en die kun je met bijv. kill %1 afmaken.

Geschiedenis

  • eind 2009: RevSpace wordt opgericht
  • begin 2010: Het wordt gebruikelijk om vooraf te betalen en op een briefje je tegoed bij te houden
  • half 2010: De briefjes worden vervangen door een terminal met vim. Mensen snappen vim niet en lezen de tekstregels scheef, en verpesten continu het bestand.
  • eind 2010: Toch maar nano, maar mensen lezen het nog steeds scheef en passen regelmatig het verkeerde saldo aan.
  • ergens begin 2011: Versie 1: een perlscriptje van ca. 300 regels. De interface was simpel: typ het bedrag, typ dan je naam.
  • 2 uur later: Het besef dat prijzen opzoeken in een tabel ook overgelaten kan worden aan een computer. Een productentabel en barcodescanner komen erbij, en voortaan wordt het: scan producten, typ/scan je naam.
  • de dagen erna: Op verzoek van gebruikers komen er features bij zoals geld geven aan iemand anders.
  • april 2011: De source komt eindelijk in git dus voor de rest van deze opsomming hoeven de datums niet gegokt te worden :)
  • juni 2011: De prompt wordt nu afgehandeld door de readline library, met tab-completion.
  • februari 2013: Versie 2: revbank is grotendeels herschreven en heeft nu een modulaire structuur met plugins.
  • februari 2013: Marketfunctie gemaakt als simpele demo (35 regels code) van de plugin-infra. Blijkt later een erg populaire feature te worden.
  • oktober 2015: De eerste heftige bug die grootschalige schade veroorzaakt wordt gevonden. Gelukkig is de schade makkelijk te herstellen met het commando "undo".
  • oktober 2015: De eerste (en vooralsnog enige) security bug wordt gevonden: een shell-injectie. Geen groot issue voor revspace, want we geven iedereen toch al shelltoegang op het account van revbank...
  • februari 2017: Tijdens Eth0:2017 Winter wordt een vieze hack gebouwd: een plugin genaamd "repeat" waarmee je makkelijk meerdere keren hetzelfde product kunt afrekenen. Het werkt door gewoon een regel van de transactie te dupliceren, want revbank heeft nog geen concept van aantallen. Het kan ook nog niet werken met sommige soorten transacties die bestaan uit meerdere regels, omdat revbank niet kan weten welke regels bij elkaar horen.
  • november 2019: Versie 3: gebruikers zien vooral de versimpelde overzichten, maar intern verandert er iets heel significants: transactieregels kunnen gegroepeerd worden, waardoor de "repeat"-plugin nu voor alles kan gaan werken. Transacties lijken nu intern meer op journaalposten van een boekhoudsysteem. Inclusief plugins is revbank nu nog steeds maar ca. 2200 regels code.

Voor veel meer detail, zie de git commit log...