WEBVTT - Automatic transcript; recognition may contain errors. Reviewed for technical wording and speaker labels. Times match the published episode.

00:00:18.700 --> 00:00:20.580
<v Aaron van Wirdum>Live from Utrecht, this is Bitcoin

00:00:20.580 --> 00:00:22.140
<v Sjors Provoost>Explained.

00:00:22.930 --> 00:00:27.450
<v Aaron van Wirdum>Sjors, I just discovered something. I had never actually paid attention to this

00:00:27.450 --> 00:00:32.400
<v Aaron van Wirdum>before, but I was scrolling through my own podcast app, and I noticed that

00:00:32.400 --> 00:00:36.940
<v Aaron van Wirdum>Bitcoin Explained is getting 4.6 out of 5 stars.

00:00:37.160 --> 00:00:40.960
<v Sjors Provoost>On your random podcast app. Because every podcast app has its own ratings.

00:00:41.360 --> 00:00:46.460
<v Aaron van Wirdum>Is that how it works? Oh, I have Pocket Casts. On Pocket Casts, we get 4.6 stars

00:00:46.460 --> 00:00:51.590
<v Aaron van Wirdum>out of... Oh, every single listener has left a review. We have 20 reviews.

00:00:51.750 --> 00:00:55.370
<v Sjors Provoost>But it's even worse than that. Every podcast app has its own reviews, and then

00:00:55.370 --> 00:00:59.850
<v Sjors Provoost>some podcast app, like Apple, will split those reviews between countries. So you

00:00:59.850 --> 00:01:04.530
<v Sjors Provoost>might have somebody in Tanzania leaving a review, but you will never see it

00:01:04.530 --> 00:01:06.290
<v Sjors Provoost>because we're not in Tanzania.

00:01:07.890 --> 00:01:13.350
<v Aaron van Wirdum>Okay, well, I don't know what to make of 4.6. Let's see. What Bitcoin Did with

00:01:13.350 --> 00:01:14.850
<v Aaron van Wirdum>Danny has 4.8.

00:01:15.520 --> 00:01:16.000
<v Sjors Provoost>Nice.

00:01:16.500 --> 00:01:19.940
<v Aaron van Wirdum>Well, no. That means Danny is doing better than us, Sjors.

00:01:20.820 --> 00:01:21.400
<v Sjors Provoost>Oh, okay.

00:01:22.620 --> 00:01:26.180
<v Aaron van Wirdum>I still have Junseth's World. Junseth's World has got zero reviews.

00:01:26.480 --> 00:01:26.980
<v Sjors Provoost>Zero stars.

00:01:27.140 --> 00:01:28.700
<v Aaron van Wirdum>Zero stars, but that's what he's going for, right?

00:01:28.700 --> 00:01:29.740
<v Sjors Provoost>No, they wanted one star.

00:01:31.520 --> 00:01:37.320
<v Aaron van Wirdum>Bitcoin Audible, 4.9. Oh, my God. Stephan Livera, 4.9.

00:01:37.560 --> 00:01:41.540
<v Aaron van Wirdum>We're the lowest one, Sjors. Other than zero stars.

00:01:43.800 --> 00:01:45.960
<v Aaron van Wirdum>Reckless Review got five stars.

00:01:47.490 --> 00:01:48.010
<v Sjors Provoost>Okay.

00:01:48.090 --> 00:01:52.930
<v Aaron van Wirdum>Does anyone remember what Reckless Review is? I'm still subscribed to it, but

00:01:52.930 --> 00:01:55.750
<v Aaron van Wirdum>that was our goal. That was our only goal, Sjors.

00:01:55.910 --> 00:01:56.750
<v Sjors Provoost>To surpass them.

00:01:56.930 --> 00:02:02.270
<v Aaron van Wirdum>To be better, to at least meet the lowest of low bars and to be better than

00:02:02.270 --> 00:02:04.310
<v Aaron van Wirdum>Reckless Review, but we failed at that even.

00:02:04.710 --> 00:02:05.830
<v Sjors Provoost>Well, sounds good.

00:02:07.920 --> 00:02:11.860
<v Aaron van Wirdum>Let's go for another five-star episode today, Sjors. What do you think?

00:02:12.100 --> 00:02:13.860
<v Sjors Provoost>Sounds like a good plan. You know what else is annoying?

00:02:14.340 --> 00:02:14.980
<v Aaron van Wirdum>What's annoying?

00:02:15.100 --> 00:02:16.280
<v Sjors Provoost>Smoke alarm batteries.

00:02:16.720 --> 00:02:17.100
<v Aaron van Wirdum>Why?

00:02:17.870 --> 00:02:22.670
<v Sjors Provoost>Well, because the way you find out that your smoke alarm battery is empty is at 3

00:02:22.670 --> 00:02:25.970
<v Sjors Provoost>o'clock in the night when it starts beeping and doesn't stop until you find a

00:02:25.970 --> 00:02:27.530
<v Sjors Provoost>ladder and remove the smoke alarm.

00:02:29.590 --> 00:02:31.490
<v Aaron van Wirdum>Repeat that. The only...

00:02:31.490 --> 00:02:36.020
<v Sjors Provoost>The way you find out that your smoke alarm battery is empty is that it starts

00:02:36.020 --> 00:02:40.840
<v Sjors Provoost>beeping at you in the middle of the night. And then... You buy a new battery and

00:02:40.840 --> 00:02:45.200
<v Sjors Provoost>the battery says, oh, don't worry, you can keep this battery in its packaging for

00:02:45.200 --> 00:02:50.200
<v Sjors Provoost>10 years or for five years or whatever. Of course it doesn't. So you don't want

00:02:50.200 --> 00:02:55.960
<v Sjors Provoost>to buy the battery when the last one runs out. Because by the time you need the

00:02:55.960 --> 00:02:59.120
<v Sjors Provoost>new battery, the old battery that you kept in your closet is going to be leaking.

00:03:01.630 --> 00:03:04.390
<v Aaron van Wirdum>Why are we talking about smoke alarm batteries?

00:03:04.650 --> 00:03:07.970
<v Sjors Provoost>Because they are the same battery that fits on the little device that is in front of you.

00:03:09.040 --> 00:03:13.340
<v Aaron van Wirdum>This beautiful device right here uses the same battery as a smoke alarm.

00:03:13.580 --> 00:03:14.260
<v Sjors Provoost>That's right.

00:03:14.400 --> 00:03:19.000
<v Aaron van Wirdum>What is this device? It's, oh my God, it's like a piece of art that I hold in my

00:03:19.000 --> 00:03:19.780
<v Aaron van Wirdum>hands right now.

00:03:20.220 --> 00:03:20.700
<v Sjors Provoost>Yes.

00:03:20.920 --> 00:03:24.350
<v Aaron van Wirdum>It's sublime. Tell me what this is, Sjors.

00:03:24.590 --> 00:03:29.070
<v Sjors Provoost>That is the COLDCARD Q. Also the BlackBerry. No, it's not a BlackBerry. It looks

00:03:29.070 --> 00:03:29.650
<v Sjors Provoost>like a BlackBerry.

00:03:29.830 --> 00:03:35.470
<v Aaron van Wirdum>The COLDCARD by CoinKite happens to be our amazing sponsors as well.

00:03:35.870 --> 00:03:39.590
<v Aaron van Wirdum>Pure coincidence, I'm sure, that it's laying here when you bring that up.

00:03:39.790 --> 00:03:40.250
<v Sjors Provoost>Yes.

00:03:40.310 --> 00:03:43.410
<v Aaron van Wirdum>You just have it here as a piece of art in your living room.

00:03:43.530 --> 00:03:43.870
<v Sjors Provoost>Exactly.

00:03:44.330 --> 00:03:46.750
<v Aaron van Wirdum>For people to admire when they walk in.

00:03:46.890 --> 00:03:47.630
<v Sjors Provoost>Next to the anvil.

00:03:49.540 --> 00:03:54.200
<v Aaron van Wirdum>Seriously, though, COLDCARDs, the hardware wallet that you need to store your

00:03:54.200 --> 00:03:55.600
<v Aaron van Wirdum>Bitcoin. Get it today.

00:03:55.860 --> 00:03:57.120
<v Sjors Provoost>Thanks for sponsoring us.

00:03:57.500 --> 00:04:02.780
<v Aaron van Wirdum>Alrighty. Now, Sjors, today we had a very hard time finding a topic to talk

00:04:02.780 --> 00:04:08.200
<v Aaron van Wirdum>about. We had to look all over the internet to find anything, something technical

00:04:08.200 --> 00:04:13.790
<v Aaron van Wirdum>that people were talking about. Finally, we found this one obscure comment

00:04:13.790 --> 00:04:17.400
<v Aaron van Wirdum>somewhere on GitHub about the OP_RETURN limit.

00:04:17.580 --> 00:04:17.980
<v Sjors Provoost>Yes.

00:04:18.100 --> 00:04:22.380
<v Aaron van Wirdum>And how Bitcoin Core developers or some Bitcoin Core developer wants to

00:04:22.380 --> 00:04:26.560
<v Aaron van Wirdum>potentially lift it. Is that right? Is the rumor true?

00:04:28.300 --> 00:04:32.670
<v Sjors Provoost>I can neither confirm nor deny. No, you can see it on GitHub.

00:04:32.910 --> 00:04:37.790
<v Aaron van Wirdum>Twitter runs ablaze this week. I'm not on Twitter anymore, which I find

00:04:37.790 --> 00:04:43.210
<v Aaron van Wirdum>wonderful. Well, I do have my account, but I really only use it for one-way

00:04:43.210 --> 00:04:45.790
<v Aaron van Wirdum>tweets once in a while. I don't spend any time.

00:04:45.870 --> 00:04:50.360
<v Sjors Provoost>I deleted it, so if you see anybody with my username on Twitter, it's not me. And

00:04:50.360 --> 00:04:51.420
<v Sjors Provoost>I'm not going to double your coins.

00:04:51.600 --> 00:04:55.300
<v Aaron van Wirdum>Yeah, I'm de facto Nostr only. You're really Nostr only.

00:04:55.480 --> 00:04:55.660
<v Sjors Provoost>Yep.

00:04:56.160 --> 00:05:01.380
<v Aaron van Wirdum>Yeah. So honestly, whatever was debated on Twitter on this topic, I don't think

00:05:01.380 --> 00:05:06.340
<v Aaron van Wirdum>I've seen it other than indirectly because other people are talking about it or I

00:05:06.340 --> 00:05:07.920
<v Aaron van Wirdum>saw screenshots on Nostr.

00:05:08.060 --> 00:05:12.760
<v Sjors Provoost>Yeah, but they were also debating it on Nostr and more importantly on GitHub and

00:05:12.760 --> 00:05:13.440
<v Sjors Provoost>on the mailing list.

00:05:14.340 --> 00:05:18.520
<v Aaron van Wirdum>Well, they were not discussing it on GitHub, I heard, because the Core developers

00:05:18.520 --> 00:05:20.100
<v Aaron van Wirdum>shut that discussion down.

00:05:20.220 --> 00:05:21.440
<v Sjors Provoost>Well, not effectively enough.

00:05:24.120 --> 00:05:28.900
<v Aaron van Wirdum>Anyways, okay, so we're going to make the 37th podcast on the OP_RETURN drama.

00:05:29.240 --> 00:05:32.120
<v Sjors Provoost>Yes, and for the listeners, we did one before.

00:05:30.980 --> 00:05:35.620
<v Aaron van Wirdum>But this is just to say this will be the highest quality one. Because we got our

00:05:35.620 --> 00:05:40.060
<v Aaron van Wirdum>very special Sjors. Well, this is not even your first podcast talking about the

00:05:40.060 --> 00:05:41.100
<v Aaron van Wirdum>OP_RETURN drama, I think.

00:05:41.340 --> 00:05:43.580
<v Sjors Provoost>No, we've done episode 61 on it.

00:05:43.760 --> 00:05:49.380
<v Aaron van Wirdum>Well, also, and you were on the Bitcoin Optech podcast. But it's your first

00:05:49.380 --> 00:05:54.880
<v Aaron van Wirdum>podcast speaking about it with me after the drama happened.

00:05:55.840 --> 00:05:59.080
<v Aaron van Wirdum>And indeed, we did other episodes on OP_RETURN as well.

00:05:59.740 --> 00:06:00.180
<v Sjors Provoost>Yes.

00:06:00.460 --> 00:06:06.340
<v Aaron van Wirdum>But let's dig into it. Let's see if we can bring anything new to the table. If not,

00:06:07.960 --> 00:06:13.230
<v Aaron van Wirdum>well, maybe you get at least new voices talking about the same thing. So, dear

00:06:13.230 --> 00:06:15.470
<v Aaron van Wirdum>listener, I hope you enjoy it at least a little bit.

00:06:16.890 --> 00:06:18.170
<v Aaron van Wirdum>Sjors, we're going to start at the beginning.

00:06:20.620 --> 00:06:25.460
<v Aaron van Wirdum>And yes, we did a previous episode on it, which these were episode six, very

00:06:25.460 --> 00:06:30.880
<v Aaron van Wirdum>early one, and episode 76, and I'm sure it came up in other episodes.

00:06:31.000 --> 00:06:33.100
<v Sjors Provoost>You mean episode 61, not six.

00:06:34.390 --> 00:06:36.550
<v Aaron van Wirdum>I have 76 here, though.

00:06:36.950 --> 00:06:37.570
<v Sjors Provoost>Yeah, 61.

00:06:37.730 --> 00:06:38.950
<v Aaron van Wirdum>Oh, not six.

00:06:39.030 --> 00:06:39.170
<v Sjors Provoost>Yeah.

00:06:39.370 --> 00:06:45.100
<v Aaron van Wirdum>Oh, right. That was one after the six on the next. Next row. Okay, 61 and

00:06:45.100 --> 00:06:50.000
<v Aaron van Wirdum>76, probably here and there between as well. But actually, I do want to sort of

00:06:50.000 --> 00:06:55.530
<v Aaron van Wirdum>use this episode to kind of give a complete picture. So let's not go

00:06:55.530 --> 00:06:59.530
<v Aaron van Wirdum>back to that episode thing and let's just kind of start from the beginning.

00:06:59.690 --> 00:07:03.110
<v Sjors Provoost>No, but you could listen to it if you think that I randomly changed my mind on

00:07:03.110 --> 00:07:06.170
<v Sjors Provoost>these topics, which is possible. But we have the earlier episode.

00:07:08.660 --> 00:07:14.300
<v Aaron van Wirdum>Sure. Let's start at the beginning. What is OP_RETURN? Let's start there. What is

00:07:14.300 --> 00:07:14.880
<v Aaron van Wirdum>OP_RETURN?

00:07:14.980 --> 00:07:18.760
<v Sjors Provoost>Well, if we really go back to the beginning, it was a way to basically steal

00:07:18.760 --> 00:07:23.020
<v Sjors Provoost>everybody's coins. Because there was a bug in the original version of it. It

00:07:23.020 --> 00:07:23.860
<v Sjors Provoost>basically says like...

00:07:23.860 --> 00:07:28.040
<v Aaron van Wirdum>Well, okay, first question. Was OP_RETURN in the Bitcoin protocol since day one?

00:07:28.460 --> 00:07:28.940
<v Sjors Provoost>Yes.

00:07:29.400 --> 00:07:34.560
<v Aaron van Wirdum>Okay, but that means, because you mentioned, there was originally a bug in the

00:07:34.560 --> 00:07:38.880
<v Aaron van Wirdum>OP_RETURN implementation. So that means, if I understand you correctly...

00:07:39.380 --> 00:07:42.540
<v Sjors Provoost>It wasn't in the OP_RETURN implementation itself. It was that you can use it

00:07:42.540 --> 00:07:48.280
<v Sjors Provoost>basically the way, just as a reminder, how do you spend a Bitcoin? You spend an

00:07:48.280 --> 00:07:52.420
<v Sjors Provoost>output, right? So it's like coins. And the output says, here's a challenge if you

00:07:52.420 --> 00:07:57.180
<v Sjors Provoost>want to spend me. And then the way you do it in practice is first you provide

00:07:57.180 --> 00:08:01.100
<v Sjors Provoost>some answers to the blockchain. We now call that the witness. It used to be the

00:08:01.100 --> 00:08:05.080
<v Sjors Provoost>scriptSig. It doesn't really matter. You start with the answer. And then it's

00:08:05.080 --> 00:08:10.760
<v Sjors Provoost>followed by the question. It's kind of a riddle-y way, right? So you say, your

00:08:10.760 --> 00:08:14.840
<v Sjors Provoost>answer might be, here's my signature. And then the question would be, like, give

00:08:14.840 --> 00:08:16.180
<v Sjors Provoost>me a signature for this public key.

00:08:17.320 --> 00:08:19.900
<v Aaron van Wirdum>For the next person that will spend it.

00:08:20.020 --> 00:08:24.480
<v Sjors Provoost>Yes. Now, the problem is, because of this sequence, if you use OP_RETURN, you

00:08:24.480 --> 00:08:27.800
<v Sjors Provoost>could say, okay, OP_RETURN, that just says, I'm done now.

00:08:29.360 --> 00:08:31.700
<v Sjors Provoost>And so you're not going to look at the question.

00:08:32.820 --> 00:08:34.640
<v Aaron van Wirdum>This is already skipping ahead too far.

00:08:34.800 --> 00:08:37.120
<v Sjors Provoost>That was basically how, I believe, how the bug worked.

00:08:37.700 --> 00:08:42.080
<v Aaron van Wirdum>Yeah, but people don't understand how the bug works if they don't understand

00:08:42.080 --> 00:08:46.990
<v Aaron van Wirdum>OP_RETURN itself, right? So that's why you're skipping ahead too far already. In

00:08:46.990 --> 00:08:50.870
<v Aaron van Wirdum>either case, this is not even what we're talking about, the bug. But I guess

00:08:50.870 --> 00:08:53.450
<v Aaron van Wirdum>we... What is OP_RETURN?

00:08:53.550 --> 00:08:58.600
<v Sjors Provoost>It just says, like, you're done now. We're finished evaluating this. whatever

