<oembed><type>rich</type><version>1.0</version><author_name>npub1gaszwl7qd0tjmnwcaamgzzgsmzzjlvle6kz0td66pwa8z69vsxsqxgac47</author_name><author_url>https://nostr.ae/npub1gaszwl7qd0tjmnwcaamgzzgsmzzjlvle6kz0td66pwa8z69vsxsqxgac47</author_url><provider_name>njump</provider_name><provider_url>https://nostr.ae</provider_url><html>📅 Original date posted:2019-10-03&#xA;📝 Original message:I hope you are having an great afternoon ZmnSCPxj,&#xA;&#xA;You make an excellent point!&#xA;&#xA;I had thought about doing the following to tag nodes&#xA;&#xA;|| means OP_CAT&#xA;&#xA;`node = SHA256(type||SHA256(data))`&#xA;so a subnode would be&#xA;`subnode1 = SHA256(1||SHA256(subnode2||subnode3))`&#xA;and a leaf node would be&#xA;`leafnode = SHA256(0||SHA256(leafdata))`&#xA;&#xA;Yet, I like your idea better. Increasing the size of the two inputs to&#xA;OP_CAT to be 260 Bytes each where 520 Bytes is the maximum allowable&#xA;size of object on the stack seems sensible and also doesn&#39;t special&#xA;case the logic of OP_CAT.&#xA;&#xA;It would also increase performance. SHA256(tag||subnode2||subnode3)&#xA;requires 2 compression function calls whereas&#xA;SHA256(1||SHA256(subnode2||subnode3)) requires 2+1=3 compression&#xA;function calls (due to padding).&#xA;&#xA;&gt;Or we could implement tagged SHA256 as a new opcode...&#xA;&#xA;I agree that tagged SHA256 as an op code that would certainty be&#xA;useful, but OP_CAT provides far more utility and is a simpler change.&#xA;&#xA;Thanks,&#xA;Ethan&#xA;&#xA;On Thu, Oct 3, 2019 at 7:42 PM ZmnSCPxj &lt;ZmnSCPxj at protonmail.com&gt; wrote:&#xA;&gt;&#xA;&gt; Good morning Ethan,&#xA;&gt;&#xA;&gt;&#xA;&gt; &gt; To avoid derailing the NO_INPUT conversation, I have changed the&#xA;&gt; &gt; subject to OP_CAT.&#xA;&gt; &gt;&#xA;&gt; &gt; Responding to:&#xA;&gt; &gt; &#34;&#34;&#34;&#xA;&gt; &gt;&#xA;&gt; &gt; -   `SIGHASH` flags attached to signatures are a misdesign, sadly&#xA;&gt; &gt;     retained from the original BitCoin 0.1.0 Alpha for Windows design, on&#xA;&gt; &gt;     par with:&#xA;&gt; &gt;     [..]&#xA;&gt; &gt;&#xA;&gt; &gt; -   `OP_CAT` and `OP_MULT` and `OP_ADD` and friends&#xA;&gt; &gt;     [..]&#xA;&gt; &gt;     &#34;&#34;&#34;&#xA;&gt; &gt;&#xA;&gt; &gt;     OP_CAT is an extremely valuable op code. I understand why it was&#xA;&gt; &gt;     removed as the situation at the time with scripts was dire. However&#xA;&gt; &gt;     most of the protocols I&#39;ve wanted to build on Bitcoin run into the&#xA;&gt; &gt;     limitation that stack values can not be concatenated. For instance&#xA;&gt; &gt;     TumbleBit would have far smaller transaction sizes if OP_CAT was&#xA;&gt; &gt;     supported in Bitcoin. If it happens to me as a researcher it is&#xA;&gt; &gt;     probably holding other people back as well. If I could wave a magic&#xA;&gt; &gt;     wand and turn on one of the disabled op codes it would be OP_CAT. Of&#xA;&gt; &gt;     course with the change that size of each concatenated value must be 64&#xA;&gt; &gt;     Bytes or less.&#xA;&gt;&#xA;&gt; Why 64 bytes in particular?&#xA;&gt;&#xA;&gt; It seems obvious to me that this 64 bytes is most suited for building Merkle trees, being the size of two SHA256 hashes.&#xA;&gt;&#xA;&gt; However we have had issues with the use of Merkle trees in Bitcoin blocks.&#xA;&gt; 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;&gt; My understanding is that this is the reason for now requiring transactions to be at least 80 bytes.&#xA;&gt;&#xA;&gt; 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;&gt; 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;&gt;&#xA;&gt; 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;&gt;&#xA;&gt; Or we could implement tagged SHA256 as a new opcode...&#xA;&gt;&#xA;&gt; Regards,&#xA;&gt; ZmnSCPxj&#xA;&gt;&#xA;&gt;&#xA;&gt; &gt;&#xA;&gt; &gt;     On Tue, Oct 1, 2019 at 10:04 PM ZmnSCPxj via bitcoin-dev&#xA;&gt; &gt;     bitcoin-dev at lists.linuxfoundation.org wrote:&#xA;&gt; &gt;&#xA;&gt; &gt;&#xA;&gt; &gt; &gt; Good morning lists,&#xA;&gt; &gt; &gt; Let me propose the below radical idea:&#xA;&gt; &gt; &gt;&#xA;&gt; &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; &gt;     -   1 RETURN&#xA;&gt; &gt; &gt;     -   higher-`nSequence` replacement&#xA;&gt; &gt; &gt;     -   DER-encoded pubkeys&#xA;&gt; &gt; &gt;     -   unrestricted `scriptPubKey`&#xA;&gt; &gt; &gt;     -   Payee-security-paid-by-payer (i.e. lack of P2SH)&#xA;&gt; &gt; &gt;     -   `OP_CAT` and `OP_MULT` and `OP_ADD` and friends&#xA;&gt; &gt; &gt;     -   transaction malleability&#xA;&gt; &gt; &gt;     -   probably many more&#xA;&gt; &gt; &gt;&#xA;&gt; &gt; &gt; So let me propose the more radical excision, starting with SegWit v1:&#xA;&gt; &gt; &gt;&#xA;&gt; &gt; &gt; -   Remove `SIGHASH` from signatures.&#xA;&gt; &gt; &gt; -   Put `SIGHASH` on public keys.&#xA;&gt; &gt; &gt;&#xA;&gt; &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; &gt; `OP_CHECKSIG` and friends then look at the public key to determine sighash algorithm rather than the signature.&#xA;&gt; &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; &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; &gt; I propose also the addition of the opcode:&#xA;&gt; &gt; &gt;&#xA;&gt; &gt; &gt;     &lt;sighash&gt; &lt;pubkey&gt; OP_SETPUBKEYSIGHASH&#xA;&gt; &gt; &gt;&#xA;&gt; &gt; &gt;&#xA;&gt; &gt; &gt; -   `sighash` must be one byte.&#xA;&gt; &gt; &gt; -   `pubkey` may be the special byte `0x1`, meaning &#34;just use the Taproot internal pubkey&#34;.&#xA;&gt; &gt; &gt; -   `pubkey` may be 33-byte public key, in which case the `sighash` byte is just prepended to it.&#xA;&gt; &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; &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; &gt;&#xA;&gt; &gt; &gt; This retains the old feature where the sighash is selected at time-of-spending rather than time-of-payment.&#xA;&gt; &gt; &gt; This is done by using the script:&#xA;&gt; &gt; &gt;&#xA;&gt; &gt; &gt;     &lt;pubkey&gt; OP_SETPUBKEYSIGHASH OP_CHECKSIG&#xA;&gt; &gt; &gt;&#xA;&gt; &gt; &gt;&#xA;&gt; &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; &gt; This is malleability-safe as the signature still commits to the `SIGHASH` it was created for.&#xA;&gt; &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; &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; &gt; Would this not be a superior solution?&#xA;&gt; &gt; &gt; Regards,&#xA;&gt; &gt; &gt; ZmnSCPxj&#xA;&gt; &gt; &gt;&#xA;&gt; &gt; &gt; bitcoin-dev mailing list&#xA;&gt; &gt; &gt; bitcoin-dev at lists.linuxfoundation.org&#xA;&gt; &gt; &gt; https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev&#xA;&gt; &gt;&#xA;&gt; &gt; Lightning-dev mailing list&#xA;&gt; &gt; Lightning-dev at lists.linuxfoundation.org&#xA;&gt; &gt; https://lists.linuxfoundation.org/mailman/listinfo/lightning-dev&#xA;&gt;&#xA;&gt;</html></oembed>