Skip to content

Instantly share code, notes, and snippets.

@84adam
Created February 23, 2023 04:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 84adam/d85f5f40e8821925585f263f68b655eb to your computer and use it in GitHub Desktop.
Save 84adam/d85f5f40e8821925585f263f68b655eb to your computer and use it in GitHub Desktop.
Decode Keys/Values from Postgres LND Database
# lnd-postgres-kv-decoder.py
from decouple import config
import psycopg2
import psycopg2.extras
import pandas as pd
import time
tables = ['channeldb_kv', 'decayedlogdb_kv', 'macaroondb_kv',
'towerclientdb_kv', 'towerserverdb_kv', 'walletdb_kv']
def bytea2bytes(value, cur):
"""
Typecaster for converting bytea data to bytes
"""
m = psycopg2.BINARY(value, cur)
if m is not None:
return m.tobytes()
# register the BYTE2BYTES type for psycopg2
BYTEA2BYTES = psycopg2.extensions.new_type(psycopg2.BINARY.values, 'BYTEA2BYTES', bytea2bytes)
psycopg2.extensions.register_type(BYTEA2BYTES)
def lnddb_conn():
"""
Connect to Postgres Database using psycopg2
- credentials should be stored in an .env file for python-decouple to read from
"""
dbname = config('DB_NAME_LND')
user = config('DB_USER_LND')
password = config('DB_PASSWORD_LND')
host = config('DB_HOST_LND')
port = config('DB_PORT_LND', cast=int)
try:
conn = psycopg2.connect(dbname=dbname,
user=user,
password=password,
host=host,
port=port,
sslmode='require'
)
except (Exception, psycopg2.Error) as e:
print(f"Error while connecting to DB:\n", e)
conn = None
return conn
def select_all(conn, table_name):
"""
Select all records from a given table in the Postgres database
"""
dict_cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
dict_cur.execute(f"select key::bytea, value::bytea, parent_id, id, sequence from {table_name} "
"where value is not null ");
rec = dict_cur.fetchall()
dict_cur.close()
return rec
def single_table(table_name):
"""
Select all records from a single table and read them into a Pandas dataframe
"""
conn = lnddb_conn()
t = table_name
rec = select_all(conn, t)
col_names = ['key', 'value', 'parent_id', 'id', 'sequence']
df = pd.DataFrame([[row[col] for col in col_names] for row in rec], columns=col_names)
conn.close()
return df
def is_alpha_dash(w):
"""
Check whether a given value can be decoded into an alpha string including dashes
"""
if not isinstance(w, str):
try:
w = w.decode("utf-8")
except:
pass
alphanumdash = ['a','b','c','d','e','f','g','h','i',
'j','k','l','m','n','o','p','q','r',
's','t','u','v','w','x','y','z','-']
chars = []
for c in w:
if c in alphanumdash:
chars.append(c)
chars_w = ''.join(chars)
if len(chars_w) == len(w):
return True, chars_w
else:
return False, w
def is_alphanum_dash(w):
"""
Check whether a given value can be decoded into an alphanumeric string including dashes
"""
if not isinstance(w, str):
try:
w = w.decode("utf-8")
except:
pass
alphanumdash = ['a','b','c','d','e','f','g','h','i',
'j','k','l','m','n','o','p','q','r',
's','t','u','v','w','x','y','z','0',
'1','2','3','4','5','6','7','8','9',
'-']
chars = []
for c in w:
if c in alphanumdash:
chars.append(c)
chars_w = ''.join(chars)
if len(chars_w) == len(w):
return True, chars_w
else:
return False, w
def main():
"""
Read data from all tables and print out human-readable, decoded keys and values
"""
conn = lnddb_conn()
for t in tables:
print(f"fetching data from {t}...")
rec = select_all(conn, t)
col_names = ['key', 'value', 'parent_id', 'id', 'sequence']
df = pd.DataFrame([[row[col] for col in col_names] for row in rec], columns=col_names)
column_names = ['key', 'value']
for col in column_names:
unique_entries = []
for k in df[col]:
if k != None and len(k) > 0:
alphanum_dash, k2 = is_alphanum_dash(k)
if alphanum_dash:
alpha_dash, k3 = is_alpha_dash(k2)
if alpha_dash:
if len(k3) > 0:
if k3 not in unique_entries:
unique_entries.append(k3)
else:
k4 = binascii.hexlify(k).decode('utf-8')
alphanum_dahsh, k5 = is_alphanum_dash(k4)
if alphanum_dash:
alpha_dash, k6 = is_alpha_dash(k5)
if alpha_dash:
if len(k6) > 0:
if k6 not in unique_entries:
unique_entries.append(k6)
print(f"\nUnique Names Decoded from '{column_name}' Column in '{t}' Table:\n")
for i in unique_entries:
print(i)
print()
print("-"*80)
print()
time.sleep(2)
conn.close()
print()
print("DONE")
if __name__ == '__main__':
main()
@84adam
Copy link
Author

