Skip to content

Commit d4dd14b

Browse files
ShahanaFarooquicdecker
authored andcommitted
examples: Test Python example snippets
1 parent da5661f commit d4dd14b

File tree

1 file changed

+104
-45
lines changed

1 file changed

+104
-45
lines changed
Lines changed: 104 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,126 +1,185 @@
1+
import os
2+
import sys
3+
import string
4+
from pathlib import Path
15
import bip39 # type: ignore
26
from glclient import Credentials, Signer, Scheduler # type: ignore
37
from pathlib import Path
48
from pyln import grpc as clnpb # type: ignore
59
import secrets # Make sure to use cryptographically sound randomness
610

7-
8-
# ---8<--- [start: upgrade_device_certs_to_creds]
9-
def upgrade_device_certs_to_creds(
10-
scheduler: Scheduler, signer: Signer, device_cert: bytes, device_key: bytes
11-
):
12-
device_creds = Credentials.from_parts(device_cert, device_key, "")
13-
return device_creds.upgrade(scheduler.inner, signer.inner)
14-
# ---8<--- [end: upgrade_device_certs_to_creds]
11+
GL_NOBODY_CRT = os.environ.get('GL_NOBODY_CRT')
12+
GL_NOBODY_KEY = os.environ.get('GL_NOBODY_KEY')
13+
NETWORK="regtest"
14+
TEST_NODE_DATA_DIR_1="/tmp/gltests/node1"
1515

1616

1717
def save_to_file(file_name: str, data: bytes) -> None:
18+
file_name = Path(TEST_NODE_DATA_DIR_1) / file_name
19+
os.makedirs(file_name.parent, exist_ok=True)
1820
with open(file_name, "wb") as file:
1921
file.write(data)
2022

2123

2224
def read_file(file_name: str) -> bytes:
25+
file_name = Path(TEST_NODE_DATA_DIR_1) / file_name
2326
with open(file_name, "rb") as file:
2427
return file.read()
2528

2629

30+
def upgrade_device_certs_to_creds(scheduler: Scheduler, signer: Signer, device_creds_file_path: str):
31+
# ---8<--- [start: upgrade_device_certs_to_creds]
32+
device_creds = Credentials.from_path(device_creds_file_path)
33+
upgraded_device_creds = device_creds.upgrade(scheduler.inner, signer.inner)
34+
# ---8<--- [end: upgrade_device_certs_to_creds]
35+
return upgraded_device_creds
36+
37+
2738
def create_seed() -> bytes:
2839
# ---8<--- [start: create_seed]
2940
rand = secrets.randbits(256).to_bytes(32, "big") # 32 bytes of randomness
3041

31-
# Show seed phrase to user
42+
# Seed phrase for user
3243
phrase = bip39.encode_bytes(rand)
3344

3445
seed = bip39.phrase_to_seed(phrase)[:32] # Only need the first 32 bytes
3546

3647
# Store the seed on the filesystem, or secure configuration system
37-
save_to_file("seed", seed)
48+
save_to_file("hsm_secret", seed)
3849

3950
# ---8<--- [end: create_seed]
4051
return seed
4152

42-
def register_node(seed: bytes, developer_cert_path: str, developer_key_path: str) -> None:
53+
54+
def load_developer_creds():
4355
# ---8<--- [start: dev_creds]
56+
developer_cert_path = os.environ.get('GL_NOBODY_CRT')
57+
developer_key_path = os.environ.get('GL_NOBODY_KEY')
4458
developer_cert = Path(developer_cert_path).open(mode="rb").read()
4559
developer_key = Path(developer_key_path).open(mode="rb").read()
4660

4761
developer_creds = Credentials.nobody_with(developer_cert, developer_key)
4862
# ---8<--- [end: dev_creds]
63+
return developer_creds
64+
4965

66+
def register_node(seed: bytes, developer_creds: Credentials):
5067
# ---8<--- [start: init_signer]
51-
network = "bitcoin"
52-
signer = Signer(seed, network, developer_creds)
68+
signer = Signer(seed, NETWORK, developer_creds)
5369
# ---8<--- [end: init_signer]
5470

5571
# ---8<--- [start: register_node]
56-
scheduler = Scheduler(network, developer_creds)
72+
scheduler = Scheduler(NETWORK, developer_creds)
5773

5874
# Passing in the signer is required because the client needs to prove
5975
# ownership of the `node_id`
6076
registration_response = scheduler.register(signer, invite_code=None)
6177

6278
# ---8<--- [start: device_creds]
6379
device_creds = Credentials.from_bytes(registration_response.creds)
64-
save_to_file("creds", device_creds.to_bytes())
80+
save_to_file("credentials.gfs", device_creds.to_bytes())
6581
# ---8<--- [end: device_creds]
66-
6782
# ---8<--- [end: register_node]
83+
return scheduler, device_creds, signer
6884

85+
86+
def get_node(scheduler: Scheduler, device_creds: Credentials) -> dict:
6987
# ---8<--- [start: get_node]
7088
scheduler = scheduler.authenticate(device_creds)
7189
node = scheduler.node()
7290
# ---8<--- [end: get_node]
91+
return node
7392

