Return-Path: <jlrubin@mit.edu>
Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org
	[172.17.192.35])
	by mail.linuxfoundation.org (Postfix) with ESMTPS id B118E105B;
	Fri,  4 Oct 2019 05:02:30 +0000 (UTC)
X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6
X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6
Received: from outgoing.mit.edu (outgoing-auth-1.mit.edu [18.9.28.11])
	by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 00EFEA8;
	Fri,  4 Oct 2019 05:02:28 +0000 (UTC)
Received: from mail-io1-f49.google.com (mail-io1-f49.google.com
	[209.85.166.49]) (authenticated bits=0)
	(User authenticated as jlrubin@ATHENA.MIT.EDU)
	by outgoing.mit.edu (8.14.7/8.12.4) with ESMTP id x9452Qoa030285
	(version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NOT);
	Fri, 4 Oct 2019 01:02:27 -0400
Received: by mail-io1-f49.google.com with SMTP id n197so10750982iod.9;
	Thu, 03 Oct 2019 22:02:27 -0700 (PDT)
X-Gm-Message-State: APjAAAUdxtBMvCJA4Le/V37GyRZRHvChHqFC4/1BmFoYTn4f712lsk6E
	SVPvdD4CgHdCd8MQ6va8zrFMvJgfoURfnytScqU=
X-Google-Smtp-Source: APXvYqxX4wp0qdK3i3VD9SOxl3VOXCVlx92+opnaNo8l4Jj3R73TsuKJFt7wqLCzF3BUrMw6mlEOHyEG07SINCvMia8=
X-Received: by 2002:a5e:8902:: with SMTP id k2mr11708140ioj.49.1570165346480; 
	Thu, 03 Oct 2019 22:02:26 -0700 (PDT)
MIME-Version: 1.0
References: <87wodp7w9f.fsf@gmail.com>
	<20191001155929.e2yznsetqesx2jxo@erisian.com.au>
	<CR-etCjXB-JWkvecjDog4Pkq1SuLUgndtSrZo-V4f4EGcNXzNCeAHRvCZGrxDWw7aHVdDY0pAF92jNLb_Hct0bMb3ew6JEpB9AfIm1tSGaQ=@protonmail.com>
	<CAEM=y+XbP3Dn7X8rHu7h0vbX6DkKA0vFK5nQqzcJ_V+D4EVMmw@mail.gmail.com>
	<C1OLL5FLxdOgfQ_A15mf88wIyztDapkyXJ2HZ0HxwmQADhRXGRe3le7Veso4tMIlbis6I0qiCd22xug5_GCKtgrjGnBtojWxOCMgn1UldkE=@protonmail.com>
	<CAEM=y+WCGSF_=WXpgXJUZCZcGUQhxzXF6Wv1_iX+VwEyYSWypg@mail.gmail.com>
In-Reply-To: <CAEM=y+WCGSF_=WXpgXJUZCZcGUQhxzXF6Wv1_iX+VwEyYSWypg@mail.gmail.com>
From: Jeremy <jlrubin@mit.edu>
Date: Thu, 3 Oct 2019 22:02:14 -0700
X-Gmail-Original-Message-ID: <CAD5xwhi7=5eiv1jjf72-rUezZMfj3caR+PGfZEa8i8rjNjodFg@mail.gmail.com>
Message-ID: <CAD5xwhi7=5eiv1jjf72-rUezZMfj3caR+PGfZEa8i8rjNjodFg@mail.gmail.com>
To: Ethan Heilman <eth3rs@gmail.com>
Content-Type: multipart/alternative; boundary="000000000000b73a1105940e9b4e"
X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,HTML_MESSAGE,
	RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
	smtp1.linux-foundation.org
Cc: ZmnSCPxj via bitcoin-dev <bitcoin-dev@lists.linuxfoundation.org>,
	"lightning-dev@lists.linuxfoundation.org"
	<lightning-dev@lists.linuxfoundation.org>
Subject: Re: [bitcoin-dev] [Lightning-dev] OP_CAT was Re: Continuing the
 discussion about noinput / anyprevout
