Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Template Provider CMake support #61

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ on:
# See: https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#push.
push:
branches:
- '**'
# Disable CI on branch pushes to forks. It will still run for pull requests.
# This prevents CI from running twice for typical pull request workflows.
- 'bitcoin/**'
- 'bitcoin-core/**'
tags-ignore:
- '**'

Expand Down
3 changes: 2 additions & 1 deletion contrib/signet/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ Adding the --ongoing parameter will then cause the signet miner to create blocks

$MINER --cli="$CLI" generate --grind-cmd="$GRIND" --address="$ADDR" --nbits=$NBITS --ongoing

For custom signets with a trivial challenge a PSBT is not necessary. The miner detects this for `OP_TRUE`.

Other options
-------------

Expand Down Expand Up @@ -80,4 +82,3 @@ These steps can instead be done explicitly:
$CLI -signet -stdin submitblock

This is intended to allow you to replace part of the pipeline for further experimentation (eg, to sign the block with a hardware wallet).

47 changes: 31 additions & 16 deletions contrib/signet/miner
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,10 @@ def do_decode_psbt(b64psbt):
return from_binary(CBlock, psbt.g.map[PSBT_SIGNET_BLOCK]), ser_string(scriptSig) + scriptWitness

def finish_block(block, signet_solution, grind_cmd):
block.vtx[0].vout[-1].scriptPubKey += CScriptOp.encode_op_pushdata(SIGNET_HEADER + signet_solution)
block.vtx[0].rehash()
block.hashMerkleRoot = block.calc_merkle_root()
if signet_solution is not None:
block.vtx[0].vout[-1].scriptPubKey += CScriptOp.encode_op_pushdata(SIGNET_HEADER + signet_solution)
block.vtx[0].rehash()
block.hashMerkleRoot = block.calc_merkle_root()
if grind_cmd is None:
block.solve()
else:
Expand All @@ -110,10 +111,12 @@ def finish_block(block, signet_solution, grind_cmd):
block.rehash()
return block

def generate_psbt(tmpl, reward_spk, *, blocktime=None):
signet_spk = tmpl["signet_challenge"]
def generate_psbt(block, signet_spk):
signet_spk_bin = bytes.fromhex(signet_spk)
signme, spendme = signet_txs(block, signet_spk_bin)
return do_createpsbt(block, signme, spendme)

def new_block(tmpl, reward_spk, blocktime=None):
cbtx = create_coinbase(height=tmpl["height"], value=tmpl["coinbasevalue"], spk=reward_spk)
cbtx.vin[0].nSequence = 2**32-2
cbtx.rehash()
Expand All @@ -135,9 +138,10 @@ def generate_psbt(tmpl, reward_spk, *, blocktime=None):
block.vtx[0].wit.vtxinwit = [cbwit]
block.vtx[0].vout.append(CTxOut(0, bytes(get_witness_script(witroot, witnonce))))

signme, spendme = signet_txs(block, signet_spk_bin)
block.vtx[0].rehash()
block.hashMerkleRoot = block.calc_merkle_root()

return do_createpsbt(block, signme, spendme)
return block

def get_reward_address(args, height):
if args.address is not None:
Expand Down Expand Up @@ -177,8 +181,10 @@ def get_reward_addr_spk(args, height):

def do_genpsbt(args):
tmpl = json.load(sys.stdin)
signet_spk = tmpl["signet_challenge"]
_, reward_spk = get_reward_addr_spk(args, tmpl["height"])
psbt = generate_psbt(tmpl, reward_spk)
block = new_block(tmpl, reward_spk)
psbt = generate_psbt(block, signet_spk)
print(psbt)

def do_solvepsbt(args):
Expand Down Expand Up @@ -407,14 +413,23 @@ def do_generate(args):
# mine block
logging.debug("Mining block delta=%s start=%s mine=%s", seconds_to_hms(mine_time-bestheader["time"]), mine_time, is_mine)
mined_blocks += 1
psbt = generate_psbt(tmpl, reward_spk, blocktime=mine_time)
input_stream = os.linesep.join([psbt, "true", "ALL"]).encode('utf8')
psbt_signed = json.loads(args.bcli("-stdin", "walletprocesspsbt", input=input_stream))
if not psbt_signed.get("complete",False):
logging.debug("Generated PSBT: %s" % (psbt,))
sys.stderr.write("PSBT signing failed\n")
return 1
block, signet_solution = do_decode_psbt(psbt_signed["psbt"])
block = new_block(tmpl, reward_spk, blocktime=mine_time)

# BIP325 allows omitting the signet commitment when scriptSig and
# scriptWitness are both empty. This is the case for trivial
# challenges such as OP_TRUE
signet_solution = None
signet_spk = tmpl["signet_challenge"]
if signet_spk != "51":
psbt = generate_psbt(block, signet_spk)
input_stream = os.linesep.join([psbt, "true", "ALL"]).encode('utf8')
psbt_signed = json.loads(args.bcli("-stdin", "walletprocesspsbt", input=input_stream))
if not psbt_signed.get("complete",False):
logging.debug("Generated PSBT: %s" % (psbt,))
sys.stderr.write("PSBT signing failed\n")
return 1
block, signet_solution = do_decode_psbt(psbt_signed["psbt"])

block = finish_block(block, signet_solution, args.grind_cmd)

# submit block
Expand Down
Loading
Loading