7493

75-
# TODO: Remove node_id from signature and add node_id to credentials
76-
def start_node(device_creds_path: str, node_id: bytes) -> None:
94+
def start_node(device_creds_file_path: str) -> None:
7795
# ---8<--- [start: start_node]
78-
network = "bitcoin"
79-
device_creds = Credentials.from_path(device_creds_path)
80-
scheduler = Scheduler(network, device_creds)
96+
device_creds = Credentials.from_path(device_creds_file_path)
97+
scheduler = Scheduler(NETWORK, device_creds)
8198

8299
node = scheduler.node()
83100
# ---8<--- [end: start_node]
84101

85102
# ---8<--- [start: list_peers]
86-
info = node.get_info()
87-
peers = node.list_peers()
103+
getinfo_response = node.get_info()
104+
listpeers_response = node.list_peers()
88105
# ---8<--- [end: list_peers]
89106

90107
# ---8<--- [start: start_signer]
91-
seed = read_file("seed")
92-
signer = Signer(seed, network, device_creds)
108+
seed = read_file("hsm_secret")
109+
signer = Signer(seed, NETWORK, device_creds)
93110

94111
signer.run_in_thread()
95112
# ---8<--- [end: start_signer]
96113

97114
# ---8<--- [start: create_invoice]
98-
node.invoice(
115+
invoice_response = node.invoice(
99116
amount_msat=clnpb.AmountOrAny(amount=clnpb.Amount(msat=10000)),
100-
description="description",
101-
label="label",
117+
description="description".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(10)),
118+
label="label".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(10)),
102119
)
103120
# ---8<--- [end: create_invoice]
121+
return getinfo_response, listpeers_response, invoice_response
104122

105123

106124
def recover_node(developer_cert: bytes, developer_key: bytes) -> None:
107125
# ---8<--- [start: recover_node]
108-
seed = read_file("seed")
109-
network = "bitcoin"
126+
seed = read_file("hsm_secret")
110127
signer_creds = Credentials.nobody_with(developer_cert, developer_key)
111-
signer = Signer(seed, network, signer_creds)
112-
113-
scheduler = Scheduler(
114-
network,
115-
signer_creds,
116-
)
117-
118-
scheduler_creds = signer_creds.upgrade(scheduler.inner, signer.inner)
119-
120-
scheduler = Scheduler(
121-
network,
122-
scheduler_creds,
123-
)
124-
125-
scheduler.recover(signer)
128+
signer = Signer(seed, NETWORK, signer_creds)
129+
scheduler = Scheduler(NETWORK, signer_creds)
130+
recover_response = scheduler.recover(signer)
126131
# ---8<--- [end: recover_node]
132+
device_creds = Credentials.from_bytes(recover_response.creds)
133+
save_to_file("credentials.gfs", device_creds.to_bytes())
134+
return scheduler, device_creds, signer
135+
136+
137+
def main():
138+
# Verify files exist
139+
if not GL_NOBODY_CRT or not os.path.exists(GL_NOBODY_CRT):
140+
print(f"Error: Developer certificate not found at {GL_NOBODY_CRT}")
141+
sys.exit(1)
142+
143+
if not GL_NOBODY_KEY or not os.path.exists(GL_NOBODY_KEY):
144+
print(f"Error: Developer key not found at {GL_NOBODY_KEY}")
145+
sys.exit(1)
146+
147+
#Create seed
148+
print("Creating seed...")
149+
seed = create_seed()
150+
151+
print("Loading developer credentials...")
152+
developer_creds = load_developer_creds()
153+
154+
# Register node
155+
print("Registering node...")
156+
scheduler, device_creds, signer = register_node(seed, developer_creds)
157+
print("Node Registered!")
158+
159+
# Get GL node
160+
print("Getting node information...")
161+
get_node(scheduler, device_creds)
162+
163+
# Print node's information to check
164+
getinfo_response, listpeers_response, invoice_response = start_node(TEST_NODE_DATA_DIR_1 + "/credentials.gfs")
165+
print("Node pubkey:", getinfo_response.id.hex())
166+
print("Peers list:", listpeers_response.peers)
167+
print("Invoice created:", invoice_response.bolt11)
168+
169+
# Upgrade Certificates
170+
print("Upgrading certs...")
171+
upgrade_device_certs_to_creds(scheduler, signer, TEST_NODE_DATA_DIR_1 + "/credentials.gfs")
172+
173+
# Recover the node
174+
print("Recovering node...")
175+
scheduler, device_creds, signer = recover_node(Path(GL_NOBODY_CRT).open(mode="rb").read(), Path(GL_NOBODY_KEY).open(mode="rb").read())
176+
print("Node Recovered!")
177+
178+
# Print node's information to check
179+
getinfo_response, listpeers_response, invoice_response = start_node(TEST_NODE_DATA_DIR_1 + "/credentials.gfs")
180+
print("Node pubkey:", getinfo_response.id.hex())
181+
print("All steps completed successfully!")
182+
183+
184+
if __name__ == "__main__":
185+
main()

0 commit comments

Comments
 (0)