diff --git a/docker-bake.hcl b/docker-bake.hcl index 5e88f6372..93a51e33d 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -59,7 +59,7 @@ target "cmake-base" { inherits = ["maintained-base"] dockerfile = "./Dockerfile.dev" args = { - BUILD_ARGS = "-DBUILD_TESTS=OFF -DBUILD_GUI=OFF -DBUILD_BENCH=OFF -DBUILD_FUZZ_BINARY=OFF -DWITH_ZMQ=ON" + BUILD_ARGS = "-DBUILD_TESTS=OFF -DBUILD_GUI=OFF -DBUILD_BENCH=OFF -DBUILD_UTIL=ON -DBUILD_FUZZ_BINARY=OFF -DWITH_ZMQ=ON" } } diff --git a/resources/charts/bitcoincore/templates/pod.yaml b/resources/charts/bitcoincore/templates/pod.yaml index ea9679d2b..f7e154147 100644 --- a/resources/charts/bitcoincore/templates/pod.yaml +++ b/resources/charts/bitcoincore/templates/pod.yaml @@ -65,6 +65,8 @@ spec: {{- toYaml .Values.readinessProbe | nindent 8 }} tcpSocket: port: {{ index .Values.global .Values.global.chain "RPCPort" }} + startupProbe: + {{- toYaml .Values.startupProbe | nindent 8 }} resources: {{- toYaml .Values.resources | nindent 8 }} volumeMounts: diff --git a/resources/charts/commander/templates/rbac.yaml b/resources/charts/commander/templates/rbac.yaml index 4348f6471..d3d62b77d 100644 --- a/resources/charts/commander/templates/rbac.yaml +++ b/resources/charts/commander/templates/rbac.yaml @@ -44,7 +44,7 @@ metadata: app.kubernetes.io/name: {{ .Chart.Name }} rules: - apiGroups: [""] - resources: ["pods", "namespaces", "configmaps", "pods/log"] + resources: ["pods", "namespaces", "configmaps", "pods/log", "pods/exec"] verbs: ["get", "list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 diff --git a/resources/scenarios/commander.py b/resources/scenarios/commander.py index 067cd4cc1..e1ccba71c 100644 --- a/resources/scenarios/commander.py +++ b/resources/scenarios/commander.py @@ -7,15 +7,42 @@ import pathlib import random import signal +import struct import sys import tempfile import threading from time import sleep from kubernetes import client, config +from kubernetes.stream import stream from ln_framework.ln import CLN, LND, LNNode from test_framework.authproxy import AuthServiceProxy +from test_framework.blocktools import get_witness_script, script_BIP34_coinbase_height +from test_framework.messages import ( + CBlock, + CBlockHeader, + COutPoint, + CTransaction, + CTxIn, + CTxInWitness, + CTxOut, + from_binary, + from_hex, + ser_string, + ser_uint256, + tx_from_hex, +) from test_framework.p2p import NetworkThread +from test_framework.psbt import ( + PSBT, + PSBT_GLOBAL_UNSIGNED_TX, + PSBT_IN_FINAL_SCRIPTSIG, + PSBT_IN_FINAL_SCRIPTWITNESS, + PSBT_IN_NON_WITNESS_UTXO, + PSBT_IN_SIGHASH_TYPE, + PSBTMap, +) +from test_framework.script import CScriptOp from test_framework.test_framework import ( TMPDIR_PREFIX, BitcoinTestFramework, @@ -24,6 +51,11 @@ from test_framework.test_node import TestNode from test_framework.util import PortSeed, get_rpc_proxy +SIGNET_HEADER = b"\xec\xc7\xda\xa2" +PSBT_SIGNET_BLOCK = ( + b"\xfc\x06signetb" # proprietary PSBT global field holding the block being signed +) + NAMESPACE = None pods = client.V1PodList(items=[]) cmaps = client.V1ConfigMapList(items=[]) @@ -502,3 +534,144 @@ def connect_nodes(self, a, b, *, peer_advertises_v2=None, wait_for_connect: bool ) == to_num_peers ) + + def generatetoaddress(self, generator, n, addr, sync_fun=None, **kwargs): + if generator.chain == "regtest": + blocks = generator.generatetoaddress(n, addr, invalid_call=False, **kwargs) + sync_fun() if sync_fun else self.sync_all() + return blocks + if generator.chain == "signet": + mined_blocks = 0 + block_hashes = [] + + def bcli(method, *args, **kwargs): + return generator.__getattr__(method)(*args, **kwargs) + + while mined_blocks < n: + # gbt + tmpl = bcli("getblocktemplate", {"rules": ["signet", "segwit"]}) + # address for reward + reward_spk = bytes.fromhex(bcli("getaddressinfo", addr)["scriptPubKey"]) + # create coinbase tx + cbtx = CTransaction() + cbtx.vin = [ + CTxIn( + COutPoint(0, 0xFFFFFFFF), + script_BIP34_coinbase_height(tmpl["height"]), + 0xFFFFFFFF, + ) + ] + cbtx.vout = [CTxOut(tmpl["coinbasevalue"], reward_spk)] + cbtx.vin[0].nSequence = 2**32 - 2 + cbtx.rehash() + # assemble block + block = CBlock() + block.nVersion = tmpl["version"] + block.hashPrevBlock = int(tmpl["previousblockhash"], 16) + block.nTime = tmpl["curtime"] + if block.nTime < tmpl["mintime"]: + block.nTime = tmpl["mintime"] + block.nBits = int(tmpl["bits"], 16) + block.nNonce = 0 + block.vtx = [cbtx] + [tx_from_hex(t["data"]) for t in tmpl["transactions"]] + witnonce = 0 + witroot = block.calc_witness_merkle_root() + cbwit = CTxInWitness() + cbwit.scriptWitness.stack = [ser_uint256(witnonce)] + block.vtx[0].wit.vtxinwit = [cbwit] + block.vtx[0].vout.append(CTxOut(0, bytes(get_witness_script(witroot, witnonce)))) + # create signet txs for signing + signet_spk = tmpl["signet_challenge"] + signet_spk_bin = bytes.fromhex(signet_spk) + txs = block.vtx[:] + txs[0] = CTransaction(txs[0]) + txs[0].vout[-1].scriptPubKey += CScriptOp.encode_op_pushdata(SIGNET_HEADER) + hashes = [] + for tx in txs: + tx.rehash() + hashes.append(ser_uint256(tx.sha256)) + mroot = block.get_merkle_root(hashes) + sd = b"" + sd += struct.pack("