Skip to content

Commit 7b15770

Browse files
committed
commander: derive port and signet magic bytes automagically
1 parent a84b7a6 commit 7b15770

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

resources/charts/bitcoincore/templates/pod.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ metadata:
88
{{- toYaml . | nindent 4 }}
99
{{- end }}
1010
chain: {{ .Values.global.chain }}
11+
P2PPort: "{{ index .Values.global .Values.global.chain "P2PPort" }}"
1112
RPCPort: "{{ index .Values.global .Values.global.chain "RPCPort" }}"
1213
ZMQTxPort: "{{ .Values.global.ZMQTxPort }}"
1314
ZMQBlockPort: "{{ .Values.global.ZMQBlockPort }}"

resources/scenarios/commander.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,12 @@
2828
CTxOut,
2929
from_binary,
3030
from_hex,
31+
hash256,
3132
ser_string,
3233
ser_uint256,
3334
tx_from_hex,
3435
)
35-
from test_framework.p2p import NetworkThread
36+
from test_framework.p2p import NetworkThread, MAGIC_BYTES
3637
from test_framework.psbt import (
3738
PSBT,
3839
PSBT_GLOBAL_UNSIGNED_TX,
@@ -94,6 +95,7 @@
9495
"tank": pod.metadata.name,
9596
"namespace": pod.metadata.namespace,
9697
"chain": pod.metadata.labels["chain"],
98+
"p2pport": int(pod.metadata.labels["P2PPort"]),
9799
"rpc_host": pod.status.pod_ip,
98100
"rpc_port": int(pod.metadata.labels["RPCPort"]),
99101
"rpc_user": "user",
@@ -263,6 +265,7 @@ def setup(self):
263265
)
264266
node.rpc_connected = True
265267
node.init_peers = int(tank["init_peers"])
268+
node.p2pport = tank['p2pport']
266269

267270
self.nodes.append(node)
268271
self.tanks[tank["tank"]] = node
@@ -295,6 +298,23 @@ def setup(self):
295298

296299
self.success = TestStatus.PASSED
297300

301+
if len(self.nodes) > 0 and self.nodes[0].chain == "signet":
302+
# There's no garuntee that any nodes are responsive
303+
# but we only need one to figure out the network magic bytes
304+
for node in self.nodes:
305+
try:
306+
# Times out after 60 seconds (!)
307+
template = node.getblocktemplate({"rules": ["segwit", "signet"]})
308+
challenge = template["signet_challenge"]
309+
challenge_bytes = bytes.fromhex(challenge)
310+
data = len(challenge_bytes).to_bytes() + challenge_bytes
311+
digest = hash256(data)
312+
MAGIC_BYTES["signet"] = digest[0:4]
313+
self.log.info(f"Got signet network magic bytes from {node.tank}: {MAGIC_BYTES['signet'].hex()}")
314+
break
315+
except Exception as e:
316+
self.log.info(f"Failed to get signet network magic bytes from {node.tank}: {e}")
317+
298318
def parse_args(self):
299319
# Only print "outer" args from parent class when using --help
300320
help_parser = argparse.ArgumentParser(usage="%(prog)s [options]")
@@ -482,7 +502,7 @@ def connect_nodes(self, a, b, *, peer_advertises_v2=None, wait_for_connect: bool
482502
to_connection = self.nodes[b]
483503
from_num_peers = 1 + len(from_connection.getpeerinfo())
484504
to_num_peers = 1 + len(to_connection.getpeerinfo())
485-
ip_port = self.nodes[b].rpchost + ":18444"
505+
ip_port = self.nodes[b].rpchost + ":" + self.nodes[b].p2pport
486506

487507
if peer_advertises_v2 is None:
488508
peer_advertises_v2 = self.options.v2transport

0 commit comments

Comments
 (0)