84adam commented Feb 23, 2023

Example Output

fetching data from channeldb_kv...

Unique Names Decoded from 'key' Column in 'channeldb_kv' Table:

dbp
source
flap-count

Unique Names Decoded from 'key' Column in 'channeldb_kv' Table:

kademlia
hmmmstrange
dontconnect
ferrabras
ln-hub-de
guggero
unclemurray
luce
my-node
aybabtu
senza
bosphorus
zerobps
indosekai
schilling
rootlnnode
pacblitz
vertice
cryptolorenzo
nmfretz
kno
beefyfish
peppertiger
wbobeirne
encryptedenergy
gator
beachnode
thepkbadger
slybtc
marote
teflontwin
tblitz
notabot
llaangel
hopey
fido
madali
atlasarmsresearch
hirish-ln
thundergraphnet
joyintechnology
yunipher
loco-node
fuessiotherapie
breakawaycoffeeroasters
bifrost
luke
jmillionaire
dragonsland
momentum
nybemotion
mynode-cln
powehi
terminus-labs
dodoblitz
fiona
ionosphere-mainnet
bcashlol
justin-hoffman-lightning-node
sovereign
rasputin
boldthings
otech
richuals
alex
plebstafarian
fluffy
glamdring
chodeynodey
netpeak
flash
sommerfeld
router
tschinoko
smolgrrr
enlightened
shtyrlitz
deadcatlambo
freehodl
lfgbtc
swmpr
nodeworthy
cavuminfundo
orangepillshill
festnoz
ndnd
blumi
tuttifrutti
daedra
arielleplus
munch
satoshispender
blitzdings
betheball
bitcoinaudio
jpnode
archcore
vagabundo
truly-random
capitol
satoshi-money
brrrrrrrrr
djseeds
berlinblitz
mustard
lordofwar
mjolnir
moneyprinterbrrrrr
frontiblitz
deepthought
bigdaddyrabbit
sahilc
pinkfloyd
johnsbrt
kaixonode
onosendai
honey
daped
droach
thirtythirty
amperture
nodefall
pwnd-pleb
danenode
zombie
blitzen
kankichi
mound
syncro
jairusats
dynamo
setmid
alulight
sentinel
galaxoidlabs
datablock
bti-b
carrot
giorgione
amelien
fulmo
ppz
duck-farmer-node-one
gossipking
vanguarda
bitcoinblitz
funky-node
reigningtrout
lsdcapital
earn-sats-spend-sats-save-sats
dabestnode
wallsat
cguida
user-main-f
sebastix
brolightning
binkbonkbank
mydarling
elhefe
tinova-btcd-lnd
beastmodal
paraplu-device
btcpayproviderdundle
satoshi-mynode
kungmeow
satoshibox
sheesh
ishomenode
gkrizek
dr-bonez
mattmcpherson
altcode
satapult
shallot
oyvt
lapistano
jaxtax
intothevoid
curfew
taproot
struct
butterfly
fewsats
storm
grandjury
rockshouse
uuunlimitedpower
sparky
scarce-city
drakennl
dude-network
yangnamers
hodltoshi
hodlmore
coinmode-staging
nevershift
eta
iampigman
tarnhelm
tovarcina
bluefuze
anhingas
steropes
naumburger
satoshi
abitibinode
null
ratwater
guyfawkes
nodestradamus
ben
trampoline-hodlisterco
bezysoftware
tankman
nodorobico
hodlonode
mysterx
cloakedwireless
lakeside
raiju
whatsnext
bipa
dpwfor-lighting
eberhard
cshnode
ezekiel
zerofire
moonbreeze
cercatrova
myespresso
aragorn
edefix-test-node
zoe
frznode
fancyfinance
bitcast
makana
xmrk
nebuchadnezzar
tgk
raspiden
dolmentlaxcalteca
coinblitzer
bakamoto
rayito
blippy
satoshionsea
thefreedomofchoice
ilovesatscom
rolltide
metacortex
rigly-lightning-node
tempehtots
ghoststalker
lightningforthewin
swisslightning
ignis
thenewstandard
batusie
bti-a
spellpwr
bfected
monode
weischeee
braaah
cryptonews
djmeistro
freelove
jairunet
papi
stijnbtc
martynode
allyourbankarebelongtous
winston
childhoods-end
catspaw
lightning-kmalloc
nineoneone
geyser-node
notable-donor
hypernode
lightnigg
bowline
gogogo
primelight
threewood
amorfati
tokencontainermodel
knowtorious
burrto
synapsus
actionslave
carryon-maximalist
makionaire
bloope
manolo
nzln
juninode
lindlof
isoguna
b-m-dot-m
nlt
guoduyule
riverside
cryptopath
stressedsunfish
noonenodes
plebeian-market
okcoin
rylo
knode
stramash
bitlany
blitzy
loxx
zap
elle
daisukenosuke
thruput
taeppsch
enrutamuto
satsophone
soner
sunfarmsln
standsonrock
psklqc
wizard-school
pintxo
odinode
undergroundrailnode
swisslight
jurlightningnode
nufx
johnny-lightning
nansa
rkfg
hc-lnd
cheasy
whiterabbit
wobloz
kevinyc
bowlafterbowl-raspi
notyourkeys
fixedsupply
enlightning
thisiswhereyousendit
bayes
hiyocoro
hammer
bitcoinplebdev
lightningsingapore
icanfixeverything
jupil
fvalentiner
bitluso
shadowverse
cmatrx
spn
turtlenet
himbaerman
slowzone
micka
darkzone
glix
btcpaylove
sunkim
unatco
faraday
kabosu
badgr-digital
martypb
mclovin
baffler
node-ber-steg
gcpc
bconf
oldenburg
nimbus
moneyprintergobrrr
blitzsome
burger
bankofzettel
cyberpay
sutadon
decap
whitepony
prod-gamblrr
crabbypatty
buurman
migraines
kittyboy
acorns
machankura-y
bitcoinaruba
toby-nuc
hub-lnd-gar-nodl-it
mash
raspel
blitznode
xuano
aegis
megalodon
bannnode
bitcoinitaliapodcast
filou
lntools
nodekorea
spirit
perl
mandonode
llamp
puhbuhruh
potzblitz
antinoderati
criticalltng
aquilafedele
sprookjesbos
antistate
streamturbine
eucentralnode
m-node-bln-de
melmacblitz
orthwyrm
doughless
lightningbax
santantango
mbpnode
thundernode
raspi
kokkienode
libredos
faltyn
cork
bumblebee-hive
pevelenode
oliht
lightening
bieleblitz
biggypop
napetost
jesterhodl
openhoofd
epicurious
weezelblitz
pumpkinpatch
shualippa
stacktracey
thinking
tempusfugit
konak
node-ber-zeh
sappiamo
scottmsul
boostjar
phileas
hodlhodlhodl
candle
nodistan
mrp
tardis
marvelsnode
pipi
weshalpass
placeholder
whoop
fishfeed
accidentje
bananenblitz
boilerhodl
thesatstash
zaphodok
alefuh
puhnuckel
mandeezy
tiny-ninja
proppalightning
jeed
teilcorner
hyperion
friendlynode
nix-bitcoin
nakamoto
moonwalk
alice
btcblitz
pantarhei
funklnd
trial-balloon
lighthefire
smutsstudio
bitpi
framboise
satosys
oshisat
stream
wordform
captainchaos
langi
ugligatschu
alephi
cookielightning
coinmarketcap
wookstar
fullthrodl
zapper
dagobert
xvrn
croesus
dnilabs
btclnfnode
fw-lnd-node
madbaker
bretzel
selfbankt
richnode
bleskomat
carche
fulgurite
thenodesneakerz
blackbox-cln
blank
schnitzelblitzc
crom
bobot
anti-cbdc
von-node
lynchlight
pimane
qaobtc
bear
magicmountainmoney
some-node
mikuhl
sublime
bnuuy
bowlafterbowl-umbrel
sendai
mainnode
wef-official
bitpetro-devices
wolzie
across-minimum
sbcm
manyak
ohli
crader
fireflyfiesta
nvrbnbttr
pimmetjepom
trekon
raspiblitz-piezzo
pikonode
bringingfreedom
naoko
ewocs
hury
counterweight
ahhnee
stupleb
wexo-lnd
ivan
roosoft
zerofeeboy
hsware
heisenberg
webworthy
rs-lightning-node
raspiblitz
blitzenlights
mycelium
microcosm
beernode
relampago
suneo
techmedia
thingymabob
myblitzi
opticbit
alto-voltaje
treepear
gizmomatt
nodchblitz
ming
lndsovereignty
shitaso
haplo
kulning
electromoney
toaster
tanimachiyonchome
mynodeismynode
papaya
poseidon
danyman
bitcoin-twitter
fullnodetest
trek
ln-bulsan
vonets
destevie
kenovios
vvizard
rrbtc
mblitz
kashyyykwinecellar
armstrong
bare-bitcoin
rebecca
btctip
outsidia-ln-node
revs-bitchin-node
newport
dontgetrekt
themptyuniverse
ravo
voyager
gtfo
omekau
escalator
opaque-umbra
tisza-payments
voluntary
davidlnd
kornpow-store
blitzbold
asglytzopy
yourbestfriendema
feustey
freedom
albis
talanln
donnerhamster
tulkooo
new-zealand-official-node
kuroiso
bigu
zehkstoshi
nocoiner
beedit
lndnodetm
vajra
galago
johnnycash
twentyuno
renoblitz
hobunror
vietnamhodl
goetzr
truman
stugg-rides-the-lightning
bernieboy
starfort-technologies-ln
elvece
wayne
duran
anaxablitz
falsefaucet
markwaldo
lightsats
swisslnd
alexbit
thaneoflynwood
nameeo
lightitup
dmuc
rakkis
habibitcoin
craig
lnforthewin
jimbocoin
dshiznit
nudistech
renesraspi
sebdev
salvagate
chainy
skyskiff
goldenmonkey
fenixtaxi
theblueray
montricher
yoyonode
kyashiro
some-random-awesome-name
wholecelium
playmotv
soultiller
lightningrabbit
olha
datlightning
rspilnd
nodedesbobs
pfkbk
magnetron
nicks-node
bitcoin-racing-final
caladan
swissless
ickycage
hello-world
flowernode
catbeans
millo-btc
drg
hot-two
cabtocoin
clayop
tshodl
yellow
midoric
bitsader
coinboy
kollubistes
coincharge
volvnode
oprema
lcuscl
zion
awesomejarynsnode
flypdev
runningrock
octobocto
love-of-my-life
tatumturnup
musicstar
dixblitz
lnpapi
sudonym
asiegf
hollepenjo
bitcoinnatal
easteuropeanentrypoint
bookmark
elendee
noob
lndzido
ubud
morpheus
ranas
rickyspanish
jokapi
paci-nodl
bignode
xgfreon
jrfoliveira-lnd-br
medea
cookiemonster
joltz-test-mainnet
lnd-beveragedrinker
niggerboy
zuliacoin
johnchidgeysnode
mijnlightningnode
okamikun
windranger
hodlnodl
benfin
pangolin
niggergirl
niggerdog
niggercat
hardest-money-wins
lilblitz
tracksight
rodblitz
infimum
voltage-jerry
lessefer
yeet
bitmax
dhomochevsky
polpetta
lightweight
lighthub
sugar
satoshiskitchen
rgavoltagenode
noctua-node
bija-nostr-client
becryptosmart
mylightningnetwork
iamtherealiam
cameloid
frostbolt
beyla-wallib
satseye
skyenet
significant-coffee
caronte
lorenzo-voltage
alan
duizendbommenengranaten
reflodark
hpautomation
nutman
jonode
salamaverkko
eeloo
jaegernode
stack-sats-and-pet-cats
zimbabwerise
benode
sebolightning
solserver
lnprivate
nodekeeper
elpkecoin
lnd-cwilbzz
poshblitz
underworld
shedquarters
raspiflizz
my-btc-node
nodl-cloud
trinary-dev
mynode
slate
yggdrasil-wallib
lnquidity
satscanal
charmingfarming
orange-pill-app-ln
okex
zeid-lightning-node
neuranex
bittimaatti
bebe-rose-love
raijin
awsum-pawsum
segireamada
internet-portal-lnd-alias
her-dao-kenya
inazuman
mitchyart
jjblitz
liviudm
btcgardener
oykoyc
freakyblitz
cosmicnag
jinkinoko
brettpi
raspibolt-lnd
dvadesetjedan
victoria
fullylightningnode
geyserproject
keyysa
hackberry
undersea
qmochi
yamato-mn
gshapiro
geeknewscentral
rootz
lnbitsnode
cologneffm
bitcoin-dad-pod
lime
stallo
cachupa
soulturnaround
geyser-fund-lhc
ned-redrum
unlockingscript
izzirins-node
mobycrypt
lndg-xyz
thehouseofobango
dominion-subject
lightningchess
kumulynja
pode
hytryy
mwmdev
freedominchaos
mountainfire
starlight-love
lokrim
shadowfax
bokuma
lndbitcoinminer
dora-the-crypto-explorer
madmax
pleb-fm
royalbitcoin
dibalik
btc-display
bitfreaks
knudix-mini
arefvoltage
viresinnumeris
lnvvv
liberdade
sisu
esternocleidomastoideo
abstract-coffee
hatoto
blackcoffee
bliskavka
chilman
centex
swiss-bitcoin-pay
seven
jmdatasolutions
flyingpig
palavradesatoshi
fulminate
calimeroshi
bademantel
chainbytes
wyssblitz
bonoblitz
bleskozel
nucularpowered
zhbop
grubnode
plebeque
terrenosjundiai
pepinillo
goyban
crunchycrypto
hodl-grischun
jerrycat
loopy
riedlinode
blesky
allconnect
ten-will-have-to-do
flashlouwie
austen-pushkin
depturandis
ollie-node
hphpoooooo
huffnode
efadv-ln-node
sost
nexondo
banterpanther
retconx
misa-test
iwok
globalnode
acenode
buckeyebitcoin
loko
centralbankdisruptor
mulleirocorp
lacosanostr
dummy
waka
glitter
mokamochi
solin
shvot
chromart
mountainfiremouse
lac-first-light
machankura-z
clguard
kaleidoscope
swearycoin
twntyone
mulberry
opago
piedrawallet
valker
sp-test-node
ln-core
hanuman
markoolazap
twz-lnd
kumuly-lite
rotfuchs
eniac
forgetmyid
lunarthunder
cwps
faerie
allyourbanktestnode
mantiev
ehahnda
lndev
lovac
aurora
slyroundabout
lean-lightning
algoblitz
ptrncc
salar
swissbtconf
kinakuta
satoshizap
winterstorm
suniwallet
lit-services
travelmore
seedhammer
fourtytwo
lnmxx
downpour
coincreek
flute
singularpoint
bilbo
luke-node
oiblz
molle
gromp
playhub
maneltso
legany
greatislibertymindfulness
arrowdrive
chicken
pike-control
naglfar
happy-sardine
bityogi
ggeztrip
tradenix
tempnodeplayfull
tuxedorabbit
jlas
calibtc
amok-products
zeste
leo
epiktetforlag
helloitsme
superlubricity
sun
tsk
properbitcoin
centuple
ruhrblitz
main-ligtning
iceman
econoob
kappa
viewer-fancied-motocross
purovino
kboom
polaris
chooch
lnd
butterknuckles
launchwindow
watts-node
tr-hike-new
haocomcloud
powerofpodcasting
amenano
lignumglacies
brainbudln
q-zax-cloud
plus
catness
bonzasteech
satoko
satoko-sama
thefuture
zynos
rasu
bytecoin
henghonglee
winderton
prime
angel
mrbitz
dreizehn
node-djs
ollisketteraha
logsonlogs
dua
cyberhub
hans
basaltmagnostempest
coherent-mule-immortal
mercury
illumination
honeybadger
bitcoin-sheffield
osvian
ericcantmeme
pingpong
tnbsats-cln
dissonantbyte
ryzizub
satscriber
ordinal-bot
shady
sogoagain-lnd
box
fixblitz
happybot
blur
bcats
benjaminchodroff
tyfovo
mycel
btcforever
cyphersafe
carlslight
wolkenblitz
testlnode
sonex
njofang
ninjanode
albatross
peaches-and-plums
kryptoneuling
harambelovesbitcoin
uwubotu
randomminer
matrix
sattva
treefrog
chad
invite
node-of-excelance
endera-lnd
nguvu
dalliance
reflexnode
ziggysmalls
wim
yakiniku
gi-blitz
sunny
lbitcoin
lurifax
kaisertroyer
feleena
sion
jjpdiago
light
fctchannel
gbdemo-lnd
privatesig
walnut
omboo
progress-bar
sideways
greencandleit
jokscryptos
donverduras
voltage-staging-mainnet
sdfdsfsdfsd
jerrynode
eclair
tournette
winecountry
raspinode
celine


