<oembed><type>rich</type><version>1.0</version><title>Ethan Heilman [ARCHIVE] wrote</title><author_name>Ethan Heilman [ARCHIVE] (npub1ga…gac47)</author_name><author_url>https://yabu.me/npub1gaszwl7qd0tjmnwcaamgzzgsmzzjlvle6kz0td66pwa8z69vsxsqxgac47</author_url><provider_name>njump</provider_name><provider_url>https://yabu.me</provider_url><html>📅 Original date posted:2019-10-03&#xA;📝 Original message:&#xA;To avoid derailing the NO_INPUT conversation, I have changed the&#xA;subject to OP_CAT.&#xA;&#xA;Responding to:&#xA;&#34;&#34;&#34;&#xA;* `SIGHASH` flags attached to signatures are a misdesign, sadly&#xA;retained from the original BitCoin 0.1.0 Alpha for Windows design, on&#xA;par with:&#xA;[..]&#xA;* `OP_CAT` and `OP_MULT` and `OP_ADD` and friends&#xA;[..]&#xA;&#34;&#34;&#34;&#xA;&#xA;OP_CAT is an extremely valuable op code. I understand why it was&#xA;removed as the situation at the time with scripts was dire. However&#xA;most of the protocols I&#39;ve wanted to build on Bitcoin run into the&#xA;limitation that stack values can not be concatenated. For instance&#xA;TumbleBit would have far smaller transaction sizes if OP_CAT was&#xA;supported in Bitcoin. If it happens to me as a researcher it is&#xA;probably holding other people back as well. If I could wave a magic&#xA;wand and turn on one of the disabled op codes it would be OP_CAT.  Of&#xA;course with the change that size of each concatenated value must be 64&#xA;Bytes or less.&#xA;&#xA;&#xA;On Tue, Oct 1, 2019 at 10:04 PM ZmnSCPxj via bitcoin-dev&#xA;&lt;bitcoin-dev at lists.linuxfoundation.org&gt; wrote:&#xA;&gt;&#xA;&gt; Good morning lists,&#xA;&gt;&#xA;&gt; Let me propose the below radical idea:&#xA;&gt;&#xA;&gt; * `SIGHASH` flags attached to signatures are a misdesign, sadly retained from the original BitCoin 0.1.0 Alpha for Windows design, on par with:&#xA;&gt;   * 1 RETURN&#xA;&gt;   * higher-`nSequence` replacement&#xA;&gt;   * DER-encoded pubkeys&#xA;&gt;   * unrestricted `scriptPubKey`&#xA;&gt;   * Payee-security-paid-by-payer (i.e. lack of P2SH)&#xA;&gt;   * `OP_CAT` and `OP_MULT` and `OP_ADD` and friends&#xA;&gt;   * transaction malleability&#xA;&gt;   * probably many more&#xA;&gt;&#xA;&gt; So let me propose the more radical excision, starting with SegWit v1:&#xA;&gt;&#xA;&gt; * Remove `SIGHASH` from signatures.&#xA;&gt; * Put `SIGHASH` on public keys.&#xA;&gt;&#xA;&gt; Public keys are now encoded as either 33-bytes (implicit `SIGHASH_ALL`) or 34-bytes (`SIGHASH` byte, followed by pubkey type, followed by pubkey coordinate).&#xA;&gt; `OP_CHECKSIG` and friends then look at the *public key* to determine sighash algorithm rather than the signature.&#xA;&gt;&#xA;&gt; As we expect public keys to be indirectly committed to on every output `scriptPubKey`, this is automatically output tagging to allow particular `SIGHASH`.&#xA;&gt; However, we can then utilize the many many ways to hide public keys away until they are needed, exemplified in MAST-inside-Taproot.&#xA;&gt;&#xA;&gt; I propose also the addition of the opcode:&#xA;&gt;&#xA;&gt;     &lt;sighash&gt; &lt;pubkey&gt; OP_SETPUBKEYSIGHASH&#xA;&gt;&#xA;&gt; * `sighash` must be one byte.&#xA;&gt; * `pubkey` may be the special byte `0x1`, meaning &#34;just use the Taproot internal pubkey&#34;.&#xA;&gt; * `pubkey` may be 33-byte public key, in which case the `sighash` byte is just prepended to it.&#xA;&gt; * `pubkey` may be 34-byte public key with sighash, in which case the first byte is replaced with `sighash` byte.&#xA;&gt; * If `sighash` is `0x00` then the result is a 33-byte public key (the sighash byte is removed) i.e. `SIGHASH_ALL` implicit.&#xA;&gt;&#xA;&gt; This retains the old feature where the sighash is selected at time-of-spending rather than time-of-payment.&#xA;&gt; This is done by using the script:&#xA;&gt;&#xA;&gt;     &lt;pubkey&gt; OP_SETPUBKEYSIGHASH OP_CHECKSIG&#xA;&gt;&#xA;&gt; Then the sighash can be put in the witness stack after the signature, letting the `SIGHASH` flag be selected at time-of-signing, but only if the SCRIPT specifically is formed to do so.&#xA;&gt; This is malleability-safe as the signature still commits to the `SIGHASH` it was created for.&#xA;&gt;&#xA;&gt; However, by default, public keys will not have an attached `SIGHASH` byte, implying `SIGHASH_ALL` (and disallowing-by-default non-`SIGHASH_ALL`).&#xA;&gt;&#xA;&gt; This removes the problems with `SIGHASH_NONE` `SIGHASH_SINGLE`, as they are allowed only if the output specifically says they are allowed.&#xA;&gt;&#xA;&gt; Would this not be a superior solution?&#xA;&gt;&#xA;&gt; Regards,&#xA;&gt; ZmnSCPxj&#xA;&gt; _______________________________________________&#xA;&gt; bitcoin-dev mailing list&#xA;&gt; bitcoin-dev at lists.linuxfoundation.org&#xA;&gt; https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev</html></oembed>