X-BeenThere: bitcoin-dev@lists.linuxfoundation.org
X-Mailman-Version: 2.1.12
Precedence: list
List-Id: Bitcoin Protocol Discussion <bitcoin-dev.lists.linuxfoundation.org>
List-Unsubscribe: <https://lists.linuxfoundation.org/mailman/options/bitcoin-dev>,
	<mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=unsubscribe>
List-Archive: <http://lists.linuxfoundation.org/pipermail/bitcoin-dev/>
List-Post: <mailto:bitcoin-dev@lists.linuxfoundation.org>
List-Help: <mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=help>
List-Subscribe: <https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev>,
	<mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=subscribe>
X-List-Received-Date: Fri, 04 Oct 2019 05:02:30 -0000

--000000000000b73a1105940e9b4e
Content-Type: text/plain; charset="UTF-8"

Awhile back, Ethan and I discussed having, rather than OP_CAT, an
OP_SHA256STREAM that uses the streaming properties of a SHA256 hash
function to allow concatenation of an unlimited amount of data, provided
the only use is to hash it.

You can then use it perhaps as follows:

// start a new hash with item
OP_SHA256STREAM  (-1) -> [state]
// Add item to the hash in state
OP_SHA256STREAM n [item] [state] -> [state]
// Finalize
OP_SHA256STREAM (-2) [state] -> [Hash]

<-1> OP_SHA256STREAM <tag> <subnode 2> <subnode 3> <3> OP_SHA256STREAM <-2>
OP_SHA256STREAM


Or it coul



--
@JeremyRubin <https://twitter.com/JeremyRubin>
<https://twitter.com/JeremyRubin>


On Thu, Oct 3, 2019 at 8:04 PM Ethan Heilman <eth3rs@gmail.com> wrote:

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

--000000000000b73a1105940e9b4e
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div class=3D"gmail_default" style=3D"font-family:arial,he=
lvetica,sans-serif;font-size:small;color:#000000">Awhile back, Ethan and I =
discussed having, rather than OP_CAT, an OP_SHA256STREAM that uses the stre=
aming properties of a SHA256 hash function to allow concatenation of an unl=
imited amount of data, provided the only use is to hash it.</div><div class=
=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;font-siz=
e:small;color:#000000"><br></div><div class=3D"gmail_default" style=3D"font=
-family:arial,helvetica,sans-serif;font-size:small;color:#000000">You can t=
hen use it perhaps as follows:</div><div class=3D"gmail_default" style=3D"f=
ont-family:arial,helvetica,sans-serif;font-size:small;color:#000000"><br></=
div><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-=
serif;font-size:small;color:#000000">// start a new hash with item<br></div=
><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-ser=
if;font-size:small;color:#000000">OP_SHA256STREAM=C2=A0 (-1) -&gt; [state]<=
/div><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans=
-serif;font-size:small;color:#000000">// Add item to the hash in state<br><=
/div><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans=
-serif;font-size:small;color:#000000">OP_SHA256STREAM n [item] [state]  -&g=
t; [state]</div><div class=3D"gmail_default" style=3D"font-family:arial,hel=
vetica,sans-serif;font-size:small;color:#000000">// Finalize</div><div clas=
s=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;font-si=
ze:small;color:#000000">OP_SHA256STREAM (-2) [state] -&gt; [Hash]</div><div=
 class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;fo=
nt-size:small;color:#000000"><br></div><div class=3D"gmail_default" style=
=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:#000000">&=
lt;-1&gt; OP_SHA256STREAM &lt;tag&gt; &lt;subnode 2&gt; &lt;subnode 3&gt; &=
lt;3&gt; OP_SHA256STREAM &lt;-2&gt; OP_SHA256STREAM</div><div class=3D"gmai=
l_default" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;=
color:#000000"><br></div><div class=3D"gmail_default" style=3D"font-family:=
arial,helvetica,sans-serif;font-size:small;color:#000000"><br></div><div cl=
ass=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;font-=
size:small;color:#000000">Or it coul<br></div><div class=3D"gmail_default" =
style=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:#0000=
00"><br></div><div class=3D"gmail_default" style=3D"font-family:arial,helve=
tica,sans-serif;font-size:small;color:#000000"><br></div><div class=3D"gmai=
l_default" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;=
color:#000000"><br clear=3D"all"></div><div><div dir=3D"ltr" class=3D"gmail=
_signature" data-smartmail=3D"gmail_signature"><div dir=3D"ltr">--<br><a hr=
ef=3D"https://twitter.com/JeremyRubin" target=3D"_blank">@JeremyRubin</a><a=
 href=3D"https://twitter.com/JeremyRubin" target=3D"_blank"></a></div></div=
