alternate pubkey persistence

This commit is contained in:
Evan Feenstra
2022-07-20 11:31:42 -07:00
parent de24ddd361
commit 1777d97fb3

View File

@@ -22,7 +22,7 @@ pub struct FsPersister {
channels: DoubleBucket<ChannelEntry>, channels: DoubleBucket<ChannelEntry>,
allowlist: Bucket<AllowlistItemEntry>, allowlist: Bucket<AllowlistItemEntry>,
chaintracker: Bucket<ChainTrackerEntry>, chaintracker: Bucket<ChainTrackerEntry>,
pubkeys: Bucket<PublicKey>, pubkeys: Bucket<Vec<PublicKey>>,
} }
impl FsPersister { impl FsPersister {
@@ -44,6 +44,36 @@ fn get_channel_key(channel_id: &[u8]) -> &[u8] {
channel_id.get(length - 11..length - 7).unwrap() channel_id.get(length - 11..length - 7).unwrap()
} }
const PUBKEY_KEY: &str = "PKS";
impl FsPersister {
fn get_pubkeys(&self) -> Vec<PublicKey> {
match self.pubkeys.get(PUBKEY_KEY) {
Ok(ps) => ps,
Err(_) => Vec::new(),
}
}
fn add_pubkey(&self, pubkey: &PublicKey) {
let mut pks: Vec<PublicKey> = match self.pubkeys.get(PUBKEY_KEY) {
Ok(ps) => ps,
Err(_) => Vec::new(),
};
let pk = pubkey.clone();
if !pks.contains(&pk) {
pks.push(pk);
let _ = self.pubkeys.put(PUBKEY_KEY, pks);
}
}
fn remove_pubkey(&self, pk: &PublicKey) {
let pks: Vec<PublicKey> = match self.pubkeys.get(PUBKEY_KEY) {
Ok(ps) => ps,
Err(_) => Vec::new(),
};
let newpks = pks.iter().filter(|p| *p != pk).map(|p| p.clone()).collect();
let _ = self.pubkeys.put(PUBKEY_KEY, newpks);
}
}
impl Persist for FsPersister { impl Persist for FsPersister {
fn new_node(&self, node_id: &PublicKey, config: &NodeConfig, seed: &[u8]) { fn new_node(&self, node_id: &PublicKey, config: &NodeConfig, seed: &[u8]) {
let pk = hex::encode(node_id.serialize()); let pk = hex::encode(node_id.serialize());
@@ -53,14 +83,14 @@ impl Persist for FsPersister {
network: config.network.to_string(), network: config.network.to_string(),
}; };
let _ = self.nodes.put(&pk, entry); let _ = self.nodes.put(&pk, entry);
let _ = self.pubkeys.put(&pk, node_id.clone()); self.add_pubkey(node_id);
} }
fn delete_node(&self, node_id: &PublicKey) { fn delete_node(&self, node_id: &PublicKey) {
let pk = hex::encode(node_id.serialize()); let pk = hex::encode(node_id.serialize());
// clear all channel entries within "pk" sub-bucket // clear all channel entries within "pk" sub-bucket
let _ = self.channels.clear(&pk); let _ = self.channels.clear(&pk);
let _ = self.nodes.remove(&pk); let _ = self.nodes.remove(&pk);
let _ = self.pubkeys.remove(&pk); self.remove_pubkey(node_id);
} }
fn new_channel(&self, node_id: &PublicKey, stub: &ChannelStub) -> Result<(), ()> { fn new_channel(&self, node_id: &PublicKey, stub: &ChannelStub) -> Result<(), ()> {
let pk = hex::encode(node_id.serialize()); let pk = hex::encode(node_id.serialize());
@@ -171,17 +201,13 @@ impl Persist for FsPersister {
} }
fn get_nodes(&self) -> Vec<(PublicKey, CoreNodeEntry)> { fn get_nodes(&self) -> Vec<(PublicKey, CoreNodeEntry)> {
let mut res = Vec::new(); let mut res = Vec::new();
let list = match self.nodes.list() { let list = self.get_pubkeys();
Ok(ns) => ns, for pubkey in list {
Err(_) => return res, let pk = hex::encode(pubkey.serialize());
};
for pk in list {
if let Ok(pubkey) = self.pubkeys.get(&pk) {
if let Ok(node) = self.nodes.get(&pk) { if let Ok(node) = self.nodes.get(&pk) {
res.push((pubkey, node.into())); res.push((pubkey, node.into()));
} }
} }
}
res res
} }
fn clear_database(&self) { fn clear_database(&self) {