<oembed><type>rich</type><version>1.0</version><author_name>npub1g5zswf6y48f7fy90jf3tlcuwdmjn8znhzaa4vkmtxaeskca8hpss23ms3l</author_name><author_url>https://nostr.ae/npub1g5zswf6y48f7fy90jf3tlcuwdmjn8znhzaa4vkmtxaeskca8hpss23ms3l</author_url><provider_name>njump</provider_name><provider_url>https://nostr.ae</provider_url><html>📅 Original date posted:2019-10-03&#xA;📝 Original message:Good morning Ethan,&#xA;&#xA;&#xA;&gt; To avoid derailing the NO_INPUT conversation, I have changed the&#xA;&gt; subject to OP_CAT.&#xA;&gt;&#xA;&gt; Responding to:&#xA;&gt; &#34;&#34;&#34;&#xA;&gt;&#xA;&gt; -   `SIGHASH` flags attached to signatures are a misdesign, sadly&#xA;&gt;     retained from the original BitCoin 0.1.0 Alpha for Windows design, on&#xA;&gt;     par with:&#xA;&gt;     [..]&#xA;&gt;&#xA;&gt; -   `OP_CAT` and `OP_MULT` and `OP_ADD` and friends&#xA;&gt;     [..]&#xA;&gt;     &#34;&#34;&#34;&#xA;&gt;&#xA;&gt;     OP_CAT is an extremely valuable op code. I understand why it was&#xA;&gt;     removed as the situation at the time with scripts was dire. However&#xA;&gt;     most of the protocols I&#39;ve wanted to build on Bitcoin run into the&#xA;&gt;     limitation that stack values can not be concatenated. For instance&#xA;&gt;     TumbleBit would have far smaller transaction sizes if OP_CAT was&#xA;&gt;     supported in Bitcoin. If it happens to me as a researcher it is&#xA;&gt;     probably holding other people back as well. If I could wave a magic&#xA;&gt;     wand and turn on one of the disabled op codes it would be OP_CAT. Of&#xA;&gt;     course with the change that size of each concatenated value must be 64&#xA;&gt;     Bytes or less.&#xA;&#xA;Why 64 bytes in particular?&#xA;&#xA;It seems obvious to me that this 64 bytes is most suited for building Merkle trees, being the size of two SHA256 hashes.&#xA;&#xA;However we have had issues with the use of Merkle trees in Bitcoin blocks.&#xA;Specifically, it is difficult to determine if a hash on a Merkle node is the hash of a Merkle subnode, or a leaf transaction.&#xA;My understanding is that this is the reason for now requiring transactions to be at least 80 bytes.&#xA;&#xA;The obvious fix would be to prepend the type of the hashed object, i.e. add at least one byte to determine this type.&#xA;Taproot for example uses tagged hash functions, with a different tag for leaves, and tagged hashes are just prepend-this-32-byte-constant-twice-before-you-SHA256.&#xA;&#xA;This seems to indicate that to check merkle tree proofs, an `OP_CAT` with only 64 bytes max output size would not be sufficient.&#xA;&#xA;Or we could implement tagged SHA256 as a new opcode...&#xA;&#xA;Regards,&#xA;ZmnSCPxj&#xA;&#xA;&#xA;&gt;&#xA;&gt;     On Tue, Oct 1, 2019 at 10:04 PM ZmnSCPxj via bitcoin-dev&#xA;&gt;     bitcoin-dev at lists.linuxfoundation.org wrote:&#xA;&gt;&#xA;&gt;&#xA;&gt; &gt; Good morning lists,&#xA;&gt; &gt; Let me propose the below radical idea:&#xA;&gt; &gt;&#xA;&gt; &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; &gt;     -   1 RETURN&#xA;&gt; &gt;     -   higher-`nSequence` replacement&#xA;&gt; &gt;     -   DER-encoded pubkeys&#xA;&gt; &gt;     -   unrestricted `scriptPubKey`&#xA;&gt; &gt;     -   Payee-security-paid-by-payer (i.e. lack of P2SH)&#xA;&gt; &gt;     -   `OP_CAT` and `OP_MULT` and `OP_ADD` and friends&#xA;&gt; &gt;     -   transaction malleability&#xA;&gt; &gt;     -   probably many more&#xA;&gt; &gt;&#xA;&gt; &gt; So let me propose the more radical excision, starting with SegWit v1:&#xA;&gt; &gt;&#xA;&gt; &gt; -   Remove `SIGHASH` from signatures.&#xA;&gt; &gt; -   Put `SIGHASH` on public keys.&#xA;&gt; &gt;&#xA;&gt; &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; &gt; `OP_CHECKSIG` and friends then look at the public key to determine sighash algorithm rather than the signature.&#xA;&gt; &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; &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; &gt; I propose also the addition of the opcode:&#xA;&gt; &gt;&#xA;&gt; &gt;     &lt;sighash&gt; &lt;pubkey&gt; OP_SETPUBKEYSIGHASH&#xA;&gt; &gt;&#xA;&gt; &gt;&#xA;&gt; &gt; -   `sighash` must be one byte.&#xA;&gt; &gt; -   `pubkey` may be the special byte `0x1`, meaning &#34;just use the Taproot internal pubkey&#34;.&#xA;&gt; &gt; -   `pubkey` may be 33-byte public key, in which case the `sighash` byte is just prepended to it.&#xA;&gt; &gt; -   `pubkey` may be 34-byte public key with sighash, in which case the first byte is replaced with `sighash` byte.&#xA;&gt; &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; &gt;&#xA;&gt; &gt; This retains the old feature where the sighash is selected at time-of-spending rather than time-of-payment.&#xA;&gt; &gt; This is done by using the script:&#xA;&gt; &gt;&#xA;&gt; &gt;     &lt;pubkey&gt; OP_SETPUBKEYSIGHASH OP_CHECKSIG&#xA;&gt; &gt;&#xA;&gt; &gt;&#xA;&gt; &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; &gt; This is malleability-safe as the signature still commits to the `SIGHASH` it was created for.&#xA;&gt; &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; &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; &gt; Would this not be a superior solution?&#xA;&gt; &gt; Regards,&#xA;&gt; &gt; ZmnSCPxj&#xA;&gt; &gt;&#xA;&gt; &gt; bitcoin-dev mailing list&#xA;&gt; &gt; bitcoin-dev at lists.linuxfoundation.org&#xA;&gt; &gt; https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev&#xA;&gt;&#xA;&gt; Lightning-dev mailing list&#xA;&gt; Lightning-dev at lists.linuxfoundation.org&#xA;&gt; https://lists.linuxfoundation.org/mailman/listinfo/lightning-dev</html></oembed>