></div><br></div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"g=
mail_attr">On Thu, Oct 3, 2019 at 8:04 PM Ethan Heilman &lt;<a href=3D"mail=
to:eth3rs@gmail.com">eth3rs@gmail.com</a>&gt; wrote:<br></div><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px soli=
d rgb(204,204,204);padding-left:1ex">I hope you are having an great afterno=
on ZmnSCPxj,<br>
<br>
You make an excellent point!<br>
<br>
I had thought about doing the following to tag nodes<br>
<br>
|| means OP_CAT<br>
<br>
`node =3D SHA256(type||SHA256(data))`<br>
so a subnode would be<br>
`subnode1 =3D SHA256(1||SHA256(subnode2||subnode3))`<br>
and a leaf node would be<br>
`leafnode =3D SHA256(0||SHA256(leafdata))`<br>
<br>
Yet, I like your idea better. Increasing the size of the two inputs to<br>
OP_CAT to be 260 Bytes each where 520 Bytes is the maximum allowable<br>
size of object on the stack seems sensible and also doesn&#39;t special<br>
case the logic of OP_CAT.<br>
<br>
It would also increase performance. SHA256(tag||subnode2||subnode3)<br>
requires 2 compression function calls whereas<br>
SHA256(1||SHA256(subnode2||subnode3)) requires 2+1=3D3 compression<br>
function calls (due to padding).<br>
<br>
&gt;Or we could implement tagged SHA256 as a new opcode...<br>
<br>
I agree that tagged SHA256 as an op code that would certainty be<br>
useful, but OP_CAT provides far more utility and is a simpler change.<br>
<br>
Thanks,<br>
Ethan<br>
<br>
On Thu, Oct 3, 2019 at 7:42 PM ZmnSCPxj &lt;<a href=3D"mailto:ZmnSCPxj@prot=
onmail.com" target=3D"_blank">ZmnSCPxj@protonmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Good morning Ethan,<br>
&gt;<br>
&gt;<br>
&gt; &gt; To avoid derailing the NO_INPUT conversation, I have changed the<=
br>
&gt; &gt; subject to OP_CAT.<br>
&gt; &gt;<br>
&gt; &gt; Responding to:<br>
&gt; &gt; &quot;&quot;&quot;<br>
&gt; &gt;<br>
&gt; &gt; -=C2=A0 =C2=A0`SIGHASH` flags attached to signatures are a misdes=
ign, sadly<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0retained from the original BitCoin 0.1.0 Alpha=
 for Windows design, on<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0par with:<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0[..]<br>
&gt; &gt;<br>
&gt; &gt; -=C2=A0 =C2=A0`OP_CAT` and `OP_MULT` and `OP_ADD` and friends<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0[..]<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0&quot;&quot;&quot;<br>
&gt; &gt;<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0OP_CAT is an extremely valuable op code. I und=
erstand why it was<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0removed as the situation at the time with scri=
pts was dire. However<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0most of the protocols I&#39;ve wanted to build=
 on Bitcoin run into the<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0limitation that stack values can not be concat=
enated. For instance<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0TumbleBit would have far smaller transaction s=
izes if OP_CAT was<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0supported in Bitcoin. If it happens to me as a=
 researcher it is<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0probably holding other people back as well. If=
 I could wave a magic<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0wand and turn on one of the disabled op codes =
