Skip to content

Commit 3d36dc2

Browse files
authored
Merge pull request #757 from pinheadmz/signet-magic
commander: derive port and signet magic bytes automagically
2 parents a84b7a6 + b578fdb commit 3d36dc2

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-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: 24 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 MAGIC_BYTES, NetworkThread
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,25 @@ 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(
314+
f"Got signet network magic bytes from {node.tank}: {MAGIC_BYTES['signet'].hex()}"
315+
)
316+
break
317+
except Exception as e:
318+
self.log.info(f"Failed to get signet network magic bytes from {node.tank}: {e}")
319+
298320
def parse_args(self):
299321
# Only print "outer" args from parent class when using --help
300322
help_parser = argparse.ArgumentParser(usage="%(prog)s [options]")
@@ -482,7 +504,7 @@ def connect_nodes(self, a, b, *, peer_advertises_v2=None, wait_for_connect: bool
482504
to_connection = self.nodes[b]
483505
from_num_peers = 1 + len(from_connection.getpeerinfo())
484506
to_num_peers = 1 + len(to_connection.getpeerinfo())
485-
ip_port = self.nodes[b].rpchost + ":18444"
507+
ip_port = f"{self.nodes[b].rpchost}:{self.nodes[b].p2pport}"
486508

487509
if peer_advertises_v2 is None:
488510
peer_advertises_v2 = self.options.v2transport

0 commit comments

Comments
 (0)