summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier Mateos <javierpmateos@gmail.com>2025-03-28 15:40:13 -0700
committerbitcoindev <bitcoindev@googlegroups.com>2025-03-31 13:41:27 -0700
commit42beff0ca9c4a49a6d9d81508f04b314832f8852 (patch)
tree68c2c64b1874d5de17dea55cff745cf06c5814fa
parent73299f3e822d3efec5fae86fac5b1fb02cd6cebc (diff)
downloadpi-bitcoindev-42beff0ca9c4a49a6d9d81508f04b314832f8852.tar.gz
pi-bitcoindev-42beff0ca9c4a49a6d9d81508f04b314832f8852.zip
Re: [bitcoindev] New Proposal:String Substring Search in Bitcoin Script - OP_ISSUBSTR
-rw-r--r--57/20aec1288fa217895508abab570ebb8e78de83635
1 files changed, 635 insertions, 0 deletions
diff --git a/57/20aec1288fa217895508abab570ebb8e78de83 b/57/20aec1288fa217895508abab570ebb8e78de83
new file mode 100644
index 000000000..ec22c80c0
--- /dev/null
+++ b/57/20aec1288fa217895508abab570ebb8e78de83
@@ -0,0 +1,635 @@
+Delivery-date: Mon, 31 Mar 2025 13:41:27 -0700
+Received: from mail-yb1-f183.google.com ([209.85.219.183])
+ by mail.fairlystable.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
+ (Exim 4.94.2)
+ (envelope-from <bitcoindev+bncBDQ6BG4PT4CRB3H3VO7QMGQEIZFJVUI@googlegroups.com>)
+ id 1tzLwk-0001p7-6y
+ for bitcoindev@gnusha.org; Mon, 31 Mar 2025 13:41:27 -0700
+Received: by mail-yb1-f183.google.com with SMTP id 3f1490d57ef6-e643f233fbesf7235505276.0
+ for <bitcoindev@gnusha.org>; Mon, 31 Mar 2025 13:41:26 -0700 (PDT)
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+ d=googlegroups.com; s=20230601; t=1743453680; x=1744058480; darn=gnusha.org;
+ h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post
+ :list-id:mailing-list:precedence:x-original-sender:mime-version
+ :subject:references:in-reply-to:message-id:to:from:date:sender:from
+ :to:cc:subject:date:message-id:reply-to;
+ bh=AIKL1AYd/xO+SLv3q7xjPwAw1WZmU0WoqzkDslwyHLg=;
+ b=WhEyH/5AnnQH2GiXmNzLnWu5+8WdtIHiDD48YN0Dx0GJxjBRw901utqSj82FNQMA8s
+ pJOiOQXHUnb9oTle5pR7nFkcPZVV26fWkNhkIFZF5X4rQUei8BZ8xzHXpKOgE8kpyrWl
+ /Gaym5/Os59+N+4TAJ1+RRA4AvdHZnIVBFvhPCQLgV+BeSEK4aub2DH3AzJoFWhXDArk
+ plQ7LHqixSsxxAKZrqgc3JDrjoCX1lYiSbepoheBzgbhh+e4AUhIfMpDoRWMpoeHyc5p
+ yIkFtVrbwUx3j5LYleA4ca75eY2Tz/L8bn2/Bu1dr2yDhmAm6GYaCOxJNZgEYHAPaY1e
+ rCBg==
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+ d=gmail.com; s=20230601; t=1743453680; x=1744058480; darn=gnusha.org;
+ h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post
+ :list-id:mailing-list:precedence:x-original-sender:mime-version
+ :subject:references:in-reply-to:message-id:to:from:date:from:to:cc
+ :subject:date:message-id:reply-to;
+ bh=AIKL1AYd/xO+SLv3q7xjPwAw1WZmU0WoqzkDslwyHLg=;
+ b=hPe+Y74ozlNFe8Ffn5islF6nUH/SKrUkBKQUfqwLK4GttxguT6/e7VzhFjCuC1wk4z
+ e10NZ16xzZx2KnS6pxufR34RBKbYq/wfZxum7rqpgv94ZkwyS8EIGTflqA1TTdXWlIQb
+ Erl4KkVJqSzw5qS1hznacOIltDqp0ZNxpjuc1o28g0w6cQqxzzK6La/wy6CukIVkiDxz
+ nLpXersyWXfV8rVjt0/C/NR70aeu9591zKadTp0OTXF1TeoEm1aM5xfODnutnhqlid23
+ YQor5K66veOmgXyouQWAR4Or6vaktI/b+D4MYqn9J2ZjGE8u1mYOAZJEoNWN8684n2tj
+ uRvA==
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+ d=1e100.net; s=20230601; t=1743453680; x=1744058480;
+ h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post
+ :list-id:mailing-list:precedence:x-original-sender:mime-version
+ :subject:references:in-reply-to:message-id:to:from:date:x-beenthere
+ :x-gm-message-state:sender:from:to:cc:subject:date:message-id
+ :reply-to;
+ bh=AIKL1AYd/xO+SLv3q7xjPwAw1WZmU0WoqzkDslwyHLg=;
+ b=nWei1MYkU6kAB5wW37YA9D/NKJj6POJmkWaj8e4V/jzVNpb7YJFdsy85zAZb3BpJjy
+ AoeyULivFzzGGOj6zXr6goFXVFiIVI+LH+eFlJEj8zjqyppCTGZqMa+ZF6YtcGsUaSyC
+ 8Efmn2X5eRpVc1RguCowEz/Qe7K5KwWFUgAe+BXp2B+LbZ70Sjp7qmE0rOrjIsFsW0JC
+ 5hGw33k+BAeNJkoazFpaHOLSzcqkgQg6sb/YbQ8oPIwCtkVlYdl3xrUxX5gZ3OYBhPuR
+ iphVgLBb0I05194sUHdmfdGIO7p01xmUWdF4zlKgYQwVPiEstHl6tZSmyPsVr0IvcM/e
+ MLPw==
+Sender: bitcoindev@googlegroups.com
+X-Forwarded-Encrypted: i=1; AJvYcCV02INzH0BgJ53EdkPQGJf7ysyXWorIPz+CB0WQVtwJmAl+YbNESdHyEXGrDcaDwxgUZl1Qh7UiEQH6@gnusha.org
+X-Gm-Message-State: AOJu0YwqK28WjUyq3/bX9XsfyA+qIyhjbj2587mNv8KYIJwpZYiwWaSz
+ X1hzIVnYi/kJmHZHv7xkVUnOMWvcMnJthYz4BOeDnZYhqvhV/V4M
+X-Google-Smtp-Source: AGHT+IFLnR2DwFIP33Hqhwu9EXY51XQK3r6zR4DfWbkn6TqJs66+xP4QHyOEcJqgIvXW0oYaF7Nfwg==
+X-Received: by 2002:a05:6902:108e:b0:e64:3f66:90b8 with SMTP id 3f1490d57ef6-e6b82dbb3c3mr15952153276.3.1743453680194;
+ Mon, 31 Mar 2025 13:41:20 -0700 (PDT)
+X-BeenThere: bitcoindev@googlegroups.com; h=ARLLPAJoVNJEQCIeyM7Q3BZ5A19yatJ3CO9lKocmUg157LwICA==
+Received: by 2002:a25:a05:0:b0:e63:6582:71d2 with SMTP id 3f1490d57ef6-e6942e67cf8ls1604384276.1.-pod-prod-01-us;
+ Mon, 31 Mar 2025 13:41:16 -0700 (PDT)
+X-Received: by 2002:a05:690c:61c9:b0:6f7:5605:c62b with SMTP id 00721157ae682-703a40253c0mr7219127b3.27.1743453676383;
+ Mon, 31 Mar 2025 13:41:16 -0700 (PDT)
+Received: by 2002:a05:690c:9a05:b0:6ef:590d:3213 with SMTP id 00721157ae682-70210946373ms7b3;
+ Fri, 28 Mar 2025 15:40:15 -0700 (PDT)
+X-Received: by 2002:a05:690c:6082:b0:6f9:b12b:8943 with SMTP id 00721157ae682-702572731fbmr16213677b3.19.1743201613785;
+ Fri, 28 Mar 2025 15:40:13 -0700 (PDT)
+Date: Fri, 28 Mar 2025 15:40:13 -0700 (PDT)
+From: Javier Mateos <javierpmateos@gmail.com>
+To: Bitcoin Development Mailing List <bitcoindev@googlegroups.com>
+Message-Id: <e8c30db7-b509-4fbd-93ef-0bca0313003cn@googlegroups.com>
+In-Reply-To: <b4594133-e6e5-438b-aa56-98d6171296fan@googlegroups.com>
+References: <f844a85e-8be8-4429-8687-bc19dd4b96ffn@googlegroups.com>
+ <Z9hTu2TjMlLr5-Eg@petertodd.org>
+ <678d40e3-3e22-4d55-82c0-b25ccafb87ecn@googlegroups.com>
+ <CAD2YOAp=ft+pApAwh6CQvwMpujfZ0ysSK+=7zKA64nBeB5w3nA@mail.gmail.com>
+ <8c823e50-197e-479c-8651-9e0407a4168en@googlegroups.com>
+ <b4594133-e6e5-438b-aa56-98d6171296fan@googlegroups.com>
+Subject: =?UTF-8?Q?Re=3A_=5Bbitcoindev=5D_New_Proposal=EF=BC=9AString_Substring_Sea?=
+ =?UTF-8?Q?rch_in_Bitcoin_Script_=2D_OP=5FISSUBSTR?=
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="----=_Part_210538_699175425.1743201613472"
+X-Original-Sender: javierpmateos@gmail.com
+Precedence: list
+Mailing-list: list bitcoindev@googlegroups.com; contact bitcoindev+owners@googlegroups.com
+List-ID: <bitcoindev.googlegroups.com>
+X-Google-Group-Id: 786775582512
+List-Post: <https://groups.google.com/group/bitcoindev/post>, <mailto:bitcoindev@googlegroups.com>
+List-Help: <https://groups.google.com/support/>, <mailto:bitcoindev+help@googlegroups.com>
+List-Archive: <https://groups.google.com/group/bitcoindev
+List-Subscribe: <https://groups.google.com/group/bitcoindev/subscribe>, <mailto:bitcoindev+subscribe@googlegroups.com>
+List-Unsubscribe: <mailto:googlegroups-manage+786775582512+unsubscribe@googlegroups.com>,
+ <https://groups.google.com/group/bitcoindev/subscribe>
+X-Spam-Score: -0.5 (/)
+
+------=_Part_210538_699175425.1743201613472
+Content-Type: multipart/alternative;
+ boundary="----=_Part_210539_408308505.1743201613472"
+
+------=_Part_210539_408308505.1743201613472
+Content-Type: text/plain; charset="UTF-8"
+Content-Transfer-Encoding: quoted-printable
+
+ The solution of splitting the string and using OP_CAT only works if the=
+=20
+exact position of the substring is known. How would a case be handled where=
+=20
+the substring could be in any position? =20
+
+El mi=C3=A9rcoles, 19 de marzo de 2025 a las 22:02:05 UTC-3, Vojt=C4=9Bch S=
+trnad=20
+escribi=C3=B3:
+
+> Hi Weichu,
+>
+> You can implement this game by having the user supply in the initial stac=
+k=20
+> the two parts of their public key with the middle "goodluck" removed, and=
+=20
+> inserting the "goodluck" as part of the script:
+>
+> - script: "goodluck" OP_SWAP OP_CAT OP_CAT OP_CHECKSIG
+> - initial stack: signature pubkey_left pubkey_right
+>
+> Hope this helps.
+>
+> Vojt=C4=9Bch
+> On Thursday, March 20, 2025 at 1:06:41=E2=80=AFAM UTC+1 weichu deng wrote=
+:
+>
+>> Hi Rijndael,
+>>
+>> =20
+>>
+>> Thanks for your example=20
+>>
+>> [witness: foobar foo] bar CAT EQ
+>>
+>> =20
+>>
+>> Yes, the unfixed string can be checked against a target substring in you=
+r=20
+>> example. However, if the target substring is located in the middle of th=
+e=20
+>> unfixed string, how to check it? In other words, how to have the same=20
+>> function as =E2=80=9Cfoobar ob ISSUBSTR=E2=80=9D with CAT if =E2=80=9Cfo=
+obar=E2=80=9D is unfixed?
+>>
+>> =20
+>>
+>> For example, suppose that a lucky draw game has the rule: if anyone has =
+a=20
+>> publicKey which includes a special substring "goodluck", he/she will be=
+=20
+>> awarded.=20
+>>
+>> This game can be easily implemented with OP_ISSUBSTR as follow.
+>>
+>> - LockScript: OP_DUP goodluck OP_ISSUBSTR...
+>>
+>> - UnlockScript: signature publicKey
+>>
+>> How to implement it with OP_CAT?
+>>
+>> =20
+>>
+>> *Regards*
+>>
+>> Weichu deng
+>>
+>> weich...@stu2024.jnu.edu.cn
+>>
+>> =20
+>>
+>> =E5=9C=A82025=E5=B9=B43=E6=9C=8819=E6=97=A5=E6=98=9F=E6=9C=9F=E4=B8=89 U=
+TC+8 10:28:25<Rijndael> =E5=86=99=E9=81=93=EF=BC=9A
+>>
+>>> Stack elements in Taproot are limited to 520 bytes. The current proposa=
+l=20
+>>> for re-activating OP_CAT includes this restriction: creating a string=
+=20
+>>> longer than 520 bytes with CAT will cause the script to fail.
+>>>
+>>> With either CAT or ISSUBSTR, you can either commit to the substrings or=
+=20
+>>> provide them at spend-time as witness data (and allow them to be unfixe=
+d in=20
+>>> the script).
+>>>
+>>> Fixed: FOOBAR BAR ISSUBSTR =3D=3D FOOBAR FOO BAR CAT EQ
+>>> Variable: [witness: FOOBAR] BAR ISSUBSTR =3D=3D [witness: FOOBAR FOO] B=
+AR=20
+>>> CAT EQ
+>>>
+>>>
+>>> rijndael=20
+>>>
+>>>
+>>> On Mar 18, 2025, at 11:32=E2=80=AFAM, weichu deng <weich...@stu2024.jnu=
+.edu.cn>=20
+>>> wrote:
+>>>
+>>> Hi, Peter Todd
+>>> Thanks for your feedback. I agree that "Bitcoin scripts are about=20
+>>> validation. Not computation."
+>>> String search and concatenation are equivalent in some cases, such as i=
+n=20
+>>> the example you provided.
+>>> However, it is still necessary to introduce the OP_ISSUBSTR operation=
+=20
+>>> separately.
+>>> One example is converting a non-deterministic signature to a=20
+>>> deterministic one.
+>>> Another case is when the substring in question is located in the middle=
+=20
+>>> of the checked string.
+>>> CAT cannot replace ISSUBSTR for the following reasons:
+>>>
+>>> 1. The security of CAT is still controversial. It can easily=20
+>>> generate overly long strings, potentially causing a stack overflow.=
+=20
+>>> Additionally, whether OP_CAT will be restored is still under discuss=
+ion.
+>>> 2. The other substring (bar) must be known in advance.
+>>> =20
+>>>
+>>> With respect,
+>>>
+>>> Weichu Deng
+>>>
+>>> weich...@stu2024.jnu.edu.cn
+>>> =E5=9C=A82025=E5=B9=B43=E6=9C=8818=E6=97=A5=E6=98=9F=E6=9C=9F=E4=BA=8C =
+UTC+8 01:01:16<Peter Todd> =E5=86=99=E9=81=93=EF=BC=9A
+>>>
+>>> On Mon, Mar 17, 2025 at 09:14:05AM -0700, weichu deng wrote:
+>>> >=20
+>>> >=20
+>>> > Dear fellow Bitcoin developers,
+>>> >=20
+>>> >=20
+>>> >=20
+>>> > I am pleased to present a new BIP proposal. This proposal introduces =
+a=20
+>>> new=20
+>>> > opcode for Bitcoin scripts: OP_ISSUBSTR.
+>>> >=20
+>>> >=20
+>>> > *Abstract*
+>>> >=20
+>>> > This BIP introduces two string opcodes, OP_ISSUBSTR and=20
+>>> OP_ISSUBSTRVERIFY=20
+>>> > (similar to the relationship between OP_EQUAL and OP_EQUALVERIFY), to=
+=20
+>>> > determine whether one string is a substring of another. As these=20
+>>> opcodes do=20
+>>> > not alter any blockchain state, they are secure.
+>>>
+>>> Bitcoin scripts are about validation. Not computation.
+>>>
+>>> This means that substring search and concatenation are equivalent. For
+>>> every script that validates a substring search, you can instead
+>>> concatenate the substring with the rest of the string, and validate
+>>> equality instead.
+>>>
+>>> Basically speaking:
+>>>
+>>> foobar foo IsSubStr
+>>>
+>>> is equivalent to:
+>>>
+>>> foobar foo bar Cat Equal
+>>>
+>>> A real-world example would be more complex. But I hope that illustrates
+>>> my point sufficiently.
+>>>
+>>> --=20
+>>> https://petertodd.org 'peter'[:-1]@petertodd.org
+>>>
+>>>
+>>> --=20
+>>> You received this message because you are subscribed to the Google=20
+>>> Groups "Bitcoin Development Mailing List" group.
+>>> To unsubscribe from this group and stop receiving emails from it, send=
+=20
+>>> an email to bitcoindev+...@googlegroups.com.
+>>> To view this discussion visit=20
+>>> https://groups.google.com/d/msgid/bitcoindev/678d40e3-3e22-4d55-82c0-b2=
+5ccafb87ecn%40googlegroups.com=20
+>>> <https://groups.google.com/d/msgid/bitcoindev/678d40e3-3e22-4d55-82c0-b=
+25ccafb87ecn%40googlegroups.com?utm_medium=3Demail&utm_source=3Dfooter>
+>>> .
+>>>
+>>>
+>>>
+
+--=20
+You received this message because you are subscribed to the Google Groups "=
+Bitcoin Development Mailing List" group.
+To unsubscribe from this group and stop receiving emails from it, send an e=
+mail to bitcoindev+unsubscribe@googlegroups.com.
+To view this discussion visit https://groups.google.com/d/msgid/bitcoindev/=
+e8c30db7-b509-4fbd-93ef-0bca0313003cn%40googlegroups.com.
+
+------=_Part_210539_408308505.1743201613472
+Content-Type: text/html; charset="UTF-8"
+Content-Transfer-Encoding: quoted-printable
+
+=C2=A0 The solution of splitting the string and using OP_CAT only works if =
+the exact position of the substring is known. How would a case be handled w=
+here the substring could be in any position?=C2=A0=C2=A0<br /><br /><div cl=
+ass=3D"gmail_quote"><div dir=3D"auto" class=3D"gmail_attr">El mi=C3=A9rcole=
+s, 19 de marzo de 2025 a las 22:02:05 UTC-3, Vojt=C4=9Bch Strnad escribi=C3=
+=B3:<br/></div><blockquote class=3D"gmail_quote" style=3D"margin: 0 0 0 0.8=
+ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div>Hi =
+Weichu,</div><div><br></div><div>You can implement this game by having the =
+user supply in the initial stack the two parts of their public key with the=
+ middle &quot;goodluck&quot; removed, and inserting the &quot;goodluck&quot=
+; as part of the script:</div><div><ul><li>script: &quot;goodluck&quot; OP_=
+SWAP OP_CAT OP_CAT OP_CHECKSIG</li><li>initial stack: signature pubkey_left=
+ pubkey_right</li></ul></div><div>Hope this helps.</div><div><br></div><div=
+>Vojt=C4=9Bch</div><div class=3D"gmail_quote"><div dir=3D"auto" class=3D"gm=
+ail_attr">On Thursday, March 20, 2025 at 1:06:41=E2=80=AFAM UTC+1 weichu de=
+ng wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 =
+0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><p><span lan=
+g=3D"EN-US">Hi Rijndael,</span></p>
+
+<p><span lang=3D"EN-US">=C2=A0</span></p>
+
+<p><span lang=3D"EN-US">Thanks for your example </span></p>
+
+<p style=3D"text-indent:12pt"><span lang=3D"EN-US">[witness: foobar =C2=A0f=
+oo] bar CAT
+EQ</span></p>
+
+<p><span lang=3D"EN-US">=C2=A0</span></p>
+
+<p><span lang=3D"EN-US">Yes, the unfixed string can be checked
+against a target substring in your example. However, if the target substrin=
+g is
+located in the middle of the unfixed string, how to check it? In other word=
+s,
+how to have the same function as =E2=80=9Cfoobar ob ISSUBSTR=E2=80=9D with =
+CAT if =E2=80=9Cfoobar=E2=80=9D is
+unfixed?</span></p>
+
+<p><span lang=3D"EN-US">=C2=A0</span></p>
+
+<p><span lang=3D"EN-US">For example, suppose that a lucky draw game
+has the rule: if anyone has a publicKey which includes a special substring
+&quot;goodluck&quot;, he/she will be awarded. </span></p>
+
+<p><span lang=3D"EN-US">This game can be easily implemented with
+OP_ISSUBSTR as follow.</span></p>
+
+<p style=3D"text-indent:48pt"><span lang=3D"EN-US">- LockScript: OP_DUP goo=
+dluck OP_ISSUBSTR...</span></p>
+
+<p style=3D"text-indent:48pt"><span lang=3D"EN-US">- UnlockScript: signatur=
+e publicKey</span></p>
+
+<p><span lang=3D"EN-US">How to implement it with OP_CAT?<b></b></span></p>
+
+<p><b><span lang=3D"EN-US">=C2=A0</span></b></p>
+
+<p><b><span lang=3D"EN-US">Regards</span></b><span lang=3D"EN-US"></span></=
+p>
+
+<p><span lang=3D"EN-US">Weichu deng</span></p>
+
+<p><span lang=3D"EN-US"><a rel=3D"nofollow">weich...@stu2024.jnu.edu.cn</a>=
+</span></p>
+
+<p><span lang=3D"EN-US">=C2=A0</span></p><br><div class=3D"gmail_quote"><di=
+v dir=3D"auto" class=3D"gmail_attr">=E5=9C=A82025=E5=B9=B43=E6=9C=8819=E6=
+=97=A5=E6=98=9F=E6=9C=9F=E4=B8=89 UTC+8 10:28:25&lt;Rijndael&gt; =E5=86=99=
+=E9=81=93=EF=BC=9A<br></div><blockquote class=3D"gmail_quote" style=3D"marg=
+in:0 0 0 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><di=
+v dir=3D"ltr"><div dir=3D"auto" style=3D"line-break:after-white-space">Stac=
+k elements in Taproot are limited to 520 bytes. The current proposal for re=
+-activating OP_CAT includes this restriction: creating a string longer than=
+ 520 bytes with CAT will cause the script to fail.<div><br></div><div>With =
+either CAT or ISSUBSTR, you can either commit to the substrings or provide =
+them at spend-time as witness data (and allow them to be unfixed in the scr=
+ipt).</div><div><br></div><div>Fixed: FOOBAR BAR ISSUBSTR =3D=3D FOOBAR FOO=
+ BAR CAT EQ</div><div>Variable: [witness: FOOBAR] BAR ISSUBSTR =3D=3D [witn=
+ess: FOOBAR FOO] BAR CAT EQ</div><div><br></div><div><br></div><div>rijndae=
+l=C2=A0</div><div><br><div style=3D"direction:ltr"><br><blockquote type=3D"=
+cite"></blockquote></div></div></div></div><div dir=3D"ltr"><div dir=3D"aut=
+o" style=3D"line-break:after-white-space"><div><div style=3D"direction:ltr"=
+><blockquote type=3D"cite"><div>On Mar 18, 2025, at 11:32=E2=80=AFAM, weich=
+u deng &lt;<a rel=3D"nofollow">weich...@stu2024.jnu.edu.cn</a>&gt; wrote:</=
+div><br></blockquote></div></div></div></div><div dir=3D"ltr"><div dir=3D"a=
+uto" style=3D"line-break:after-white-space"><div><div style=3D"direction:lt=
+r"><blockquote type=3D"cite"><div><div style=3D"font-size:12px;font-style:n=
+ormal;font-variant-caps:normal;font-weight:400;text-align:start;text-indent=
+:0px;text-transform:none;white-space:pre-wrap;word-spacing:0px;text-decorat=
+ion:none;padding:0px;border:0px;font-variant-numeric:inherit;font-variant-e=
+ast-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;line=
+-height:24px;font-family:-apple-system,BlinkMacSystemFont,&quot;Helvetica N=
+eue&quot;,Helvetica,&quot;Segoe UI&quot;,Arial,Roboto,&quot;PingFang SC&quo=
+t;,MIUI,&quot;Hiragino Sans GB&quot;,&quot;Microsoft YaHei&quot;,sans-serif=
+;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inheri=
+t;vertical-align:baseline;margin:0px 0px 0.859em;letter-spacing:0.25px;max-=
+width:100%;overflow:auto hidden;color:rgb(6,6,7);word-break:break-word">Hi,=
+ <span style=3D"color:rgb(32,33,36);font-family:Roboto,Arial,sans-serif">Pe=
+ter Todd</span></div><div style=3D"font-size:12px;font-style:normal;font-va=
+riant-caps:normal;font-weight:400;text-align:start;text-indent:0px;text-tra=
+nsform:none;white-space:pre-wrap;word-spacing:0px;text-decoration:none;padd=
+ing:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inh=
+erit;font-variant-alternates:inherit;font-stretch:inherit;line-height:24px;=
+font-family:-apple-system,BlinkMacSystemFont,&quot;Helvetica Neue&quot;,Hel=
+vetica,&quot;Segoe UI&quot;,Arial,Roboto,&quot;PingFang SC&quot;,MIUI,&quot=
+;Hiragino Sans GB&quot;,&quot;Microsoft YaHei&quot;,sans-serif;font-size-ad=
+just:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-al=
+ign:baseline;margin:0px 0px 0.859em;letter-spacing:0.25px;max-width:100%;ov=
+erflow:auto hidden;color:rgb(6,6,7);word-break:break-word">Thanks for your =
+feedback. I agree that &quot;Bitcoin scripts are about validation. Not comp=
+utation.&quot;</div><div style=3D"font-size:12px;font-style:normal;font-var=
+iant-caps:normal;font-weight:400;text-align:start;text-indent:0px;text-tran=
+sform:none;white-space:pre-wrap;word-spacing:0px;text-decoration:none;paddi=
+ng:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inhe=
+rit;font-variant-alternates:inherit;font-stretch:inherit;line-height:24px;f=
+ont-family:-apple-system,BlinkMacSystemFont,&quot;Helvetica Neue&quot;,Helv=
+etica,&quot;Segoe UI&quot;,Arial,Roboto,&quot;PingFang SC&quot;,MIUI,&quot;=
+Hiragino Sans GB&quot;,&quot;Microsoft YaHei&quot;,sans-serif;font-size-adj=
+ust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-ali=
+gn:baseline;margin:0px 0px 0.859em;letter-spacing:0.25px;max-width:100%;ove=
+rflow:auto hidden;color:rgb(6,6,7);word-break:break-word">String search and=
+ concatenation are equivalent in some cases, such as in the example you pro=
+vided.</div><div style=3D"font-size:12px;font-style:normal;font-variant-cap=
+s:normal;font-weight:400;text-align:start;text-indent:0px;text-transform:no=
+ne;white-space:pre-wrap;word-spacing:0px;text-decoration:none;padding:0px;b=
+order:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font=
+-variant-alternates:inherit;font-stretch:inherit;line-height:24px;font-fami=
+ly:-apple-system,BlinkMacSystemFont,&quot;Helvetica Neue&quot;,Helvetica,&q=
+uot;Segoe UI&quot;,Arial,Roboto,&quot;PingFang SC&quot;,MIUI,&quot;Hiragino=
+ Sans GB&quot;,&quot;Microsoft YaHei&quot;,sans-serif;font-size-adjust:inhe=
+rit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:basel=
+ine;margin:0px 0px 0.859em;letter-spacing:0.25px;max-width:100%;overflow:au=
+to hidden;color:rgb(6,6,7);word-break:break-word">However, it is still nece=
+ssary to introduce the OP_ISSUBSTR operation separately.</div><div style=3D=
+"font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:400;=
+text-align:start;text-indent:0px;text-transform:none;white-space:pre-wrap;w=
+ord-spacing:0px;text-decoration:none;padding:0px;border:0px;font-variant-nu=
+meric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inher=
+it;font-stretch:inherit;line-height:24px;font-family:-apple-system,BlinkMac=
+SystemFont,&quot;Helvetica Neue&quot;,Helvetica,&quot;Segoe UI&quot;,Arial,=
+Roboto,&quot;PingFang SC&quot;,MIUI,&quot;Hiragino Sans GB&quot;,&quot;Micr=
+osoft YaHei&quot;,sans-serif;font-size-adjust:inherit;font-kerning:inherit;=
+font-feature-settings:inherit;vertical-align:baseline;margin:0px 0px 0.859e=
+m;letter-spacing:0.25px;max-width:100%;overflow:auto hidden;color:rgb(6,6,7=
+);word-break:break-word">One example is converting a non-deterministic sign=
+ature to a deterministic one.</div><div style=3D"font-size:12px;font-style:=
+normal;font-variant-caps:normal;font-weight:400;text-align:start;text-inden=
+t:0px;text-transform:none;white-space:pre-wrap;word-spacing:0px;text-decora=
+tion:none;padding:0px;border:0px;font-variant-numeric:inherit;font-variant-=
+east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;lin=
+e-height:24px;font-family:-apple-system,BlinkMacSystemFont,&quot;Helvetica =
+Neue&quot;,Helvetica,&quot;Segoe UI&quot;,Arial,Roboto,&quot;PingFang SC&qu=
+ot;,MIUI,&quot;Hiragino Sans GB&quot;,&quot;Microsoft YaHei&quot;,sans-seri=
+f;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inher=
+it;vertical-align:baseline;margin:0px 0px 0.859em;letter-spacing:0.25px;max=
+-width:100%;overflow:auto hidden;color:rgb(6,6,7);word-break:break-word">An=
+other case is when the substring in question is located in the middle of th=
+e checked string.</div><div style=3D"font-size:12px;font-style:normal;font-=
+variant-caps:normal;font-weight:400;text-align:start;text-indent:0px;text-t=
+ransform:none;white-space:pre-wrap;word-spacing:0px;text-decoration:none;pa=
+dding:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:i=
+nherit;font-variant-alternates:inherit;font-stretch:inherit;line-height:24p=
+x;font-family:-apple-system,BlinkMacSystemFont,&quot;Helvetica Neue&quot;,H=
+elvetica,&quot;Segoe UI&quot;,Arial,Roboto,&quot;PingFang SC&quot;,MIUI,&qu=
+ot;Hiragino Sans GB&quot;,&quot;Microsoft YaHei&quot;,sans-serif;font-size-=
+adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-=
+align:baseline;margin:0px 0px 0.859em;letter-spacing:0.25px;max-width:100%;=
+overflow:auto hidden;color:rgb(6,6,7);word-break:break-word">CAT cannot rep=
+lace ISSUBSTR for the following reasons:</div><ol start=3D"1" style=3D"font=
+-size:12px;font-style:normal;font-variant-caps:normal;font-weight:400;text-=
+align:start;text-indent:0px;text-transform:none;white-space:normal;word-spa=
+cing:0px;text-decoration:none;padding:0px 0px 0px 2em;border:0px;font-varia=
+nt-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:=
+inherit;font-stretch:inherit;line-height:inherit;font-family:-apple-system,=
+BlinkMacSystemFont,&quot;Helvetica Neue&quot;,Helvetica,&quot;Segoe UI&quot=
+;,Arial,Roboto,&quot;PingFang SC&quot;,MIUI,&quot;Hiragino Sans GB&quot;,&q=
+uot;Microsoft YaHei&quot;,sans-serif;font-size-adjust:inherit;font-kerning:=
+inherit;font-feature-settings:inherit;vertical-align:baseline;list-style-po=
+sition:initial;margin:0.859em 0px 0px;color:rgb(6,6,7);letter-spacing:0.5px=
+"><li style=3D"margin:0px;padding:0px;border:0px;font-style:inherit;font-va=
+riant-ligatures:inherit;font-variant-caps:inherit;font-variant-alternates:i=
+nherit;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-we=
+ight:inherit;font-stretch:inherit;font-size:inherit;line-height:24px;font-f=
+amily:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-se=
+ttings:inherit;vertical-align:baseline;letter-spacing:0.25px"><div style=3D=
+"padding:0px;border:0px;font-style:inherit;font-variant-ligatures:inherit;f=
+ont-variant-caps:inherit;font-variant-alternates:inherit;font-variant-numer=
+ic:inherit;font-variant-east-asian:inherit;font-weight:inherit;font-stretch=
+:inherit;line-height:24px;font-family:inherit;font-size-adjust:inherit;font=
+-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;marg=
+in:0px;max-width:100%;overflow:visible;word-break:break-word">The security =
+of CAT is still controversial. It can easily generate overly long strings, =
+potentially causing a stack overflow. Additionally, whether OP_CAT will be =
+restored is still under discussion.</div></li><li style=3D"margin:0px;paddi=
+ng:0px;border:0px;font-style:inherit;font-variant-ligatures:inherit;font-va=
+riant-caps:inherit;font-variant-alternates:inherit;font-variant-numeric:inh=
+erit;font-variant-east-asian:inherit;font-weight:inherit;font-stretch:inher=
+it;font-size:inherit;line-height:24px;font-family:inherit;font-size-adjust:=
+inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:b=
+aseline;letter-spacing:0.25px"><div style=3D"padding:0px;border:0px;font-st=
+yle:inherit;font-variant-ligatures:inherit;font-variant-caps:inherit;font-v=
+ariant-alternates:inherit;font-variant-numeric:inherit;font-variant-east-as=
+ian:inherit;font-weight:inherit;font-stretch:inherit;line-height:24px;font-=
+family:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-s=
+ettings:inherit;vertical-align:baseline;margin:0px;max-width:100%;overflow:=
+visible;word-break:break-word">The other substring (bar) must be known in a=
+dvance.</div></li></ol><div style=3D"font-family:Helvetica;font-size:12px;f=
+ont-style:normal;font-variant-caps:normal;font-weight:400;letter-spacing:no=
+rmal;text-align:start;text-indent:0px;text-transform:none;white-space:norma=
+l;word-spacing:0px;text-decoration:none"><font color=3D"#060607" face=3D"-a=
+pple-system, BlinkMacSystemFont, Helvetica Neue, Helvetica, Segoe UI, Arial=
+, Roboto, PingFang SC, MIUI, Hiragino Sans GB, Microsoft YaHei, sans-serif"=
+><span style=3D"letter-spacing:0.25px"><br></span></font></div><div style=
+=3D"font-family:Helvetica;font-size:12px;font-style:normal;font-variant-cap=
+s:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent=
+:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoratio=
+n:none"><p><span lang=3D"EN-US">With respect,</span></p><p><span lang=3D"EN=
+-US">Weichu Deng</span></p><p><span lang=3D"EN-US"><a rel=3D"nofollow">weic=
+h...@stu2024.jnu.edu.cn</a></span></p></div><div style=3D"font-family:Helve=
+tica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:=
+400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:n=
+one;white-space:normal;word-spacing:0px;text-decoration:none"><div dir=3D"a=
+uto">=E5=9C=A82025=E5=B9=B43=E6=9C=8818=E6=97=A5=E6=98=9F=E6=9C=9F=E4=BA=8C=
+ UTC+8 01:01:16&lt;Peter Todd&gt; =E5=86=99=E9=81=93=EF=BC=9A<br></div><blo=
+ckquote style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left=
+-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">On Mon, M=
+ar 17, 2025 at 09:14:05AM -0700, weichu deng wrote:<br>&gt;<span>=C2=A0</sp=
+an><br>&gt;<span>=C2=A0</span><br>&gt; Dear fellow Bitcoin developers,<br>&=
+gt;<span>=C2=A0</span><br>&gt;<span>=C2=A0</span><br>&gt;<span>=C2=A0</span=
+><br>&gt; I am pleased to present a new BIP proposal. This proposal introdu=
+ces a new<span>=C2=A0</span><br>&gt; opcode for Bitcoin scripts: OP_ISSUBST=
+R.<br>&gt;<span>=C2=A0</span><br>&gt;<span>=C2=A0</span><br>&gt; *Abstract*=
+<br>&gt;<span>=C2=A0</span><br>&gt; This BIP introduces two string opcodes,=
+ OP_ISSUBSTR and OP_ISSUBSTRVERIFY<span>=C2=A0</span><br>&gt; (similar to t=
+he relationship between OP_EQUAL and OP_EQUALVERIFY), to<span>=C2=A0</span>=
+<br>&gt; determine whether one string is a substring of another. As these o=
+pcodes do<span>=C2=A0</span><br>&gt; not alter any blockchain state, they a=
+re secure.<br><br>Bitcoin scripts are about validation. Not computation.<br=
+><br>This means that substring search and concatenation are equivalent. For=
+<br>every script that validates a substring search, you can instead<br>conc=
+atenate the substring with the rest of the string, and validate<br>equality=
+ instead.<br><br>Basically speaking:<br><br>foobar foo IsSubStr<br><br>is e=
+quivalent to:<br><br>foobar foo bar Cat Equal<br><br>A real-world example w=
+ould be more complex. But I hope that illustrates<br>my point sufficiently.=
+<br><br>--<span>=C2=A0</span><br><a href=3D"https://petertodd.org/" rel=3D"=
+nofollow" target=3D"_blank" data-saferedirecturl=3D"https://www.google.com/=
+url?hl=3Des&amp;q=3Dhttps://petertodd.org/&amp;source=3Dgmail&amp;ust=3D174=
+3287600558000&amp;usg=3DAOvVaw1Ik2DvB3qmfvCC6WNopIcs">https://petertodd.org=
+</a><span>=C2=A0</span>&#39;peter&#39;[:-1]@<a href=3D"http://petertodd.org=
+/" rel=3D"nofollow" target=3D"_blank" data-saferedirecturl=3D"https://www.g=
+oogle.com/url?hl=3Des&amp;q=3Dhttp://petertodd.org/&amp;source=3Dgmail&amp;=
+ust=3D1743287600558000&amp;usg=3DAOvVaw3q9sFCwjUyG-epYef9h89z">petertodd.or=
+g</a><br></blockquote></div><div style=3D"font-family:Helvetica;font-size:1=
+2px;font-style:normal;font-variant-caps:normal;font-weight:400;letter-spaci=
+ng:normal;text-align:start;text-indent:0px;text-transform:none;white-space:=
+normal;word-spacing:0px;text-decoration:none"><br></div></div></blockquote>=
+</div></div></div></div><div dir=3D"ltr"><div dir=3D"auto" style=3D"line-br=
+eak:after-white-space"><div><div style=3D"direction:ltr"><blockquote type=
+=3D"cite"><div><span style=3D"font-family:Helvetica;font-size:12px;font-sty=
+le:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;te=
+xt-align:start;text-indent:0px;text-transform:none;white-space:normal;word-=
+spacing:0px;text-decoration:none;float:none;display:inline!important">--<sp=
+an>=C2=A0</span></span><br style=3D"font-family:Helvetica;font-size:12px;fo=
+nt-style:normal;font-variant-caps:normal;font-weight:400;letter-spacing:nor=
+mal;text-align:start;text-indent:0px;text-transform:none;white-space:normal=
+;word-spacing:0px;text-decoration:none"><span style=3D"font-family:Helvetic=
+a;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:400=
+;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none=
+;white-space:normal;word-spacing:0px;text-decoration:none;float:none;displa=
+y:inline!important">You received this message because you are subscribed to=
+ the Google Groups &quot;Bitcoin Development Mailing List&quot; group.</spa=
+n><br style=3D"font-family:Helvetica;font-size:12px;font-style:normal;font-=
+variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;=
+text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;tex=
+t-decoration:none"><span style=3D"font-family:Helvetica;font-size:12px;font=
+-style:normal;font-variant-caps:normal;font-weight:400;letter-spacing:norma=
+l;text-align:start;text-indent:0px;text-transform:none;white-space:normal;w=
+ord-spacing:0px;text-decoration:none;float:none;display:inline!important">T=
+o unsubscribe from this group and stop receiving emails from it, send an em=
+ail to<span>=C2=A0</span></span><a style=3D"font-family:Helvetica;font-size=
+:12px;font-style:normal;font-variant-caps:normal;font-weight:400;letter-spa=
+cing:normal;text-align:start;text-indent:0px;text-transform:none;white-spac=
+e:normal;word-spacing:0px" rel=3D"nofollow">bitcoindev+...@googlegroups.com=
+</a><span style=3D"font-family:Helvetica;font-size:12px;font-style:normal;f=
+ont-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:st=
+art;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px=
+;text-decoration:none;float:none;display:inline!important">.</span><br styl=
+e=3D"font-family:Helvetica;font-size:12px;font-style:normal;font-variant-ca=
+ps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-inden=
+t:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decorati=
+on:none"><span style=3D"font-family:Helvetica;font-size:12px;font-style:nor=
+mal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-ali=
+gn:start;text-indent:0px;text-transform:none;white-space:normal;word-spacin=
+g:0px;text-decoration:none;float:none;display:inline!important">To view thi=
+s discussion visit<span>=C2=A0</span></span><a href=3D"https://groups.googl=
+e.com/d/msgid/bitcoindev/678d40e3-3e22-4d55-82c0-b25ccafb87ecn%40googlegrou=
+ps.com?utm_medium=3Demail&amp;utm_source=3Dfooter" style=3D"font-family:Hel=
+vetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weigh=
+t:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform=
+:none;white-space:normal;word-spacing:0px" rel=3D"nofollow" target=3D"_blan=
+k" data-saferedirecturl=3D"https://www.google.com/url?hl=3Des&amp;q=3Dhttps=
+://groups.google.com/d/msgid/bitcoindev/678d40e3-3e22-4d55-82c0-b25ccafb87e=
+cn%2540googlegroups.com?utm_medium%3Demail%26utm_source%3Dfooter&amp;source=
+=3Dgmail&amp;ust=3D1743287600558000&amp;usg=3DAOvVaw24Jy-cBu9db9jrBHwaj2U3"=
+>https://groups.google.com/d/msgid/bitcoindev/678d40e3-3e22-4d55-82c0-b25cc=
+afb87ecn%40googlegroups.com</a><span style=3D"font-family:Helvetica;font-si=
+ze:12px;font-style:normal;font-variant-caps:normal;font-weight:400;letter-s=
+pacing:normal;text-align:start;text-indent:0px;text-transform:none;white-sp=
+ace:normal;word-spacing:0px;text-decoration:none;float:none;display:inline!=
+important">.</span></div></blockquote></div><br></div></div></div>
+</blockquote></div></blockquote></div></blockquote></div>
+
+<p></p>
+
+-- <br />
+You received this message because you are subscribed to the Google Groups &=
+quot;Bitcoin Development Mailing List&quot; group.<br />
+To unsubscribe from this group and stop receiving emails from it, send an e=
+mail to <a href=3D"mailto:bitcoindev+unsubscribe@googlegroups.com">bitcoind=
+ev+unsubscribe@googlegroups.com</a>.<br />
+To view this discussion visit <a href=3D"https://groups.google.com/d/msgid/=
+bitcoindev/e8c30db7-b509-4fbd-93ef-0bca0313003cn%40googlegroups.com?utm_med=
+ium=3Demail&utm_source=3Dfooter">https://groups.google.com/d/msgid/bitcoind=
+ev/e8c30db7-b509-4fbd-93ef-0bca0313003cn%40googlegroups.com</a>.<br />
+
+------=_Part_210539_408308505.1743201613472--
+
+------=_Part_210538_699175425.1743201613472--
+