it would be OP_CAT. Of<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0course with the change that size of each conca=
tenated value must be 64<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0Bytes or less.<br>
&gt;<br>
&gt; Why 64 bytes in particular?<br>
&gt;<br>
&gt; It seems obvious to me that this 64 bytes is most suited for building =
Merkle trees, being the size of two SHA256 hashes.<br>
&gt;<br>
&gt; However we have had issues with the use of Merkle trees in Bitcoin blo=
cks.<br>
&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.<br>
&gt; My understanding is that this is the reason for now requiring transact=
ions to be at least 80 bytes.<br>
&gt;<br>
&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.<br>
&gt; Taproot for example uses tagged hash functions, with a different tag f=
or leaves, and tagged hashes are just prepend-this-32-byte-constant-twice-b=
efore-you-SHA256.<br>
&gt;<br>
&gt; This seems to indicate that to check merkle tree proofs, an `OP_CAT` w=
ith only 64 bytes max output size would not be sufficient.<br>
&gt;<br>
&gt; Or we could implement tagged SHA256 as a new opcode...<br>
&gt;<br>
&gt; Regards,<br>
&gt; ZmnSCPxj<br>
&gt;<br>
&gt;<br>
&gt; &gt;<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0On Tue, Oct 1, 2019 at 10:04 PM ZmnSCPxj via b=
itcoin-dev<br>
&gt; &gt;=C2=A0 =C2=A0 =C2=A0<a href=3D"mailto:bitcoin-dev@lists.linuxfound=
ation.org" target=3D"_blank">bitcoin-dev@lists.linuxfoundation.org</a> wrot=
e:<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; &gt; Good morning lists,<br>
&gt; &gt; &gt; Let me propose the below radical idea:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; -=C2=A0 =C2=A0`SIGHASH` flags attached to signatures are a m=
isdesign, sadly retained from the original BitCoin 0.1.0 Alpha for Windows =
design, on par with:<br>
&gt; &gt; &gt;=C2=A0 =C2=A0 =C2=A0-=C2=A0 =C2=A01 RETURN<br>
&gt; &gt; &gt;=C2=A0 =C2=A0 =C2=A0-=C2=A0 =C2=A0higher-`nSequence` replacem=
ent<br>
&gt; &gt; &gt;=C2=A0 =C2=A0 =C2=A0-=C2=A0 =C2=A0DER-encoded pubkeys<br>
&gt; &gt; &gt;=C2=A0 =C2=A0 =C2=A0-=C2=A0 =C2=A0unrestricted `scriptPubKey`=
<br>
&gt; &gt; &gt;=C2=A0 =C2=A0 =C2=A0-=C2=A0 =C2=A0Payee-security-paid-by-paye=
r (i.e. lack of P2SH)<br>
&gt; &gt; &gt;=C2=A0 =C2=A0 =C2=A0-=C2=A0 =C2=A0`OP_CAT` and `OP_MULT` and =
`OP_ADD` and friends<br>
&gt; &gt; &gt;=C2=A0 =C2=A0 =C2=A0-=C2=A0 =C2=A0transaction malleability<br=
>
&gt; &gt; &gt;=C2=A0 =C2=A0 =C2=A0-=C2=A0 =C2=A0probably many more<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; So let me propose the more radical excision, starting with S=
egWit v1:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; -=C2=A0 =C2=A0Remove `SIGHASH` from signatures.<br>
&gt; &gt; &gt; -=C2=A0 =C2=A0Put `SIGHASH` on public keys.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Public keys are now encoded as either 33-bytes (implicit `SI=
GHASH_ALL`) or 34-bytes (`SIGHASH` byte, followed by pubkey type, followed =
by pubkey coordinate).<br>
&gt; &gt; &gt; `OP_CHECKSIG` and friends then look at the public key to det=
ermine sighash algorithm rather than the signature.<br>
&gt; &gt; &gt; As we expect public keys to be indirectly committed to on ev=
ery output `scriptPubKey`, this is automatically output tagging to allow pa=
rticular `SIGHASH`.<br>
&gt; &gt; &gt; However, we can then utilize the many many ways to hide publ=
ic keys away until they are needed, exemplified in MAST-inside-Taproot.<br>
&gt; &gt; &gt; I propose also the addition of the opcode:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;=C2=A0 =C2=A0 =C2=A0&lt;sighash&gt; &lt;pubkey&gt; OP_SETPUBK=
EYSIGHASH<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; -=C2=A0 =C2=A0`sighash` must be one byte.<br>
&gt; &gt; &gt; -=C2=A0 =C2=A0`pubkey` may be the special byte `0x1`, meanin=
g &quot;just use the Taproot internal pubkey&quot;.<br>
&gt; &gt; &gt; -=C2=A0 =C2=A0`pubkey` may be 33-byte public key, in which c=
ase the `sighash` byte is just prepended to it.<br>
&gt; &gt; &gt; -=C2=A0 =C2=A0`pubkey` may be 34-byte public key with sighas=
h, in which case the first byte is replaced with `sighash` byte.<br>
&gt; &gt; &gt; -=C2=A0 =C2=A0If `sighash` is `0x00` then the result is a 33=
-byte public key (the sighash byte is removed) i.e. `SIGHASH_ALL` implicit.=
<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; This retains the old feature where the sighash is selected a=
t time-of-spending rather than time-of-payment.<br>
&gt; &gt; &gt; This is done by using the script:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;=C2=A0 =C2=A0 =C2=A0&lt;pubkey&gt; OP_SETPUBKEYSIGHASH OP_CHE=
CKSIG<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Then the sighash can be put in the witness stack after the s=
ignature, letting the `SIGHASH` flag be selected at time-of-signing, but on=
ly if the SCRIPT specifically is formed to do so.<br>
&gt; &gt; &gt; This is malleability-safe as the signature still commits to =
the `SIGHASH` it was created for.<br>
&gt; &gt; &gt; However, by default, public keys will not have an attached `=
SIGHASH` byte, implying `SIGHASH_ALL` (and disallowing-by-default non-`SIGH=
ASH_ALL`).<br>
&gt; &gt; &gt; This removes the problems with `SIGHASH_NONE` `SIGHASH_SINGL=
E`, as they are allowed only if the output specifically says they are allow=
ed.<br>
&gt; &gt; &gt; Would this not be a superior solution?<br>
&gt; &gt; &gt; Regards,<br>
&gt; &gt; &gt; ZmnSCPxj<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; bitcoin-dev mailing list<br>
&gt; &gt; &gt; <a href=3D"mailto:bitcoin-dev@lists.linuxfoundation.org" tar=
get=3D"_blank">bitcoin-dev@lists.linuxfoundation.org</a><br>
&gt; &gt; &gt; <a href=3D"https://lists.linuxfoundation.org/mailman/listinf=
o/bitcoin-dev" rel=3D"noreferrer" target=3D"_blank">https://lists.linuxfoun=
dation.org/mailman/listinfo/bitcoin-dev</a><br>
&gt; &gt;<br>
&gt; &gt; Lightning-dev mailing list<br>
&gt; &gt; <a href=3D"mailto:Lightning-dev@lists.linuxfoundation.org" target=
=3D"_blank">Lightning-dev@lists.linuxfoundation.org</a><br>
&gt; &gt; <a href=3D"https://lists.linuxfoundation.org/mailman/listinfo/lig=
htning-dev" rel=3D"noreferrer" target=3D"_blank">https://lists.linuxfoundat=
ion.org/mailman/listinfo/lightning-dev</a><br>
&gt;<br>
&gt;<br>
_______________________________________________<br>
Lightning-dev mailing list<br>
<a href=3D"mailto:Lightning-dev@lists.linuxfoundation.org" target=3D"_blank=
">Lightning-dev@lists.linuxfoundation.org</a><br>
<a href=3D"https://lists.linuxfoundation.org/mailman/listinfo/lightning-dev=
" rel=3D"noreferrer" target=3D"_blank">https://lists.linuxfoundation.org/ma=
ilman/listinfo/lightning-dev</a><br>
</blockquote></div>

--000000000000b73a1105940e9b4e--