00:08:58.600 --> 00:09:00.180
<v Sjors Provoost>script it is. It's the end of the script.

00:09:00.320 --> 00:09:00.460
<v Aaron van Wirdum>Right.

00:09:00.720 --> 00:09:02.320
<v Sjors Provoost>Even if it's not actually the end of the script.

00:09:02.340 --> 00:09:08.160
<v Aaron van Wirdum>So I'm running a node and my node is looking at a transaction. So in my node,

00:09:08.320 --> 00:09:13.840
<v Aaron van Wirdum>my computer is reading these transactions, going line for line, seeing what I'm

00:09:13.840 --> 00:09:18.220
<v Aaron van Wirdum>supposed to do here. And then at some point, my node sees OP_RETURN in a

00:09:18.220 --> 00:09:21.120
<v Aaron van Wirdum>transaction and then my node says, oh, I'm done reading now.

00:09:21.260 --> 00:09:21.480
<v Sjors Provoost>Yes.

00:09:21.940 --> 00:09:22.200
<v Aaron van Wirdum>Okay.

00:09:22.560 --> 00:09:27.600
<v Sjors Provoost>And I guess the thing I forgot about the exploit is... When you're done reading,

00:09:27.900 --> 00:09:32.520
<v Sjors Provoost>the question then is, is this transaction now valid or not? That's the actual

00:09:32.520 --> 00:09:34.280
<v Sjors Provoost>challenge. Can I spend this coin or not?

00:09:34.400 --> 00:09:34.500
<v Aaron van Wirdum>Yeah.

00:09:34.920 --> 00:09:38.360
<v Sjors Provoost>And whether or not you can spend a coin does not depend on the last thing you

00:09:38.360 --> 00:09:41.740
<v Sjors Provoost>read. It depends on what's on the stack. And we talked about stacks earlier. Like

00:09:41.740 --> 00:09:45.200
<v Sjors Provoost>you put something on the stack and you can take things off the stack and you can

00:09:45.200 --> 00:09:47.120
<v Sjors Provoost>multiply them, whatever. Well, you can multiply them.

00:09:48.430 --> 00:09:53.420
<v Sjors Provoost>And so what you would do is you put the word true. on the stack and then you

00:09:53.420 --> 00:09:58.000
<v Sjors Provoost>finish and so the rule is if at the end of a script the last thing on the stack

00:09:58.000 --> 00:10:02.810
<v Sjors Provoost>is true then you're done so this was kind of the trick you would just put true on

00:10:02.810 --> 00:10:04.930
<v Sjors Provoost>the stack and you would stop and you wouldn't read the challenge

00:10:04.930 --> 00:10:10.750
<v Aaron van Wirdum>okay but I want to ask what is the benefit of this what is the benefit of

00:10:10.750 --> 00:10:12.050
<v Aaron van Wirdum>saying stop reading now

00:10:12.050 --> 00:10:16.080
<v Sjors Provoost>I mean it's used in pretty much every programming language to say okay

00:10:17.310 --> 00:10:20.710
<v Sjors Provoost>the program is done or yeah usually or the function is done

00:10:20.710 --> 00:10:26.390
<v Aaron van Wirdum>well why not just stop writing code after OP_RETURN

00:10:26.390 --> 00:10:30.070
<v Aaron van Wirdum>and not include OP_RETURN because then the node is also done reading because

00:10:30.070 --> 00:10:31.530
<v Aaron van Wirdum>there's nothing to read like what's the difference

00:10:31.530 --> 00:10:35.230
<v Sjors Provoost>yeah so this is why you know it's a general thing that you would use in

00:10:35.230 --> 00:10:38.550
<v Sjors Provoost>programming language it wasn't I don't think there was a specific reason to

00:10:38.550 --> 00:10:43.220
<v Sjors Provoost>include it Satoshi just added a whole bunch of opcodes to Bitcoin some of which

00:10:43.220 --> 00:10:46.580
<v Sjors Provoost>were, like, a lot of them were just from, this is kind of how programming

00:10:46.580 --> 00:10:49.620
<v Sjors Provoost>languages work and we can make smart contracts. I think there wasn't that much

00:10:49.620 --> 00:10:53.400
<v Sjors Provoost>thinking about which opcodes to include, which is why a lot of them were disabled.

00:10:53.580 --> 00:10:57.520
<v Aaron van Wirdum>Okay, the way you're explaining it to me now, and this is the first time I'm

00:10:57.520 --> 00:11:02.060
<v Aaron van Wirdum>hearing it explained like this, so let me ask, you explain it like OP_RETURN is

00:11:02.060 --> 00:11:06.040
<v Aaron van Wirdum>the equivalent of, like, a dot in regular text. It's like the end of the

00:11:06.040 --> 00:11:08.600
<v Aaron van Wirdum>sentence. Is that what it is?

00:11:08.740 --> 00:11:13.060
<v Sjors Provoost>Pretty much. I mean, in programming language, you can use return just as its own

00:11:13.060 --> 00:11:17.080
<v Sjors Provoost>statement, which just ends, but you can also put a value after it. So you can

00:11:17.080 --> 00:11:20.920
<v Sjors Provoost>return something, return a value. That's kind of where it comes from. So you can

00:11:20.920 --> 00:11:25.580
<v Sjors Provoost>say return five, and then whichever function is calling you gets the number five.

00:11:26.410 --> 00:11:29.710
<v Sjors Provoost>But this gets too deep in the programming weeds. I think for the purpose of

00:11:29.710 --> 00:11:31.490
<v Sjors Provoost>Bitcoin, it just means stop where you are.

00:11:31.790 --> 00:11:32.210
<v Aaron van Wirdum>Yeah, okay.

00:11:33.800 --> 00:11:38.580
<v Aaron van Wirdum>So let me skip ahead a little bit, or not, depending on your answer. The way

00:11:38.580 --> 00:11:44.380
<v Aaron van Wirdum>OP_RETURN is used is you put some sort of other kind of data

00:11:44.380 --> 00:11:49.250
<v Aaron van Wirdum>in... in OP_RETURN. That's how it's usually explained. Like you have an OP_RETURN

00:11:49.250 --> 00:11:52.930
<v Aaron van Wirdum>output and then you put some other kind of data, whether that's a hash or

00:11:52.930 --> 00:11:57.150
<v Aaron van Wirdum>something. That's what you use OP_RETURN for. My question then is, was that the

00:11:57.150 --> 00:12:00.690
<v Aaron van Wirdum>original intention of OP_RETURN or is that something that was figured out later

00:12:00.690 --> 00:12:03.850
<v Aaron van Wirdum>in the sense of, okay, that's what we could use that for?

00:12:03.970 --> 00:12:07.890
<v Sjors Provoost>I think it was figured out later. I think the original reason was it just stops

00:12:07.890 --> 00:12:10.990
<v Sjors Provoost>the program. And because you stop the program, you can put whatever you want

00:12:10.990 --> 00:12:12.550
<v Sjors Provoost>after it because you're not going to check it.

00:12:12.920 --> 00:12:17.380
<v Aaron van Wirdum>Okay, I think this is new to me, unless you explained this to me in a previous episode.

00:12:17.500 --> 00:12:18.760
<v Sjors Provoost>I don't know if I did, but...

00:12:18.760 --> 00:12:19.520
<v Aaron van Wirdum>You may have.

00:12:21.200 --> 00:12:25.800
<v Aaron van Wirdum>So it was not necessarily the original intention of Satoshi for putting OP_RETURN

00:12:25.800 --> 00:12:31.240
<v Aaron van Wirdum>in there, but it did effectively work that way. Because if my node stops

00:12:31.240 --> 00:12:36.120
<v Aaron van Wirdum>assessing data, but the data is technically in the transaction, then that means

00:12:36.120 --> 00:12:39.970
<v Aaron van Wirdum>that... you know, the data ends up in the blockchain and can be used for other

00:12:39.970 --> 00:12:45.810
<v Aaron van Wirdum>purposes, basically. That's how OP_RETURN was effectively used,

00:12:45.830 --> 00:12:46.570
<v Aaron van Wirdum>at least later.

00:12:46.810 --> 00:12:51.630
<v Sjors Provoost>Yeah, I think the first OP_RETURN ever was long after Satoshi left, but I haven't

00:12:51.630 --> 00:12:52.190
<v Sjors Provoost>checked this.

00:12:53.970 --> 00:12:57.550
<v Sjors Provoost>I mean, Satoshi himself put a message in the blockchain at the Genesis block, but

00:12:57.550 --> 00:12:58.730
<v Sjors Provoost>he didn't put it in an OP_RETURN.

00:12:58.870 --> 00:12:59.990
<v Aaron van Wirdum>No, he put it in a Coinbase.

00:13:00.130 --> 00:13:00.290
<v Sjors Provoost>Yeah.

00:13:00.710 --> 00:13:06.100
<v Aaron van Wirdum>Okay, you think... double-check us if one of our listeners thinks it's wrong or

00:13:06.100 --> 00:13:10.280
<v Aaron van Wirdum>not. We don't actually care. We're not going to read the comments. But you think,

00:13:10.420 --> 00:13:15.860
<v Aaron van Wirdum>Sjors, that OP_RETURN was probably only ever used after Satoshi left, in fact.

00:13:16.640 --> 00:13:19.520
<v Sjors Provoost>I think so. You can easily check this. I don't know for sure.

00:13:20.700 --> 00:13:20.960
<v Aaron van Wirdum>Okay.

00:13:23.310 --> 00:13:28.990
<v Aaron van Wirdum>So the original thing was just a generic code thing. Stop reading here.

00:13:29.870 --> 00:13:33.630
<v Sjors Provoost>Yeah, this is one of many opcodes that Satoshi added, and it's kind of standard

00:13:33.630 --> 00:13:35.650
<v Sjors Provoost>if you know how programming languages work.

00:13:35.810 --> 00:13:38.930
<v Aaron van Wirdum>Okay, and now the next step. Now the first time it was used, or maybe not the

00:13:38.930 --> 00:13:43.370
<v Aaron van Wirdum>first time, but when it started to be. People started to use OP_RETURN to embed

00:13:43.370 --> 00:13:48.850
<v Aaron van Wirdum>other types of data other than transaction data, other than send Bitcoins from

00:13:48.850 --> 00:13:53.850
<v Aaron van Wirdum>here to there. Other types of data. in the blockchain and they were used... Okay,

00:13:53.850 --> 00:13:54.920
<v Aaron van Wirdum>go on. You go first.

00:13:54.530 --> 00:13:58.850
<v Sjors Provoost>Here, I'm not sure if they actually did that first. I think what they did first

00:13:58.850 --> 00:14:00.490
<v Sjors Provoost>was to use fake public keys.

00:14:00.590 --> 00:14:00.710
<v Aaron van Wirdum>Right.

00:14:00.890 --> 00:14:04.930
<v Sjors Provoost>And then somebody told them, hey, don't do that. Use OP_RETURN instead.

00:14:05.210 --> 00:14:05.260
<v Aaron van Wirdum>Right.

00:14:06.450 --> 00:14:10.530
<v Sjors Provoost>So let's assume that this sequence is incorrect. It doesn't really matter for the argument.

00:14:10.850 --> 00:14:11.010
<v Aaron van Wirdum>Indeed.

00:14:13.120 --> 00:14:16.240
<v Sjors Provoost>So, okay. So you want to embed something in the data and you're like, we're in

00:14:16.240 --> 00:14:19.440
<v Sjors Provoost>the blockchain. The first thing is you would ask yourself is where am I going to

00:14:19.440 --> 00:14:19.920
<v Sjors Provoost>put this?

00:14:20.950 --> 00:14:25.130
<v Aaron van Wirdum>You want to put data in the blockchain that's not sending Bitcoins from A to B.

00:14:25.130 --> 00:14:25.810
<v Sjors Provoost>Yeah, and at the time...

00:14:25.810 --> 00:14:27.490
<v Aaron van Wirdum>Other type of data, for whatever reason.

00:14:27.670 --> 00:14:30.190
<v Sjors Provoost>Yeah, and so at the time you're like, okay, what is in a transaction? Well,

00:14:30.270 --> 00:14:34.390
<v Sjors Provoost>there's public keys, there's signatures, all these things. Why don't I just make

00:14:34.390 --> 00:14:38.630
<v Sjors Provoost>a fake... Well, if you make a fake signature, then the transaction is invalid, so

00:14:38.630 --> 00:14:41.790
<v Sjors Provoost>it doesn't end up in the blockchain. At least, you know, there's some caveats

00:14:41.790 --> 00:14:46.360
<v Sjors Provoost>there, but that's a general idea. But a fake public key... Yeah, you can do that.

00:14:46.800 --> 00:14:50.880
<v Aaron van Wirdum>Yeah, and by fake public key, what you mean is something that looks like a public

00:14:50.880 --> 00:14:56.740
<v Aaron van Wirdum>key, except some parts of the numbers and figures that are in there are

00:14:56.740 --> 00:14:58.880
<v Aaron van Wirdum>actually data that you use for something else, right?

00:14:58.880 --> 00:15:01.880
<v Sjors Provoost>Yes, and the effect of that is that there's not going to be a corresponding

00:15:01.880 --> 00:15:06.820
<v Sjors Provoost>private key. You can infer that as a human. So one of the first things that are

00:15:06.820 --> 00:15:11.280
<v Sjors Provoost>in the blockchain, I think, is a picture of Obama, the Bitcoin white paper PDF.

00:15:11.620 --> 00:15:13.780
<v Sjors Provoost>You can get it out of the blockchain. Yeah.

00:15:15.430 --> 00:15:18.770
<v Sjors Provoost>And I think a lot of that is done with fake signatures. Some of it might have

00:15:18.770 --> 00:15:19.990
<v Sjors Provoost>been done later with OP_RETURN.

00:15:20.230 --> 00:15:25.190
<v Aaron van Wirdum>Yeah, so what I could do potentially is I could write a message to you that says,

00:15:25.390 --> 00:15:30.080
<v Aaron van Wirdum>hey, Sjors, let's explain the new Bitcoin Explained. Let's record a new

00:15:30.080 --> 00:15:35.980
<v Aaron van Wirdum>Bitcoin Explained episode today at 6. And then I create a bunch of pubkeys that

00:15:35.980 --> 00:15:41.180
<v Aaron van Wirdum>have these exact letters as the last letters of each one of them. Hi, Sjors, you

00:15:41.180 --> 00:15:45.300
<v Aaron van Wirdum>can actually read that. And if you run some sort of program that monitors the

00:15:45.300 --> 00:15:49.080
<v Aaron van Wirdum>blockchain for that, then at some point you can actually see that message and

00:15:49.080 --> 00:15:52.080
<v Aaron van Wirdum>then you can message me back in the same way. And now we've created a bunch of

00:15:52.080 --> 00:15:55.420
<v Aaron van Wirdum>pubkeys that cannot actually be spent because I just generated them for the

00:15:55.420 --> 00:15:59.860
<v Aaron van Wirdum>message. But they do end up... in the blockchain, and worse,

00:16:00.100 --> 00:16:01.460
<v Sjors Provoost>they end up in the UTXO set.

00:16:01.520 --> 00:16:02.720
<v Aaron van Wirdum>They end up in the UTXO set.

00:16:02.880 --> 00:16:08.070
<v Sjors Provoost>Yeah, and the UTXO set is this database of coins that exist. And right now this

00:16:08.070 --> 00:16:11.050
<v Sjors Provoost>database, I think if you put it on your disk, it's like 13 gigabytes.

00:16:11.390 --> 00:16:15.630
<v Aaron van Wirdum>To be clear, to be clear. So if I do this, then of course I do indeed need to

00:16:15.630 --> 00:16:19.610
<v Aaron van Wirdum>send some coins to each of these addresses, right? One satoshi at least. Or not

00:16:19.610 --> 00:16:20.950
<v Aaron van Wirdum>even? Or can I send zero?

00:16:21.090 --> 00:16:24.670
<v Sjors Provoost>No, there's a dust limit. So you have to send, I think, a couple hundred satoshis

00:16:24.670 --> 00:16:25.070
<v Sjors Provoost>in practice.

00:16:25.290 --> 00:16:26.210
<v Aaron van Wirdum>Well, is that a consensus?

00:16:26.590 --> 00:16:26.950
<v Sjors Provoost>No.

00:16:27.210 --> 00:16:27.390
<v Aaron van Wirdum>Okay.

00:16:27.510 --> 00:16:31.490
<v Sjors Provoost>No, no, no. Consensus-wise, you can actually spend zero and you can make a

00:16:31.490 --> 00:16:32.690
<v Sjors Provoost>transaction that spends nothing.

00:16:34.310 --> 00:16:35.790
<v Sjors Provoost>also doesn't produce any outputs.

00:16:35.930 --> 00:16:38.390
<v Aaron van Wirdum>Yeah, I heard that recently on the Bitcoin Explained podcast.

00:16:39.110 --> 00:16:39.470
<v Sjors Provoost>Interesting.

00:16:39.610 --> 00:16:43.410
<v Aaron van Wirdum>Yeah, they were talking about a new Bitcoin Core release and I learned a lot from it.

00:16:43.590 --> 00:16:45.170
<v Sjors Provoost>Okay, well, it sounds like a nice podcast then.

00:16:46.020 --> 00:16:49.800
<v Aaron van Wirdum>But practically speaking, let's say I wanted to send these messages, then yeah,

00:16:49.980 --> 00:16:53.800
<v Aaron van Wirdum>probably I would just use the dust limit, which is whatever it is, 400 sats or

00:16:53.800 --> 00:16:54.240
<v Aaron van Wirdum>what is it?

00:16:54.320 --> 00:16:54.460
<v Sjors Provoost>Yeah.

00:16:55.180 --> 00:16:55.980
<v Aaron van Wirdum>Whatever it is.

00:16:56.140 --> 00:16:56.360
<v Sjors Provoost>Whatever.

00:16:56.800 --> 00:17:01.300
<v Aaron van Wirdum>Yeah, it's pretty cheap still and then I have this message. The thing is that the

00:17:01.300 --> 00:17:02.380
<v Aaron van Wirdum>rest of the world...

00:17:02.380 --> 00:17:04.080
<v Sjors Provoost>And especially then, it was pretty cheap, right?

