Skip to content

Commit

Permalink
Updated tapscript descriptors
Browse files Browse the repository at this point in the history
Ran the following shell script to subsitute old/new descriptors in
repository. Order of sed invocations matter.

sed -i -e 's/pkhasholder/pk_hashlock_delay/g' $(git grep -l pkhasholder)
sed -i -e 's/pkhash/pk_hashlock/g' $(git grep -l pkhash)
sed -i -e 's/pkolder/pk_delay/g' $(git grep -l pkolder)
sed -i -e 's/csahasholder/csa_hashlock_delay/g' $(git grep -l \
csahasholder)
sed -i -e 's/csahash/csa_hashlock/g' $(git grep -l csahash)
sed -i -e 's/csaolder/csa_delay/g' $(git grep -l csaolder)
  • Loading branch information
jachiang authored and jnewbery committed Nov 1, 2019
1 parent 053d8f6 commit 40e4595
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 92 deletions.
60 changes: 30 additions & 30 deletions 2.3-tapscript.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -303,17 +303,17 @@
" * Witness: `[signature]`\n",
" \n",
" \n",
"* `ts(pkhash(key, 20B-hash-digest))`\n",
"* `ts(pk_hashlock(key, 20B-hash-digest))`\n",
" * Witness: `[signature]`,`[32B-preimage]`\n",
" * Hashlock: `hash160(32B-preimage)`\n",
"\n",
"\n",
"* `ts(pkolder(key, delay))`\n",
"* `ts(pk_delay(key, delay))`\n",
" * Witness: `[signature]`\n",
" * Spendable after delay (with `nSequence > delay`)\n",
" \n",
" \n",
"* `ts(pkhasholder(key, 20B-hash-digest, delay))`\n",
"* `ts(pk_hashlock_delay(key, 20B-hash-digest, delay))`\n",
" * Witness: `[signature]`,`[32B-preimage]`\n",
" * Hashlock: `hash160(32B-preimage)`\n",
" * Spendable after delay (with `nSequence > delay`)"
Expand All @@ -326,9 +326,9 @@
"We also provide pay-to-pubkey tapscript constructors for for the `TapLeaf` class. \n",
"\n",
"* `TapLeaf.construct_pk(ECPubKey)`\n",
"* `TapLeaf.construct_pkhash(ECPubKey, 20B-hash-digest)`\n",
"* `TapLeaf.construct_pkolder(ECPubKey, delay)`\n",
"* `TapLeaf.construct_pkhasholder(ECPubKey, 20B-hash-digest, delay)`\n",
"* `TapLeaf.construct_pk_hashlock(ECPubKey, 20B-hash-digest)`\n",
"* `TapLeaf.construct_pk_delay(ECPubKey, delay)`\n",
"* `TapLeaf.construct_pk_hashlock_delay(ECPubKey, 20B-hash-digest, delay)`\n",
"\n",
"The descriptor string can be recalled with:\n",
"* `TapLeaf.desc`\n",
Expand All @@ -340,9 +340,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 2.3.4 Example: Generating a `pkolder` tapscript\n",
"#### 2.3.4 Example: Generating a `pk_delay` tapscript\n",
"\n",
"We construct a `pkolder` tapscript with the following locking conditions:\n",
"We construct a `pk_delay` tapscript with the following locking conditions:\n",
"\n",
"* 2-of-2 MuSig public key\n",
"* Delay of 20 blocks"
Expand All @@ -359,17 +359,17 @@
"privkey2, pubkey2 = generate_key_pair()\n",
"c_map, pk_musig = generate_musig_key([pubkey1, pubkey2])\n",
"\n",
"# Generate pkolder tapscript\n",
"pkolder_tapscript = TapLeaf()\n",
"pkolder_tapscript.construct_pkolder(pk_musig, 20)\n",
"print(\"Tapscript descriptor:\", pkolder_tapscript.desc, \"\\n\")\n",
"# Generate pk_delay tapscript\n",
"pk_delay_tapscript = TapLeaf()\n",
"pk_delay_tapscript.construct_pk_delay(pk_musig, 20)\n",
"print(\"Tapscript descriptor:\", pk_delay_tapscript.desc, \"\\n\")\n",
"\n",
"print(\"Tapscript operations:\")\n",
"for op in pkolder_tapscript.script:\n",
"for op in pk_delay_tapscript.script:\n",
" print(op.hex()) if isinstance(op, bytes) else print(op)\n",
"\n",
"print(\"\\nSatisfying witness elements:\")\n",
"for element, value in pkolder_tapscript.sat:\n",
"for element, value in pk_delay_tapscript.sat:\n",
" print(\"{}, {}\".format(element, value.hex()))"
]
},
Expand All @@ -387,18 +387,18 @@
" \n",
"\n",
"\n",
"* `ts(csahash(k, [key0, key1, ...], hash, time))`\n",
"* `ts(csa_hashlock(k, [key0, key1, ...], hash, time))`\n",
" * Witness: `[signature], [signature], ..., [32B pre-image]`\n",
" * Hashlock: `hash160(32B-preimage)`\n",
"\n",
"\n",
"\n",
"* `ts(csaolder(k, [key0, key1, ...], hash, time))`\n",
"* `ts(csa_delay(k, [key0, key1, ...], hash, time))`\n",
" * Witness: `[signature], [signature], ...`\n",
" * Spendable after delay (with `nSequence > delay`)\n",
"\n",
"\n",
"* `ts(csahasholder(k, [key0, key1, ...], hash, time))`\n",
"* `ts(csa_hashlock_delay(k, [key0, key1, ...], hash, time))`\n",
" * Witness: `[signature], [signature], ..., [32B pre-image]`\n",
" * Hashlock: `hash160(32B-preimage)`\n",
" * Spendable after delay (with `nSequence > delay`)"
Expand All @@ -411,9 +411,9 @@
"We also provide checksigadd tapscript constructors for for the `TapLeaf` class. \n",
"\n",
"* `TapLeaf.construct_csa(k, [ECPubKey, ECPubKey, ...])`\n",
"* `TapLeaf.construct_csahash(k, [ECPubKey, ECPubKey, ...], 20B-hash-digest)`\n",
"* `TapLeaf.construct_csaolder(k, [ECPubKey, ECPubKey, ...], delay)`\n",
"* `TapLeaf.construct_csahasholder(k, [ECPubKey, ECPubKey, ...], 20B-hash-digest, delay)`\n",
"* `TapLeaf.construct_csa_hashlock(k, [ECPubKey, ECPubKey, ...], 20B-hash-digest)`\n",
"* `TapLeaf.construct_csa_delay(k, [ECPubKey, ECPubKey, ...], delay)`\n",
"* `TapLeaf.construct_csa_hashlock_delay(k, [ECPubKey, ECPubKey, ...], 20B-hash-digest, delay)`\n",
"\n",
"**Note:** Any single public key in CSA tapscripts can be generated with multi-party schemes such as MuSig."
]
Expand All @@ -422,9 +422,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 2.3.5 _Programming Exercise:_ Generate a 2-of-2 `csahasholder` tapscript\n",
"#### 2.3.5 _Programming Exercise:_ Generate a 2-of-2 `csa_hashlock_delay` tapscript\n",
"\n",
"Construct a `csahasholder` tapscript with the following locking conditions:\n",
"Construct a `csa_hashlock_delay` tapscript with the following locking conditions:\n",
"\n",
"* 2-of-2 public keys\n",
"* `OP_HASH160` hashlock with the preimage `sha256(b'secret')`\n",
Expand Down Expand Up @@ -453,15 +453,15 @@
"delay = # TODO: implement\n",
"\n",
"# Construct tapscript\n",
"csahasholder_tapscript = # TODO: implement\n",
"print(\"Descriptor:\", csahasholder_tapscript.desc, \"\\n\")\n",
"csa_hashlock_delay_tapscript = # TODO: implement\n",
"print(\"Descriptor:\", csa_hashlock_delay_tapscript.desc, \"\\n\")\n",
"\n",
"print(\"Tapscript operations:\")\n",
"for op in csahasholder_tapscript.script:\n",
"for op in csa_hashlock_delay_tapscript.script:\n",
" print(op.hex()) if isinstance(op, bytes) else print(op)\n",
"\n",
"print(\"\\nSatisfying witness elements:\")\n",
"for element, value in csahasholder_tapscript.sat:\n",
"for element, value in csa_hashlock_delay_tapscript.sat:\n",
" print(\"{}, {}\".format(element, value.hex()))"
]
},
Expand Down Expand Up @@ -505,7 +505,7 @@
"\n",
"* Use the `tagged_hash()` function to compute a tagged hash.\n",
"* Generate an internal public key.\n",
"* Compute the taptweak from a single `csahasholder_tapscript` commitment."
"* Compute the taptweak from a single `csa_hashlock_delay_tapscript` commitment."
]
},
{
Expand Down Expand Up @@ -540,7 +540,7 @@
"metadata": {},
"outputs": [],
"source": [
"taptree = TapTree(key=pubkey_internal, root=csahasholder_tapscript)\n",
"taptree = TapTree(key=pubkey_internal, root=csa_hashlock_delay_tapscript)\n",
"segwit_v1_script, tap_tweak_constructed, control_map = taptree.construct()\n",
"\n",
"assert taptweak == tap_tweak_constructed\n",
Expand Down Expand Up @@ -574,7 +574,7 @@
"source": [
"#### Example 2.3.8: Generate a single tapscript segwit v1 address\n",
"\n",
"In this example, we construct segwit v1 output for spending along the single script path. We will reuse the previously generated segwit v1 witness program which has the `csahasholder` tapscript committed to it, and encode it to a bech32 address."
"In this example, we construct segwit v1 output for spending along the single script path. We will reuse the previously generated segwit v1 witness program which has the `csa_hashlock_delay` tapscript committed to it, and encode it to a bech32 address."
]
},
{
Expand Down Expand Up @@ -684,7 +684,7 @@
"source": [
"#### _Programming Exercise 2.3.12:_ Add the witness and test acceptance of the transaction\n",
"\n",
"Remember to revisit the satisfying witness elements for `csahasholder_tapscript` constructed in exercise 2.3.5:\n",
"Remember to revisit the satisfying witness elements for `csa_hashlock_delay_tapscript` constructed in exercise 2.3.5:\n",
"* Preimage\n",
"* Signature for pubkey2\n",
"* Signature for pubkey1\n",
Expand Down
10 changes: 5 additions & 5 deletions 3.1-degrading-multisig-case-study.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -149,18 +149,18 @@
"outputs": [],
"source": [
"# Tapscripts - 2 main keys & 1 backup key\n",
"# Use construct_csaolder() to construct the tapscript\n",
"# Use construct_csa_delay() to construct the tapscript\n",
"tapscript_2a, tapscript_2b, ... = # TODO: implement\n",
"delay = # TODO: implement\n",
"tapscript_2a.construct_csaolder(... # TODO: implement\n",
"tapscript_2b.construct_csaolder(... # TODO: implement\n",
"tapscript_2a.construct_csa_delay(... # TODO: implement\n",
"tapscript_2b.construct_csa_delay(... # TODO: implement\n",
"... # TODO: implement\n",
"\n",
"# Tapscripts - 1 main keys & 2 backup keys\n",
"tapscript_3a, tapscript_3b, ... # TODO: implement\n",
"long_delay = # TODO: implement\n",
"tapscript_3a.construct_csaolder(... # TODO: implement\n",
"tapscript_3b.construct_csaolder(... # TODO: implement\n",
"tapscript_3a.construct_csa_delay(... # TODO: implement\n",
"tapscript_3b.construct_csa_delay(... # TODO: implement\n",
"... # TODO: implement\n",
"\n",
"# Set list of backup tapscripts\n",
Expand Down
18 changes: 9 additions & 9 deletions solutions/2.3-tapscript-solutions.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 2.3.5 _Programming Exercise:_ Generate a 2-of-2 `csahasholder` tapscript"
"#### 2.3.5 _Programming Exercise:_ Generate a 2-of-2 `csa_hashlock_delay` tapscript"
]
},
{
Expand All @@ -28,16 +28,16 @@
"delay = 20\n",
"\n",
"# Construct tapscript\n",
"csahasholder_tapscript = TapLeaf()\n",
"csahasholder_tapscript.construct_csahasholder(2, [pubkey1, pubkey2], digest, delay)\n",
"print(\"Descriptor:\", csahasholder_tapscript.desc, \"\\n\")\n",
"csa_hashlock_delay_tapscript = TapLeaf()\n",
"csa_hashlock_delay_tapscript.construct_csa_hashlock_delay(2, [pubkey1, pubkey2], digest, delay)\n",
"print(\"Descriptor:\", csa_hashlock_delay_tapscript.desc, \"\\n\")\n",
"\n",
"print(\"Tapscript operations:\")\n",
"for op in csahasholder_tapscript.script:\n",
"for op in csa_hashlock_delay_tapscript.script:\n",
" print(op.hex()) if isinstance(op, bytes) else print(op)\n",
"\n",
"print(\"\\nSatisfying witness elements:\")\n",
"for element, value in csahasholder_tapscript.sat:\n",
"for element, value in csa_hashlock_delay_tapscript.sat:\n",
" print(\"{}, {}\".format(element, value.hex()))"
]
},
Expand All @@ -58,7 +58,7 @@
"\n",
"# Method: ser_string(Cscript) prepends compact size.\n",
"TAPSCRIPT_VER = bytes([0xc0])\n",
"tapleaf = tagged_hash(\"TapLeaf\", TAPSCRIPT_VER + ser_string(csahasholder_tapscript.script))\n",
"tapleaf = tagged_hash(\"TapLeaf\", TAPSCRIPT_VER + ser_string(csa_hashlock_delay_tapscript.script))\n",
"taptweak = tagged_hash(\"TapTweak\", pubkey_internal.get_bytes() + tapleaf)\n",
"print(\"Your constructed taptweak is: {}.\".format(taptweak.hex()))"
]
Expand All @@ -82,7 +82,7 @@
" SIGHASH_ALL_TAPROOT,\n",
" input_index=0,\n",
" scriptpath=True,\n",
" tapscript=csahasholder_tapscript.script)\n",
" tapscript=csa_hashlock_delay_tapscript.script)\n",
"\n",
"# Sign with both privkeys\n",
"signature1 = privkey1.sign_schnorr(sighash)\n",
Expand All @@ -108,7 +108,7 @@
"# Add witness to transaction\n",
"# Tip: Witness stack for script path - [satisfying elements for tapscript] [TapLeaf.script] [controlblock]\n",
"# Tip: Controlblock for a tapscript in control_map[TapLeaf.script]\n",
"witness_elements = [preimage, signature2, signature1, csahasholder_tapscript.script, control_map[csahasholder_tapscript.script]]\n",
"witness_elements = [preimage, signature2, signature1, csa_hashlock_delay_tapscript.script, control_map[csa_hashlock_delay_tapscript.script]]\n",
"spending_tx.wit.vtxinwit.append(CTxInWitness(witness_elements))\n",
"\n",
"print(\"Spending transaction:\\n{}\\n\".format(spending_tx))\n",
Expand Down
36 changes: 18 additions & 18 deletions solutions/3.1-degrading-multisig-case-study-solutions.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,16 @@
"\n",
"1. Internalkey: `MuSig(pkA, pkB, pkC)`\n",
"2. 2 main keys & 1 backup key:\n",
" - `csaolder(3, pkA, pkB, pkD, 3 days)`\n",
" - `csaolder(3, pkA, pkC, pkD, 3 days)`\n",
" - `csaolder(3, pkB, pkC, pkD, 3 days)`\n",
" - `csaolder(3, pkA, pkB, pkE, 3 days)`\n",
" - `csaolder(3, pkA, pkC, pkE, 3 days)`\n",
" - `csaolder(3, pkB, pkC, pkE, 3 days)`\n",
" - `csa_delay(3, pkA, pkB, pkD, 3 days)`\n",
" - `csa_delay(3, pkA, pkC, pkD, 3 days)`\n",
" - `csa_delay(3, pkB, pkC, pkD, 3 days)`\n",
" - `csa_delay(3, pkA, pkB, pkE, 3 days)`\n",
" - `csa_delay(3, pkA, pkC, pkE, 3 days)`\n",
" - `csa_delay(3, pkB, pkC, pkE, 3 days)`\n",
"3. 1 main keys & 2 backup keys:\n",
" - `csaolder(3, pkA, pkD, pkE, 10 days)`\n",
" - `csaolder(3, pkB, pkD, pkE, 10 days)`\n",
" - `csaolder(3, pkC, pkD, pkE, 10 days)`\n",
" - `csa_delay(3, pkA, pkD, pkE, 10 days)`\n",
" - `csa_delay(3, pkB, pkD, pkE, 10 days)`\n",
" - `csa_delay(3, pkC, pkD, pkE, 10 days)`\n",
"\n",
"**Note: since backup keys cannot participate in MuSig, all possible key combinations are enumerated in different leaves of the Taptree."
]
Expand All @@ -60,21 +60,21 @@
"tapscript_2e = TapLeaf()\n",
"tapscript_2f = TapLeaf()\n",
"delay = 3*24*6\n",
"tapscript_2a.construct_csaolder(3, [main_pubkeyA, main_pubkeyB, backup_pubkeyD], delay)\n",
"tapscript_2b.construct_csaolder(3, [main_pubkeyA, main_pubkeyC, backup_pubkeyD], delay)\n",
"tapscript_2c.construct_csaolder(3, [main_pubkeyB, main_pubkeyC, backup_pubkeyD], delay)\n",
"tapscript_2d.construct_csaolder(3, [main_pubkeyA, main_pubkeyB, backup_pubkeyE], delay)\n",
"tapscript_2e.construct_csaolder(3, [main_pubkeyA, main_pubkeyC, backup_pubkeyE], delay)\n",
"tapscript_2f.construct_csaolder(3, [main_pubkeyB, main_pubkeyC, backup_pubkeyE], delay)\n",
"tapscript_2a.construct_csa_delay(3, [main_pubkeyA, main_pubkeyB, backup_pubkeyD], delay)\n",
"tapscript_2b.construct_csa_delay(3, [main_pubkeyA, main_pubkeyC, backup_pubkeyD], delay)\n",
"tapscript_2c.construct_csa_delay(3, [main_pubkeyB, main_pubkeyC, backup_pubkeyD], delay)\n",
"tapscript_2d.construct_csa_delay(3, [main_pubkeyA, main_pubkeyB, backup_pubkeyE], delay)\n",
"tapscript_2e.construct_csa_delay(3, [main_pubkeyA, main_pubkeyC, backup_pubkeyE], delay)\n",
"tapscript_2f.construct_csa_delay(3, [main_pubkeyB, main_pubkeyC, backup_pubkeyE], delay)\n",
"\n",
"# Tapscripts - 1 main keys & 2 backup keys\n",
"tapscript_3a = TapLeaf()\n",
"tapscript_3b = TapLeaf()\n",
"tapscript_3c = TapLeaf()\n",
"long_delay = 10*24*6\n",
"tapscript_3a.construct_csaolder(3, [main_pubkeyA, backup_pubkeyD, backup_pubkeyE], long_delay)\n",
"tapscript_3b.construct_csaolder(3, [main_pubkeyB, backup_pubkeyD, backup_pubkeyE], long_delay)\n",
"tapscript_3c.construct_csaolder(3, [main_pubkeyC, backup_pubkeyD, backup_pubkeyE], long_delay)\n",
"tapscript_3a.construct_csa_delay(3, [main_pubkeyA, backup_pubkeyD, backup_pubkeyE], long_delay)\n",
"tapscript_3b.construct_csa_delay(3, [main_pubkeyB, backup_pubkeyD, backup_pubkeyE], long_delay)\n",
"tapscript_3c.construct_csa_delay(3, [main_pubkeyC, backup_pubkeyD, backup_pubkeyE], long_delay)\n",
"\n",
"# Set list of backup tapscripts\n",
"# Suggestion: Include tapscripts with 3d timelocks first, then those with 10d timelocks\n",
Expand Down
Loading

0 comments on commit 40e4595

Please sign in to comment.