Try changing peer primary key to hash, not done (#782)

* Try changing peer primary key to hash, not done

* Got backend working with peer hash as primary key

* Got frontend working with peer hash as primary key for peer
This commit is contained in:
Jonathan Zernik 2021-02-04 00:09:58 -08:00 committed by GitHub
parent ebd61823aa
commit 64cf97dfe9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 322 additions and 202 deletions

View file

@ -40,12 +40,12 @@ export default function BuyOfferDetailItem({
const onPeerClick = (event) => {
event.preventDefault();
const peerId = getPeerId();
if (peerId == null) {
const peerHash = getPeerHash();
if (peerHash == null) {
return;
}
console.log("Handling peer click for peerId: " + peerId);
goToPeerPage(history, peerId);
console.log("Handling peer click for peerHash: " + peerHash);
goToPeerPage(history, peerHash);
}
const onLightningNodeClick = (event) => {
@ -58,12 +58,12 @@ export default function BuyOfferDetailItem({
)
}
const getPeerId = () => {
const getPeerHash = () => {
if (!offer.getHasPeer()) {
return null;
}
const peer = offer.getPeer();
return peer.getPeerId();
return peer.getPeerHash();
}
@ -96,9 +96,9 @@ export default function BuyOfferDetailItem({
}
function HasPeerDisplay(peer) {
const peerId = peer.getPeerId();
const peerHash = peer.getPeerHash();
const peerName = peer.getPeerName();
const peerDisplayName = peerName ? peerName : peerId;
const peerDisplayName = peerName ? peerName : peerHash;
return (
<Link href="#"
onClick={onPeerClick}

View file

@ -85,7 +85,7 @@ export default function CreatePeerDialog({
const createPeer = (peerName, host, port) => {
createPeerRequest(peerName, host, port, (response) => {
goToPeerPage(history, response.getPeerId());
goToPeerPage(history, response.getPeerHash());
});
};

View file

@ -45,8 +45,8 @@ export default function DeletePeerDialog({
var classes = useStyles();
const history = useHistory();
const deletePeer = (peerId) => {
deletePeerRequest(peerId, (response) => {
const deletePeer = (peerHash) => {
deletePeerRequest(peerHash, (response) => {
reloadRoute(history);
});
};
@ -54,9 +54,9 @@ export default function DeletePeerDialog({
function handleSubmit(event) {
event.preventDefault();
console.log( 'peer:', peer);
var peerId = peer.getPeerId();
console.log( 'peerId:', peerId);
deletePeer(peerId);
var peerHash = peer.getPeerHash();
console.log( 'peerHash:', peerHash);
deletePeer(peerHash);
handleClose();
}

View file

@ -70,7 +70,7 @@ function Layout(props) {
<Route path="/app/lightningnode/:pubkey" component={LightningNode} />
<Route path="/app/channel/:txId/:outputIndex" component={Channel} />
<Route path="/app/peers" component={Peers} />
<Route path="/app/peer/:id" component={Peer} />
<Route path="/app/peer/:hash" component={Peer} />
<Route path="/app/notifications" component={Notifications} />
<Route
exact

View file

@ -47,12 +47,12 @@ export default function SentPayment({
const onPeerClick = (event) => {
event.preventDefault();
const peerId = getPeerId();
if (peerId == null) {
const peerHash = getPeerHash();
if (peerHash == null) {
return;
}
console.log("Handling peer click for peerId: " + peerId);
goToPeerPage(history, peerId);
console.log("Handling peer click for peerHash: " + peerHash);
goToPeerPage(history, peerHash);
}
const onLightningNodeClick = (event) => {
@ -62,12 +62,12 @@ export default function SentPayment({
goToLightningNodePage(history, nodePubkey);
}
const getPeerId = () => {
const getPeerHash = () => {
if (!sentPayment.getHasPeer()) {
return null;
}
const peer = sentPayment.getPeer();
return peer.getPeerId();
return peer.getPeerHash();
}
const getPeerDisplay = () => {
@ -76,8 +76,8 @@ export default function SentPayment({
}
const peer = sentPayment.getPeer();
const peerName = peer.getPeerName();
const peerId = peer.getPeerId();
return peerName ? peerName : peerId;
const peerHash = peer.getPeerHash();
return peerName ? peerName : peerHash;
}
function PeerDisplay() {
@ -89,9 +89,9 @@ export default function SentPayment({
}
function HasPeerDisplay(peer) {
const peerId = peer.getPeerId();
const peerHash = peer.getPeerHash();
const peerName = peer.getPeerName();
const peerDisplayName = peerName ? peerName : peerId;
const peerDisplayName = peerName ? peerName : peerHash;
return (
<Link href="#"
onClick={onPeerClick}

View file

@ -2,8 +2,8 @@ export const reloadRoute = (history) => {
history.go(0);
};
export const goToPeerPage = (history, peerId) => {
history.push("/app/peer/" + peerId);
export const goToPeerPage = (history, peerHash) => {
history.push("/app/peer/" + peerHash);
};
export const goToLightningNodePage = (history, pubkey, host, port) => {

View file

@ -29,27 +29,27 @@ import {
export default function PeerPage() {
var classes = useStyles();
const { id } = useParams();
const { hash } = useParams();
const [peer, setPeer] = useState(null);
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
const getSqueakPeer = (id) => {
getPeerRequest(id, setPeer);
const getSqueakPeer = (hash) => {
getPeerRequest(hash, setPeer);
};
const setDownloading = (id, downloading) => {
setPeerDownloadingRequest(id, downloading, () => {
getSqueakPeer(id);
const setDownloading = (hash, downloading) => {
setPeerDownloadingRequest(hash, downloading, () => {
getSqueakPeer(hash);
});
};
const setUploading = (id, uploading) => {
setPeerUploadingRequest(id, uploading, () => {
getSqueakPeer(id);
const setUploading = (hash, uploading) => {
setPeerUploadingRequest(hash, uploading, () => {
getSqueakPeer(hash);
});
};
useEffect(()=>{
getSqueakPeer(id)
},[id]);
getSqueakPeer(hash)
},[hash]);
const handleClickOpenDeleteDialog = () => {
setDeleteDialogOpen(true);
@ -61,15 +61,15 @@ export default function PeerPage() {
};
const handleSettingsDownloadingChange = (event) => {
console.log("Downloading changed for peer id: " + id);
console.log("Downloading changed for peer hash: " + hash);
console.log("Downloading changed to: " + event.target.checked);
setDownloading(id, event.target.checked);
setDownloading(hash, event.target.checked);
};
const handleSettingsUploadingChange = (event) => {
console.log("Uploading changed for peer id: " + id);
console.log("Uploading changed for peer hash: " + hash);
console.log("Uploading changed to: " + event.target.checked);
setUploading(id, event.target.checked);
setUploading(hash, event.target.checked);
};
function NoPeerContent() {

View file

@ -96,7 +96,7 @@ export default function Peers() {
title="Peers"
data={peers.map(s =>
[
s.getPeerId(),
s.getPeerHash(),
s.getPeerName(),
s.getHost(),
s.getPort(),

View file

@ -412,9 +412,9 @@ export function getBuyOfferRequest(offerId, handleResponse) {
);
}
export function getPeerRequest(id, handleResponse) {
export function getPeerRequest(peerHash, handleResponse) {
var request = new GetPeerRequest();
request.setPeerId(id);
request.setPeerHash(peerHash);
makeRequest(
'getpeer',
request,
@ -425,9 +425,9 @@ export function getPeerRequest(id, handleResponse) {
);
}
export function setPeerDownloadingRequest(id, downloading, handleResponse) {
export function setPeerDownloadingRequest(peerHash, downloading, handleResponse) {
var request = new SetPeerDownloadingRequest();
request.setPeerId(id);
request.setPeerHash(peerHash);
request.setDownloading(downloading);
makeRequest(
'setpeerdownloading',
@ -437,9 +437,9 @@ export function setPeerDownloadingRequest(id, downloading, handleResponse) {
);
}
export function setPeerUploadingRequest(id, uploading, handleResponse) {
export function setPeerUploadingRequest(peerHash, uploading, handleResponse) {
var request = new SetPeerUploadingRequest();
request.setPeerId(id);
request.setPeerHash(peerHash);
request.setUploading(uploading);
makeRequest(
'setpeeruploading',
@ -590,9 +590,9 @@ export function createPeerRequest(peerName, host, port, handleResponse) {
);
}
export function deletePeerRequest(peerId, handleResponse) {
export function deletePeerRequest(peerHash, handleResponse) {
var request = new DeletePeerRequest();
request.setPeerId(peerId);
request.setPeerHash(peerHash);
makeRequest(
'deletepeer',
request,

View file

@ -130,17 +130,49 @@ def saved_squeak_hash(server_stub, admin_stub, signing_profile_address):
@pytest.fixture
def peer_id(server_stub, admin_stub):
def random_peer_host():
yield "random_host_name_{}".format(uuid.uuid1())
@pytest.fixture
def random_peer_hash(server_stub, admin_stub, random_peer_host):
# Create a new peer
create_peer_response = admin_stub.CreatePeer(
squeak_admin_pb2.CreatePeerRequest(
peer_name="fake_peer_name",
host="fake_host",
peer_name=random_peer_host,
host=random_peer_host,
port=1234,
)
)
peer_id = create_peer_response.peer_id
yield peer_id
peer_hash = create_peer_response.peer_hash
yield peer_hash
@pytest.fixture
def connected_peer_hash(other_admin_stub, admin_stub):
# Add the main node as a peer
create_peer_response = other_admin_stub.CreatePeer(
squeak_admin_pb2.CreatePeerRequest(
peer_name="test_peer",
host="squeaknode",
port=8774,
)
)
peer_hash = create_peer_response.peer_hash
# Set the peer to be downloading
other_admin_stub.SetPeerDownloading(
squeak_admin_pb2.SetPeerDownloadingRequest(
peer_hash=peer_hash,
downloading=True,
)
)
yield peer_hash
# Delete the peer
other_admin_stub.DeletePeer(
squeak_admin_pb2.DeletePeerRequest(
peer_hash=peer_hash,
)
)
@pytest.fixture

View file

@ -713,12 +713,12 @@ def test_create_peer(server_stub, admin_stub):
port=1234,
)
)
peer_id = create_peer_response.peer_id
peer_hash = create_peer_response.peer_hash
# Get the new peer
get_peer_response = admin_stub.GetPeer(
squeak_admin_pb2.GetPeerRequest(
peer_id=peer_id,
peer_hash=peer_hash,
)
)
assert get_peer_response.squeak_peer.host == "fake_host"
@ -745,11 +745,11 @@ def test_create_peer_empty_name(server_stub, admin_stub):
assert "Peer name cannot be empty." in str(excinfo.value)
def test_set_peer_downloading(server_stub, admin_stub, peer_id):
def test_set_peer_downloading(server_stub, admin_stub, random_peer_hash):
# Get the peer
get_peer_response = admin_stub.GetPeer(
squeak_admin_pb2.GetPeerRequest(
peer_id=peer_id,
peer_hash=random_peer_hash,
)
)
assert not get_peer_response.squeak_peer.downloading
@ -757,7 +757,7 @@ def test_set_peer_downloading(server_stub, admin_stub, peer_id):
# Set the peer to be downloading
admin_stub.SetPeerDownloading(
squeak_admin_pb2.SetPeerDownloadingRequest(
peer_id=peer_id,
peer_hash=random_peer_hash,
downloading=True,
)
)
@ -765,17 +765,17 @@ def test_set_peer_downloading(server_stub, admin_stub, peer_id):
# Get the peer again
get_peer_response = admin_stub.GetPeer(
squeak_admin_pb2.GetPeerRequest(
peer_id=peer_id,
peer_hash=random_peer_hash,
)
)
assert get_peer_response.squeak_peer.downloading
def test_set_peer_uploading(server_stub, admin_stub, peer_id):
def test_set_peer_uploading(server_stub, admin_stub, random_peer_hash):
# Get the peer
get_peer_response = admin_stub.GetPeer(
squeak_admin_pb2.GetPeerRequest(
peer_id=peer_id,
peer_hash=random_peer_hash,
)
)
assert not get_peer_response.squeak_peer.uploading
@ -783,7 +783,7 @@ def test_set_peer_uploading(server_stub, admin_stub, peer_id):
# Set the peer to be uploading
admin_stub.SetPeerUploading(
squeak_admin_pb2.SetPeerUploadingRequest(
peer_id=peer_id,
peer_hash=random_peer_hash,
uploading=True,
)
)
@ -791,17 +791,17 @@ def test_set_peer_uploading(server_stub, admin_stub, peer_id):
# Get the peer again
get_peer_response = admin_stub.GetPeer(
squeak_admin_pb2.GetPeerRequest(
peer_id=peer_id,
peer_hash=random_peer_hash,
)
)
assert get_peer_response.squeak_peer.uploading
def test_rename_peer(server_stub, admin_stub, peer_id, random_name):
def test_rename_peer(server_stub, admin_stub, random_peer_hash, random_name):
# Rename the peer
admin_stub.RenamePeer(
squeak_admin_pb2.RenamePeerRequest(
peer_id=peer_id,
peer_hash=random_peer_hash,
peer_name=random_name,
)
)
@ -809,17 +809,17 @@ def test_rename_peer(server_stub, admin_stub, peer_id, random_name):
# Get the peer again
get_peer_response = admin_stub.GetPeer(
squeak_admin_pb2.GetPeerRequest(
peer_id=peer_id,
peer_hash=random_peer_hash,
)
)
assert get_peer_response.squeak_peer.peer_name == random_name
def test_delete_peer(server_stub, admin_stub, peer_id):
def test_delete_peer(server_stub, admin_stub, random_peer_hash):
# Delete the peer
admin_stub.DeletePeer(
squeak_admin_pb2.DeletePeerRequest(
peer_id=peer_id,
peer_hash=random_peer_hash,
)
)
@ -827,7 +827,7 @@ def test_delete_peer(server_stub, admin_stub, peer_id):
with pytest.raises(Exception) as excinfo:
admin_stub.GetPeer(
squeak_admin_pb2.GetPeerRequest(
peer_id=peer_id,
peer_hash=random_peer_hash,
)
)
assert "Peer not found." in str(excinfo.value)
@ -1025,6 +1025,7 @@ def test_connect_other_node(
admin_stub,
other_server_stub,
other_admin_stub,
connected_peer_hash,
lightning_client,
signing_profile_address,
saved_squeak_hash,
@ -1035,24 +1036,6 @@ def test_connect_other_node(
)
assert len(get_timeline_squeak_display_response.squeak_display_entries) == 0
# Add the main node as a peer
create_peer_response = other_admin_stub.CreatePeer(
squeak_admin_pb2.CreatePeerRequest(
peer_name="test_peer",
host="squeaknode",
port=8774,
)
)
peer_id = create_peer_response.peer_id
# Set the peer to be downloading
other_admin_stub.SetPeerDownloading(
squeak_admin_pb2.SetPeerDownloadingRequest(
peer_id=peer_id,
downloading=True,
)
)
# Get the squeak profile
get_squeak_profile_response = admin_stub.GetSqueakProfile(
squeak_admin_pb2.GetSqueakProfileRequest(
@ -1096,7 +1079,7 @@ def test_connect_other_node(
)
time.sleep(5)
# print(sync_squeaks_response)
# assert peer_id in sync_squeaks_response.sync_result.completed_peer_ids
# assert peer_hash in sync_squeaks_response.sync_result.completed_peer_hashs
# Get the sent offers from the seller node
get_sent_offers_response = admin_stub.GetSentOffers(
@ -1232,29 +1215,12 @@ def test_download_single_squeak(
admin_stub,
other_server_stub,
other_admin_stub,
connected_peer_hash,
lightning_client,
signing_profile_address,
saved_squeak_hash,
):
# Add the main node as a peer
create_peer_response = other_admin_stub.CreatePeer(
squeak_admin_pb2.CreatePeerRequest(
peer_name="test_peer",
host="squeaknode",
port=8774,
)
)
peer_id = create_peer_response.peer_id
# Set the peer to be downloading
other_admin_stub.SetPeerDownloading(
squeak_admin_pb2.SetPeerDownloadingRequest(
peer_id=peer_id,
downloading=True,
)
)
# Get the squeak profile
get_squeak_profile_response = admin_stub.GetSqueakProfile(
squeak_admin_pb2.GetSqueakProfileRequest(
@ -1316,7 +1282,7 @@ def test_download_single_squeak(
)
time.sleep(10)
print(sync_squeak_response)
# assert peer_id in sync_squeak_response.sync_result.completed_peer_ids
# assert peer_hash in sync_squeak_response.sync_result.completed_peer_hashs
# Get the squeak display item
get_squeak_display_response = other_admin_stub.GetSqueakDisplay(

View file

@ -514,13 +514,13 @@ message CreatePeerRequest {
}
message CreatePeerReply {
/// The peer id
int32 peer_id = 1;
/// The peer hash
string peer_hash = 1;
}
message GetPeerRequest {
/// The peer id
int32 peer_id = 1;
/// The peer hash
string peer_hash = 1;
}
message GetPeerReply {
@ -537,8 +537,8 @@ message GetPeersReply {
}
message SqueakPeer {
/// The peer id
int32 peer_id = 1;
/// The peer hash
string peer_hash = 1;
/// The peer name
string peer_name = 2;
@ -557,8 +557,8 @@ message SqueakPeer {
}
message SetPeerDownloadingRequest {
/// The peer id
int32 peer_id = 1;
/// The peer hash
string peer_hash = 1;
/// Downloading
bool downloading = 2;
@ -568,8 +568,8 @@ message SetPeerDownloadingReply {
}
message SetPeerUploadingRequest {
/// The peer id
int32 peer_id = 1;
/// The peer hash
string peer_hash = 1;
/// Uploading
bool uploading = 2;
@ -579,8 +579,8 @@ message SetPeerUploadingReply {
}
message RenamePeerRequest {
/// The peer id
int32 peer_id = 1;
/// The peer hash
string peer_hash = 1;
/// Name of the peer
string peer_name = 2;
@ -590,8 +590,8 @@ message RenamePeerReply {
}
message DeletePeerRequest {
/// The peer id
int32 peer_id = 1;
/// The peer hash
string peer_hash = 1;
}
message DeletePeerReply {
@ -700,7 +700,7 @@ message SentPayment {
/// Has peer
bool has_peer = 2;
/// The peer id
/// The peer hash
SqueakPeer peer = 3;
/// The squeak hash

View file

@ -68,10 +68,8 @@ def squeak_profile_to_message(squeak_profile: SqueakProfile) -> squeak_admin_pb2
def squeak_peer_to_message(squeak_peer: SqueakPeer) -> squeak_admin_pb2.SqueakPeer:
if squeak_peer.peer_id is None:
raise Exception("Peer id cannot be None.")
return squeak_admin_pb2.SqueakPeer(
peer_id=squeak_peer.peer_id,
peer_hash=squeak_peer.peer_hash.hex(),
peer_name=squeak_peer.peer_name,
host=squeak_peer.host,
port=squeak_peer.port,

View file

@ -387,19 +387,21 @@ class SqueakAdminServerHandler(object):
port,
)
)
peer_id = self.squeak_controller.create_peer(
peer_hash = self.squeak_controller.create_peer(
peer_name,
host,
port,
)
return squeak_admin_pb2.CreatePeerReply(
peer_id=peer_id,
peer_hash=peer_hash.hex(),
)
def handle_get_squeak_peer(self, request):
peer_id = request.peer_id
logger.info("Handle get squeak peer with id: {}".format(peer_id))
squeak_peer = self.squeak_controller.get_peer(peer_id)
peer_hash_str = request.peer_hash
peer_hash = bytes.fromhex(peer_hash_str)
logger.info(
"Handle get squeak peer with hash: {}".format(peer_hash_str))
squeak_peer = self.squeak_controller.get_peer(peer_hash)
if squeak_peer is None:
raise Exception("Peer not found.")
squeak_peer_msg = squeak_peer_to_message(squeak_peer)
@ -418,45 +420,50 @@ class SqueakAdminServerHandler(object):
)
def handle_set_squeak_peer_downloading(self, request):
peer_id = request.peer_id
peer_hash_str = request.peer_hash
peer_hash = bytes.fromhex(peer_hash_str)
downloading = request.downloading
logger.info(
"Handle set peer downloading with peer id: {}, downloading: {}".format(
peer_id,
peer_hash,
downloading,
)
)
self.squeak_controller.set_peer_downloading(peer_id, downloading)
self.squeak_controller.set_peer_downloading(peer_hash, downloading)
return squeak_admin_pb2.SetPeerDownloadingReply()
def handle_rename_squeak_peer(self, request):
peer_id = request.peer_id
peer_hash_str = request.peer_hash
peer_hash = bytes.fromhex(peer_hash_str)
peer_name = request.peer_name
logger.info(
"Handle rename peer with peer id: {}, new name: {}".format(
peer_id,
peer_hash_str,
peer_name,
)
)
self.squeak_controller.rename_peer(peer_id, peer_name)
self.squeak_controller.rename_peer(peer_hash, peer_name)
return squeak_admin_pb2.RenamePeerReply()
def handle_set_squeak_peer_uploading(self, request):
peer_id = request.peer_id
peer_hash_str = request.peer_hash
peer_hash = bytes.fromhex(peer_hash_str)
uploading = request.uploading
logger.info(
"Handle set peer uploading with peer id: {}, uploading: {}".format(
peer_id,
peer_hash,
uploading,
)
)
self.squeak_controller.set_peer_uploading(peer_id, uploading)
self.squeak_controller.set_peer_uploading(peer_hash, uploading)
return squeak_admin_pb2.SetPeerUploadingReply()
def handle_delete_squeak_peer(self, request):
peer_id = request.peer_id
logger.info("Handle delete squeak peer with id: {}".format(peer_id))
self.squeak_controller.delete_peer(peer_id)
peer_hash_str = request.peer_hash
peer_hash = bytes.fromhex(peer_hash_str)
logger.info(
"Handle delete squeak peer with hash: {}".format(peer_hash_str))
self.squeak_controller.delete_peer(peer_hash)
return squeak_admin_pb2.DeletePeerReply()
def handle_get_buy_offers(self, request):

View file

@ -16,4 +16,4 @@ class ReceivedOffer(NamedTuple):
destination: str
node_host: str
node_port: int
peer_id: int
peer_hash: bytes

View file

@ -7,7 +7,7 @@ class SentPayment(NamedTuple):
"""Represents a payment made by a buyer."""
sent_payment_id: Optional[int]
created: Optional[datetime]
peer_id: int
peer_hash: bytes
squeak_hash: bytes
payment_hash: bytes
secret_key: bytes

View file

@ -13,6 +13,7 @@ from squeaknode.core.received_offer import ReceivedOffer
from squeaknode.core.received_payment_summary import ReceivedPaymentSummary
from squeaknode.core.sent_offer import SentOffer
from squeaknode.core.sent_payment_summary import SentPaymentSummary
from squeaknode.core.squeak_peer import make_squeak_peer
from squeaknode.core.squeak_peer import SqueakPeer
from squeaknode.core.squeak_profile import SqueakProfile
from squeaknode.core.util import get_hash
@ -236,8 +237,7 @@ class SqueakController:
"Peer name cannot be empty.",
)
port = port or self.config.core.default_peer_rpc_port
squeak_peer = SqueakPeer(
peer_id=None,
squeak_peer = make_squeak_peer(
peer_name=peer_name,
host=host,
port=port,
@ -246,8 +246,8 @@ class SqueakController:
)
return self.squeak_db.insert_peer(squeak_peer)
def get_peer(self, peer_id: int):
return self.squeak_db.get_peer(peer_id)
def get_peer(self, peer_hash: bytes):
return self.squeak_db.get_peer(peer_hash)
def get_peers(self):
return self.squeak_db.get_peers()
@ -258,17 +258,17 @@ class SqueakController:
def get_uploading_peers(self):
return self.squeak_db.get_uploading_peers()
def set_peer_downloading(self, peer_id: int, downloading: bool):
self.squeak_db.set_peer_downloading(peer_id, downloading)
def set_peer_downloading(self, peer_hash: bytes, downloading: bool):
self.squeak_db.set_peer_downloading(peer_hash, downloading)
def set_peer_uploading(self, peer_id: int, uploading: bool):
self.squeak_db.set_peer_uploading(peer_id, uploading)
def set_peer_uploading(self, peer_hash: bytes, uploading: bool):
self.squeak_db.set_peer_uploading(peer_hash, uploading)
def rename_peer(self, peer_id: int, peer_name: str):
self.squeak_db.set_peer_name(peer_id, peer_name)
def rename_peer(self, peer_hash: bytes, peer_name: str):
self.squeak_db.set_peer_name(peer_hash, peer_name)
def delete_peer(self, peer_id: int):
self.squeak_db.delete_peer(peer_id)
def delete_peer(self, peer_hash: bytes):
self.squeak_db.delete_peer(peer_hash)
def get_buy_offers_with_peer(self, squeak_hash: bytes):
return self.squeak_db.get_offers_with_peer(squeak_hash)
@ -422,12 +422,12 @@ class SqueakController:
include_locked=True,
)
def lookup_squeaks_needing_offer(self, addresses: List[str], min_block, max_block, peer_id):
def lookup_squeaks_needing_offer(self, addresses: List[str], min_block, max_block, peer_hash: bytes):
return self.squeak_db.lookup_squeaks_needing_offer(
addresses,
min_block,
max_block,
peer_id,
peer_hash,
)
def save_offer(self, received_offer: ReceivedOffer):

View file

@ -186,8 +186,6 @@ class SqueakCore:
Returns:
ReceivedOffer: A record of the details of the offer for the buyer.
"""
if peer.peer_id is None:
raise Exception("Peer must have a non-null peer_id.")
# Get the squeak hash
squeak_hash = get_hash(squeak)
# TODO: check if squeak hash matches squeak_hash in buy_offer.
@ -224,7 +222,7 @@ class SqueakCore:
destination=destination,
node_host=node_host,
node_port=node_port,
peer_id=peer.peer_id,
peer_hash=peer.peer_hash,
)
def pay_offer(self, received_offer: ReceivedOffer) -> SentPayment:
@ -255,7 +253,7 @@ class SqueakCore:
return SentPayment(
sent_payment_id=None,
created=None,
peer_id=received_offer.peer_id,
peer_hash=received_offer.peer_hash,
squeak_hash=received_offer.squeak_hash,
payment_hash=received_offer.payment_hash,
secret_key=secret_key,

View file

@ -1,12 +1,30 @@
from typing import NamedTuple
from typing import Optional
from squeaknode.core.util import get_peer_hash
class SqueakPeer(NamedTuple):
"""Represents another node in the network."""
peer_id: Optional[int]
peer_hash: bytes
peer_name: str
host: str
port: int
uploading: bool
downloading: bool
def make_squeak_peer(
peer_name: str,
host: str,
port: int,
uploading: bool,
downloading: bool,
):
return SqueakPeer(
get_peer_hash(host, port),
peer_name,
host,
port,
uploading,
downloading,
)

View file

@ -1,4 +1,5 @@
import os
from hashlib import sha256
from bitcoin.base58 import Base58ChecksumError
from bitcoin.wallet import CBitcoinAddressError
@ -58,3 +59,8 @@ def is_address_valid(address: str) -> bool:
except (Base58ChecksumError, CBitcoinAddressError):
return False
return True
def get_peer_hash(host: str, port: int) -> bytes:
host_port_str = "{}:{}".format(host, port)
return sha256(host_port_str.encode()).digest()

View file

@ -0,0 +1,87 @@
"""Use peer hash for peer primary key
Revision ID: 9eb4ba6da999
Revises: d1cf733279c4
Create Date: 2021-02-02 22:14:57.682676
"""
import sqlalchemy as sa
from alembic import op
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy.sql import column
from sqlalchemy.sql import table
from squeaknode.core.util import get_peer_hash
# revision identifiers, used by Alembic.
revision = '9eb4ba6da999'
down_revision = 'd1cf733279c4'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
# Create the peer_hash column
with op.batch_alter_table('peer', schema=None) as batch_op:
batch_op.add_column(
sa.Column('peer_hash', sa.String(length=64), nullable=False, server_default=''))
with op.batch_alter_table('received_offer', schema=None) as batch_op:
batch_op.add_column(
sa.Column('peer_hash', sa.String(length=64), nullable=False, server_default=''))
with op.batch_alter_table('sent_payment', schema=None) as batch_op:
batch_op.add_column(
sa.Column('peer_hash', sa.String(length=64), nullable=False, server_default=''))
peers = table(
"peer",
column("peer_hash", String(64)),
column("server_host", String),
column("server_port", Integer),
)
# Set the peer_hash column in the peers table.
op.execute(
peers.update().
values(
peer_hash=get_peer_hash(
peers.c.server_host,
peers.c.server_port,
).hex(),
)
)
# Delete peer_id and create the primary key on peer_hash
with op.batch_alter_table('peer', schema=None) as batch_op:
batch_op.drop_column('peer_id')
batch_op.create_primary_key(
"pk_peer", ["peer_hash"]
)
with op.batch_alter_table('received_offer', schema=None) as batch_op:
batch_op.drop_column('peer_id')
with op.batch_alter_table('sent_payment', schema=None) as batch_op:
batch_op.drop_column('peer_id')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('peer', schema=None) as batch_op:
batch_op.drop_constraint("pk_peer")
batch_op.add_column(sa.Column('peer_id', sa.INTEGER(),
nullable=False, server_default='0'))
batch_op.drop_column('peer_hash')
with op.batch_alter_table('received_offer', schema=None) as batch_op:
batch_op.add_column(sa.Column('peer_id', sa.INTEGER(),
nullable=False, server_default='0'))
batch_op.drop_column('peer_hash')
with op.batch_alter_table('sent_payment', schema=None) as batch_op:
batch_op.add_column(sa.Column('peer_id', sa.INTEGER(),
nullable=False, server_default='0'))
batch_op.drop_column('peer_hash')
# ### end Alembic commands ###

View file

@ -71,7 +71,7 @@ class Models:
self.peers = Table(
"peer",
self.metadata,
Column("peer_id", Integer, primary_key=True),
Column("peer_hash", String(64), primary_key=True),
Column("created", TZDateTime,
server_default=func.now(), nullable=False),
Column("peer_name", String),
@ -98,7 +98,7 @@ class Models:
Column("destination", String(66), nullable=False),
Column("node_host", String, nullable=False),
Column("node_port", Integer, nullable=False),
Column("peer_id", Integer, nullable=False),
Column("peer_hash", String(64), nullable=False),
)
self.sent_payments = Table(
@ -107,7 +107,7 @@ class Models:
Column("sent_payment_id", Integer, primary_key=True),
Column("created", TZDateTime,
server_default=func.now(), nullable=False),
Column("peer_id", Integer, nullable=False),
Column("peer_hash", String(64), nullable=False),
Column("squeak_hash", String(64), nullable=False),
Column("payment_hash", String(64), nullable=False),
Column("secret_key", String(64), nullable=False),

View file

@ -395,7 +395,7 @@ class SqueakDb:
addresses: List[str],
min_block: int,
max_block: int,
peer_id: int,
peer_hash: bytes,
include_unverified: bool = False
) -> List[bytes]:
""" Lookup squeaks that are locked and don't have an offer. """
@ -409,7 +409,7 @@ class SqueakDb:
self.received_offers,
and_(
self.received_offers.c.squeak_hash == self.squeaks.c.hash,
self.received_offers.c.peer_id == peer_id,
self.received_offers.c.peer_hash == peer_hash.hex(),
),
)
)
@ -435,7 +435,7 @@ class SqueakDb:
# SELECT hash FROM squeak
# LEFT JOIN offer
# ON squeak.hash=offer.squeak_hash
# AND offer.peer_id=%s
# AND offer.peer_hash=%s
# WHERE author_address IN %s
# AND n_block_height >= %s
# AND n_block_height <= %s
@ -452,7 +452,7 @@ class SqueakDb:
# # mogrify to debug.
# # logger.info(curs.mogrify(sql, (addresses_tuple, min_block, max_block)))
# curs.execute(
# sql, (peer_id, addresses_tuple, min_block, max_block, include_unverified)
# sql, (peer_hash, addresses_tuple, min_block, max_block, include_unverified)
# )
# rows = curs.fetchall()
# hashes = [bytes.fromhex(row["hash"]) for row in rows]
@ -683,9 +683,10 @@ class SqueakDb:
# with self.get_cursor() as curs:
# curs.execute(sql, (squeak_hash_str,))
def insert_peer(self, squeak_peer: SqueakPeer) -> int:
def insert_peer(self, squeak_peer: SqueakPeer) -> bytes:
""" Insert a new squeak peer. """
ins = self.peers.insert().values(
peer_hash=squeak_peer.peer_hash.hex(),
peer_name=squeak_peer.peer_name,
server_host=squeak_peer.host,
server_port=squeak_peer.port,
@ -694,12 +695,14 @@ class SqueakDb:
)
with self.get_connection() as connection:
res = connection.execute(ins)
id = res.inserted_primary_key[0]
return id
peer_hash_str = res.inserted_primary_key[0]
return bytes.fromhex(peer_hash_str)
def get_peer(self, peer_id: int) -> Optional[SqueakPeer]:
def get_peer(self, peer_hash: bytes) -> Optional[SqueakPeer]:
""" Get a peer. """
s = select([self.peers]).where(self.peers.c.peer_id == peer_id)
s = select([self.peers]).where(
self.peers.c.peer_hash == peer_hash.hex()
)
with self.get_connection() as connection:
result = connection.execute(s)
row = result.fetchone()
@ -734,39 +737,40 @@ class SqueakDb:
peers = [self._parse_squeak_peer(row) for row in rows]
return peers
def set_peer_downloading(self, peer_id: int, downloading: bool):
def set_peer_downloading(self, peer_hash: bytes, downloading: bool):
""" Set a peer is downloading. """
stmt = (
self.peers.update()
.where(self.peers.c.peer_id == peer_id)
.where(self.peers.c.peer_hash == peer_hash.hex())
.values(downloading=downloading)
)
with self.get_connection() as connection:
connection.execute(stmt)
def set_peer_uploading(self, peer_id: int, uploading: bool):
def set_peer_uploading(self, peer_hash: bytes, uploading: bool):
""" Set a peer is uploading. """
stmt = (
self.peers.update()
.where(self.peers.c.peer_id == peer_id)
.where(self.peers.c.peer_hash == peer_hash.hex())
.values(uploading=uploading)
)
with self.get_connection() as connection:
connection.execute(stmt)
def set_peer_name(self, peer_id: int, peer_name: str):
def set_peer_name(self, peer_hash: bytes, peer_name: str):
""" Set a peer name. """
stmt = (
self.peers.update()
.where(self.peers.c.peer_id == peer_id)
.where(self.peers.c.peer_hash == peer_hash.hex())
.values(peer_name=peer_name)
)
with self.get_connection() as connection:
connection.execute(stmt)
def delete_peer(self, peer_id: int):
def delete_peer(self, peer_hash: bytes):
""" Delete a peer. """
delete_peer_stmt = self.peers.delete().where(self.peers.c.peer_id == peer_id)
delete_peer_stmt = self.peers.delete().where(
self.peers.c.peer_hash == peer_hash.hex())
with self.get_connection() as connection:
connection.execute(delete_peer_stmt)
@ -784,7 +788,7 @@ class SqueakDb:
destination=received_offer.destination,
node_host=received_offer.node_host,
node_port=received_offer.node_port,
peer_id=received_offer.peer_id,
peer_hash=received_offer.peer_hash.hex(),
)
with self.get_connection() as connection:
res = connection.execute(ins)
@ -808,7 +812,7 @@ class SqueakDb:
.select_from(
self.received_offers.outerjoin(
self.peers,
self.peers.c.peer_id == self.received_offers.c.peer_id,
self.peers.c.peer_hash == self.received_offers.c.peer_hash,
)
)
.where(self.received_offers.c.squeak_hash == squeak_hash.hex())
@ -827,7 +831,7 @@ class SqueakDb:
.select_from(
self.received_offers.outerjoin(
self.peers,
self.peers.c.peer_id == self.received_offers.c.peer_id,
self.peers.c.peer_hash == self.received_offers.c.peer_hash,
)
)
.where(self.received_offers.c.received_offer_id == received_offer_id)
@ -881,7 +885,7 @@ class SqueakDb:
def insert_sent_payment(self, sent_payment: SentPayment):
""" Insert a new sent payment. """
ins = self.sent_payments.insert().values(
peer_id=sent_payment.peer_id,
peer_hash=sent_payment.peer_hash.hex(),
squeak_hash=sent_payment.squeak_hash.hex(),
payment_hash=sent_payment.payment_hash.hex(),
secret_key=sent_payment.secret_key.hex(),
@ -901,7 +905,7 @@ class SqueakDb:
.select_from(
self.sent_payments.outerjoin(
self.peers,
self.peers.c.peer_id == self.sent_payments.c.peer_id,
self.peers.c.peer_hash == self.sent_payments.c.peer_hash,
)
)
.order_by(
@ -922,7 +926,7 @@ class SqueakDb:
.select_from(
self.sent_payments.outerjoin(
self.peers,
self.peers.c.peer_id == self.sent_payments.c.peer_id,
self.peers.c.peer_hash == self.sent_payments.c.peer_hash,
)
)
.where(self.sent_payments.c.sent_payment_id == sent_payment_id)
@ -1128,7 +1132,7 @@ class SqueakDb:
def _parse_squeak_peer(self, row) -> SqueakPeer:
return SqueakPeer(
peer_id=row[self.peers.c.peer_id],
peer_hash=bytes.fromhex(row[self.peers.c.peer_hash]),
peer_name=row["peer_name"],
host=row["server_host"],
port=row["server_port"],
@ -1150,12 +1154,12 @@ class SqueakDb:
destination=row["destination"],
node_host=row["node_host"],
node_port=row["node_port"],
peer_id=row[self.peers.c.peer_id],
peer_hash=bytes.fromhex(row[self.received_offers.c.peer_hash]),
)
def _parse_received_offer_with_peer(self, row) -> ReceivedOfferWithPeer:
offer = self._parse_received_offer(row)
if row[self.peers.c.peer_id] is None:
if row[self.peers.c.peer_hash] is None:
peer = None
else:
peer = self._parse_squeak_peer(row)
@ -1168,7 +1172,7 @@ class SqueakDb:
return SentPayment(
sent_payment_id=row["sent_payment_id"],
created=row[self.sent_payments.c.created],
peer_id=row[self.sent_payments.c.peer_id],
peer_hash=bytes.fromhex(row[self.sent_payments.c.peer_hash]),
squeak_hash=bytes.fromhex(row["squeak_hash"]),
payment_hash=bytes.fromhex(row["payment_hash"]),
secret_key=bytes.fromhex(row["secret_key"]),
@ -1179,7 +1183,7 @@ class SqueakDb:
def _parse_sent_payment_with_peer(self, row) -> SentPaymentWithPeer:
sent_payment = self._parse_sent_payment(row)
if row[self.peers.c.peer_id] is None:
if row[self.peers.c.peer_hash] is None:
peer = None
else:
peer = self._parse_squeak_peer(row)

View file

@ -66,7 +66,7 @@ class PeerConnection:
followed_addresses,
min_block,
max_block,
self.peer.peer_id,
self.peer.peer_hash,
)
# Get hashes to get offer
hashes_to_get_offer = set(remote_hashes) & set(locked_hashes)
@ -124,7 +124,7 @@ class PeerConnection:
def _get_saved_offer(self, squeak_hash: bytes) -> Optional[ReceivedOfferWithPeer]:
offers = self.squeak_controller.get_buy_offers_with_peer(squeak_hash)
for offer_with_peer in offers:
if offer_with_peer.received_offer.peer_id == self.peer.peer_id:
if offer_with_peer.received_offer.peer_hash == self.peer.peer_hash:
return offer_with_peer
return None

View file

@ -6,6 +6,7 @@ from squeaknode.core.lightning_address import LightningAddressHostPort
from squeaknode.core.squeak_controller import SqueakController
from squeaknode.core.squeak_core import SqueakCore
from squeaknode.core.squeak_peer import SqueakPeer
from squeaknode.core.util import get_peer_hash
from squeaknode.db.squeak_db import SqueakDb
from squeaknode.node.squeak_rate_limiter import SqueakRateLimiter
from squeaknode.node.squeak_whitelist import SqueakWhitelist
@ -131,7 +132,7 @@ def test_create_peer(squeak_db, squeak_controller):
squeak_db.insert_peer.assert_called_with(
SqueakPeer(
peer_id=None,
peer_hash=get_peer_hash("fake_host", 5678),
peer_name="fake_peer_name",
host="fake_host",
port=5678,
@ -150,7 +151,10 @@ def test_create_peer_default_port(config, squeak_db, squeak_controller):
squeak_db.insert_peer.assert_called_with(
SqueakPeer(
peer_id=None,
peer_hash=get_peer_hash(
"fake_host",
config.core.default_peer_rpc_port,
),
peer_name="fake_peer_name",
host="fake_host",
port=config.core.default_peer_rpc_port,