00:17:04.520 --> 00:17:09.920
<v Aaron van Wirdum>Right. So the rest of the world, I know that I can't spend these coins. You can

00:17:09.920 --> 00:17:12.760
<v Aaron van Wirdum>probably also figure out that I can't spend these coins. But for the rest of the

00:17:12.760 --> 00:17:17.140
<v Aaron van Wirdum>world, it just looks like spendable coins. Now the rest of the world, everyone

00:17:17.140 --> 00:17:22.720
<v Aaron van Wirdum>who runs a node needs to keep track of these coins and their existence. And in

00:17:22.720 --> 00:17:28.100
<v Aaron van Wirdum>fact, because they go into the UTXO set, so the database basically of unspent

00:17:28.100 --> 00:17:33.320
<v Aaron van Wirdum>coins, that means I think, correct me if I'm wrong, but they end up in the...

00:17:34.830 --> 00:17:38.010
<v Aaron van Wirdum>the memory of your computer, which is kind of resource-intensive.

00:17:38.130 --> 00:17:41.270
<v Sjors Provoost>Yeah, they don't have to be in memory, but it's better if you do. But the most

00:17:41.270 --> 00:17:42.690
<v Sjors Provoost>important thing is you cannot delete it.

00:17:42.870 --> 00:17:43.230
<v Aaron van Wirdum>Yeah.

00:17:43.590 --> 00:17:48.350
<v Sjors Provoost>Because, I mean, you could bluff, basically. You could say, well, I'm going to

00:17:48.350 --> 00:17:51.870
<v Sjors Provoost>look at these transactions and I know nobody can spend it, so I know I can delete

00:17:51.870 --> 00:17:54.970
<v Sjors Provoost>this from my computer and it will never cause a problem. But if you're wrong,

00:17:55.190 --> 00:17:58.370
<v Sjors Provoost>somebody creates something that looks like a picture, but it's actually, you

00:17:58.370 --> 00:18:02.530
<v Sjors Provoost>know, it's a real key and they end up spending it. well, you will look at that

00:18:02.530 --> 00:18:05.530
<v Sjors Provoost>block and think the block is invalid because they're spending a coin that doesn't

00:18:05.530 --> 00:18:09.590
<v Sjors Provoost>exist because you deleted it. So there's really no objective way to figure out

00:18:09.590 --> 00:18:13.050
<v Sjors Provoost>which of these coins are real and which of these are fake, other than saying,

00:18:13.190 --> 00:18:17.470
<v Sjors Provoost>hey, Bitcoin Core, why don't you make a database and tell us all what the real

00:18:17.470 --> 00:18:21.050
<v Sjors Provoost>coins are and what the spam coins are? But that would be fairly centralizing.

00:18:22.310 --> 00:18:23.410
<v Aaron van Wirdum>We don't want that.

00:18:23.690 --> 00:18:23.810
<v Sjors Provoost>No.

00:18:26.530 --> 00:18:32.360
<v Aaron van Wirdum>Okay, so then at some point, Core developers said, This sucks. We don't want

00:18:32.360 --> 00:18:37.940
<v Aaron van Wirdum>you guys to upload Obama pictures and white papers and Bitcoin Explained

00:18:37.940 --> 00:18:43.920
<v Aaron van Wirdum>scheduling messages into the UTXO set. That sucks. Here

00:18:43.920 --> 00:18:47.020
<v Aaron van Wirdum>is actually a better solution, right? That's kind of how it went.

00:18:47.820 --> 00:18:51.740
<v Sjors Provoost>Yeah, so I guess there were people that said don't embed this kind of stuff

00:18:51.740 --> 00:18:56.420
<v Sjors Provoost>anywhere. But specifically, don't put it in the UTXO set because it is this thing

00:18:56.420 --> 00:19:00.000
<v Sjors Provoost>that will grow forever until the end of time. Like, you cannot shrink it. Every

00:19:00.000 --> 00:19:03.940
<v Sjors Provoost>time you spend a coin, it shrinks. But if you never spend a coin, it never shrinks.

00:19:04.760 --> 00:19:08.260
<v Aaron van Wirdum>Yeah, so if you create UTXOs that cannot be spent, then...

00:19:08.540 --> 00:19:10.320
<v Sjors Provoost>then they will never be spent, exactly.

00:19:11.940 --> 00:19:16.680
<v Sjors Provoost>So the idea was, okay, how can we, you know, we can't stop people because, again,

00:19:16.900 --> 00:19:21.300
<v Sjors Provoost>then that would require some weirdness. But you can encourage people to put data

00:19:21.300 --> 00:19:24.660
<v Sjors Provoost>on the blockchain in a way that does not grow the UTXO set. And that is when

00:19:24.660 --> 00:19:26.540
<v Sjors Provoost>people realized you can use OP_RETURN for this.

00:19:27.020 --> 00:19:27.160
<v Aaron van Wirdum>Right.

00:19:27.320 --> 00:19:30.860
<v Sjors Provoost>And so then a change was made in the relay rules. We'll need to get to the relay

00:19:30.860 --> 00:19:36.710
<v Sjors Provoost>rules with basically saying, just put this OP_RETURN code and then after it, put

00:19:36.710 --> 00:19:37.410
<v Sjors Provoost>your JPEGs.

00:19:37.690 --> 00:19:37.790
<v Aaron van Wirdum>Yeah.

00:19:38.170 --> 00:19:40.510
<v Sjors Provoost>And then the limit was still 80 bytes.

00:19:41.130 --> 00:19:46.610
<v Aaron van Wirdum>Well, so let's get to that right now. So the way I understand it, what I

00:19:46.610 --> 00:19:50.350
<v Aaron van Wirdum>remember, I think, from our previous episode, is that originally,

00:19:51.660 --> 00:19:57.260
<v Aaron van Wirdum>as a consensus rule, as what is valid in a block, there was never a limit on OP_RETURN.

00:19:57.560 --> 00:19:57.820
<v Sjors Provoost>Yes.

00:19:58.340 --> 00:20:04.170
<v Aaron van Wirdum>The block size limit was made one megabyte by Satoshi. I guess

00:20:04.170 --> 00:20:04.890
<v Aaron van Wirdum>before that.

00:20:05.010 --> 00:20:07.130
<v Sjors Provoost>Yeah, the original OP_RETURN limit was 32 megabyte.

00:20:07.890 --> 00:20:11.070
<v Aaron van Wirdum>And that was because transactions of...

00:20:11.070 --> 00:20:14.370
<v Sjors Provoost>Because blocks are 32 megabytes. And I think even that limit...

00:20:14.370 --> 00:20:16.910
<v Aaron van Wirdum>Was that even a consensus rule? I think even that was a relay rule.

00:20:19.230 --> 00:20:23.230
<v Sjors Provoost>Well, I don't know about relay rule, but it was like any network message that was

00:20:23.230 --> 00:20:26.810
<v Sjors Provoost>larger would be rejected. So it's possible if you got the block on a floppy disk,

00:20:26.930 --> 00:20:30.890
<v Sjors Provoost>then you could load it. Right. But it's not like what we now would call a policy rule.

00:20:30.990 --> 00:20:33.550
<v Aaron van Wirdum>Yeah, policy rule. That's a term I was looking for, actually.

00:20:36.020 --> 00:20:41.840
<v Aaron van Wirdum>But at least as a consensus rule, OP_RETURN transactions could be as big as block

00:20:41.840 --> 00:20:47.500
<v Aaron van Wirdum>size limits or the message limit that you just mentioned. But at that point,

00:20:47.740 --> 00:20:53.440
<v Aaron van Wirdum>I think there was still a relay restriction of no OP_RETURNs at all,

00:20:53.640 --> 00:20:58.100
<v Aaron van Wirdum>maybe. Like OP_RETURNs would just not be relayed. Is that correct, or do you not

00:20:58.100 --> 00:20:58.580
<v Aaron van Wirdum>know this?

00:20:58.620 --> 00:21:02.720
<v Sjors Provoost>Yes, so if we go back to relay history in general, without recapping everything,

00:21:03.280 --> 00:21:08.060
<v Sjors Provoost>in the beginning, Satoshi made a whitelist of things that can be relayed.

00:21:09.400 --> 00:21:14.180
<v Sjors Provoost>basically between nodes. And those would be the very standard transaction types.

00:21:14.340 --> 00:21:17.220
<v Sjors Provoost>Like I'm spending from a public key and receiving to a public key. There were

00:21:17.220 --> 00:21:22.630
<v Sjors Provoost>some limits on, say, multi-signature, how many, I think it was three. in a

00:21:22.630 --> 00:21:27.470
<v Sjors Provoost>multisig, so no more than three keys in a multisig, etc. So it was a very, very

00:21:27.470 --> 00:21:31.030
<v Sjors Provoost>small subset of everything that was possible, was allowed, and it was definitely

00:21:31.030 --> 00:21:31.670
<v Sjors Provoost>a whitelist.

00:21:31.910 --> 00:21:37.630
<v Aaron van Wirdum>Yeah, and to re-emphasize this, you now distinguish between what is

00:21:37.630 --> 00:21:42.810
<v Aaron van Wirdum>possible and what is allowed. The difference is, there is one set of rules, the

00:21:42.810 --> 00:21:46.810
<v Aaron van Wirdum>consensus rules, for what may end up in a block, and other nodes will consider

00:21:46.810 --> 00:21:51.470
<v Aaron van Wirdum>valid. And then there's another set of rules. The relay rules or what's the

00:21:51.470 --> 00:21:53.110
<v Aaron van Wirdum>actual policy rules?

00:21:53.210 --> 00:21:53.750
<v Sjors Provoost>Policy rules.

00:21:53.930 --> 00:21:58.210
<v Aaron van Wirdum>And that will determine what nodes will accept in their mempool and relay to

00:21:58.210 --> 00:21:58.830
<v Aaron van Wirdum>other nodes.

00:21:58.990 --> 00:21:59.370
<v Sjors Provoost>Yeah.

00:21:59.510 --> 00:22:02.750
<v Aaron van Wirdum>Right? That's the difference. Okay, so there's one set of rules for what goes

00:22:02.750 --> 00:22:06.510
<v Aaron van Wirdum>into a block, what's allowed, and one set of rules for what a node will tell

00:22:06.510 --> 00:22:11.720
<v Aaron van Wirdum>other nodes is happening. Right? So, at first, anything was allowed in a block,

00:22:11.900 --> 00:22:16.920
<v Aaron van Wirdum>or at least any OP_RETURN size was allowed in a block, but nodes would not send

00:22:16.920 --> 00:22:20.980
<v Aaron van Wirdum>it to other nodes. They would say, OP_RETURN, I'm not going to help spread that.

00:22:21.220 --> 00:22:26.700
<v Aaron van Wirdum>But that was then changed. So, at that point, Core developers said, there was a

00:22:26.700 --> 00:22:27.640
<v Aaron van Wirdum>debate about this.

00:22:29.520 --> 00:22:33.220
<v Aaron van Wirdum>whether it should be 40 or 80, and I think they settled on 80 bytes.

00:22:33.560 --> 00:22:33.920
<v Sjors Provoost>Yes.

00:22:34.160 --> 00:22:37.860
<v Aaron van Wirdum>Yeah, so they said, okay, from now on, with this new Bitcoin Core release, that

00:22:37.860 --> 00:22:41.820
<v Aaron van Wirdum>was the Bitcoin Core, whatever, six or whatever it was. I don't know. Do you know this?

00:22:41.880 --> 00:22:42.220
<v Sjors Provoost>I don't know.

00:22:42.380 --> 00:22:46.220
<v Aaron van Wirdum>Yeah, well, it was a long time ago. They said, okay, from now on, we are going to

00:22:46.220 --> 00:22:51.930
<v Aaron van Wirdum>relay OP_RETURNs up to 80 bytes. Okay, why was... The limit set

00:22:51.930 --> 00:22:53.090
<v Aaron van Wirdum>at 80 bytes.

00:22:53.210 --> 00:22:56.630
<v Sjors Provoost>Yeah. So for this, we need to introduce another use case of this putting data on

00:22:56.630 --> 00:23:00.630
<v Sjors Provoost>the blockchain because this 80 bytes is still not enough to relay anything like

00:23:00.630 --> 00:23:04.910
<v Sjors Provoost>the white paper and JPEGs. I guess they weren't that popular back then, but what

00:23:04.910 --> 00:23:09.610
<v Sjors Provoost>was starting to get popular was something called Counterparty. And it was more

00:23:09.610 --> 00:23:13.670
<v Sjors Provoost>about smart contracts that would not put the actual image on the blockchain, but

00:23:13.670 --> 00:23:17.110
<v Sjors Provoost>put like a hash of the image in the blockchain and you would sell, quote unquote,

00:23:17.510 --> 00:23:17.930
<v Sjors Provoost>your...

00:23:19.670 --> 00:23:25.140
<v Sjors Provoost>trading cards, NFTs, as we call them now. And those transactions, I think...

00:23:25.140 --> 00:23:28.340
<v Aaron van Wirdum>Yeah, I mean, I think Counterparty was more than just that, but go on, yeah.

00:23:28.780 --> 00:23:30.600
<v Sjors Provoost>Yeah, but basically those transactions...

00:23:30.600 --> 00:23:33.180
<v Aaron van Wirdum>I mean, it was also like meta coins and stuff like that, but go on.

00:23:33.280 --> 00:23:36.420
<v Sjors Provoost>Yeah, trading cards is one example, but there were other things. Rare Pepe was

00:23:36.420 --> 00:23:37.860
<v Sjors Provoost>quite famous, I think, back then.

00:23:38.000 --> 00:23:38.100
<v Aaron van Wirdum>Yeah.

00:23:39.380 --> 00:23:45.320
<v Sjors Provoost>So those transactions, I think, were in practice a little bit like 60 bytes or 70

00:23:45.320 --> 00:23:49.480
<v Sjors Provoost>bytes, some number. And so... And that was kind of the use case that people

00:23:49.480 --> 00:23:53.540
<v Sjors Provoost>wanted to not facilitate, but basically say, let's not, for every time somebody

00:23:53.540 --> 00:23:56.760
<v Sjors Provoost>is selling or buying a card or this other coin, let's not add an entry to the

00:23:56.760 --> 00:24:01.760
<v Sjors Provoost>UTXO set. So then let's give them these 80 bytes that they need. Now, there was

00:24:01.760 --> 00:24:05.100
<v Sjors Provoost>some discussion because some people said, well, you could make this protocol

00:24:05.100 --> 00:24:08.500
<v Sjors Provoost>better and use only 40 bytes. And then the Counterparty people were like, yeah,

00:24:08.580 --> 00:24:12.750
<v Sjors Provoost>but we don't feel like implementing that or we don't agree with that. And

00:24:12.750 --> 00:24:16.170
<v Sjors Provoost>remember, the goal again was harm reduction here, right? So the goal was to

00:24:16.170 --> 00:24:19.510
<v Sjors Provoost>convince those people to stop doing what they were already doing and use

00:24:19.510 --> 00:24:25.170
<v Sjors Provoost>OP_RETURN instead. So you're negotiating basically from a fairly weak position.

00:24:25.390 --> 00:24:29.680
<v Sjors Provoost>You can ask people nicely, but they were already doing this. And apparently they

00:24:29.680 --> 00:24:34.090
<v Sjors Provoost>could afford it. So you can only say like, well, if we allow this... I don't

00:24:34.090 --> 00:24:36.830
<v Sjors Provoost>think it would even be cheaper. It's just like, this is better for the network.

00:24:36.990 --> 00:24:39.230
<v Sjors Provoost>People are going to stop screaming at you if you do this.

00:24:39.790 --> 00:24:43.090
<v Aaron van Wirdum>Yeah, there's a small piece of context here that I want to clarify.

00:24:44.680 --> 00:24:50.320
<v Aaron van Wirdum>At this time in history, blocks were basically never full. So what's

00:24:50.320 --> 00:24:53.800
<v Aaron van Wirdum>Counterparty, and I think there was also Mastercoin maybe, which was a

00:24:53.800 --> 00:24:56.320
<v Aaron van Wirdum>predecessor of Counterparty, but never mind that.

00:24:58.300 --> 00:25:03.460
<v Aaron van Wirdum>if they were using or they were also using the pubkey system that I used before

00:25:03.460 --> 00:25:06.940
<v Aaron van Wirdum>or I explained before how I would message you about what time we record Bitcoin

00:25:06.940 --> 00:25:12.490
<v Aaron van Wirdum>Explained so Counterparty could also do that basically for free

00:25:13.020 --> 00:25:17.500
<v Aaron van Wirdum>Right? It was just an annoyance. So then the Bitcoin community, the Bitcoin Core

00:25:17.500 --> 00:25:22.420
<v Aaron van Wirdum>developers asked, let's just use the OP_RETURN instead. At least that's better.

00:25:22.640 --> 00:25:28.260
<v Aaron van Wirdum>But for the Counterparty people, there was no financial incentive or anything to

00:25:28.260 --> 00:25:29.620
<v Aaron van Wirdum>do that. It was more...

00:25:29.620 --> 00:25:32.960
<v Sjors Provoost>Yeah, I don't think so. I don't think there was a discount in doing it. There

00:25:32.960 --> 00:25:37.940
<v Sjors Provoost>might be slightly because if you're creating three fake public keys, that means

00:25:37.940 --> 00:25:40.980
<v Sjors Provoost>you need to make... three outputs of your transaction and every output has a

00:25:40.980 --> 00:25:46.080
<v Sjors Provoost>little bit of overhead because it has like some bytes to indicate the amount so

00:25:46.080 --> 00:25:50.100
<v Sjors Provoost>it's possible that using OP_RETURN was slightly cheaper and that was sort of the

00:25:50.100 --> 00:25:53.760
<v Sjors Provoost>extra incentive but it wouldn't have been a very dramatic change

00:25:54.850 --> 00:25:59.050
<v Aaron van Wirdum>Well, the blocks were not full, so there was no fee pressure. Fees were basically

00:25:59.050 --> 00:26:00.310
<v Aaron van Wirdum>more or less voluntary.

00:26:00.390 --> 00:26:03.110
<v Sjors Provoost>Yeah, they were just set to a certain amount per vbyte or even fixed. I don't

00:26:03.110 --> 00:26:06.210
<v Sjors Provoost>know. There were times when a fee was just like 0.1 Bitcoin and people were like

00:26:06.210 --> 00:26:06.730
<v Sjors Provoost>fine with it.

00:26:07.270 --> 00:26:10.030
<v Aaron van Wirdum>Yeah, because there was nothing at the time. Yeah, and no one cared.

00:26:12.010 --> 00:26:17.810
<v Aaron van Wirdum>Where was I? In any... Well, I also pointed out because it says something

00:26:17.810 --> 00:26:22.890
<v Aaron van Wirdum>about... You pointed out that, you know, let's just say Bitcoin Core. Bitcoin

00:26:22.890 --> 00:26:27.830
<v Aaron van Wirdum>Core had a weak negotiating position because Counterparty might as well just have

00:26:27.830 --> 00:26:32.990
<v Aaron van Wirdum>used the pubkey system. So then, you know, when there was a debate between 40 or

00:26:32.990 --> 00:26:38.940
<v Aaron van Wirdum>80 bytes, then... You know, you kind of had to give in or say, okay, use

00:26:38.940 --> 00:26:43.540
<v Aaron van Wirdum>the 80 byte one then if you really want it because that's still better than using

00:26:43.540 --> 00:26:44.460
<v Aaron van Wirdum>the pubkeys right?

00:26:44.680 --> 00:26:44.820
<v Sjors Provoost>Yeah.

00:26:45.060 --> 00:26:47.240
<v Aaron van Wirdum>Yeah. A little extra.

00:26:47.240 --> 00:26:52.060
<v Sjors Provoost>And so I don't remember why there was no debate about putting entire images on

00:26:52.060 --> 00:26:56.580
<v Sjors Provoost>the blockchain. And my guess is because people didn't or at least not at any

00:26:56.580 --> 00:26:59.290
<v Sjors Provoost>meaningful scale. But I'm not sure about that.

00:27:00.330 --> 00:27:05.030
<v Aaron van Wirdum>Yeah, well, there is another interesting little detail here, which is that as

00:27:05.030 --> 00:27:09.850
<v Aaron van Wirdum>this debate was happening back then between, okay, should we increase relay

00:27:09.850 --> 00:27:14.150
<v Aaron van Wirdum>policy to 40 or 80? And then, you know, some Bitcoin Core developers wanted to

00:27:14.150 --> 00:27:19.250
<v Aaron van Wirdum>keep it at 40. They said that was enough. And it was kind of like a hassle back then.

00:27:20.450 --> 00:27:25.990
<v Aaron van Wirdum>The, you know, the origin story of Ethereum goes that Vitalik Buterin,

00:27:26.230 --> 00:27:31.830
<v Aaron van Wirdum>he was sort of witnessing this debate and witnessing the pushback. from Bitcoin

00:27:31.830 --> 00:27:36.090
<v Aaron van Wirdum>Core developers to increase it to 80, even though they did in the end agree with

00:27:36.090 --> 00:27:41.790
<v Aaron van Wirdum>that. But he was witnessing that and he saw or he thought, okay, this

00:27:41.790 --> 00:27:47.790
<v Aaron van Wirdum>is not a... This is not an environment that's going to be friendly towards

00:27:47.790 --> 00:27:53.390
<v Aaron van Wirdum>me and others building meta protocols like Ethereum on Bitcoin. So

00:27:53.390 --> 00:27:58.330
<v Aaron van Wirdum>let's just build our whole own system to build that on and let's forget about all

00:27:58.330 --> 00:28:00.310
<v Aaron van Wirdum>of that Bitcoin hassle.

00:28:00.570 --> 00:28:03.030
<v Sjors Provoost>And conveniently get rich in the process.

00:28:03.790 --> 00:28:08.610
<v Aaron van Wirdum>Yes, although he could have also done that with a meta layer on top of Bitcoin,

00:28:08.610 --> 00:28:13.290
<v Aaron van Wirdum>like a Counterparty or a Masterparty. He could have done that on Bitcoin, I guess.

00:28:16.230 --> 00:28:21.310
<v Aaron van Wirdum>But anyways, that's sort of a sidestep there. This is

00:28:21.310 --> 00:28:27.050
<v Aaron van Wirdum>considered sort of the origin story of Ethereum, the original OP_RETURN wars. If

00:28:27.050 --> 00:28:31.610
<v Aaron van Wirdum>you want to call that a war, it was more like a discussion or conflict maybe.

00:28:31.750 --> 00:28:36.090
<v Sjors Provoost>But then you have the BitMEX research wrote a blog post called the OP_RETURN Wars

00:28:36.090 --> 00:28:41.090
<v Sjors Provoost>of 2014. So it was really considered sort of a part of history. We

00:28:41.090 --> 00:28:46.090
<v Sjors Provoost>had this phase. And nothing happened for another decade or so.

00:28:47.660 --> 00:28:48.160
<v Aaron van Wirdum>Yeah.

00:28:50.630 --> 00:28:54.110
<v Aaron van Wirdum>Nothing happened for another decade or so. And then what happened, Sjors?

00:28:55.820 --> 00:29:00.020
<v Sjors Provoost>Well, we can do the actual chronological sequence or we can do an alternative

00:29:00.020 --> 00:29:02.640
<v Sjors Provoost>history that I think would illustrate the problem better.

00:29:03.360 --> 00:29:03.860
<v Aaron van Wirdum>Okay.

00:29:04.140 --> 00:29:08.480
<v Sjors Provoost>The alternative is that we would arrive today and this really big elephant in the

00:29:08.480 --> 00:29:09.400
<v Sjors Provoost>room didn't happen.

00:29:11.860 --> 00:29:14.760
<v Sjors Provoost>Inscriptions didn't happen. Let's pretend they didn't happen, okay?

00:29:14.940 --> 00:29:15.160
<v Aaron van Wirdum>Sure.

00:29:17.180 --> 00:29:23.100
<v Sjors Provoost>So today we see other metaprotocols, more sophisticated than

00:29:23.100 --> 00:29:27.120
<v Sjors Provoost>Counterparty, but still sort of the same idea. We want to do fancy contracts off-chain.

00:29:28.960 --> 00:29:33.440
<v Sjors Provoost>And in order for those contracts to work, we need to put stuff on the blockchain.

00:29:34.400 --> 00:29:40.200
<v Sjors Provoost>And in this time, the things were not 80 bytes, but they were like 140 bytes.

00:29:41.620 --> 00:29:46.460
<v Sjors Provoost>And so they looked at it and they just said, OK, doesn't fit in the 80 bytes.

00:29:46.680 --> 00:29:52.660
<v Sjors Provoost>Let's just use fake public keys. So that's a blast from the past.

00:29:52.820 --> 00:29:56.200
<v Sjors Provoost>When did we last see that? So again, we're in the same situation, hypothetically

00:29:56.200 --> 00:30:00.160
<v Sjors Provoost>here. There's a protocol out there that wants to do this. Now, maybe you can say,

00:30:00.280 --> 00:30:03.440
<v Sjors Provoost>let's wait and see if they actually do it, but let's say you just want to

00:30:03.440 --> 00:30:03.960
<v Sjors Provoost>anticipate it.

00:30:04.060 --> 00:30:08.520
<v Aaron van Wirdum>Oh, hang on. You call this alternative history, but this part of the alternative

00:30:08.520 --> 00:30:10.140
<v Aaron van Wirdum>history is actually what happened, right?

00:30:10.140 --> 00:30:12.940
<v Sjors Provoost>It happened, but the considerations are now a little bit different because of

00:30:12.940 --> 00:30:16.480
<v Sjors Provoost>this bigger thing that's also happening. But if we imagine that only this...

00:30:16.480 --> 00:30:17.080
<v Aaron van Wirdum>I'll let you cook.

00:30:17.300 --> 00:30:22.750
<v Sjors Provoost>Yeah. If it was only this new protocol, then we could have had the same

00:30:22.750 --> 00:30:26.470
<v Sjors Provoost>discussion from the 40 versus 80 byte discussion saying, okay, well, these guys

00:30:26.470 --> 00:30:31.010
<v Sjors Provoost>are clearly using 140 bytes, so let's give them the 140 bytes so they stop making

00:30:31.010 --> 00:30:35.290
<v Sjors Provoost>these fake public keys that we can never get rid of in the future. That would

00:30:35.290 --> 00:30:40.930
<v Sjors Provoost>have been sort of a repeat, same drama, but pretty simple. The problem is,

00:30:41.130 --> 00:30:45.730
<v Sjors Provoost>and the reason why, instead of just going to 140, we're just going all the way

00:30:45.730 --> 00:30:50.420
<v Sjors Provoost>and just dropping the limit completely. is this elephant in the room called

00:30:50.420 --> 00:30:50.980
<v Sjors Provoost>inscriptions.

00:30:51.500 --> 00:30:55.740
<v Aaron van Wirdum>Okay, so in the alternative history where inscriptions never happened, then it

00:30:55.740 --> 00:30:59.620
<v Aaron van Wirdum>would have been probably fairly reasonable to say, okay, we're going to double

00:30:59.620 --> 00:31:05.460
<v Aaron van Wirdum>limit to 160. However, we live in real history where inscriptions happened, and

00:31:05.460 --> 00:31:08.340
<v Aaron van Wirdum>inscriptions can already go to 4 megabytes, I guess.

00:31:08.600 --> 00:31:14.580
<v Sjors Provoost>Yes, so we did an episode about the SegWit discount. So for all

00:31:14.580 --> 00:31:18.840
<v Sjors Provoost>the reasoning of why the limit increased to 4 megabytes and why, even despite

00:31:18.840 --> 00:31:22.120
<v Sjors Provoost>inscriptions, I still think that was a good idea. We kind of had that whole

00:31:22.120 --> 00:31:22.520
<v Sjors Provoost>discussion.

00:31:24.380 --> 00:31:29.020
<v Sjors Provoost>So yeah, somebody figured out quite late, really, like many years after SegWit

00:31:29.020 --> 00:31:34.360
<v Sjors Provoost>happened, even a while after Taproot happened, that you can really just stuff 4

00:31:34.360 --> 00:31:40.360
<v Sjors Provoost>megabytes into a blockchain by using the witness data. And basically kind of a

00:31:40.360 --> 00:31:44.480
<v Sjors Provoost>similar trick where you tell the... the validation code, the script interpreter.

00:31:45.080 --> 00:31:50.940
<v Sjors Provoost>Okay, here's an if statement. And so an if statement means like do the

00:31:50.940 --> 00:31:55.080
<v Sjors Provoost>following code if the condition is true. And then otherwise skip the following

00:31:55.080 --> 00:31:59.560
<v Sjors Provoost>code. That's kind of what an if statement does. And so you would basically start

00:31:59.560 --> 00:32:04.160
<v Sjors Provoost>with a zero, which means it's not going to be true. So you say zero and then if.

00:32:05.500 --> 00:32:08.500
<v Sjors Provoost>So that means the script interpreter is going to skip everything after the if.

00:32:08.880 --> 00:32:09.280
<v Aaron van Wirdum>Yeah.

00:32:09.520 --> 00:32:10.540
<v Sjors Provoost>Very much like OP_RETURN.

00:32:10.820 --> 00:32:11.000
<v Aaron van Wirdum>Right.

00:32:12.140 --> 00:32:15.500
<v Sjors Provoost>And you do that again and again and again because you can only fit like 500 bytes

00:32:15.500 --> 00:32:16.320
<v Sjors Provoost>at a time that way.

00:32:16.700 --> 00:32:19.020
<v Aaron van Wirdum>Okay. I want to jog my own memory here.

00:32:21.660 --> 00:32:27.420
<v Aaron van Wirdum>We discussed the difference between consensus rules and policy rules. So

00:32:27.420 --> 00:32:32.440
<v Aaron van Wirdum>for a consensus rule, what you just described is possible up to four megabyte.

00:32:33.460 --> 00:32:37.420
<v Aaron van Wirdum>What was the deal with the policy rule in that regard? Is that what changed with

00:32:37.420 --> 00:32:39.080
<v Aaron van Wirdum>Taproot? Is that what happened? Is that right?

00:32:39.560 --> 00:32:45.120
<v Sjors Provoost>No, I think what happened with Taproot is that the way you would write these

00:32:45.120 --> 00:32:49.960
<v Sjors Provoost>scripts was more efficient, but I don't know the details. You could have done

00:32:49.960 --> 00:32:52.760
<v Sjors Provoost>something very similar with SegWit, but slightly less efficient.

00:32:53.030 --> 00:32:56.410
<v Aaron van Wirdum>Okay, what is the deal with the policy rule when it comes to this? Can you

00:32:56.410 --> 00:33:00.190
<v Aaron van Wirdum>broadcast a 4 megabyte inscription to the network and other nodes relay it?

00:32:59.390 --> 00:33:04.150
<v Sjors Provoost>No. Because there is another limit, that is the transaction size limit. So there

00:33:04.150 --> 00:33:09.590
<v Sjors Provoost>is a limit for 100 kilobyte, or if it uses SegWit, 400 kilobyte. That doesn't

00:33:09.590 --> 00:33:12.250
<v Sjors Provoost>change. Even in this whole new debate, that limit is still there.

00:33:12.410 --> 00:33:16.290
<v Aaron van Wirdum>Okay, so if you want to get an inscription of 4 megabyte in the blockchain, you

00:33:16.290 --> 00:33:19.790
<v Aaron van Wirdum>need to contact the miner directly and send that transaction to a miner to put it

00:33:19.790 --> 00:33:21.150
<v Aaron van Wirdum>in the block, or mine a block yourself.

00:33:21.370 --> 00:33:24.970
<v Sjors Provoost>Yes, and unfortunately that doesn't happen a lot, because if we had to have the

00:33:24.970 --> 00:33:28.590
<v Sjors Provoost>same discussion about allowing 4 megabyte transactions in the mempool, that would

00:33:28.590 --> 00:33:29.070
<v Sjors Provoost>be bad.

00:33:30.350 --> 00:33:32.750
<v Sjors Provoost>It would not be a simple trade-off as this one.

00:33:34.710 --> 00:33:39.370
<v Aaron van Wirdum>Why does that not happen a lot? Is it just because it's expensive to do or is it

00:33:39.370 --> 00:33:40.330
<v Aaron van Wirdum>because it's hard to do?

00:33:41.370 --> 00:33:44.830
<v Sjors Provoost>My guess is not enough people feel the need to do it because it's not hard to do.

00:33:45.030 --> 00:33:48.830
<v Sjors Provoost>You call MARA and you send them some money and they do it for you.

00:33:49.070 --> 00:33:53.250
<v Aaron van Wirdum>I don't have their phone number. Most people don't. That's already hard to do.

00:33:53.450 --> 00:33:58.750
<v Sjors Provoost>Corporate sales have existed for a long time. If you are a corporation,

00:33:59.450 --> 00:34:03.980
<v Sjors Provoost>there's going to be somebody willing to... If somebody wanted to... say hey i

00:34:03.980 --> 00:34:08.040
<v Sjors Provoost>want to you know for now until the end of time i've got a billion dollars i'm

00:34:08.040 --> 00:34:14.010
<v Sjors Provoost>just gonna fill every block with four megabytes of pictures of me that that's not

00:34:14.010 --> 00:34:16.930
<v Sjors Provoost>a skill problem it's just a matter of hiring someone to figure it out for you

00:34:18.080 --> 00:34:22.740
<v Aaron van Wirdum>yeah okay but it's still harder than just broadcasting it to the network there's

00:34:22.740 --> 00:34:25.140
<v Aaron van Wirdum>still an extra step you need to take there

00:34:25.200 --> 00:34:28.480
<v Sjors Provoost>yeah the the extra step being a phone call

00:34:28.480 --> 00:34:30.340
<v Aaron van Wirdum>this yes yeah or an email

00:34:32.400 --> 00:34:36.860
<v Aaron van Wirdum>well hang on though they also have this thing on their website right or you can

00:34:36.860 --> 00:34:42.000
<v Aaron van Wirdum>like some miners also have a way to just submit transactions directly to them

00:34:42.000 --> 00:34:44.480
<v Aaron van Wirdum>through some API and maybe that even allows you

00:34:44.480 --> 00:34:47.140
<v Sjors Provoost>to do 4 megabytes I don't know that might be right

00:34:49.930 --> 00:34:53.310
<v Sjors Provoost>But that wouldn't get it in every block. So if you wanted to really have every

00:34:53.310 --> 00:34:56.730
<v Sjors Provoost>block be four megabytes, you'd have to call a lot of different miners and go

00:34:56.730 --> 00:35:00.650
<v Sjors Provoost>through this process. But you get the gist. So for now, this 100 kilobyte limit

00:35:00.650 --> 00:35:04.790
<v Sjors Provoost>doesn't seem to be under attack, so to speak.

00:35:05.430 --> 00:35:11.210
<v Aaron van Wirdum>Okay, so... Now that we're in real history, so inscriptions

00:35:11.210 --> 00:35:17.130
<v Aaron van Wirdum>exist, and you can do them up to 4 megabytes if you call a miner, or up

00:35:17.130 --> 00:35:19.210
<v Aaron van Wirdum>to 100 bytes easily, right?

00:35:19.470 --> 00:35:20.530
<v Sjors Provoost>400 kilobytes.

00:35:20.670 --> 00:35:21.670
<v Aaron van Wirdum>400 kilobytes, sorry.

00:35:23.350 --> 00:35:26.830
<v Aaron van Wirdum>400 kilobytes, you can just even relay over the network.

00:35:28.640 --> 00:35:33.680
<v Aaron van Wirdum>Why are we... And there's the SegWit discount. So why are we even talking or

00:35:33.680 --> 00:35:37.640
<v Aaron van Wirdum>caring about OP_RETURN anymore? There's basically a better way to do the same thing.

00:35:37.800 --> 00:35:42.940
<v Sjors Provoost>Yeah, it's about four times cheaper, especially for big payloads.

00:35:45.170 --> 00:35:49.650
<v Sjors Provoost>The only question is, and so this is why I think it was two years ago and we did

00:35:49.650 --> 00:35:54.160
<v Sjors Provoost>an episode sort of around that time. There was already a proposal to just drop

00:35:54.160 --> 00:35:58.340
<v Sjors Provoost>the OP_RETURN list restrictions completely because it was just extra complexity

00:35:58.340 --> 00:35:59.320
<v Sjors Provoost>that wasn't doing anything.

00:35:59.500 --> 00:36:00.620
<v Aaron van Wirdum>I think that was my proposal.

00:36:01.780 --> 00:36:03.300
<v Sjors Provoost>Was yours? Okay, well...

00:36:03.300 --> 00:36:07.080
<v Aaron van Wirdum>I think I brought it up on one of the previous episodes that I thought it would be dropped.

00:36:07.080 --> 00:36:09.760
<v Sjors Provoost>Great, well then you're going to get cancelled instead of me. That's good.

00:36:10.180 --> 00:36:12.720
<v Aaron van Wirdum>Well, we're at what, episode 99?

00:36:12.980 --> 00:36:13.240
<v Sjors Provoost>98.

00:36:14.220 --> 00:36:15.760
<v Aaron van Wirdum>It's time to get cancelled, Sjors.

00:36:16.350 --> 00:36:17.290
<v Sjors Provoost>Well, we'll see.

00:36:17.890 --> 00:36:21.490
<v Aaron van Wirdum>No, I do think I mentioned that on one of the previous episodes, but maybe I'm

00:36:21.490 --> 00:36:22.130
<v Aaron van Wirdum>just confusing myself.

00:36:22.130 --> 00:36:27.370
<v Sjors Provoost>And so the idea is generally it's going to be cheaper to use these inscriptions.

00:36:28.050 --> 00:36:33.990
<v Sjors Provoost>However, there is a sweet spot where that's not the case. And so I think

00:36:33.990 --> 00:36:37.450
<v Sjors Provoost>Murch did some math on it. Other people have repeated the math and turns out that

00:36:37.450 --> 00:36:41.530
<v Sjors Provoost>roughly 140 bytes, if it's less than that, OP_RETURN is going to be cheaper.

00:36:41.890 --> 00:36:42.510
<v Aaron van Wirdum>Okay, yeah.

00:36:42.670 --> 00:36:48.110
<v Sjors Provoost>And so that was sort of the final little straw, small size reason why this limit

00:36:48.110 --> 00:36:52.580
<v Sjors Provoost>wasn't dropped two years ago. It was like, it was almost dropped. People tried to

00:36:52.580 --> 00:36:55.980
<v Sjors Provoost>drop it. And then it was like, nah, let's not drop it because there's still this

00:36:55.980 --> 00:37:01.240
<v Sjors Provoost>window between about 80 bytes and 140 bytes that we don't want to encourage

00:37:01.240 --> 00:37:05.890
<v Sjors Provoost>people. But four megabytes is fine. But yeah, there was this little sweet spot.

00:37:06.050 --> 00:37:09.670
<v Aaron van Wirdum>There was a Goldilocks zone where,

00:37:10.190 --> 00:37:10.910
<v Sjors Provoost>well,

00:37:11.530 --> 00:37:13.090
<v Aaron van Wirdum>or the opposite of a Goldilocks zone.

00:37:13.130 --> 00:37:16.670
<v Sjors Provoost>There was this space where it was like, if we had dropped the limit back then,

00:37:16.790 --> 00:37:20.310
<v Sjors Provoost>you could say, well, we're making it worse because now we're allowing, we're

00:37:20.310 --> 00:37:24.710
<v Sjors Provoost>making spam cheaper between this range of sizes. It's kind of an academic concern almost.

00:37:25.170 --> 00:37:29.740
<v Aaron van Wirdum>To be clear, I was, I didn't really propose this in this...

00:37:29.870 --> 00:37:31.770
<v Sjors Provoost>Sure, sure, sure. You're trying to wiggle out of it.

00:37:32.110 --> 00:37:36.250
<v Aaron van Wirdum>I remember mentioning that I thought it should just be lifted, but I could even

00:37:36.250 --> 00:37:38.990
<v Aaron van Wirdum>be wrong about that. But I definitely didn't make any sort of real consideration

00:37:38.990 --> 00:37:41.330
<v Aaron van Wirdum>of anything. I was just talking.

00:37:42.540 --> 00:37:42.940
<v Aaron van Wirdum>Anyways.

00:37:44.710 --> 00:37:48.590
<v Sjors Provoost>So the point is, remember this number sounds familiar, right? Because we just

00:37:48.590 --> 00:37:52.910
<v Sjors Provoost>talked about this new protocol, which required increase in this alternative

00:37:52.910 --> 00:37:58.690
<v Sjors Provoost>history, which required going from 80 to about 140 to accommodate this. So

00:37:58.690 --> 00:38:04.390
<v Sjors Provoost>guess what? The whole, this area between 80 and 140 is now

00:38:04.390 --> 00:38:07.430
<v Sjors Provoost>taken, and now there's really no reason left to keep it.

00:38:07.590 --> 00:38:12.050
<v Aaron van Wirdum>Okay, hang on. So now there is an actual new protocol being developed, I think,

00:38:12.170 --> 00:38:13.850
<v Aaron van Wirdum>right, called Citrea or something?

00:38:14.150 --> 00:38:18.890
<v Sjors Provoost>Yeah. And it's not really about that particular protocol, like it might fail, but

00:38:18.890 --> 00:38:23.090
<v Sjors Provoost>the general pattern is clearly useful, BitVMs, et cetera. So if somebody are

00:38:23.090 --> 00:38:25.510
<v Sjors Provoost>useful, I mean, like in the sense that people want to use it.

00:38:25.630 --> 00:38:25.950
<v Aaron van Wirdum>Yeah.

00:38:26.860 --> 00:38:31.100
<v Sjors Provoost>And also Bitcoin Core makes one release every six months. So we cannot just sit

00:38:31.100 --> 00:38:35.000
<v Sjors Provoost>back and say, well, we'll see what they actually do and then change it because it

00:38:35.000 --> 00:38:40.180
<v Sjors Provoost>takes a long time to deploy these changes. And again, this negotiation position

00:38:40.180 --> 00:38:45.960
<v Sjors Provoost>is if they deploy something to mainnet and start using it at scale, and then we

00:38:45.960 --> 00:38:49.440
<v Sjors Provoost>say, please use OP_RETURN instead of these fake public keys. They're going to be

00:38:49.440 --> 00:38:53.060
<v Sjors Provoost>like, sure, we'll add it to our to-do list, and they'll do it like 20 years later.

00:38:53.400 --> 00:38:58.600
<v Aaron van Wirdum>Okay, hang on. Would they use the fake pub key thing otherwise?

00:38:59.140 --> 00:39:01.020
<v Aaron van Wirdum>Like, you confirm that as if you know?

00:39:01.140 --> 00:39:03.080
<v Sjors Provoost>It's written, that's in their white paper.

00:39:03.240 --> 00:39:06.960
<v Aaron van Wirdum>Oh, it is. Okay, that's actually literally what they would do.

00:39:07.140 --> 00:39:07.440
<v Sjors Provoost>Yeah.

00:39:08.140 --> 00:39:08.800
<v Aaron van Wirdum>Okay, so now...

00:39:08.800 --> 00:39:10.560
<v Sjors Provoost>And what they will still do, unless they...

00:39:10.560 --> 00:39:14.700
<v Aaron van Wirdum>So the whole alternative history part is kind of irrelevant. Like, we are just in

00:39:14.700 --> 00:39:20.210
<v Aaron van Wirdum>real... and there is now, it's just a repeat of the original

00:39:20.210 --> 00:39:21.370
<v Aaron van Wirdum>OP_RETURN thing, kind of.

00:39:21.650 --> 00:39:25.070
<v Sjors Provoost>Yeah, it was just like, okay, we should increase to 140 because they're going to

00:39:25.070 --> 00:39:29.210
<v Sjors Provoost>be doing this and we can still convince them to change their minds if it's before

00:39:29.210 --> 00:39:29.750
<v Sjors Provoost>they launch.

00:39:29.910 --> 00:39:35.550
<v Aaron van Wirdum>Okay, let's get there then. Why not increase OP_RETURN to, let's call it

00:39:35.550 --> 00:39:41.370
<v Aaron van Wirdum>160 because it's double of 80 and not remove it altogether. Why not increase the

00:39:41.370 --> 00:39:43.920
<v Aaron van Wirdum>relay? rule to 160.

00:39:44.160 --> 00:39:44.820
<v Sjors Provoost>Yeah, that was an option.

00:39:45.180 --> 00:39:46.100
<v Aaron van Wirdum>Okay, why not do that?

00:39:46.560 --> 00:39:51.290
<v Sjors Provoost>Well then, you're going to have the same discussion again two years later because

00:39:51.290 --> 00:39:54.070
<v Sjors Provoost>there's going to be drama. Like every time you try to raise this limit, there's

00:39:54.070 --> 00:39:58.490
<v Sjors Provoost>going to be a lot of drama. So if you just look at like changes per unit of drama.

00:39:58.630 --> 00:40:00.830
<v Aaron van Wirdum>Not if you're not on Twitter. No drama.

00:40:00.970 --> 00:40:02.210
<v Sjors Provoost>No, the drama was on GitHub too.

00:40:02.630 --> 00:40:03.110
<v Aaron van Wirdum>That's true.

00:40:03.850 --> 00:40:08.090
<v Sjors Provoost>So if you just look at it, do the math from like, you know, amount of drama per

00:40:08.090 --> 00:40:12.090
<v Sjors Provoost>change. Like, do you really want to have discussions about, you know, the next

00:40:12.090 --> 00:40:13.890
<v Sjors Provoost>protocol shows up and says, oh, we need 200.

00:40:14.570 --> 00:40:18.190
<v Aaron van Wirdum>Well, that's probably not going to happen, though, because there's an

00:40:18.190 --> 00:40:22.790
<v Aaron van Wirdum>inscription. But I guess you're saying it might still happen for some reason we

00:40:22.790 --> 00:40:23.750
<v Aaron van Wirdum>don't understand yet.

00:40:23.930 --> 00:40:29.210
<v Sjors Provoost>No, so this is a relevant point. They cannot use inscriptions because the trick

00:40:29.210 --> 00:40:35.170
<v Sjors Provoost>in inscriptions is a two-stage process. First, you create a transaction that has

00:40:35.170 --> 00:40:40.520
<v Sjors Provoost>an output. Like, that's just a hash in Taproot, right? And you can't see

00:40:40.520 --> 00:40:43.860
<v Sjors Provoost>anything. You have to spend it in order to put the witness on chain, which is

00:40:43.860 --> 00:40:48.240
<v Sjors Provoost>where the data goes. So you have sort of a commitment and then a reveal. Does

00:40:48.240 --> 00:40:51.200
<v Sjors Provoost>that make sense? The witness is the part you do when you're spending another

00:40:51.200 --> 00:40:55.470
<v Sjors Provoost>transaction. The problem with these protocols is they need to publish this

00:40:55.470 --> 00:40:57.990
<v Sjors Provoost>information. In this case, it's a zero knowledge proof. It doesn't really matter.

00:40:58.350 --> 00:41:03.010
<v Sjors Provoost>They need to publish it immediately. They don't want to have another transaction

00:41:03.010 --> 00:41:08.180
<v Sjors Provoost>that then reveals it. It doesn't really work for them. So they need OP_RETURN, or

00:41:08.180 --> 00:41:11.870
<v Sjors Provoost>sorry, they need outputs. Let me be clear about that. They need to do something

00:41:11.870 --> 00:41:16.770
<v Sjors Provoost>on the output side of a transaction. The easiest thing to do would be for them to

00:41:16.770 --> 00:41:20.830
<v Sjors Provoost>use OP_RETURN on the output side. But that doesn't fit. So they use OP_RETURN

00:41:20.830 --> 00:41:26.780
<v Sjors Provoost>plus a few fake keys. And then you could say, well, why

00:41:26.780 --> 00:41:30.980
<v Sjors Provoost>don't they just use a bigger OP_RETURN? And even though it's officially not

00:41:30.980 --> 00:41:34.040
<v Sjors Provoost>relayed by Bitcoin Core, there's plenty of other nodes that will relay it anyway.

00:41:34.240 --> 00:41:38.410
<v Sjors Provoost>There's Peter Todd's Libre Relay project, et cetera. So you could say, why don't

00:41:38.410 --> 00:41:43.910
<v Sjors Provoost>they just ignore the standardness rule? And I think, I don't know what the answer

00:41:43.910 --> 00:41:47.510
<v Sjors Provoost>is because that's not explained, but my guess is they were just trying to be

00:41:47.510 --> 00:41:50.690
<v Sjors Provoost>safe. Because if you're dealing with a transaction where there's, I don't know, a

00:41:50.690 --> 00:41:56.010
<v Sjors Provoost>million dollars at stake in some other sidechain project, you don't care about

00:41:56.010 --> 00:41:58.870
<v Sjors Provoost>saving a few dollars on Bitcoin transaction fees. You just want to make

00:41:58.870 --> 00:42:00.770
<v Sjors Provoost>absolutely sure that your transaction is relayed.

00:42:02.190 --> 00:42:07.290
<v Sjors Provoost>So that's why you would use OP_RETURN, so you would not risk using a bigger

00:42:07.290 --> 00:42:10.950
<v Sjors Provoost>OP_RETURN and having more hassle to relay it. You would simply do the thing that

00:42:10.950 --> 00:42:14.330
<v Sjors Provoost>always works, which is the fake public keys. So this comes back to the

00:42:14.330 --> 00:42:19.180
<v Sjors Provoost>negotiation situation where like, okay, just use these bigger OP_RETURNs, we'll

00:42:19.180 --> 00:42:24.040
<v Sjors Provoost>allow them. And you'd be like, well... Seems to be a bit of drama around that, so

00:42:24.040 --> 00:42:25.240
<v Sjors Provoost>I don't know if we're going to do that.

00:42:27.500 --> 00:42:29.360
<v Aaron van Wirdum>So the last part I don't understand.

00:42:30.220 --> 00:42:34.180
<v Sjors Provoost>So even now that this change has been proposed to increase or drop the limit,

00:42:34.340 --> 00:42:39.440
<v Sjors Provoost>doesn't matter for that use case, if they would look at this drama, they would be

00:42:39.440 --> 00:42:43.960
<v Sjors Provoost>like, well, what if this release never happens because people have gone crazy

00:42:43.960 --> 00:42:49.660
<v Sjors Provoost>over it? Right. So they would just keep using the fake public keys

00:42:49.660 --> 00:42:51.320
<v Sjors Provoost>because it's safer from their point of view.

00:42:53.190 --> 00:42:57.030
<v Sjors Provoost>Which I think is an argument for we should have done this two years ago and not

00:42:57.030 --> 00:42:58.170
<v Sjors Provoost>had this academic discussion.

00:43:00.470 --> 00:43:06.220
<v Aaron van Wirdum>Or... And now I'm going to sort of cosplay,

00:43:06.320 --> 00:43:09.380
<v Aaron van Wirdum>I guess, as one of the opponents to this change.

00:43:11.160 --> 00:43:16.520
<v Aaron van Wirdum>Which I am at least a little bit sympathetic to, I should add. Or at least I like

00:43:16.520 --> 00:43:20.530
<v Aaron van Wirdum>the... Well, let's not get into that. Or...

00:43:22.730 --> 00:43:27.630
<v Aaron van Wirdum>They just bug off some other chain, like Vitalik did, and then not bother

00:43:27.630 --> 00:43:32.630
<v Aaron van Wirdum>Bitcoiners at all, and let Bitcoiners use Bitcoin as money. And then, you know,

00:43:32.790 --> 00:43:36.290
<v Aaron van Wirdum>as long as we're hostile towards all these other use cases, then they'll

00:43:36.290 --> 00:43:39.530
<v Aaron van Wirdum>eventually go away, which is what we want, right?

00:43:39.750 --> 00:43:42.470
<v Sjors Provoost>But is that why they proposed using the fake signatures then?

00:43:43.610 --> 00:43:45.010
<v Aaron van Wirdum>You mean the fake pubkeys?

00:43:45.130 --> 00:43:45.710
<v Sjors Provoost>The fake pubkeys?

00:43:47.290 --> 00:43:48.350
<v Aaron van Wirdum>Yeah, well...

00:43:48.350 --> 00:43:53.490
<v Sjors Provoost>Because we're allowing those, and that didn't scare them. So I think if you want

00:43:53.490 --> 00:43:55.750
<v Sjors Provoost>to scare them away, you have to do something extra, right?

00:43:55.990 --> 00:44:00.090
<v Aaron van Wirdum>Well, let's do something extra then. Let's create an environment and do

00:44:00.090 --> 00:44:06.030
<v Aaron van Wirdum>everything we can to get them to bug off so they don't pollute our UTXO

00:44:06.030 --> 00:44:07.650
<v Aaron van Wirdum>set or our chain at all.

00:44:07.750 --> 00:44:11.590
<v Sjors Provoost>And we can't assassinate people, right? There's no real world attacks. We have to

00:44:11.590 --> 00:44:14.150
<v Sjors Provoost>do only on the blockchain or mempools or nodes.

00:44:15.390 --> 00:44:20.110
<v Aaron van Wirdum>Let's make that assumption, yeah. Let's draw a line at physically harming people

00:44:20.110 --> 00:44:24.370
<v Aaron van Wirdum>and let's say, you know, we change the protocol in some way or another, right? So

00:44:24.370 --> 00:44:29.870
<v Aaron van Wirdum>let's then try to keep these people away from Bitcoin. They can do their own

00:44:29.870 --> 00:44:34.270
<v Aaron van Wirdum>things on their own chains, but not make us all download and store this data,

00:44:34.430 --> 00:44:39.270
<v Aaron van Wirdum>either in the UTXO set or even in the mempool or on the blockchain, right? There

00:44:39.270 --> 00:44:43.190
<v Aaron van Wirdum>are ways to fight back against that. So why not put our effort to that?

00:44:43.590 --> 00:44:47.830
<v Sjors Provoost>Yeah, so then there are roughly two ways that you can do this, now that we've

00:44:47.830 --> 00:44:49.010
<v Sjors Provoost>ruled out physical violence.

00:44:50.270 --> 00:44:54.490
<v Sjors Provoost>One is at the mempool level, the policy level, and the other is at the consensus level.

00:44:54.650 --> 00:44:59.150
<v Aaron van Wirdum>Right. Let's keep the consensus level out of it as well, unless you want to go there.

00:44:59.230 --> 00:45:04.190
<v Sjors Provoost>Well, we need to go there, but let's first go to policy because I think we should

00:45:04.190 --> 00:45:08.930
<v Sjors Provoost>explain that there is no point in fighting this through policy. And once we've

00:45:08.930 --> 00:45:12.990
<v Sjors Provoost>established that, then the only fight we have left is consensus, and then we can

00:45:12.990 --> 00:45:14.010
<v Sjors Provoost>sort of close the argument.

00:45:14.210 --> 00:45:19.290
<v Aaron van Wirdum>Okay, fair enough. So why can't we fight back on this on a policy level?

00:45:19.830 --> 00:45:21.230
<v Aaron van Wirdum>Why are you being so defeated?

00:45:21.410 --> 00:45:22.870
<v Sjors Provoost>Because you can just run another node.

00:45:23.570 --> 00:45:24.250
<v Aaron van Wirdum>What do you mean?

00:45:24.650 --> 00:45:29.890
<v Sjors Provoost>So basically, because it's not a consensus rule, not all software has to do the

00:45:29.890 --> 00:45:35.820
<v Sjors Provoost>same thing. So Bitcoin Core can say, okay, we're going to do something

00:45:35.820 --> 00:45:38.880
<v Sjors Provoost>to fight it, and we have to get into the actual things you could do but

00:45:39.260 --> 00:45:43.400
<v Sjors Provoost>regardless of what that thing is we change policy in some magical or non-magical

00:45:43.400 --> 00:45:49.260
<v Sjors Provoost>way so that you can no longer relay a spam then some people say well i will run a

00:45:49.260 --> 00:45:53.260
<v Sjors Provoost>node that does relay a spam either because somebody's paying me to do it or

00:45:53.260 --> 00:45:57.100
<v Sjors Provoost>because i like to be contrarian and i like to run nodes that relay things that

00:45:57.100 --> 00:46:01.910
<v Sjors Provoost>people don't like and so then we get to the problem of the mempool being very

00:46:01.910 --> 00:46:07.130
<v Sjors Provoost>good at censorship resistance which i think the The nice example, somebody gave

00:46:07.130 --> 00:46:11.740
<v Sjors Provoost>at a presentation, I think it might have been Peter Todd, in Prague, was this.

00:46:11.760 --> 00:46:16.480
<v Sjors Provoost>You have an audience of 100 people, and you whisper something to somebody in the

00:46:16.480 --> 00:46:21.930
<v Sjors Provoost>front row. And then you've told people like either, like you basically told half

00:46:21.930 --> 00:46:25.870
<v Sjors Provoost>the room, like do not relay this message. But you whisper it to the guy in the

00:46:25.870 --> 00:46:29.090
<v Sjors Provoost>first row and he whispers it to the people around him. Some people don't relay

00:46:29.090 --> 00:46:33.570
<v Sjors Provoost>it, but it gets to the other side intact. And in fact, I think you can do this

00:46:33.570 --> 00:46:37.770
<v Sjors Provoost>with about 10% of cooperating people because Bitcoin nodes connect to like more

00:46:37.770 --> 00:46:42.530
<v Sjors Provoost>than 100 peers. So even if 90 out of 100 peers censor you, the other 10 are

00:46:42.530 --> 00:46:45.770
<v Sjors Provoost>enough to get your message through. Your message just needs to go from you to the miner.

00:46:47.060 --> 00:46:49.940
<v Sjors Provoost>Just ignoring the incentive to just call the miner directly, right?

00:46:50.200 --> 00:46:50.440
<v Aaron van Wirdum>Yeah.

00:46:50.660 --> 00:46:55.240
<v Sjors Provoost>So in other words, even if Bitcoin Core were to make these rules that stop relay,

00:46:55.540 --> 00:47:01.520
<v Sjors Provoost>if at least, say, 5 or 10% of people don't care about that and run different

00:47:01.520 --> 00:47:06.360
<v Sjors Provoost>rules, it's going to get through. And you can, in fact, announce, like, you don't

00:47:06.360 --> 00:47:10.310
<v Sjors Provoost>even have to guess, right? We have service bits. in Bitcoin, which are a way for

00:47:10.310 --> 00:47:13.290
<v Sjors Provoost>your node to say, I support this feature. Like, I'm a pruned node, I'm not a

00:47:13.290 --> 00:47:16.550
<v Sjors Provoost>pruned node, you can get the whole blockchain from me. I support encryption,

00:47:16.730 --> 00:47:21.130
<v Sjors Provoost>yadda yadda. So you can basically signal, okay, I will relay anything for the

00:47:21.130 --> 00:47:25.550
<v Sjors Provoost>original standard rules, basically. And then if you want to use any of these

00:47:25.550 --> 00:47:29.590
<v Sjors Provoost>protocols, then you simply connect to nodes that have advertised that they will

00:47:29.590 --> 00:47:33.370
<v Sjors Provoost>relay this for you. And conversely, miners will do this because they want to make

00:47:33.370 --> 00:47:36.570
<v Sjors Provoost>as much money as possible, so they don't want to... give up on potentially

00:47:36.570 --> 00:47:41.590
<v Sjors Provoost>valuable transactions. So no matter what the actual changes you make in

00:47:41.590 --> 00:47:46.810
<v Sjors Provoost>policy, and we can get into these actual changes, it doesn't work because they

00:47:46.810 --> 00:47:48.890
<v Sjors Provoost>can be evaded using these methods I just described.

00:47:49.090 --> 00:47:52.890
<v Aaron van Wirdum>Well, you say that, and here I'm actually going to push back against that

00:47:52.890 --> 00:47:58.710
<v Aaron van Wirdum>argument. We just established that this new protocol, Citrea or whatever,

00:47:59.820 --> 00:48:05.140
<v Aaron van Wirdum>They could already do everything in OP_RETURN, but they don't. They use pubkeys

00:48:05.140 --> 00:48:10.540
<v Aaron van Wirdum>as well to embed data. So clearly the Citrea people themselves, they don't

00:48:10.540 --> 00:48:13.140
<v Aaron van Wirdum>believe what you just said. They are worried that...

00:48:13.140 --> 00:48:14.080
<v Sjors Provoost>They don't want to take the risk.

00:48:14.400 --> 00:48:19.440
<v Aaron van Wirdum>Right. So now if you make it even harder for them, maybe they even more don't

00:48:19.440 --> 00:48:24.040
<v Aaron van Wirdum>want to take the risk and just bug off, which is the whole point, right? So on a

00:48:24.040 --> 00:48:27.940
<v Aaron van Wirdum>technical level, I follow you on your thing that...

00:48:27.940 --> 00:48:31.300
<v Sjors Provoost>Okay, so now you're talking about a very, very risk-averse actor, right?

00:48:31.520 --> 00:48:33.960
<v Aaron van Wirdum>Which they apparently are, because they're embedding...

00:48:33.960 --> 00:48:36.920
<v Sjors Provoost>That, or they didn't even think it through, that's also possible, right? They may

00:48:36.920 --> 00:48:40.220
<v Sjors Provoost>have just taken the standard of those rules for granted and didn't want to bother

00:48:40.220 --> 00:48:41.200
<v Sjors Provoost>going around them.

00:48:43.100 --> 00:48:47.870
<v Sjors Provoost>But basically, what they would end up doing is exactly creating more fake public

00:48:47.870 --> 00:48:50.830
<v Sjors Provoost>keys. If we said, okay, OP_RETURN goes to zero, they're just going to make more

00:48:50.830 --> 00:48:55.810
<v Sjors Provoost>fake public keys. But we could design some countermeasures even for those fake

00:48:55.810 --> 00:48:59.830
<v Sjors Provoost>public keys, but we can get to that later. So then the question is, yeah, would

00:48:59.830 --> 00:49:04.090
<v Sjors Provoost>they be so risk averse that thanks to these countermeasures, they wouldn't even

00:49:04.090 --> 00:49:06.670
<v Sjors Provoost>use the fake public keys. Now the problem is...

00:49:06.670 --> 00:49:11.410
<v Aaron van Wirdum>I mean, I can easily imagine you make a filter that filters out, or I don't know

00:49:11.410 --> 00:49:11.890
<v Aaron van Wirdum>if it's easy.

00:49:12.470 --> 00:49:14.430
<v Sjors Provoost>No, you can. Yeah, it's not easy, but you can.

00:49:14.610 --> 00:49:19.670
<v Aaron van Wirdum>Yeah, you can create a filter that looks at whatever looks like a Citrea protocol

00:49:19.670 --> 00:49:24.910
<v Aaron van Wirdum>transaction. We're not going to relay that. Done. So you can fight back in ways, right?

00:49:26.100 --> 00:49:29.020
<v Sjors Provoost>Well, I wouldn't say something that looks like a Citrea transaction, but you can

00:49:29.020 --> 00:49:31.580
<v Sjors Provoost>say a more general rule because you don't want to have these super specific

00:49:31.580 --> 00:49:34.500
<v Sjors Provoost>rules, right? You just change one letter in the protocol and it doesn't work

00:49:34.500 --> 00:49:38.760
<v Sjors Provoost>anymore. But you can say every signature, sorry, every public key that's relayed

00:49:38.760 --> 00:49:44.660
<v Sjors Provoost>has to have proof that it's not fake. Like you prove that there's

00:49:44.660 --> 00:49:48.300
<v Sjors Provoost>an actual private key and therefore it's more difficult to, you can't make these

00:49:48.300 --> 00:49:49.000
<v Sjors Provoost>fake keys anymore.

00:49:50.000 --> 00:49:53.700
<v Aaron van Wirdum>Right, well, that's a very complicated way to fight back, but sure, yeah.

00:49:54.240 --> 00:49:58.400
<v Sjors Provoost>Yeah, so now the question is, they are not very price sensitive, as we've already

00:49:58.400 --> 00:50:03.000
<v Sjors Provoost>established. So they might be willing to pay $1,000 in fees because that

00:50:03.000 --> 00:50:06.900
<v Sjors Provoost>transaction represents millions of dollars in some other protocol. So if you're

00:50:06.900 --> 00:50:12.770
<v Sjors Provoost>willing to spend a lot more... One thing you can do is instead of having just

00:50:12.770 --> 00:50:17.150
<v Sjors Provoost>one fake public key to encode 32 bytes of data, you can say, well, we're going to

00:50:17.150 --> 00:50:22.590
<v Sjors Provoost>grind these fake public keys. Grinding just means like brute forcing. And, you

00:50:22.590 --> 00:50:27.250
<v Sjors Provoost>know, with a bit of brute forcing, you can maybe put six bytes. let's say instead

00:50:27.250 --> 00:50:31.670
<v Sjors Provoost>of 32, you get six bytes, or maybe to keep it simple, let's say 16 bytes. So half

00:50:31.670 --> 00:50:36.190
<v Sjors Provoost>of the public key is, so it's a real, it's a real spendable public key. Half of

00:50:36.190 --> 00:50:39.990
<v Sjors Provoost>it is gibberish because you can't brute force that part, but the other half is

00:50:39.990 --> 00:50:44.090
<v Sjors Provoost>not gibberish, it's signal. So that means your transaction needs to be two times bigger.

00:50:45.310 --> 00:50:48.410
<v Sjors Provoost>In other words, it has to pay twice as much fees, but you can still get your spam

00:50:48.410 --> 00:50:51.470
<v Sjors Provoost>in there because you've just gone through a little bit of extra trouble. Now, in

00:50:51.470 --> 00:50:54.730
<v Sjors Provoost>reality, you probably need to make it maybe 10 times bigger to do this.

00:50:56.120 --> 00:51:00.360
<v Sjors Provoost>But 10 times bigger, you know, if the current fees are $1 to get this transaction

00:51:00.360 --> 00:51:05.590
<v Sjors Provoost>in, and now you've increased them to $10, but they're willing to pay $1,000, you

00:51:05.590 --> 00:51:08.630
<v Sjors Provoost>still haven't really fought the spam, at least for this very, very price

00:51:08.630 --> 00:51:12.020
<v Sjors Provoost>-insensitive class of users.

00:51:14.280 --> 00:51:14.760
<v Aaron van Wirdum>Yeah.

00:51:15.020 --> 00:51:16.400
<v Sjors Provoost>Now, if you have the...

00:51:16.400 --> 00:51:17.820
<v Aaron van Wirdum>Go on.

00:51:18.060 --> 00:51:22.940
<v Sjors Provoost>Yeah, if you're looking at the JPEG users, there I think a much, much simpler

00:51:22.940 --> 00:51:27.570
<v Sjors Provoost>solution is to reduce the block size. like to 100 kilobytes or something, because

00:51:27.570 --> 00:51:31.900
<v Sjors Provoost>then it's more expensive for them. However, there's another problem there because

00:51:31.900 --> 00:51:32.480
<v Sjors Provoost>they have...

00:51:32.480 --> 00:51:34.640
<v Aaron van Wirdum>Well, Luke will support that as well, I think.

00:51:34.920 --> 00:51:39.820
<v Sjors Provoost>Yeah, he did in the past. The problem there is that there are people that attach

00:51:39.820 --> 00:51:44.480
<v Sjors Provoost>status to the fact that it's expensive. So there might be some of these people

00:51:44.480 --> 00:51:47.360
<v Sjors Provoost>putting JPEGs in there that are like, oh, this is too expensive now. There might

00:51:47.360 --> 00:51:50.340
<v Sjors Provoost>be others that are saying, great, this is expensive now. There's plenty of

00:51:50.340 --> 00:51:53.480
<v Sjors Provoost>millionaires that say, look, I can afford this even with the one kilobyte block

00:51:53.480 --> 00:51:57.850
<v Sjors Provoost>size. So I think you'll still fill it up, but your blocks will be smaller, but it

00:51:57.850 --> 00:51:58.710
<v Sjors Provoost>will hurt everyone else.

00:52:00.850 --> 00:52:03.950
<v Sjors Provoost>But that's already consensus changes, and we were actually talking about relay

00:52:03.950 --> 00:52:09.460
<v Sjors Provoost>rules. So for relay rules, the way you would fight the spam is, say, every public

00:52:09.460 --> 00:52:13.300
<v Sjors Provoost>key has to have a corresponding signature, and every hash has to have a

00:52:13.300 --> 00:52:17.540
<v Sjors Provoost>corresponding pre-image, as it's called. So something that creates the hash. And

00:52:17.540 --> 00:52:23.370
<v Sjors Provoost>checking that might be expensive, might create other... attack vectors, so

00:52:23.370 --> 00:52:27.390
<v Sjors Provoost>it's not a trivial change, it's a lot of engineering time that goes in there. But

00:52:27.390 --> 00:52:30.490
<v Sjors Provoost>I don't think it's going to work, because again, somebody will just say, okay,

00:52:30.550 --> 00:52:35.190
<v Sjors Provoost>I'm going to run this Peter Todd version, and if people pay me a little bit to

00:52:35.190 --> 00:52:39.830
<v Sjors Provoost>relay, or miners make more money, they'll just go around any of these barriers.

00:52:40.050 --> 00:52:41.050
<v Sjors Provoost>So they have to be consensus.

00:52:42.500 --> 00:52:45.240
<v Sjors Provoost>If you're satisfied with that argument, otherwise we can keep going.

00:52:45.480 --> 00:52:50.700
<v Aaron van Wirdum>Yeah, well, let's stall there for a little longer, and I will drop the

00:52:50.700 --> 00:52:55.720
<v Aaron van Wirdum>debate dynamic here, but let's get real quick into the actual

00:52:56.560 --> 00:53:02.220
<v Aaron van Wirdum>problems that the current limit is causing or would be

00:53:02.220 --> 00:53:06.660
<v Aaron van Wirdum>causing, right? So I think, for example, one problem is that

00:53:06.980 --> 00:53:12.960
<v Aaron van Wirdum>if you want to include a big OP_RETURN in a block,

00:53:13.570 --> 00:53:18.210
<v Aaron van Wirdum>then the way to do that right now would be to contact the miner directly which

00:53:18.210 --> 00:53:24.030
<v Aaron van Wirdum>means that If a miner wants to maximize its profit, it

00:53:24.030 --> 00:53:29.570
<v Aaron van Wirdum>will have to create avenues or APIs, whatever, for people to be able to submit

00:53:29.570 --> 00:53:34.790
<v Aaron van Wirdum>these transactions to directly. But right now, that's really something that

00:53:34.790 --> 00:53:40.010
<v Aaron van Wirdum>requires resources to maintain that and to make that available.

00:53:40.370 --> 00:53:44.630
<v Aaron van Wirdum>Therefore, it's really something that bigger miners can do, but smaller miners

00:53:44.630 --> 00:53:48.920
<v Aaron van Wirdum>cannot. If you're a home miner, you don't have... the ability to do that never

00:53:48.920 --> 00:53:53.260
<v Aaron van Wirdum>mind that you're only finding one block per year maybe so that no one's going to

00:53:53.260 --> 00:53:58.540
<v Aaron van Wirdum>want to use that so there's like a centralizing pressure to keeping the limit

00:53:58.540 --> 00:54:03.300
<v Aaron van Wirdum>rather than making it like rather than making these transactions available for

00:54:03.300 --> 00:54:06.580
<v Aaron van Wirdum>whatever miner wants to mine them only certain miners can mine them so there's

00:54:06.580 --> 00:54:11.750
<v Aaron van Wirdum>centralizing pressure right yes it's one of the arguments in favor of removing

00:54:11.750 --> 00:54:12.450
<v Aaron van Wirdum>the limit.

00:54:12.730 --> 00:54:18.250
<v Sjors Provoost>And generally in favor of not trying to block things on the relay network that

00:54:18.250 --> 00:54:21.150
<v Sjors Provoost>are economically incentivized. Like there are some things that we're blocking on

00:54:21.150 --> 00:54:25.670
<v Sjors Provoost>the relay network that are just pure attacks. Like they will crash a node kind of

00:54:25.670 --> 00:54:31.510
<v Sjors Provoost>stuff. But not the, you know, like we talked about the great consensus cleanup,

00:54:31.730 --> 00:54:34.950
<v Sjors Provoost>right? These transactions that take an hour to validate, that sort of stuff is

00:54:34.950 --> 00:54:40.060
<v Sjors Provoost>also blocked by standardness and really should be blocked by consensus. but isn't yet.

00:54:41.140 --> 00:54:46.900
<v Aaron van Wirdum>I think we've now mentioned two arguments. So one argument, it's

00:54:46.900 --> 00:54:51.860
<v Aaron van Wirdum>better that people use OP_RETURN over popkeys. Two, it's

00:54:51.860 --> 00:54:57.140
<v Aaron van Wirdum>centralizing pressure if people have to connect with miners directly to get these

00:54:57.140 --> 00:55:01.760
<v Aaron van Wirdum>transactions into blocks. Are there other arguments in favor of removing this

00:55:01.760 --> 00:55:04.040
<v Aaron van Wirdum>limit that I'm not mentioning right now?

00:55:04.420 --> 00:55:10.240
<v Sjors Provoost>So we need to raise it. I think that's because we want people to use OP_RETURN

00:55:10.240 --> 00:55:13.880
<v Sjors Provoost>and not use these fake public keys. The question then is, do we need to drop it

00:55:13.880 --> 00:55:16.840
<v Sjors Provoost>entirely? And the argument for that is simply that it's cheaper to use

00:55:16.840 --> 00:55:20.860
<v Sjors Provoost>inscriptions beyond that point anyway. We don't want to have the same discussion

00:55:20.860 --> 00:55:24.760
<v Sjors Provoost>for the next 100 bytes, 200 bytes, 400 bytes. That's just basically a

00:55:24.760 --> 00:55:29.320
<v Sjors Provoost>simplification. It's not that we must drop OP_RETURN. There's no point in keeping

00:55:29.320 --> 00:55:33.040
<v Sjors Provoost>it anymore. And then, of course, there's a general argument of this is code that

00:55:33.040 --> 00:55:36.870
<v Sjors Provoost>needs to be maintained. It's nice to get rid of code. But it's not mission

00:55:36.870 --> 00:55:39.670
<v Sjors Provoost>critical that we drop OP_RETURN, right? It's mission critical that we raise it

00:55:39.670 --> 00:55:45.660
<v Sjors Provoost>and that we keep an eye on people that need more and be ahead of them

00:55:45.660 --> 00:55:49.360
<v Sjors Provoost>so that we don't keep getting back into a situation where somebody says, well, I

00:55:49.360 --> 00:55:53.800
<v Sjors Provoost>need a 250 byte, so I'm going to make these fake outputs again and then... You

00:55:53.800 --> 00:55:57.900
<v Sjors Provoost>raise the limit, but then it's too late for them to change their system and you

00:55:57.900 --> 00:56:00.520
<v Sjors Provoost>kind of keep, you know, you're constantly behind.

00:56:00.960 --> 00:56:06.610
<v Aaron van Wirdum>Yeah. Yeah, there's also the argument that if we live in a world where people are

00:56:06.610 --> 00:56:10.570
<v Aaron van Wirdum>submitting transactions directly to miners because that's the only way to get

00:56:10.570 --> 00:56:11.650
<v Aaron van Wirdum>transactions confirmed.

00:56:12.960 --> 00:56:17.960
<v Aaron van Wirdum>then regular users like me, and we don't see these transactions because they're

00:56:17.960 --> 00:56:22.900
<v Aaron van Wirdum>all submitted directly to miners, that means that when I send a transaction, I

00:56:22.900 --> 00:56:27.540
<v Aaron van Wirdum>don't really know how much fee I'm supposed to include because I'm not seeing all

00:56:27.540 --> 00:56:32.320
<v Aaron van Wirdum>the transactions. So I'm making wrong calculations of fee inclusion because I

00:56:32.320 --> 00:56:35.640
<v Aaron van Wirdum>don't know that I'm competing with JPEGs.

00:56:36.140 --> 00:56:39.780
<v Sjors Provoost>Yeah, now we don't know how big that effect is, but it could be a thing.

00:56:40.420 --> 00:56:44.520
<v Aaron van Wirdum>Yeah, so that's another... That's another argument for removing this limit. This

00:56:44.520 --> 00:56:49.720
<v Aaron van Wirdum>gives a more precise overview of what's actually happening on the network, what's

00:56:49.720 --> 00:56:52.180
<v Aaron van Wirdum>actually likely to be included in future blocks.

00:56:52.360 --> 00:56:56.380
<v Sjors Provoost>But the bigger thing is compact block relay. I think we have talked about that

00:56:56.380 --> 00:57:02.180
<v Sjors Provoost>before, which again is a centralization risk. So in the beginning, in the

00:57:02.180 --> 00:57:06.480
<v Sjors Provoost>olden days, you would get these transactions in your mempool. And then you would

00:57:06.480 --> 00:57:09.120
<v Sjors Provoost>get a block and the block would have all these transactions. So people were

00:57:09.120 --> 00:57:12.400
<v Sjors Provoost>talking about, like, if you were doing a Skype call, you know, the other guy was

00:57:12.400 --> 00:57:16.240
<v Sjors Provoost>using Bitcoin because their Skype call would drop for a second as soon as a new

00:57:16.240 --> 00:57:19.860
<v Sjors Provoost>block came in. And so the solution there was rather than sending the whole block,

00:57:19.980 --> 00:57:23.440
<v Sjors Provoost>you send a summary of the block, essentially. And the summary says, here's the

00:57:23.440 --> 00:57:26.840
<v Sjors Provoost>identifiers of all the transactions that are in there. Hopefully you already know

00:57:26.840 --> 00:57:30.780
<v Sjors Provoost>them. If you don't know any of them, tell me and I'll send them to you. So that's

00:57:30.780 --> 00:57:35.700
<v Sjors Provoost>a round trip. So ideally. I'm sending you this block, this compact block. You've

00:57:35.700 --> 00:57:39.100
<v Sjors Provoost>got all the transactions already in your mempool. You quickly look at it, send it

00:57:39.100 --> 00:57:41.800
<v Sjors Provoost>on to the next person, send it on to the next person, and blocks relay really

00:57:41.800 --> 00:57:42.800
<v Sjors Provoost>quickly across the network.

00:57:44.730 --> 00:57:50.190
<v Sjors Provoost>This has really made a big impact, along with a few other improvements. There's

00:57:50.190 --> 00:57:54.030
<v Sjors Provoost>some charts that show how often miners were producing stale blocks, or orphan

00:57:54.030 --> 00:57:58.150
<v Sjors Provoost>blocks, as they were incorrectly called. This used to be quite often. I don't

00:57:58.150 --> 00:58:01.330
<v Sjors Provoost>know if it's every day, but it used to be very often, and now it's maybe once a

00:58:01.330 --> 00:58:06.300
<v Sjors Provoost>month or so. So blocks propagate across the network a lot faster than they used

00:58:06.300 --> 00:58:10.300
<v Sjors Provoost>to thanks to compact blocks. If, on the other hand, people have different

00:58:10.300 --> 00:58:14.380
<v Sjors Provoost>mempools because they have disagreements on what should and should not be on

00:58:14.380 --> 00:58:19.870
<v Sjors Provoost>their node, that doesn't work anymore because I'm sending you the compact block.

00:58:19.990 --> 00:58:22.510
<v Sjors Provoost>You look at it and you're like, I'm missing this OP_RETURN transaction. Now I

00:58:22.510 --> 00:58:26.570
<v Sjors Provoost>have to send it to you. So this would, again, slow block propagation down,

00:58:26.790 --> 00:58:31.550
<v Sjors Provoost>increase the orphan rate. And this hurts small miners more than it hurts big

00:58:31.550 --> 00:58:34.580
<v Sjors Provoost>miners. Which is the whole reason for doing this.

00:58:34.880 --> 00:58:40.660
<v Aaron van Wirdum>Yeah. Okay, so just to sum that up, I think the arguments for removing it, and

00:58:40.660 --> 00:58:44.080
<v Aaron van Wirdum>we were actually having some sort of debate and we got sidetracked because you

00:58:44.080 --> 00:58:48.460
<v Aaron van Wirdum>still want to get to consensus rules. But anyways, the arguments for removing it.

00:58:48.660 --> 00:58:51.520
<v Sjors Provoost>I think it is useful. Okay, let's do that after your list.

00:58:51.940 --> 00:58:56.180
<v Aaron van Wirdum>Yeah, summarize this real quick. So the arguments for removing it is, one, people

00:58:56.180 --> 00:59:00.980
<v Aaron van Wirdum>can upload data to the blockchain anyways, and in a more harmful way, we don't

00:59:00.980 --> 00:59:06.830
<v Aaron van Wirdum>allow them to use OP_RETURN with a bigger limit. Two, it incentivizes

00:59:06.830 --> 00:59:11.310
<v Aaron van Wirdum>miner centralization if people have to connect with miners directly, and only

00:59:11.310 --> 00:59:17.250
<v Aaron van Wirdum>bigger miners can do that. Three, it gives a more accurate fee estimation if

00:59:17.250 --> 00:59:21.370
<v Aaron van Wirdum>you're aware of everything that's going on on the network, which ties in also

00:59:21.370 --> 00:59:26.050
<v Aaron van Wirdum>with the direct connection with miners and also connecting. Also, tying in with

00:59:26.050 --> 00:59:30.110
<v Aaron van Wirdum>the direct connection of miners is that your block download and therefore block

00:59:30.110 --> 00:59:35.090
<v Aaron van Wirdum>propagation over network is faster if people have a mempool that reflects the

00:59:35.090 --> 00:59:40.310
<v Aaron van Wirdum>newest blocks because people are just relaying whatever transactions are paying

00:59:40.310 --> 00:59:45.630
<v Aaron van Wirdum>the highest fees. Are there other arguments? These are four of the main arguments

00:59:45.630 --> 00:59:47.860
<v Aaron van Wirdum>for dropping the limit.

00:59:48.080 --> 00:59:51.020
<v Sjors Provoost>I don't have a long list, but we kind of went through all that.

00:59:53.560 --> 00:59:58.000
<v Aaron van Wirdum>Okay, then let's get back to what happened to fighting all this. You can just

00:59:58.000 --> 00:59:58.840
<v Aaron van Wirdum>fight all this spam.

00:59:58.920 --> 01:00:04.420
<v Sjors Provoost>So we talked about fighting this at the level of relay rules and

01:00:04.420 --> 01:00:09.760
<v Sjors Provoost>this kind of two-pronged objection. One is that it's circumventable because

01:00:09.760 --> 01:00:13.640
<v Sjors Provoost>people can just run different relay rules and advertise that and you only need

01:00:13.640 --> 01:00:16.880
<v Sjors Provoost>like 10% of people to do that and you get through it and people might be paid to

01:00:16.880 --> 01:00:21.400
<v Sjors Provoost>do it. Miners want to do this. and you're incentivizing direct to miner

01:00:21.400 --> 01:00:26.630
<v Sjors Provoost>submission as well, even if you could block it this way. So that leaves only one

01:00:26.630 --> 01:00:31.610
<v Sjors Provoost>method of fighting, which is consensus changes. And of course, when is the last

01:00:31.610 --> 01:00:35.570
<v Sjors Provoost>time we were able to deploy any soft fork? It's been a while. It's hard to design

01:00:35.570 --> 01:00:40.310
<v Sjors Provoost>soft forks. I think we should use the energy that is there to design soft forks

01:00:40.310 --> 01:00:45.830
<v Sjors Provoost>very, very wisely, and not for this, mainly because this seems to be a cat and

01:00:45.830 --> 01:00:49.030
<v Sjors Provoost>mouse game you can't win. So I already talked about some of the specific things

01:00:49.030 --> 01:00:53.970
<v Sjors Provoost>you can do. You could make a consensus rule that just says every public key must

01:00:53.970 --> 01:00:58.510
<v Sjors Provoost>have a signature along with it that proves it is real. Now you are making blocks

01:00:58.510 --> 01:01:02.510
<v Sjors Provoost>bigger or putting less stuff in it because this stuff, the proof that needs to go

01:01:02.510 --> 01:01:03.070
<v Sjors Provoost>in the blockchain.

01:01:05.110 --> 01:01:08.890
<v Sjors Provoost>The same with the hash, the pre-image, that's even harder to even prove that,

01:01:08.990 --> 01:01:11.230
<v Sjors Provoost>that there is something that belongs to the hash.

01:01:12.660 --> 01:01:15.740
<v Sjors Provoost>Then you'd probably have to use a... So I don't know if you understand this

01:01:15.740 --> 01:01:19.820
<v Sjors Provoost>problem, but... Anyway, never mind. It's complicated.

01:01:22.310 --> 01:01:23.510
<v Sjors Provoost>So then really...

01:01:23.510 --> 01:01:25.010
<v Aaron van Wirdum>Too complicated for my brain.

01:01:25.170 --> 01:01:26.570
<v Sjors Provoost>I can try, but...

01:01:26.570 --> 01:01:29.290
<v Aaron van Wirdum>No, if you think it's too complicated for me, I trust you.

01:01:29.290 --> 01:01:32.570
<v Sjors Provoost>But just to [unclear], so if you want to prove that a public key isn't fake,

01:01:32.730 --> 01:01:36.520
<v Sjors Provoost>there's a very simple way to do that. You provide a signature, right? Because a

01:01:36.520 --> 01:01:40.240
<v Sjors Provoost>signature proves that you know the private key. That's essentially what you're

01:01:40.240 --> 01:01:44.520
<v Sjors Provoost>doing with a signature. So that means that every output on the blockchain needs

01:01:44.520 --> 01:01:49.120
<v Sjors Provoost>to have a corresponding signature, so... They get bigger, but not hugely bigger.

01:01:49.890 --> 01:01:53.690
<v Sjors Provoost>Now for hashes, which you can also use to put fake data in, so you say, hey, I

01:01:53.690 --> 01:01:58.870
<v Sjors Provoost>have a hash. Trust me, it's a hash, but it's really not a hash. You need to prove

01:01:58.870 --> 01:02:04.130
<v Sjors Provoost>that there is, you know, the pre-image of the hash exists. But how do you prove

01:02:04.130 --> 01:02:08.140
<v Sjors Provoost>that? You'd have to reveal it. That's really the easiest way to do it. But you

01:02:08.140 --> 01:02:10.540
<v Sjors Provoost>don't want to reveal it. That's the reason why you put the hash there in the

01:02:10.540 --> 01:02:14.420
<v Sjors Provoost>first place. And the thing, the pre-image might be 50 megabytes, so you don't

01:02:14.420 --> 01:02:18.350
<v Sjors Provoost>want to do that. But even in something like Lightning, where you have a hidden

01:02:18.350 --> 01:02:21.970
<v Sjors Provoost>pre-image, that's how you take the payment. Pre-image just means the thing that

01:02:21.970 --> 01:02:22.650
<v Sjors Provoost>leads to the hash.

01:02:24.700 --> 01:02:25.320
<v Aaron van Wirdum>I know.

01:02:25.620 --> 01:02:31.520
<v Sjors Provoost>Yeah. So how do you prove that you have a pre-image that is not a fake hash

01:02:31.520 --> 01:02:36.160
<v Sjors Provoost>without revealing the pre-image? And then presumably there's some fancy zero

01:02:36.160 --> 01:02:39.760
<v Sjors Provoost>-knowledge proof that can do it. But now you're entering whole new cryptography

01:02:39.760 --> 01:02:43.740
<v Sjors Provoost>that we would have to make consensus. So that's super scary. I don't even want to go there.

01:02:44.020 --> 01:02:44.160
<v Aaron van Wirdum>Yeah.

01:02:46.130 --> 01:02:50.370
<v Sjors Provoost>So that's really the two, I think, most obvious tools that we have. Decreasing

01:02:50.370 --> 01:02:53.330
<v Sjors Provoost>the block size would be another one. That's not a complicated fix. It's just

01:02:53.330 --> 01:02:57.270
<v Sjors Provoost>something that nobody wants. So it's probably, you can propose it and everybody

01:02:57.270 --> 01:03:01.890
<v Sjors Provoost>will say no. And then that's the end of the discussion. So then I think the only

01:03:01.890 --> 01:03:05.650
<v Sjors Provoost>way you can really fight spam if you really, really wanted to do this

01:03:05.650 --> 01:03:09.930
<v Sjors Provoost>passionately at the consensus level is to say, well, okay, spam is subjective. We

01:03:09.930 --> 01:03:14.290
<v Sjors Provoost>need people to look at it and just judge it. And so you would need to say, okay,

01:03:14.370 --> 01:03:17.970
<v Sjors Provoost>we're going to assign a public key. Like, we're going to have a vote every four

01:03:17.970 --> 01:03:21.510
<v Sjors Provoost>years or whatever it is. And whoever has a private key can censor anything they

01:03:21.510 --> 01:03:23.270
<v Sjors Provoost>want. If they say it's spam, we believe them.

01:03:24.890 --> 01:03:30.760
<v Sjors Provoost>That sounds pretty bad to give that kind of power. But you could do it as a

01:03:30.760 --> 01:03:31.960
<v Sjors Provoost>consensus rule. It's not complicated.

01:03:32.240 --> 01:03:37.400
<v Aaron van Wirdum>I mean, that's really bad as a consensus rule. However, it does bring me back.

01:03:37.600 --> 01:03:42.360
<v Sjors Provoost>I think that's the ultimate fight, basically, if you really wanted to fight it

01:03:42.360 --> 01:03:42.860
<v Sjors Provoost>this way.

01:03:44.760 --> 01:03:47.520
<v Sjors Provoost>This is the most powerful weapon you can use against spam is saying, okay,

01:03:47.620 --> 01:03:49.260
<v Sjors Provoost>there's a human in charge now of the blockchain.

01:03:50.100 --> 01:03:53.260
<v Aaron van Wirdum>Yeah, sure. I mean, this is a straw man. No one argues this.

01:03:53.540 --> 01:03:54.180
<v Sjors Provoost>No, I agree.

01:03:54.220 --> 01:03:58.640
<v Aaron van Wirdum>I agree nobody argues this. I know you're making a point. I'm just trying to sort

01:03:58.640 --> 01:04:00.460
<v Aaron van Wirdum>of push back a bit where I can.

01:04:00.580 --> 01:04:03.920
<v Sjors Provoost>Well, my pushback is this is the only thing that I think could actually work, but

01:04:03.920 --> 01:04:08.040
<v Sjors Provoost>we all agree we shouldn't do it. And I think people should be careful when

01:04:08.040 --> 01:04:11.160
<v Sjors Provoost>saying, oh, let's just do this one little thing at the, you know, just one

01:04:11.160 --> 01:04:14.820
<v Sjors Provoost>setting. Even though if you really game it out to the end, you're going to lose

01:04:14.820 --> 01:04:18.240
<v Sjors Provoost>this thing and either you're going to lose or you're going to end up doing

01:04:18.240 --> 01:04:24.050
<v Sjors Provoost>something that's horrible, like this super user key. I

01:04:24.050 --> 01:04:28.070
<v Sjors Provoost>have not seen anyone propose something serious that actually works.

01:04:28.230 --> 01:04:32.850
<v Aaron van Wirdum>Okay. You mentioned setting. You just used the word setting. So I want to get to

01:04:32.850 --> 01:04:34.410
<v Aaron van Wirdum>that. And I don't know.

01:04:35.970 --> 01:04:39.590
<v Aaron van Wirdum>Let's not keep talking for much longer, but I do want to mention the setting

01:04:39.590 --> 01:04:45.560
<v Aaron van Wirdum>thing. Why not let people set their own OP_RETURN limit

01:04:45.560 --> 01:04:50.840
<v Aaron van Wirdum>or their own mempool policy as much as possible? Let people figure out for

01:04:50.840 --> 01:04:54.500
<v Aaron van Wirdum>themselves what they want to download and what they want to relay. Because right

01:04:54.500 --> 01:04:59.660
<v Aaron van Wirdum>now, as I understand, the Bitcoin Core proposal is to just remove the

01:04:59.660 --> 01:05:04.140
<v Aaron van Wirdum>OP_RETURN policy limit. And that's just what you have to deal with if you

01:05:04.140 --> 01:05:07.780
<v Aaron van Wirdum>download Bitcoin Core. Why not just make it more configurable?

01:05:08.900 --> 01:05:13.700
<v Sjors Provoost>Because two reasons, I think. One is it's a placebo. And because of the reasons I

01:05:13.700 --> 01:05:16.300
<v Sjors Provoost>just explained, it's too easy to circumvent, yadda, yadda, yadda.

01:05:16.480 --> 01:05:19.780
<v Aaron van Wirdum>Well, not for my personal, no. My personal mempool.

01:05:20.730 --> 01:05:24.860
<v Sjors Provoost>Yeah, but then the question is, do you have feelings about your personal mempool?

01:05:24.960 --> 01:05:28.020
<v Sjors Provoost>I assume you have a goal, right? That's more important than what is in your

01:05:28.020 --> 01:05:33.930
<v Sjors Provoost>mempool. Maybe, maybe not, but... Again, I still think that's a placebo from a

01:05:33.930 --> 01:05:37.210
<v Sjors Provoost>systems point of view. It's like keeping individual users happy about what is in

01:05:37.210 --> 01:05:41.350
<v Sjors Provoost>their mempool, making individual users feel good. That almost sounds like the

01:05:41.350 --> 01:05:45.090
<v Sjors Provoost>microaggression kind of stuff. I don't necessarily think that's a good argument.

01:05:45.330 --> 01:05:51.250
<v Sjors Provoost>But it's there. The other problem is that it's harmful. Because if you set

01:05:51.250 --> 01:05:55.330
<v Sjors Provoost>this thing to something else and other users are doing, you break compact block

01:05:55.330 --> 01:05:58.970
<v Sjors Provoost>relay. And you don't just break it for yourself. You break it for people around

01:05:58.970 --> 01:06:03.530
<v Sjors Provoost>you. Because every node that connects to you fails to relay these compact blocks.

01:06:04.190 --> 01:06:09.200
<v Sjors Provoost>So it's a kind of setting that, as an ethical developer, you would have to write

01:06:09.200 --> 01:06:13.920
<v Sjors Provoost>in the documentation, do not use this. And then you come up with a philosophical

01:06:13.920 --> 01:06:17.160
<v Sjors Provoost>question, like, should you have a setting where everybody agrees it's a bad idea?

01:06:18.810 --> 01:06:24.260
<v Sjors Provoost>Is that moral or not? You can have a long debate about that. But I think at this

01:06:24.260 --> 01:06:29.470
<v Sjors Provoost>point, if you are, as a user, really do not... believe in what the developers are

01:06:29.470 --> 01:06:33.270
<v Sjors Provoost>doing at some point i think you should just use a fork of the software and not

01:06:33.270 --> 01:06:37.130
<v Sjors Provoost>force the developers to do something that they consider wrong yeah and so this is

01:06:37.130 --> 01:06:41.990
<v Sjors Provoost>where i think in general it should be easier for people to have customized

01:06:41.990 --> 01:06:47.250
<v Sjors Provoost>versions of bitcoin Core and not have to say install all of Knots because Knots

01:06:47.250 --> 01:06:52.050
<v Sjors Provoost>like adds another thousand other changes that you may not care about um if all

01:06:52.050 --> 01:06:55.950
<v Sjors Provoost>you want is this setting for whatever reason you have it's open source software so

01:06:57.160 --> 01:07:00.620
<v Sjors Provoost>you're free to write your own software to modify the software. You're not free to

01:07:00.620 --> 01:07:05.260
<v Sjors Provoost>force people to add a setting that they don't want to add for you. But I think it

01:07:05.260 --> 01:07:09.140
<v Sjors Provoost>would be good if it was easier for somebody to say, hey, look, I've got a

01:07:09.140 --> 01:07:12.980
<v Sjors Provoost>modified version of Bitcoin Core. I can prove that it only adds this setting back

01:07:12.980 --> 01:07:16.940
<v Sjors Provoost>and nothing else. I think that would be nice. I think it's technically very

01:07:16.940 --> 01:07:21.660
<v Sjors Provoost>possible because we have deterministic builds, et cetera. And we still recommend

01:07:21.660 --> 01:07:26.380
<v Sjors Provoost>that people don't install that. But, you know, Bitcoin Core developers are not in

01:07:26.380 --> 01:07:28.060
<v Sjors Provoost>charge of what people install, basically.

01:07:29.290 --> 01:07:29.390
<v Aaron van Wirdum>Yeah.

01:07:30.270 --> 01:07:35.380
<v Sjors Provoost>And I think the latest version of Bitcoin Core deprecates the setting instead of

01:07:35.380 --> 01:07:38.720
<v Sjors Provoost>immediately removing it, which means it will be removed, but it won't be removed

01:07:38.720 --> 01:07:43.220
<v Sjors Provoost>now. So if you're looking for this alternative client, you can wait a little bit

01:07:43.220 --> 01:07:46.320
<v Sjors Provoost>longer until the infrastructure is there to have those.

01:07:46.500 --> 01:07:52.010
<v Aaron van Wirdum>Yeah. Okay, I want to wrap this up and I want to sort of summarize

01:07:52.010 --> 01:07:57.890
<v Aaron van Wirdum>what I at least think there's a sort of core contention is here or the sort

01:07:57.890 --> 01:08:03.750
<v Aaron van Wirdum>of difference in philosophy in a way. And I think to a large extent it boils down

01:08:03.750 --> 01:08:09.280
<v Aaron van Wirdum>to what you just said and what I think most Bitcoin Core

01:08:09.280 --> 01:08:14.950
<v Aaron van Wirdum>developers apparently believe is that you cannot stop this anyways. So

01:08:14.950 --> 01:08:20.290
<v Aaron van Wirdum>because you cannot stop it anyways, let's do harm [unclear], like, you're not

01:08:20.290 --> 01:08:23.570
<v Aaron van Wirdum>arguing for people uploading JPEGs to the blockchain. That's not what you're

01:08:23.570 --> 01:08:28.010
<v Aaron van Wirdum>doing. You're saying people will do it anyways and people can do it anyways. And

01:08:28.010 --> 01:08:33.560
<v Aaron van Wirdum>the incentives align for miners to... you know, collaborate in doing this. So

01:08:33.560 --> 01:08:39.000
<v Aaron van Wirdum>let's at least make it, you know, as unharmful, at least harmful as possible.

01:08:39.240 --> 01:08:39.540
<v Sjors Provoost>Yeah.

01:08:39.940 --> 01:08:44.780
<v Aaron van Wirdum>Whereas I think someone like Luke is the perfect example. Luke Dashjr, of course.

01:08:45.440 --> 01:08:51.370
<v Aaron van Wirdum>I think Luke will always pick what he believes to be the most principled

01:08:51.370 --> 01:08:53.010
<v Aaron van Wirdum>position on any issue.

01:08:54.310 --> 01:08:59.630
<v Aaron van Wirdum>And completely disregarding how plausible or feasible or realistic

01:08:59.630 --> 01:09:04.610
<v Aaron van Wirdum>achieving that is. He will just go for that. And that's sort of his, the only

01:09:04.610 --> 01:09:08.930
<v Aaron van Wirdum>thing that he will say, like another good example is, you know, he's been

01:09:08.930 --> 01:09:12.930
<v Aaron van Wirdum>advocating for decreasing the block size limit. He was doing that during the

01:09:12.930 --> 01:09:16.690
<v Aaron van Wirdum>block size wars. He was doing that. Like, well, everyone was talking about

01:09:16.690 --> 01:09:20.980
<v Aaron van Wirdum>increasing the block size limit. Are we going with four megabytes or eight, or is

01:09:20.980 --> 01:09:24.020
<v Aaron van Wirdum>it going to double ever? And he was talking about decreasing the block size

01:09:24.020 --> 01:09:26.900
<v Aaron van Wirdum>limit. It was like so far outside of the Overton window.

01:09:27.020 --> 01:09:28.420
<v Sjors Provoost>Yeah, and for good reasons, by the way.

01:09:29.240 --> 01:09:35.020
<v Aaron van Wirdum>Well, I think that's an important point to point out. Luke sometimes sounds

01:09:35.020 --> 01:09:40.980
<v Aaron van Wirdum>crazy, but it would not be the first time that years later people will say,

01:09:41.160 --> 01:09:45.820
<v Aaron van Wirdum>well, Luke was maybe kind of right, or at least he had a good point. So that's

01:09:45.820 --> 01:09:48.700
<v Aaron van Wirdum>why, at least for me personally, I will always listen to what Luke has to say,

01:09:48.860 --> 01:09:50.260
<v Aaron van Wirdum>even if it sounds completely crazy.

01:09:50.460 --> 01:09:54.740
<v Sjors Provoost>Well, yeah, listening is generally a good idea. If you're able to filter the

01:09:54.740 --> 01:09:58.880
<v Sjors Provoost>signal from the noise, you should definitely find the arguments that are out

01:09:58.880 --> 01:10:03.220
<v Sjors Provoost>there and parse them. And even if you think somebody, you might disagree with the

01:10:03.220 --> 01:10:07.480
<v Sjors Provoost>person on 99.9% of the things they're saying, you still want to find a way to

01:10:07.480 --> 01:10:10.140
<v Sjors Provoost>find that 0.1% that you completely agree with.

01:10:10.730 --> 01:10:15.570
<v Aaron van Wirdum>Yeah, and in Luke's case specifically, like I said, I think he's a good example

01:10:15.570 --> 01:10:21.480
<v Aaron van Wirdum>of what he says is just a complete disregard of the Overton window,

01:10:21.680 --> 01:10:26.820
<v Aaron van Wirdum>of what's socially acceptable, of anything else. He just... says what his

01:10:26.820 --> 01:10:31.660
<v Aaron van Wirdum>principle is and that's what you should be doing. So an argument like, well,

01:10:31.760 --> 01:10:35.660
<v Aaron van Wirdum>we're not going to be able to stop it just does not work for him because he will

01:10:35.660 --> 01:10:39.120
<v Aaron van Wirdum>say, no, we need to stop this because it's bad. So the only thing we should be

01:10:39.120 --> 01:10:40.740
<v Aaron van Wirdum>doing is focusing on how to stop it.

01:10:40.920 --> 01:10:44.740
<v Sjors Provoost>Yeah, but I think he's been much less clear about how far he wants to go.

01:10:44.900 --> 01:10:45.300
<v Aaron van Wirdum>Yeah.

01:10:46.260 --> 01:10:50.580
<v Sjors Provoost>If it's only fighting at the standardness level or, you know, he wants to fight

01:10:50.580 --> 01:10:51.620
<v Sjors Provoost>at the consensus level.

01:10:51.740 --> 01:10:51.860
<v Aaron van Wirdum>Right.

01:10:52.620 --> 01:10:58.450
<v Sjors Provoost>And I think that's... because then you can sound very principled, but you're

01:10:58.450 --> 01:11:03.450
<v Sjors Provoost>not because you're not really willing to go all the way there. But, you know, if

01:11:03.450 --> 01:11:06.330
<v Sjors Provoost>you had to steelman, you could say, well, it's just about creating a perceived

01:11:06.330 --> 01:11:10.430
<v Sjors Provoost>threat to people, you know, creating a perceived threat, even it could be a

01:11:10.430 --> 01:11:14.650
<v Sjors Provoost>bluff, but it might be enough to kind of signal that to the people that are doing

01:11:14.650 --> 01:11:18.690
<v Sjors Provoost>these protocols. Look, I think where we would agree is that these non-monetary

01:11:18.690 --> 01:11:23.470
<v Sjors Provoost>uses are not something we should optimize for. It's something that exists. I

01:11:23.470 --> 01:11:27.170
<v Sjors Provoost>don't necessarily think we have to actively fight it, but I, you know, I think

01:11:27.170 --> 01:11:29.070
<v Sjors Provoost>Bitcoin should be censorship resistant money.

01:11:30.400 --> 01:11:34.240
<v Sjors Provoost>And, you know, then you have limited resources and you have spam and you have

01:11:34.240 --> 01:11:35.380
<v Sjors Provoost>some mitigations against it.

01:11:36.160 --> 01:11:41.360
<v Aaron van Wirdum>Yeah. I mean, let me be clear in case that wasn't. I personally also fall more on

01:11:41.360 --> 01:11:45.180
<v Aaron van Wirdum>the pragmatic side or, you know, the Bitcoin Core sort of side of the arguments

01:11:45.180 --> 01:11:49.090
<v Aaron van Wirdum>here where it's like, you're not going to be able to stop this. It's like RBF all

01:11:49.090 --> 01:11:53.680
<v Aaron van Wirdum>over again. It's the same thing in my view. But there's also still a bigger point

01:11:53.680 --> 01:11:59.150
<v Aaron van Wirdum>in one direction. Let's just do some harm reduction. It's not that big of a

01:11:59.150 --> 01:12:04.170
<v Aaron van Wirdum>problem. I think the real, you know, the real spam...

01:12:05.880 --> 01:12:11.100
<v Aaron van Wirdum>limit that we have is the block size limit itself that will eventually, if not

01:12:11.100 --> 01:12:16.280
<v Aaron van Wirdum>already, just outprice spam. It's basically the original reason Adam Back even

01:12:16.280 --> 01:12:20.120
<v Aaron van Wirdum>came up with Hashcash, just make spam expensive and then it will go away.

01:12:20.520 --> 01:12:25.240
<v Aaron van Wirdum>Essentially, we see that in Bitcoin or we should see that in Bitcoin as fee pressure.

01:12:25.440 --> 01:12:28.860
<v Sjors Provoost>Well, it was his hope, but it may turn out the opposite, right? It may turn out

01:12:28.860 --> 01:12:32.260
<v Sjors Provoost>that making spam expensive is what makes it interesting and you'll always have

01:12:32.260 --> 01:12:36.330
<v Sjors Provoost>some of it. But you can at least limit the damage it can do. And if you look

01:12:36.330 --> 01:12:42.190
<v Sjors Provoost>really long-term, there's proposals like Utreexo that make the UTXO set go away.

01:12:42.330 --> 01:12:47.470
<v Sjors Provoost>We did an episode about that many years ago. And well, then suddenly you no

01:12:47.470 --> 01:12:50.990
<v Sjors Provoost>longer have this argument of we don't want to pollute the UTXO set. So then the

01:12:50.990 --> 01:12:54.810
<v Sjors Provoost>whole game theory changes and you might say... We can have OP_RETURN because we

01:12:54.810 --> 01:12:57.370
<v Sjors Provoost>don't care if people make fake public keys because nobody's going to see them

01:12:57.370 --> 01:13:03.290
<v Sjors Provoost>because they go into this accumulator. The game theory could change 10 years

01:13:03.290 --> 01:13:07.120
<v Sjors Provoost>down the road, but those protocols are not concrete enough that we can count on them.

01:13:08.690 --> 01:13:11.670
<v Aaron van Wirdum>Okay. Is there anything we forgot to mention so far?

01:13:12.290 --> 01:13:14.270
<v Sjors Provoost>Probably, but we spent quite a bit of time on this.

01:13:14.770 --> 01:13:19.710
<v Aaron van Wirdum>I'm sure there's arguments on both sides we didn't mention, but let's wrap this

01:13:19.710 --> 01:13:24.160
<v Aaron van Wirdum>up. Slowly but surely. Or maybe just right now. Right now.

01:13:24.360 --> 01:13:25.780
<v Sjors Provoost>Let's put the whole episode on an OP_RETURN.

01:13:25.810 --> 01:13:25.930
<v Aaron van Wirdum>No.

01:13:26.350 --> 01:13:27.650
<v Sjors Provoost>Thank you for listening to Bitcoin.

01:13:28.150 --> 01:13:28.510
<v Aaron van Wirdum>Explained.