fetching data from decayedlogdb_kv...

Unique Names Decoded from 'key' Column in 'decayedlogdb_kv' Table:

Unique Names Decoded from 'key' Column in 'decayedlogdb_kv' Table:


fetching data from macaroondb_kv...

Unique Names Decoded from 'key' Column in 'macaroondb_kv' Table:

enckey

Unique Names Decoded from 'key' Column in 'macaroondb_kv' Table:


fetching data from towerclientdb_kv...

Unique Names Decoded from 'key' Column in 'towerclientdb_kv' Table:

version

Unique Names Decoded from 'key' Column in 'towerclientdb_kv' Table:


fetching data from towerserverdb_kv...

Unique Names Decoded from 'key' Column in 'towerserverdb_kv' Table:

Unique Names Decoded from 'key' Column in 'towerserverdb_kv' Table:


fetching data from walletdb_kv...

Unique Names Decoded from 'key' Column in 'walletdb_kv' Table:

lastaccount
mgrver
mgrcreated
ctpub
ctpriv
mhdpriv
mhdpub
mpriv
mpub
cpub
cpriv
cscript
watchonly
startblock
birthday
vers
date
bal
ready
birthdayblock
birthdayblockverified
syncedto

Unique Names Decoded from 'key' Column in 'walletdb_kv' Table:

ready


DONE

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment