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

00:00:19.630 --> 00:00:23.770
<v Aaron van Wirdum>Live from Utrecht, this is Bitcoin. Explained. Hey Sjors.

00:00:24.070 --> 00:00:24.590
<v Sjors Provoost>What's up?

00:00:25.010 --> 00:00:26.250
<v Aaron van Wirdum>How's life in the McDrive?

00:00:27.070 --> 00:00:30.670
<v Sjors Provoost>Excellent. Well, it's the McWalk now, I guess, because, you know.

00:00:31.240 --> 00:00:32.780
<v Aaron van Wirdum>You don't even have a car anymore.

00:00:32.840 --> 00:00:33.680
<v Sjors Provoost>No, you work there, right?

00:00:34.000 --> 00:00:35.280
<v Aaron van Wirdum>We both work there now.

00:00:35.500 --> 00:00:39.480
<v Sjors Provoost>Oh, you mean life from the McDrive.

00:00:39.620 --> 00:00:43.560
<v Aaron van Wirdum>Yeah, no, it's great. I actually used to work at McDonald's in my teenage years.

00:00:44.170 --> 00:00:44.570
<v Sjors Provoost>Okay.

00:00:44.950 --> 00:00:45.730
<v Aaron van Wirdum>It was kind of fun.

00:00:45.950 --> 00:00:48.930
<v Sjors Provoost>I was more into newspaper delivery and that sort of stuff.

00:00:49.210 --> 00:00:51.010
<v Aaron van Wirdum>Oh, yeah, sure. So I got a question.

00:00:51.390 --> 00:00:52.230
<v Sjors Provoost>Great. Tell me.

00:00:52.330 --> 00:00:57.550
<v Aaron van Wirdum>From one of our listeners. From Vinay Shetty. It's a question from a while ago,

00:00:57.630 --> 00:01:01.150
<v Aaron van Wirdum>actually, but we're finally going to address it. Before we get into the actual

00:01:01.150 --> 00:01:06.470
<v Aaron van Wirdum>episode. By the way, the actual episode is about James Lopp's hard fork research.

00:01:06.710 --> 00:01:10.170
<v Aaron van Wirdum>So our listeners also know this now. But we're first going to address a quick

00:01:10.170 --> 00:01:13.210
<v Aaron van Wirdum>question from one of our listeners, which is, Sjors, are you ready?

00:01:13.520 --> 00:01:14.120
<v Sjors Provoost>I'm ready.

00:01:14.120 --> 00:01:20.040
<v Aaron van Wirdum>So the tweet is curious on how the DNS seeders work when the

00:01:20.040 --> 00:01:26.000
<v Aaron van Wirdum>node is set up as an onion node. I set up a prune node and all I had was dot

00:01:26.000 --> 00:01:30.880
<v Aaron van Wirdum>onion outgoing connections. Am I querying the DNS seeders for that information?

00:01:30.880 --> 00:01:34.720
<v Aaron van Wirdum>Or do I get that information from the hard-coded file? Sjors?

00:01:35.140 --> 00:01:37.980
<v Sjors Provoost>Well, assuming this tweet was not written three years ago.

00:01:38.820 --> 00:01:40.560
<v Aaron van Wirdum>It was written like two months ago.

00:01:40.740 --> 00:01:45.980
<v Sjors Provoost>Okay. Because with Tor v2, it was a little bit different. But we had an episode

00:01:45.980 --> 00:01:50.680
<v Sjors Provoost>where we explained the difference between Tor v2 and Tor v3. But with Tor v3,

00:01:50.800 --> 00:01:54.780
<v Sjors Provoost>it's very safe to say that you did not get that from the DNS seeds. So what

00:01:54.780 --> 00:01:59.380
<v Sjors Provoost>happens is when your node starts up... It will query the DNS seeds to see if

00:01:59.380 --> 00:02:00.420
<v Sjors Provoost>there's other nodes out there.

00:02:01.680 --> 00:02:07.320
<v Sjors Provoost>But if you configured your node to only connect to Tor nodes, then it won't find

00:02:07.320 --> 00:02:11.200
<v Sjors Provoost>anything because the DNS seeds are not actually telling you where the Tor nodes

00:02:11.200 --> 00:02:15.920
<v Sjors Provoost>are. It only knows where the IPv4 nodes are and where the IPv6 nodes are. So that

00:02:15.920 --> 00:02:20.760
<v Sjors Provoost>means if you didn't run your node before, like ever,

00:02:21.080 --> 00:02:25.740
<v Sjors Provoost>without Tor, then the only way you would have found those onion addresses that

00:02:25.740 --> 00:02:29.780
<v Sjors Provoost>you connected to now is because you found one that was hard-coded in the source

00:02:29.780 --> 00:02:34.000
<v Sjors Provoost>code. So basically, if the DNS seeds don't give you anything useful... Which

00:02:34.000 --> 00:02:36.980
<v Sjors Provoost>would be the case, right? If you're asking them for Tor addresses, but you're

00:02:36.980 --> 00:02:41.900
<v Sjors Provoost>only getting IPv4 and IPv6 addresses, then your node is going to fall back to

00:02:41.900 --> 00:02:47.080
<v Sjors Provoost>some hard-coded Tor addresses that are in the source code. And if any of those

00:02:47.080 --> 00:02:51.960
<v Sjors Provoost>still exist, it will connect to them, and then it will get a bunch of other Tor

00:02:51.960 --> 00:02:54.920
<v Sjors Provoost>services from that first connection, and then you'll connect to those.

00:02:55.500 --> 00:03:00.570
<v Aaron van Wirdum>Okay. Vinay, I hope that helps. Sjors, let's get into the main topic of this

00:03:00.570 --> 00:03:04.190
<v Aaron van Wirdum>episode. All right. Oh, and if any other listeners, you know, if you have

00:03:04.190 --> 00:03:08.570
<v Aaron van Wirdum>questions or if you have an idea for a topic we can discuss for an entire

00:03:08.570 --> 00:03:14.230
<v Aaron van Wirdum>episode, feel free to let us know on Twitter. I'm at Aaron Van W. And Sjors is

00:03:14.230 --> 00:03:15.090
<v Aaron van Wirdum>at provoost.

00:03:15.410 --> 00:03:18.390
<v Sjors Provoost>That's right. And if you want the answer a bit quicker than three weeks, you

00:03:18.390 --> 00:03:20.250
<v Sjors Provoost>should probably also ask Bitcoin Stack Exchange.

00:03:21.160 --> 00:03:26.920
<v Aaron van Wirdum>All right, Sjors, on to the main topic. All right. So Jameson Lopp wrote another

00:03:26.920 --> 00:03:31.780
<v Aaron van Wirdum>excellent blog post. We've discussed one of his blog posts before. I think that

00:03:31.780 --> 00:03:37.780
<v Aaron van Wirdum>was Syncing Old Nodes, episode 55. Cool. I'm pretty sure it was

00:03:37.780 --> 00:03:43.180
<v Aaron van Wirdum>55. I'm actually almost entirely sure it was 55. And this time he

00:03:43.180 --> 00:03:47.620
<v Aaron van Wirdum>published a blog post called Has Bitcoin Ever Hard Forked?

00:03:49.170 --> 00:03:54.830
<v Aaron van Wirdum>So it discusses whether Bitcoin has ever hard forked,

00:03:54.990 --> 00:04:00.990
<v Aaron van Wirdum>obviously. Okay. First of all, I'll just ask you right now, what is

00:04:00.990 --> 00:04:01.430
<v Aaron van Wirdum>a hard fork?

00:04:02.220 --> 00:04:06.480
<v Sjors Provoost>Well, as Lopp actually points out in the blog post, it's a bit of an ambiguous

00:04:06.480 --> 00:04:10.680
<v Sjors Provoost>term, but generally what we mean is it's a loosening of the rules. I mean, it's

00:04:10.680 --> 00:04:13.940
<v Sjors Provoost>only a fork if something actually happens. Or at least that's what we could

00:04:13.940 --> 00:04:16.880
<v Sjors Provoost>debate about. But generally, the difference between a hard fork and a soft fork

00:04:16.880 --> 00:04:20.780
<v Sjors Provoost>is to say, in a hard fork, you're loosening the rules. So, for example, you might

00:04:20.780 --> 00:04:25.520
<v Sjors Provoost>be allowing 2 megabyte blocks instead of 1 megabyte blocks. And a soft fork would

00:04:25.520 --> 00:04:28.700
<v Sjors Provoost>be tightening the rules. So you might say, we're only going to allow smaller

00:04:28.700 --> 00:04:34.520
<v Sjors Provoost>blocks. And this matters in terms of whether or not you need to upgrade very

00:04:34.520 --> 00:04:36.740
<v Sjors Provoost>quickly to be able to follow the new rules.

00:04:37.290 --> 00:04:42.750
<v Aaron van Wirdum>Yeah, that's maybe a little bit of a confusing example because Bitcoin did have a

00:04:42.750 --> 00:04:46.230
<v Aaron van Wirdum>soft fork to bigger blocks a couple of years ago through SegWit.

00:04:46.470 --> 00:04:51.250
<v Sjors Provoost>Well, that also points out that the idea that hard forks are bad and soft forks

00:04:51.250 --> 00:04:55.990
<v Sjors Provoost>are good is not a great, like, it's not super accurate either because you can do

00:04:55.990 --> 00:04:59.170
<v Sjors Provoost>all sorts of things with a soft fork that you think you can only do with a hard

00:04:59.170 --> 00:05:01.250
<v Sjors Provoost>fork and vice versa.

00:05:01.550 --> 00:05:06.430
<v Aaron van Wirdum>Right. But yeah, the point here is that the general sort of classic definition of

00:05:06.430 --> 00:05:11.790
<v Aaron van Wirdum>a hard fork is it loosens or removes rules while a soft fork tightens or adds

00:05:11.790 --> 00:05:12.870
<v Aaron van Wirdum>rules. Yeah.

00:05:13.030 --> 00:05:16.490
<v Sjors Provoost>That's a very general definition. And the thing behind that is that because if

00:05:16.490 --> 00:05:20.430
<v Sjors Provoost>you're running an old node, you're going to check the old rules basically. And if

00:05:20.430 --> 00:05:24.610
<v Sjors Provoost>the new rules are more strict, then whatever the other nodes are doing, you'll

00:05:24.610 --> 00:05:27.770
<v Sjors Provoost>still approve it because you still have a looser interpretation.

00:05:28.360 --> 00:05:33.340
<v Aaron van Wirdum>Yeah, so especially if miners are enforcing the soft fork rules, then all the old

00:05:33.340 --> 00:05:38.200
<v Aaron van Wirdum>nodes will still accept that chain as well. While with the hard fork, that's not

00:05:38.200 --> 00:05:42.940
<v Aaron van Wirdum>necessarily the case. Now, what Jameson does in this blog post,

00:05:43.470 --> 00:05:48.990
<v Aaron van Wirdum>in this lab post, is first of all, he

00:05:48.990 --> 00:05:54.330
<v Aaron van Wirdum>proposes a stricter definition for hard fork. So he kind of

00:05:54.330 --> 00:06:00.200
<v Aaron van Wirdum>adds... He adds two factors to what we

00:06:00.200 --> 00:06:05.340
<v Aaron van Wirdum>should consider a hard fork or what he considers a hard fork. And then the second

00:06:05.340 --> 00:06:10.220
<v Aaron van Wirdum>thing he does is he analyzes the history of Bitcoin to see if there have been any

00:06:10.220 --> 00:06:10.780
<v Aaron van Wirdum>hard forks.

00:06:11.140 --> 00:06:11.280
<v Sjors Provoost>Okay.

00:06:11.760 --> 00:06:17.620
<v Aaron van Wirdum>Right. So what are, shall I just tell you what his new proposed definitions are?

00:06:18.040 --> 00:06:21.100
<v Sjors Provoost>Yeah, that's probably a good idea because I didn't memorize them.

00:06:21.610 --> 00:06:27.210
<v Aaron van Wirdum>Okay so he he [unclear] he... Classifications he proposes first of all,

00:06:27.210 --> 00:06:33.070
<v Aaron van Wirdum>so a hard fork loosens the rules but what Jameson suggests is that

00:06:33.070 --> 00:06:39.050
<v Aaron van Wirdum>it should really only be considered a hard fork if these looser rules

00:06:39.050 --> 00:06:40.750
<v Aaron van Wirdum>are ever used.

00:06:42.360 --> 00:06:47.480
<v Aaron van Wirdum>So you made the example of a block size limit increase. So I'll run with that

00:06:47.480 --> 00:06:51.880
<v Aaron van Wirdum>example. And let's say 10 megabytes just to make it clear that we're talking

00:06:51.880 --> 00:06:57.680
<v Aaron van Wirdum>about the hard fork here. So if a hard fork rule change is made that allows for

00:06:57.680 --> 00:07:03.450
<v Aaron van Wirdum>10 megabytes blocks. But no 10 megabyte block is mined at all, all

00:07:03.450 --> 00:07:08.950
<v Aaron van Wirdum>blocks are still one megabyte or two megabytes on their SegWit, then these looser

00:07:08.950 --> 00:07:14.150
<v Aaron van Wirdum>rules are never actually used. So the older nodes, they wouldn't even notice that

00:07:14.150 --> 00:07:18.310
<v Aaron van Wirdum>a hard fork happened at all. They would still just follow the chain. And

00:07:18.310 --> 00:07:22.890
<v Aaron van Wirdum>therefore, under Lopp's definition, which I think is a reasonable definition, a

00:07:22.890 --> 00:07:24.570
<v Aaron van Wirdum>hard fork never actually happened.

00:07:24.930 --> 00:07:27.870
<v Sjors Provoost>Right, so you're risking a hard fork, but there's not an actual hard fork.

00:07:28.070 --> 00:07:32.050
<v Aaron van Wirdum>Yeah, so it's only a hard fork if the rules are actually used.

00:07:32.550 --> 00:07:37.580
<v Sjors Provoost>Yep. I can give an actual example of that, of something that happened fairly

00:07:37.580 --> 00:07:38.120
<v Sjors Provoost>recently.

00:07:38.420 --> 00:07:41.200
<v Aaron van Wirdum>Okay. Actually, we'll go over all of the examples later.

00:07:41.580 --> 00:07:42.060
<v Sjors Provoost>Is that what we'll do?

00:07:42.320 --> 00:07:44.040
<v Aaron van Wirdum>Let's first do the second rule.

00:07:44.180 --> 00:07:45.540
<v Sjors Provoost>Okay. Or heuristic.

00:07:45.840 --> 00:07:51.440
<v Aaron van Wirdum>Yeah, so the second classification is what I'm going with, or what Lopp is going

00:07:51.440 --> 00:07:56.380
<v Aaron van Wirdum>with, actually, is implicit versus explicit. And that essentially means,

00:07:56.580 --> 00:08:02.230
<v Aaron van Wirdum>was it intended to be a rule change? Or is it basically just a bug?

00:08:02.230 --> 00:08:07.190
<v Sjors Provoost>Right but I would say a bug could still cause a hard fork but it's definitely a

00:08:07.190 --> 00:08:11.070
<v Sjors Provoost>different kind of thing to deal with. Right if if the network because the one of

00:08:11.070 --> 00:08:13.650
<v Sjors Provoost>the reasons you're worried about a hard fork is because it can split the network.

00:08:13.650 --> 00:08:19.030
<v Sjors Provoost>And when that happens you want to know like okay is this split because we

00:08:19.030 --> 00:08:23.290
<v Sjors Provoost>intended to change some of the rules or is this split some freak accident that we

00:08:23.290 --> 00:08:23.730
<v Sjors Provoost>should fix?

00:08:24.260 --> 00:08:28.580
<v Aaron van Wirdum>Yeah, well, I'm just explaining the classifications here. So right now, we've

00:08:28.580 --> 00:08:32.860
<v Aaron van Wirdum>always been saying, you know, a hard fork, and we just gave the definition of

00:08:32.860 --> 00:08:38.320
<v Aaron van Wirdum>that. And Lopp is suggesting we should make it more specific. What are we talking

00:08:38.320 --> 00:08:43.640
<v Aaron van Wirdum>about exactly? Was it actually triggered or not? If not, it probably shouldn't

00:08:43.640 --> 00:08:47.060
<v Aaron van Wirdum>even be considered a hard fork. And when I say triggered, I mean, were the new

00:08:47.060 --> 00:08:52.610
<v Aaron van Wirdum>rules used? Was there a block mined that you know used the new rules? And then

00:08:52.610 --> 00:08:58.080
<v Aaron van Wirdum>the second classification was it intentional or not? Okay then Lopp goes so

00:08:58.080 --> 00:09:03.170
<v Aaron van Wirdum>that's the first half of the or that's sort of the new proposal for that's how we

00:09:03.170 --> 00:09:07.130
<v Aaron van Wirdum>should think about hard forks more specifically. And then the second part of the

00:09:07.130 --> 00:09:12.970
<v Aaron van Wirdum>blog post he goes over I think seven consensus changes in bitcoin's history that

00:09:12.970 --> 00:09:18.670
<v Aaron van Wirdum>could be considered hard forks under any of these in any of these newer

00:09:18.670 --> 00:09:24.530
<v Aaron van Wirdum>categories that I just gave, of which five are hard forks that were

00:09:24.530 --> 00:09:29.220
<v Aaron van Wirdum>never triggered. In other words they were arguably not hard forks at all. And

00:09:29.220 --> 00:09:34.020
<v Aaron van Wirdum>then there was one implicit hard fork. So a hard fork that was kind of just a bug

00:09:34.020 --> 00:09:40.040
<v Aaron van Wirdum>and that wasn't intended to be there. And one explicit hard fork. So there's

00:09:40.040 --> 00:09:44.720
<v Sjors Provoost>so one case where the rules were intentionally expanded and also somebody made

00:09:44.720 --> 00:09:46.260
<v Sjors Provoost>use of those newly expanded rules.

00:09:46.260 --> 00:09:50.900
<v Aaron van Wirdum>Exactly so in the sort of purest definition of a hard fork it only happened once.

00:09:50.900 --> 00:09:55.220
<v Aaron van Wirdum>So it was like you said it was intended to happen and it actually happened that

00:09:55.220 --> 00:09:58.980
<v Aaron van Wirdum>only happened once. Oh there's one other thing we should discuss which Lopp also

00:09:58.980 --> 00:10:03.140
<v Aaron van Wirdum>mentioned and which I forgot so there's one other thing that people call hard

00:10:03.140 --> 00:10:09.110
<v Aaron van Wirdum>forks I've never done that in my writing but that's fork coins so

00:10:09.110 --> 00:10:13.890
<v Aaron van Wirdum>that's like Bitcoin cash or Bitcoin gold or whatever. We've had Bitcoin

00:10:13.890 --> 00:10:15.970
<v Sjors Provoost>pizza Bitcoin pizza classic we've had

00:10:15.970 --> 00:10:21.410
<v Aaron van Wirdum>dozens if not hundreds of these. So under some definitions of hard forks you

00:10:21.410 --> 00:10:26.110
<v Aaron van Wirdum>could consider these hard forks. I've never done that I I think that if you

00:10:26.270 --> 00:10:30.630
<v Aaron van Wirdum>intentionally create a new coin if it's obvious that that's what's going to

00:10:30.630 --> 00:10:34.730
<v Aaron van Wirdum>happen if you're obviously going to split the blockchain and the and you're going

00:10:34.730 --> 00:10:39.300
<v Aaron van Wirdum>to create a new token that will have a new ticker and that can be traded against

00:10:40.130 --> 00:10:44.450
<v Aaron van Wirdum>the original, then I don't think that should even be thought of as hard fork even.

00:10:44.850 --> 00:10:48.490
<v Sjors Provoost>I mean, it depends, I guess. It's in the eye of the beholder, right? I think with

00:10:48.490 --> 00:10:51.630
<v Sjors Provoost>most of the forks of Bitcoin, it was pretty obvious that they were just forks.

00:10:51.930 --> 00:10:55.530
<v Sjors Provoost>You could call them forks or airdrops or something like that. I go for

00:10:55.530 --> 00:10:56.390
<v Aaron van Wirdum>fork coins, yeah.

00:10:56.610 --> 00:11:01.290
<v Sjors Provoost>Yeah, but for example, in the case of Ethereum, it's a lot more ambiguous. If the

00:11:01.290 --> 00:11:05.230
<v Sjors Provoost>entire community considers the current Ethereum to be Ethereum and the Ethereum

00:11:05.230 --> 00:11:06.750
<v Sjors Provoost>Classic to be something else.

00:11:08.670 --> 00:11:12.450
<v Sjors Provoost>But that's because I guess they also have a different philosophy around hard

00:11:12.450 --> 00:11:14.560
<v Sjors Provoost>forks in general. They have a

00:11:14.560 --> 00:11:19.420
<v Aaron van Wirdum>different philosophy. They actually have a literal registered trademark, you

00:11:19.420 --> 00:11:24.480
<v Aaron van Wirdum>know, so the Ethereum Foundation can decide what must be called Ethereum. So

00:11:24.480 --> 00:11:29.260
<v Aaron van Wirdum>that's one of the biggest differences between Bitcoin and Ethereum. It's

00:11:29.260 --> 00:11:33.180
<v Aaron van Wirdum>centralized in that way. Yeah. Someone actually gets to make that decision. And

00:11:33.180 --> 00:11:36.970
<v Aaron van Wirdum>in Bitcoin, we don't have that. So we need to sort of... Come to some kind of

00:11:36.970 --> 00:11:38.750
<v Aaron van Wirdum>consensus on what language you use.

00:11:39.580 --> 00:11:44.760
<v Sjors Provoost>Yeah, in any case, if the goal is to create two separate coins, then that's not

00:11:44.760 --> 00:11:46.160
<v Sjors Provoost>the scenario that we're talking about here.

00:11:46.840 --> 00:11:50.460
<v Aaron van Wirdum>Yeah, I would not consider that a hard fork, and neither does Jameson Lopp, at

00:11:50.460 --> 00:11:55.350
<v Aaron van Wirdum>least in his blog post. Okay so now we've we that's out of the way, fork coins is

00:11:55.350 --> 00:11:59.050
<v Aaron van Wirdum>not what we're talking about. And then we categorized different types of hard

00:11:59.050 --> 00:12:04.510
<v Aaron van Wirdum>forks. And Lopp says there have been seven based on his research of which

00:12:04.510 --> 00:12:09.350
<v Aaron van Wirdum>five were never triggered so they arguably weren't hard forks at all. One was

00:12:09.350 --> 00:12:12.750
<v Aaron van Wirdum>implicit one was explicit. And now we're going to go over them is that right?

00:12:12.750 --> 00:12:13.290
<v Sjors Provoost>Sounds good.

00:12:13.290 --> 00:12:18.630
<v Aaron van Wirdum>Okay let's do it. So let's start with uh we're going to start with the five

00:12:19.460 --> 00:12:25.330
<v Aaron van Wirdum>hard forks that were never triggered as does Lopp and I think this

00:12:25.620 --> 00:12:30.700
<v Aaron van Wirdum>is where your expertise comes in Sjors, you're you're you can explain to our

00:12:30.700 --> 00:12:34.220
<v Aaron van Wirdum>listeners what these five events were is that right?

00:12:34.220 --> 00:12:39.440
<v Sjors Provoost>I will do my best I mostly studied the uh the final example where there was

00:12:40.070 --> 00:12:44.070
<v Sjors Provoost>most arguably a hard fork. But we'll see if I remember the other five.

00:12:44.330 --> 00:12:49.570
<v Aaron van Wirdum>Okay, so first, the first one was Satoshi changed best chain

00:12:49.570 --> 00:12:50.850
<v Aaron van Wirdum>selection logic.

00:12:51.090 --> 00:12:51.770
<v Sjors Provoost>Oh, yeah.

00:12:52.070 --> 00:12:54.810
<v Aaron van Wirdum>That's Bitcoin 0.2.

00:12:55.580 --> 00:13:00.560
<v Sjors Provoost>Yeah, that was a fun one, right? So from, I wasn't there and I haven't not

00:13:00.560 --> 00:13:03.520
<v Sjors Provoost>actually looked at the change, but my understanding is that initially what

00:13:03.520 --> 00:13:07.760
<v Sjors Provoost>Satoshi did was just saying, well, if there's more blocks, that must mean that

00:13:07.760 --> 00:13:11.680
<v Sjors Provoost>that is the right chain to go to. Whereas now we would consider the most proof of

00:13:11.680 --> 00:13:16.260
<v Sjors Provoost>work, the most cumulative proof of work to be the correct chain to go to. That's

00:13:16.260 --> 00:13:19.660
<v Sjors Provoost>definitely a big change. And I think that was the intention too, you know, from

00:13:19.660 --> 00:13:23.610
<v Sjors Provoost>the white paper. But it was implemented incorrectly in the beginning.

00:13:23.830 --> 00:13:25.570
<v Aaron van Wirdum>Well, was that intention in the white paper?

00:13:25.650 --> 00:13:30.630
<v Sjors Provoost>I don't think so. I think it was like one CPU, one vote. So if you extrapolate

00:13:30.630 --> 00:13:33.710
<v Sjors Provoost>that, you would say that the more CPU power you have, the more votes you have.

00:13:34.050 --> 00:13:37.070
<v Sjors Provoost>And the problem with the longest chain is that you can have a very high

00:13:37.070 --> 00:13:40.150
<v Sjors Provoost>difficulty, but then the difficulty goes down because fewer people are mining.

00:13:41.620 --> 00:13:45.960
<v Sjors Provoost>And you might end up with lots and lots of blocks at a very low difficulty and

00:13:45.960 --> 00:13:49.200
<v Sjors Provoost>some obvious attacks because you can fake the timestamps and things like that.

00:13:49.460 --> 00:13:52.340
<v Aaron van Wirdum>Yeah, that was definitely the philosophy in the white paper. But I think the way

00:13:52.340 --> 00:13:55.540
<v Aaron van Wirdum>it was explained in the white paper, and it's been a while since I read it. I'm

00:13:55.540 --> 00:13:56.600
<v Aaron van Wirdum>sure he would have used the word longest.

00:13:56.600 --> 00:14:00.660
<v Sjors Provoost>And I think as a first approximation, that's fine. But if you really want to

00:14:00.660 --> 00:14:03.880
<v Sjors Provoost>compare two chains, you don't just want to look at the number of blocks. You want

00:14:03.880 --> 00:14:05.620
<v Sjors Provoost>to make sure that they actually have work.

00:14:06.690 --> 00:14:11.610
<v Aaron van Wirdum>Exactly, yeah so before so apparently Bitcoin the very first version of Bitcoin

00:14:11.610 --> 00:14:14.770
<v Aaron van Wirdum>they just looked at the longest chain that is essentially the highest block

00:14:14.770 --> 00:14:19.110
<v Aaron van Wirdum>number is the chain that all nodes will converge on. And that was changed later

00:14:19.110 --> 00:14:19.870
<v Aaron van Wirdum>to look at the

00:14:21.320 --> 00:14:27.080
<v Aaron van Wirdum>most accumulated proof of work which is not technically a hard fork like it's not

00:14:27.080 --> 00:14:31.300
<v Aaron van Wirdum>a loosening of the rules but it is a complete change of the rules. Yeah it's hard to

00:14:31.300 --> 00:14:34.420
<v Sjors Provoost>see what would happen and I don't know if there's any documentation whether

00:14:34.420 --> 00:14:39.120
<v Sjors Provoost>anything actually did happen whether he correctly anticipated this would become a

00:14:39.120 --> 00:14:42.820
<v Sjors Provoost>problem or whether there were some really long chains with low proof of work out

00:14:42.820 --> 00:14:44.460
<v Sjors Provoost>there that we just don't know about.

00:14:44.460 --> 00:14:50.370
<v Aaron van Wirdum>Yeah well Jameson Lopp at least hasn't found any evidence that this was ever

00:14:50.370 --> 00:14:52.190
<v Aaron van Wirdum>triggered. That's why it's in this category.

00:14:52.790 --> 00:14:53.930
<v Sjors Provoost>Yeah, just keep in mind that the evidence...

00:14:53.930 --> 00:14:56.350
<v Aaron van Wirdum>So according to him, there was never any change.

00:14:56.670 --> 00:15:00.210
<v Sjors Provoost>Right, but keep in mind that such evidence would only exist on a forum or in some

00:15:00.210 --> 00:15:05.530
<v Sjors Provoost>very, very old Bitcoiners node log file. Yeah, especially

00:15:05.530 --> 00:15:11.450
<v Aaron van Wirdum>because... Bitcoin version 2 was probably released 2009 still? Or

00:15:11.450 --> 00:15:12.370
<v Aaron van Wirdum>what do you think?

00:15:12.970 --> 00:15:15.190
<v Sjors Provoost>Yeah, I'd say 2009 to 2010. Yeah,

00:15:15.370 --> 00:15:20.360
<v Aaron van Wirdum>so that were basically probably 10 people paying attention. Something like that.

00:15:20.940 --> 00:15:21.780
<v Aaron van Wirdum>If that.

00:15:22.020 --> 00:15:22.720
<v Sjors Provoost>That and the NSA.

00:15:23.380 --> 00:15:24.240
<v Aaron van Wirdum>Right, of course.

00:15:27.670 --> 00:15:29.850
<v Aaron van Wirdum>Okay, the next one is...

00:15:31.470 --> 00:15:33.570
<v Aaron van Wirdum>OP_VER. Do you know what OP_VER is?

00:15:33.770 --> 00:15:37.690
<v Sjors Provoost>Yeah, OP_VER is a fun one. It's not named after Roger Ver. It was actually before

00:15:37.690 --> 00:15:38.390
<v Sjors Provoost>he was involved.

00:15:40.070 --> 00:15:43.240
<v Aaron van Wirdum>No, I don't. Was it? 3.6.

00:15:43.460 --> 00:15:47.300
<v Sjors Provoost>I mean, it was in there from the beginning, right? That's probably before Roger

00:15:47.300 --> 00:15:48.420
<v Sjors Provoost>Ver was involved.

00:15:48.620 --> 00:15:49.100
<v Aaron van Wirdum>Yeah, you're right.

00:15:49.620 --> 00:15:55.500
<v Sjors Provoost>So basically what OP_VER did was it would use the version of the protocol or the

00:15:55.500 --> 00:16:00.560
<v Sjors Provoost>version, kind of like the version of the software as a part of the script. So you

00:16:00.560 --> 00:16:04.420
<v Sjors Provoost>could send somebody money and saying, okay, you can redeem this if the software

00:16:04.420 --> 00:16:08.350
<v Sjors Provoost>version is two. And so you would be running software version two, and you would

00:16:08.350 --> 00:16:12.270
<v Sjors Provoost>just take these coins and say, okay, I'm happy. My software version is two. And

00:16:12.270 --> 00:16:13.050
<v Sjors Provoost>then I would wait a while.

00:16:14.450 --> 00:16:18.810
<v Sjors Provoost>And then software version would maybe be three, or the miner might be running

00:16:18.810 --> 00:16:21.910
<v Sjors Provoost>version three, and I would send the same transaction to that miner, and they

00:16:21.910 --> 00:16:25.690
<v Sjors Provoost>would be like, no, this transaction is not actually valid. So you create a fork,

00:16:25.890 --> 00:16:28.910
<v Sjors Provoost>because whether a transaction is valid depends on which version of the software

00:16:28.910 --> 00:16:33.070
<v Sjors Provoost>you're running. So that was obviously not a very good security thing.

00:16:33.390 --> 00:16:37.530
<v Aaron van Wirdum>Right, so OP_VER, that opcode was just removed entirely from the protocol.

00:16:37.950 --> 00:16:40.530
<v Sjors Provoost>Yeah, though that sounds like a soft fork to me, so I'm not sure why.

00:16:40.810 --> 00:16:42.710
<v Aaron van Wirdum>No, removing it would be a hard fork, right?

00:16:42.940 --> 00:16:46.080
<v Sjors Provoost>No, you're limiting the rules. You're saying you cannot use this rule anymore.

00:16:49.400 --> 00:16:52.860
<v Sjors Provoost>So maybe there was something more subtle going on, but just generally when you

00:16:52.860 --> 00:16:57.330
<v Sjors Provoost>disable an opcode, which has been done countless times, you're basically saying

00:16:57.330 --> 00:17:00.510
<v Sjors Provoost>this opcode can no longer be used, so you're limiting the number of transactions

00:17:00.510 --> 00:17:05.860
<v Sjors Provoost>that are valid, which is a soft fork. But maybe there was something more subtle. Wait,

00:17:05.920 --> 00:17:08.820
<v Aaron van Wirdum>so why do you think Lopp lists as a hard fork?

00:17:10.040 --> 00:17:15.070
<v Sjors Provoost>Well, there's two possibilities, actually. One is that... Maybe the change was

00:17:15.070 --> 00:17:20.630
<v Sjors Provoost>not to make it illegal to use OP_EVAL, but maybe it would have... Sorry, OP_VER,

00:17:21.090 --> 00:17:25.510
<v Sjors Provoost>but maybe it would have been interpreted as meaning it's always valid, in which

00:17:25.510 --> 00:17:29.170
<v Sjors Provoost>case you are increasing the number of valid scripts. But the other option is that

00:17:29.170 --> 00:17:34.190
<v Sjors Provoost>what he was trying to say is the use of OP_VER could have caused many hard forks

00:17:34.190 --> 00:17:39.050
<v Sjors Provoost>at many times. Because as soon as somebody sends it, like you have two miners in

00:17:39.050 --> 00:17:42.390
<v Sjors Provoost>the system, you have one miner running version two and the other mining running

00:17:42.390 --> 00:17:45.850
<v Sjors Provoost>version three, then one of the miners would consider it chain valid, the other

00:17:45.850 --> 00:17:49.880
<v Sjors Provoost>would consider it invalid. That would definitely be a chain split. Right. But I

00:17:49.880 --> 00:17:52.140
<v Sjors Provoost>don't know if you'd classify it as a hard fork. Definitely bad.

00:17:52.340 --> 00:17:57.180
<v Aaron van Wirdum>Well, that makes sense what you just said. Yeah. Anyways, the bottom line is

00:17:57.180 --> 00:18:02.620
<v Aaron van Wirdum>OP_VER was never used at all. So that's why it wasn't actually a hard fork.

00:18:02.740 --> 00:18:05.200
<v Sjors Provoost>Well, it was never used in the history of the blockchain that we're currently

00:18:05.200 --> 00:18:05.780
<v Sjors Provoost>aware of.

00:18:06.420 --> 00:18:12.160
<v Aaron van Wirdum>Fair point. Next one is the separation of the evaluation of the

00:18:12.160 --> 00:18:14.620
<v Aaron van Wirdum>scriptSig and scriptPubKey.

00:18:14.930 --> 00:18:18.510
<v Sjors Provoost>Yeah, that was funny. It used to be that you could just take anybody's Bitcoin

00:18:18.510 --> 00:18:24.460
<v Sjors Provoost>and now you can't take anybody's Bitcoin. Though I would say that's a soft fork.

00:18:24.940 --> 00:18:27.100
<v Aaron van Wirdum>Yeah, that also sounds like a soft fork, doesn't it?

00:18:27.260 --> 00:18:31.300
<v Sjors Provoost>Yeah, but there may be a subtlety similar to what we just talked about.

00:18:31.580 --> 00:18:31.720
<v Aaron van Wirdum>Right.

00:18:32.100 --> 00:18:36.300
<v Sjors Provoost>But yeah, it used to be that I think if your script, anywhere in your script had

00:18:36.300 --> 00:18:40.920
<v Sjors Provoost>op return into it, it would just say, okay, I guess the script is valid. And then

00:18:40.920 --> 00:18:46.060
<v Sjors Provoost>the person spending your coins could say, okay, I'm just going to start my script

00:18:46.060 --> 00:18:48.760
<v Sjors Provoost>with op return and I'm going to take your coins now.

00:18:49.850 --> 00:18:54.430
<v Aaron van Wirdum>Anyways this was clearly a bug and it was also never used. So therefore it's in

00:18:54.430 --> 00:18:58.650
<v Aaron van Wirdum>this category of you know hypothetical hard forks that never happened and

00:18:58.650 --> 00:19:02.610
<v Aaron van Wirdum>therefore arguably weren't a hard fork at all. Then we have the critical

00:19:02.610 --> 00:19:08.190
<v Aaron van Wirdum>inflation bug of Bitcoin core 15 so this was relative recently

00:19:08.190 --> 00:19:10.890
<v Aaron van Wirdum>yeah that was funny you remember that one I think

00:19:11.280 --> 00:19:17.260
<v Sjors Provoost>Yep. So basically there was a bug introduced in 0.15 that would

00:19:17.260 --> 00:19:22.880
<v Sjors Provoost>have allowed inflation, but only if your node was still running. So if a miner

00:19:22.880 --> 00:19:28.800
<v Sjors Provoost>produced a block with inflation, your node would accept it. But I think if

00:19:28.800 --> 00:19:33.480
<v Sjors Provoost>you shut down the node and have it sync again, it would not. So it would

00:19:33.480 --> 00:19:34.520
<v Sjors Provoost>definitely create confusion.

00:19:35.800 --> 00:19:40.600
<v Sjors Provoost>And that rule was later removed. So you could say to allow inflation is... It's

00:19:40.600 --> 00:19:44.500
<v Sjors Provoost>creating the risk of a hard fork. But since nobody actually produced inflation

00:19:44.500 --> 00:19:47.740
<v Sjors Provoost>and the rule is then removed, nothing happened.

00:19:48.060 --> 00:19:52.700
<v Aaron van Wirdum>Yeah, it was fixed in September 2018. So for three years, people could have

00:19:52.700 --> 00:19:54.460
<v Aaron van Wirdum>created inflation on Bitcoin.

00:19:54.960 --> 00:19:58.840
<v Sjors Provoost>Yeah, my guess is they would have created chaos on Bitcoin. But I don't think

00:19:58.840 --> 00:20:04.320
<v Sjors Provoost>that those newly created coins would have ever been stored in any of the longest chains.

00:20:05.270 --> 00:20:10.140
<v Aaron van Wirdum>Yeah. Fair enough. Anyways, the bug was never abused,

00:20:10.160 --> 00:20:15.340
<v Aaron van Wirdum>and it was fixed, and therefore it's also one of these hypothetical hard forks

00:20:15.340 --> 00:20:18.500
<v Aaron van Wirdum>that never actually happened, and therefore arguably weren't a hard fork at all.

00:20:18.940 --> 00:20:24.910
<v Aaron van Wirdum>Then the last one, we actually made an episode about this one. This is burying

00:20:24.910 --> 00:20:29.480
<v Aaron van Wirdum>soft forks, BIP-90. That was episode 54.

00:20:29.820 --> 00:20:34.100
<v Sjors Provoost>Yeah, so I think what burying soft forks does is it basically says that the

00:20:34.100 --> 00:20:39.240
<v Sjors Provoost>rules, say with SegWit, for example, which has been buried, at least in Bitcoin

00:20:39.240 --> 00:20:44.280
<v Sjors Provoost>Core software, I think in others too, if there ever was an alien race creating a

00:20:44.280 --> 00:20:48.140
<v Sjors Provoost>reorg back to the Genesis block, those new blocks would have to follow SegWit.

00:20:48.700 --> 00:20:54.320
<v Sjors Provoost>And so... If you have an old node that didn't care about SegWit, it might

00:20:54.320 --> 00:20:59.290
<v Sjors Provoost>actually accept the different chain as valid as the new nodes. Again, isn't that

00:20:59.290 --> 00:20:59.750
<v Sjors Provoost>a soft fork?

00:21:00.290 --> 00:21:05.130
<v Aaron van Wirdum>Yeah, but it would create a hard fork, I guess, from the old nodes. I guess I

00:21:05.130 --> 00:21:09.030
<v Aaron van Wirdum>would tend to agree with you again. That does sound more like a soft fork. Well, it's

00:21:09.030 --> 00:21:13.370
<v Sjors Provoost>possible that the aliens create two chains, right? So they create one very long

00:21:13.370 --> 00:21:19.180
<v Sjors Provoost>chain that does not obey SegWit. And the old nodes would think

00:21:19.180 --> 00:21:23.700
<v Sjors Provoost>that's fine, and then it would create a shorter chain that does obey Segwit, and

00:21:23.700 --> 00:21:28.720
<v Sjors Provoost>the new nodes would go for that one. So then the old nodes would be following a

00:21:28.720 --> 00:21:32.460
<v Sjors Provoost>different chain. So I guess you would say that's a hard fork, or at least it's a chain split.

00:21:32.840 --> 00:21:37.920
<v Aaron van Wirdum>Yeah, well, we discussed this in full in episode 54, as I mentioned, and why it's

00:21:37.920 --> 00:21:40.760
<v Aaron van Wirdum>debatable whether this is a risk that should be taken.

00:21:41.600 --> 00:21:45.300
<v Sjors Provoost>And whether the effect of the alien invasion is perhaps a higher priority.

00:21:47.090 --> 00:21:48.650
<v Aaron van Wirdum>Higher priority than Bitcoin.

00:21:49.030 --> 00:21:52.010
<v Sjors Provoost>Than trying to fix that particular issue with SegWit rules.

00:21:52.230 --> 00:21:55.810
<v Aaron van Wirdum>In case it wasn't clear this also never happened, and it's not plausible to ever

00:21:55.810 --> 00:21:59.930
<v Aaron van Wirdum>become a real problem because like you said we would need a very long reorg etc

00:21:59.930 --> 00:22:04.150
<v Aaron van Wirdum>etc. So these were the hypothetical hardforks that were never actually triggered

00:22:04.150 --> 00:22:07.310
<v Aaron van Wirdum>and therefore arguably shouldn't be considered hardfork at all.

00:22:08.560 --> 00:22:14.350
<v Aaron van Wirdum>Then we get to the implicit consensus change implicit hard fork so

00:22:14.350 --> 00:22:19.670
<v Aaron van Wirdum>which was essentially a bug but which did trigger a hard fork that's

00:22:19.670 --> 00:22:22.860
<v Aaron van Wirdum>the Have we discussed this on our episode?

00:22:23.060 --> 00:22:25.820
<v Sjors Provoost>Yeah, we brought it up a few times. So basically it differs in database

00:22:25.820 --> 00:22:26.400
<v Sjors Provoost>configuration.

00:22:26.400 --> 00:22:30.240
<v Aaron van Wirdum>We discussed this on the previous episode where we discussed one of Jameson

00:22:30.380 --> 00:22:34.900
<v Aaron van Wirdum>Lopp's blog posts running, syncing old Bitcoin nodes, I think. So that was

00:22:34.900 --> 00:22:35.640
<v Aaron van Wirdum>episode 55.

00:22:35.900 --> 00:22:37.500
<v Sjors Provoost>Yeah, and I think we've covered it earlier too.

00:22:37.680 --> 00:22:42.500
<v Aaron van Wirdum>Of dependencies and yeah. So yeah, this was BIP50 where,

00:22:43.080 --> 00:22:48.990
<v Aaron van Wirdum>let's see, Bitcoin Core... 8? Yeah. 8.0. 0.8.

00:22:49.130 --> 00:22:54.390
<v Aaron van Wirdum>It became incompatible with previous versions due to a dependency on the Berkeley

00:22:54.390 --> 00:22:55.790
<v Aaron van Wirdum>DB database. Is that right?

00:22:56.210 --> 00:23:01.550
<v Sjors Provoost>Yeah. So I think what happened is the original version of 0.7, et cetera,

00:23:01.770 --> 00:23:07.590
<v Sjors Provoost>used Berkeley database and... And it

00:23:07.590 --> 00:23:11.470
<v Sjors Provoost>configured the Berkeley database with some limitations. And I think one of the

00:23:11.470 --> 00:23:16.370
<v Sjors Provoost>limitations was basically boiled down to a maximum number of transactions that

00:23:16.370 --> 00:23:20.550
<v Sjors Provoost>could fit in a block, like 10,000. And then it was Bitcoin Core was upgraded to a

00:23:20.550 --> 00:23:24.780
<v Sjors Provoost>new database format that did not come with any of those limitations. So

00:23:24.780 --> 00:23:29.040
<v Sjors Provoost>basically, as soon as you produced a block with more than, I think, 10,000

00:23:29.040 --> 00:23:32.740
<v Sjors Provoost>transactions, the old nodes would say, hey, this is not a valid block.

00:23:35.280 --> 00:23:39.460
<v Sjors Provoost>And then the new nodes would say, no, it's perfectly fine. And there was never

00:23:39.460 --> 00:23:42.540
<v Sjors Provoost>intended to be that type of limit on the number of transactions. It was just a

00:23:42.540 --> 00:23:47.020
<v Sjors Provoost>configuration of the database that wasn't thought through well enough that it

00:23:47.020 --> 00:23:50.400
<v Sjors Provoost>would have that implication. Or at least as far as we know, because I don't think

00:23:50.400 --> 00:23:54.600
<v Sjors Provoost>Satoshi ever documented saying, hey, by the way, this little limit in the

00:23:54.600 --> 00:23:55.640
<v Sjors Provoost>database is important.

00:23:55.960 --> 00:24:01.760
<v Aaron van Wirdum>Yeah, so this was a bug based on a dependency, essentially. And this one

00:24:01.760 --> 00:24:07.710
<v Aaron van Wirdum>did actually trigger... A hard fork and also an actual chain split. So for a

00:24:07.710 --> 00:24:12.530
<v Aaron van Wirdum>couple of hours, for about five hours, there were two incompatible Bitcoin

00:24:12.530 --> 00:24:13.270
<v Aaron van Wirdum>blockchains.

00:24:13.570 --> 00:24:18.370
<v Sjors Provoost>Yeah, exactly. And people actually had to come to consensus very quickly to

00:24:18.370 --> 00:24:20.230
<v Sjors Provoost>decide which side to go for.

00:24:20.450 --> 00:24:24.850
<v Aaron van Wirdum>Yeah, and the side they went for was the previous blockchain, the non-hard fork

00:24:24.850 --> 00:24:28.990
<v Aaron van Wirdum>blockchain, essentially. So now if you look at the Bitcoin blockchain, there's no

00:24:28.990 --> 00:24:34.540
<v Aaron van Wirdum>trace of a hard fork happening, right? But there was... For a short time, for

00:24:34.540 --> 00:24:35.140
<v Aaron van Wirdum>five hours.

00:24:35.400 --> 00:24:39.420
<v Sjors Provoost>So I think the decision was to use the old rules, to keep using the old rules,

00:24:39.500 --> 00:24:42.880
<v Sjors Provoost>even though these old rules were accidental, to keep using those accidental rules

00:24:42.880 --> 00:24:47.980
<v Sjors Provoost>for a while, but then later on to relax them. And then it turns into one of those

00:24:47.980 --> 00:24:52.200
<v Sjors Provoost>potential hard forks where it could have happened, but nobody actually triggered

00:24:52.200 --> 00:24:52.680
<v Sjors Provoost>the condition.

00:24:53.440 --> 00:24:57.820
<v Aaron van Wirdum>No, they were triggered later. That's what Lopp explains in the blog post.

00:25:01.260 --> 00:25:04.280
<v Aaron van Wirdum>Oh, right. Even pause om dat goed op te zoeken.

00:25:04.480 --> 00:25:05.280
<v Sjors Provoost>No, I think you're right.

00:25:05.500 --> 00:25:07.420
<v Aaron van Wirdum>It was triggered later, I think.

00:25:07.620 --> 00:25:11.320
<v Sjors Provoost>That's right. So, well, it was triggered immediately, but that part of history

00:25:11.320 --> 00:25:15.960
<v Sjors Provoost>has been removed. And then, because it was unexpected and people wanted to have

00:25:15.960 --> 00:25:19.840
<v Sjors Provoost>some time to regroup and think about what to do about it. But then later on, the

00:25:19.840 --> 00:25:25.720
<v Sjors Provoost>rules were relaxed to actually allow basically whatever size, whatever

00:25:25.720 --> 00:25:30.330
<v Sjors Provoost>number of transactions would actually fit into the limit of the block. And that

00:25:30.330 --> 00:25:34.530
<v Sjors Provoost>eventually ended up happening. So there was a time when if you were still running

00:25:34.530 --> 00:25:38.450
<v Sjors Provoost>that old version of the node, you would not have accepted the new blocks. And

00:25:38.450 --> 00:25:41.970
<v Sjors Provoost>then you had the choice between either upgrading to the new node version or

00:25:41.970 --> 00:25:43.750
<v Sjors Provoost>changing one configuration.

00:25:44.830 --> 00:25:49.210
<v Aaron van Wirdum>So why was that never a problem? Was it never a problem because everyone upgraded

00:25:49.210 --> 00:25:49.750
<v Aaron van Wirdum>by the node?

00:25:49.950 --> 00:25:53.150
<v Sjors Provoost>No, it was a problem. If you didn't change that configuration, your node would be

00:25:53.150 --> 00:25:56.300
<v Sjors Provoost>in trouble. So that's why you had... Some amount of time to do that.

00:25:56.300 --> 00:25:58.400
<v Aaron van Wirdum>That was new to me actually I didn't know that.

00:25:58.400 --> 00:26:00.900
<v Sjors Provoost>And I don't think it was very long either it's probably a month.

00:26:00.900 --> 00:26:05.500
<v Aaron van Wirdum>Yeah it seems like a bit more than a month but um so

00:26:05.500 --> 00:26:10.580
<v Sjors Provoost>you you had a month to do the upgrade. That was when the safety net went away.

00:26:10.780 --> 00:26:14.180
<v Sjors Provoost>But before somebody actually produced a block that big, it might have been

00:26:14.180 --> 00:26:15.180
<v Sjors Provoost>longer. Okay,

00:26:15.300 --> 00:26:21.240
<v Aaron van Wirdum>Sjors, the thing is 0.8.0 was released in March. That's when

00:26:21.240 --> 00:26:27.180
<v Aaron van Wirdum>the accidental split happened. And then shortly thereafter, Bitcoin 0.8

00:26:27.180 --> 00:26:33.180
<v Aaron van Wirdum>.1 was released, which had some virtual limits to prevent

00:26:33.180 --> 00:26:38.930
<v Aaron van Wirdum>the blockchain from splitting. This expired in May. But then the first time it

00:26:38.930 --> 00:26:44.670
<v Aaron van Wirdum>was triggered was in September 2013. But then it

00:26:44.670 --> 00:26:49.930
<v Aaron van Wirdum>only sort of triggered it compared to Bitcoin Core 0.5 nodes

00:26:49.930 --> 00:26:55.530
<v Aaron van Wirdum>and earlier. And then a couple of years later in 2015.

00:26:56.340 --> 00:27:00.920
<v Aaron van Wirdum>It was triggered again, and this time it affected Bitcoin Core 6 and 7 nodes.

00:27:01.120 --> 00:27:05.260
<v Sjors Provoost>Yeah, so it turns out there were probably several database changes that were

00:27:05.260 --> 00:27:10.720
<v Sjors Provoost>relevant here. But what kind of surprises me in what Lopp found is that, well,

00:27:11.100 --> 00:27:13.980
<v Sjors Provoost>so there was a new version of Bitcoin Core release, and it immediately caused

00:27:13.980 --> 00:27:18.440
<v Sjors Provoost>problems. Like, it immediately caused a fork. Then some measures were taken, but

00:27:18.440 --> 00:27:22.240
<v Sjors Provoost>apparently nothing else happened that could have caused that fork in three years.

00:27:23.410 --> 00:27:27.790
<v Sjors Provoost>That's odd because you think that the reason it went wrong is because miners were

00:27:27.790 --> 00:27:33.130
<v Sjors Provoost>quite eager to produce bigger blocks that immediately violated those rules. And

00:27:33.130 --> 00:27:34.390
<v Sjors Provoost>then they didn't for a while.

00:27:34.650 --> 00:27:39.050
<v Aaron van Wirdum>Well, it was triggered twice. So it was triggered once after six months in

00:27:39.050 --> 00:27:44.270
<v Aaron van Wirdum>respect to older Bitcoin nodes, Bitcoin core nodes 0.4 and 5 and earlier.

00:27:44.670 --> 00:27:50.190
<v Aaron van Wirdum>And then three years later to... Bitcoin nodes six and seven, essentially.

00:27:50.470 --> 00:27:55.090
<v Sjors Provoost>Yeah, exactly. But the first hard fork event there, or the first forking event,

00:27:55.310 --> 00:28:01.010
<v Sjors Provoost>was against the 0.7 nodes. So whatever the rule was that was violated for 0.7

00:28:01.010 --> 00:28:04.990
<v Sjors Provoost>nodes was violated once, immediately after the release, and then only three years

00:28:04.990 --> 00:28:10.730
<v Sjors Provoost>later. Right, yeah. So that tells me that maybe miners were extra

00:28:10.730 --> 00:28:14.730
<v Sjors Provoost>careful for a while to just stick to the old rules, even though they didn't have

00:28:14.730 --> 00:28:20.950
<v Sjors Provoost>to. So maybe miners just didn't upgrade to 0.8.1 for three years. That's possible.

00:28:23.010 --> 00:28:24.910
<v Sjors Provoost>They just didn't want that to happen again.

00:28:25.800 --> 00:28:31.790
<v Aaron van Wirdum>That makes sense. Anyways, that was the one example that Jameson found for

00:28:31.790 --> 00:28:33.690
<v Aaron van Wirdum>an implicit hard fork.

00:28:33.850 --> 00:28:35.190
<v Sjors Provoost>Yeah, so unintentional.

00:28:35.350 --> 00:28:41.170
<v Aaron van Wirdum>Yeah, unintentional. Then finally, we get... Well, in fact, it actually...

00:28:41.170 --> 00:28:45.990
<v Aaron van Wirdum>The thing he did was enabling soft forks. So yeah, he was clearly thinking about it.

00:28:46.870 --> 00:28:51.030
<v Sjors Provoost>He wanted those new rules. I don't think it was intentional in that he wanted to

00:28:51.030 --> 00:28:52.710
<v Sjors Provoost>split the network. But we can get to that.

00:28:52.830 --> 00:28:54.090
<v Aaron van Wirdum>And it didn't split the network.

00:28:55.910 --> 00:29:00.570
<v Aaron van Wirdum>Maybe this was back at a time where people weren't even thinking as much about

00:29:00.570 --> 00:29:02.990
<v Aaron van Wirdum>hard forks or soft forks. Is that what you're saying?

00:29:03.190 --> 00:29:07.690
<v Sjors Provoost>Yes, but he was thinking about it because this was exactly the same time when he

00:29:07.690 --> 00:29:12.130
<v Sjors Provoost>was working on the block size limit decrease, which was a soft fork in which he

00:29:12.130 --> 00:29:15.970
<v Sjors Provoost>did in a very careful way. So my guess is that he did want to add this new

00:29:15.970 --> 00:29:18.610
<v Sjors Provoost>feature, did probably not realize that it was a hard fork.

00:29:18.970 --> 00:29:24.770
<v Aaron van Wirdum>Well, in fact, the thing he did was enabling soft forks. So, yeah, he was

00:29:24.770 --> 00:29:26.110
<v Aaron van Wirdum>clearly thinking about it.

00:29:27.090 --> 00:29:31.030
<v Sjors Provoost>Yeah, he wanted the feature. He wanted to enable future soft forks. Exactly. But

00:29:31.030 --> 00:29:33.750
<v Sjors Provoost>I don't think he realized he committed a hard fork in the process.

00:29:33.890 --> 00:29:38.550
<v Aaron van Wirdum>In doing so, yeah. So the change is the addition of OP_NOP functions.

00:29:38.850 --> 00:29:39.250
<v Sjors Provoost>Yes.

00:29:39.350 --> 00:29:40.510
<v Aaron van Wirdum>So what are OP_NOP functions?

00:29:40.770 --> 00:29:46.690
<v Sjors Provoost>They're awesome. Well, basically, they are codes that

00:29:46.690 --> 00:29:52.690
<v Sjors Provoost>do nothing. No operation is what no op stands for. So it's op, no op,

00:29:52.710 --> 00:29:57.550
<v Sjors Provoost>essentially. So what would happen is if your Bitcoin Core node sees those

00:29:57.550 --> 00:30:01.130
<v Sjors Provoost>instructions, if an old version of Bitcoin Core, say today's version sees OP_NOP,

00:30:01.290 --> 00:30:06.150
<v Sjors Provoost>it'll just say, okay, whatever, and moves on with the script. But a new version

00:30:06.150 --> 00:30:10.370
<v Sjors Provoost>may actually attach meaning to it and may say, well, it's not necessarily always

00:30:10.370 --> 00:30:14.210
<v Sjors Provoost>valid. There may be some rules in which it's not valid. So this makes it easy to

00:30:14.210 --> 00:30:17.190
<v Sjors Provoost>have this thing where new nodes have more strict interpretations of the rules

00:30:17.190 --> 00:30:17.810
<v Sjors Provoost>than old nodes.

00:30:18.190 --> 00:30:23.790
<v Aaron van Wirdum>Yeah, so this is, for example, used in SegWit, I think, Taproot, like these kinds

00:30:23.790 --> 00:30:24.890
<v Aaron van Wirdum>of...

00:30:24.890 --> 00:30:29.490
<v Sjors Provoost>No, it's only been used for check, time lock, verify.

00:30:29.790 --> 00:30:34.990
<v Aaron van Wirdum>So anyways, what OP_NOP does, if you're an older node, you just ignore it. But if

00:30:34.990 --> 00:30:39.410
<v Aaron van Wirdum>you're a newer node, then potentially you add extra meaning to it. For example,

00:30:39.570 --> 00:30:40.450
<v Aaron van Wirdum>you see a time lock.

00:30:40.750 --> 00:30:44.820
<v Sjors Provoost>Yeah. And so where the hard fork aspect comes in here is that if you look at very

00:30:44.820 --> 00:30:49.440
<v Sjors Provoost>old nodes, namely before Satoshi introduced these codes, if they would see that

00:30:49.440 --> 00:30:52.960
<v Sjors Provoost>in the script, they wouldn't see op-nop, right? So a script is just a series of

00:30:52.960 --> 00:30:58.960
<v Sjors Provoost>numbers. Basically, you know, they're bytes. So byte is 8

00:30:58.960 --> 00:31:04.180
<v Sjors Provoost>-bit, so there's 256 possible things that a byte can be. And every one of those

00:31:04.180 --> 00:31:10.120
<v Sjors Provoost>things maps to an opcode. So if the byte says 10, or if the

00:31:10.120 --> 00:31:15.150
<v Sjors Provoost>byte says 100, then maybe that's OP_NOP, right? So that's how it works. It's

00:31:15.150 --> 00:31:20.550
<v Sjors Provoost>called an enum, an enumerator. So you basically say, when I see a number, I'm

00:31:20.550 --> 00:31:23.810
<v Sjors Provoost>going to interpret that as a special meaning. The problem was there was no

00:31:23.810 --> 00:31:29.770
<v Sjors Provoost>meaning for those values that OP_NOP uses. So if an OP_NOP occurred in

00:31:29.770 --> 00:31:34.040
<v Sjors Provoost>a script, The very old node would say, hey, I don't know what this number means.

00:31:34.760 --> 00:31:36.980
<v Sjors Provoost>I'm now going to declare the whole script invalid.

00:31:38.110 --> 00:31:41.570
<v Aaron van Wirdum>Right. It wouldn't just ignore it. It would just say, I don't know what this is.

00:31:41.670 --> 00:31:44.750
<v Aaron van Wirdum>This cannot be a valid transaction because I don't know what this is.

00:31:44.910 --> 00:31:48.450
<v Sjors Provoost>So if you were to run a Bitcoin node before Satoshi introduced these OP_NOPs,

00:31:48.810 --> 00:31:53.470
<v Sjors Provoost>then as soon as it did see an OP_NOP, it would think that transaction is invalid,

00:31:53.710 --> 00:31:58.740
<v Sjors Provoost>but future nodes would consider it valid. And that would basically fork them off

00:31:58.740 --> 00:31:59.160
<v Sjors Provoost>the network.

00:31:59.460 --> 00:32:04.120
<v Aaron van Wirdum>Right. So then the next point is when this actually happened.

00:32:05.040 --> 00:32:11.020
<v Aaron van Wirdum>And so as we just mentioned, the first soft fork that actually used

00:32:11.020 --> 00:32:16.220
<v Aaron van Wirdum>this was CLTV. That was the time lock that Peter Todd designed at the time.

00:32:17.120 --> 00:32:22.940
<v Aaron van Wirdum>But apparently it can be found in the blockchain even before that. So

00:32:22.940 --> 00:32:28.780
<v Aaron van Wirdum>even before any OP_NOP code was attributed to anything, there is an example of it

00:32:28.780 --> 00:32:29.660
<v Aaron van Wirdum>in the blockchain, right?

00:32:29.960 --> 00:32:33.860
<v Sjors Provoost>Yes, because everybody is free to use OP_NOP whenever they want to in their crazy

00:32:33.860 --> 00:32:37.200
<v Sjors Provoost>experiments. It doesn't do anything. But in practice, most of the time, nobody

00:32:37.200 --> 00:32:42.600
<v Sjors Provoost>did that. Except one day somebody was experimenting with the design of a

00:32:42.600 --> 00:32:47.640
<v Sjors Provoost>different soft fork proposal and actually decided to use this OP_NOP2 in their

00:32:47.640 --> 00:32:51.760
<v Sjors Provoost>experiment for this future soft fork. And so that would have caused an actual

00:32:51.760 --> 00:32:57.520
<v Sjors Provoost>hard fork event had somebody still run the 0.3.5 or

00:32:57.520 --> 00:32:58.240
<v Sjors Provoost>older nodes.

00:32:58.480 --> 00:33:00.280
<v Aaron van Wirdum>Yeah, that was actually Luke Jr.

00:33:03.950 --> 00:33:09.130
<v Aaron van Wirdum>Yep, tinkering with BIP17, which was sort of a competitor

00:33:09.130 --> 00:33:10.130
<v Aaron van Wirdum>to...

00:33:10.580 --> 00:33:15.320
<v Sjors Provoost>In any case, if you use the Block Explorer, then the Block Explorer will say, oh,

00:33:15.620 --> 00:33:20.640
<v Sjors Provoost>this transaction used OP_NOP2. Or sorry, this transaction used OP_CLTV. But of

00:33:20.640 --> 00:33:26.500
<v Sjors Provoost>course, OP_CLTV did not exist at the time. Of that transaction because

00:33:26.500 --> 00:33:29.580
<v Sjors Provoost>your block explorer probably doesn't know which opcodes existed at which time in

00:33:29.580 --> 00:33:32.760
<v Sjors Provoost>the past. So if your block explorer was really smart, it would say, okay, it was

00:33:32.760 --> 00:33:36.080
<v Sjors Provoost>this opcode, but back then it had no meaning. So your block explorer really

00:33:36.080 --> 00:33:41.020
<v Sjors Provoost>should say it was OP_NOP2 at the time the transaction was made. Yeah, so somebody

00:33:41.020 --> 00:33:43.100
<v Sjors Provoost>used, Luke, I guess, used OP_NOP2.

00:33:43.640 --> 00:33:49.460
<v Aaron van Wirdum>Luke Jr. is responsible for the first and only sort of real hard fork in

00:33:49.460 --> 00:33:53.540
<v Aaron van Wirdum>Bitcoin's history. That we know of. The first explicit one, let's put it that way.

00:33:54.160 --> 00:33:58.380
<v Sjors Provoost>That we know of. There's there may be many more because you'd really have to

00:33:58.380 --> 00:34:02.240
<v Sjors Provoost>inspect what the very old Bitcoin core code would do or Bitcoin code would do

00:34:02.240 --> 00:34:06.240
<v Sjors Provoost>under circumstances and a lot of changes were made in the beginning.

00:34:07.770 --> 00:34:12.650
<v Aaron van Wirdum>Anyways, I think that concludes our overview, right? So yeah, we've discussed

00:34:12.650 --> 00:34:17.710
<v Aaron van Wirdum>five hard forks that never actually triggered, of which some of us,

00:34:17.990 --> 00:34:22.030
<v Aaron van Wirdum>some of them, we were struggling to figure out why they were actually considered

00:34:22.030 --> 00:34:26.470
<v Aaron van Wirdum>hard forks in the first place. And then one implicit hard fork, which was

00:34:26.470 --> 00:34:31.790
<v Aaron van Wirdum>essentially a bug. And then one explicit one, which was the addition of op-nop.

00:34:31.950 --> 00:34:35.150
<v Sjors Provoost>That's right. And I guess we could do some philosophy, but I think we've covered

00:34:35.150 --> 00:34:35.850
<v Sjors Provoost>enough for now.

00:34:36.550 --> 00:34:39.130
<v Aaron van Wirdum>I'm kind of curious to hear your philosophy now.

00:34:39.510 --> 00:34:43.010
<v Sjors Provoost>Well, the question is, you know, what do you want to do in the future with hard

00:34:43.010 --> 00:34:46.290
<v Sjors Provoost>forks and bug fixes and stuff like that? But I think we can get into that another time.

00:34:46.750 --> 00:34:50.330
<v Aaron van Wirdum>Let's get into it, Sjors. We're here now. I'm here now. I'm not in a rush.

00:34:50.590 --> 00:34:56.510
<v Sjors Provoost>Well, so yeah. So what was interesting about this OP_NOP hard fork is

00:34:56.510 --> 00:35:01.550
<v Sjors Provoost>that it was introduced in version 0.3.6. And that version also contained some

00:35:01.550 --> 00:35:06.840
<v Sjors Provoost>sort of emergency fix. And so one of the reasons you want to avoid hardforks is

00:35:06.840 --> 00:35:11.180
<v Sjors Provoost>that it forces everybody to upgrade at the same time. But in this case, everybody

00:35:11.180 --> 00:35:15.760
<v Sjors Provoost>is upgrading at the same time anyway because there's like a massive bug. And so

00:35:15.760 --> 00:35:20.760
<v Sjors Provoost>then the philosophical question or even the governance question is, you know, if

00:35:20.760 --> 00:35:24.500
<v Sjors Provoost>you have some hardfork in mind, do you just wait for the next emergency fix and

00:35:24.500 --> 00:35:29.960
<v Sjors Provoost>then just do it anyway? Or not, because you could argue against that, of course.

00:35:30.140 --> 00:35:34.180
<v Aaron van Wirdum>Yeah, there's something called the hard fork wish list, right? These are changes

00:35:34.180 --> 00:35:38.520
<v Aaron van Wirdum>to the Bitcoin protocol that are assumed to only be possible with a hard fork.

00:35:38.860 --> 00:35:43.140
<v Aaron van Wirdum>And what you're saying is we definitely need to do a hard fork in the future, it

00:35:43.140 --> 00:35:44.640
<v Aaron van Wirdum>looks like, because there's a bug.

00:35:46.110 --> 00:35:49.650
<v Aaron van Wirdum>The time value overflow bug.

00:35:49.790 --> 00:35:54.670
<v Sjors Provoost>Yeah, there is a problem, but that's probably only in 2106 that that actually

00:35:54.670 --> 00:35:55.370
<v Sjors Provoost>needs to be fixed.

00:35:55.490 --> 00:35:55.710
<v Aaron van Wirdum>Right.

00:35:56.290 --> 00:35:59.150
<v Sjors Provoost>From what it looks like right now. And so you could say, well...

00:35:59.150 --> 00:36:00.630
<v Aaron van Wirdum>Well, it's better to fix it earlier, right?

00:36:00.790 --> 00:36:05.170
<v Sjors Provoost>Yeah, so the idea is that... Well, yeah, so that when you're fixing it earlier,

00:36:05.190 --> 00:36:08.270
<v Sjors Provoost>you can think about these things, but you could imagine that some emergency

00:36:08.270 --> 00:36:13.010
<v Sjors Provoost>problem shows up that we didn't anticipate and that requires a hard fork to fix.

00:36:13.090 --> 00:36:14.970
<v Sjors Provoost>Otherwise, all of Bitcoin is completely destroyed.

00:36:15.700 --> 00:36:20.860
<v Aaron van Wirdum>So your question, I think, is if we're going to do a hard fork anyways, would it

00:36:20.860 --> 00:36:25.440
<v Aaron van Wirdum>be better to package it together with other hard forks we want to do?

00:36:25.720 --> 00:36:30.000
<v Sjors Provoost>That's kind of the point. Right. That's the question. And I think one answer to

00:36:30.000 --> 00:36:34.600
<v Sjors Provoost>that could be no. You do not want to sneak in any other hard forks. You

00:36:34.600 --> 00:36:38.980
<v Sjors Provoost>definitely don't want to sneak in any other hard forks. I guess you could have a

00:36:38.980 --> 00:36:43.680
<v Sjors Provoost>long-standing debate where this hard fork wish list is actually implemented. And

00:36:43.680 --> 00:36:48.160
<v Sjors Provoost>ready to go and said like, okay, this works. We're absolutely sure it's safe, but

00:36:48.160 --> 00:36:51.360
<v Sjors Provoost>we're not going to deploy it until there is some other emergency. So you could

00:36:51.360 --> 00:36:54.700
<v Sjors Provoost>have some agreement like, okay, when some emergency happens that requires a hard

00:36:54.700 --> 00:37:00.000
<v Sjors Provoost>fork, shove this other thing in it because that finishes our hard fork wishlist

00:37:00.000 --> 00:37:05.320
<v Sjors Provoost>and might as well use an emergency as an opportunity to fix things. But you

00:37:05.320 --> 00:37:09.680
<v Sjors Provoost>generally want to be careful about when people have to upgrade, you don't want to

00:37:09.680 --> 00:37:14.100
<v Sjors Provoost>trick them into accepting new rules that are not in their interest. Yeah

00:37:14.100 --> 00:37:19.440
<v Aaron van Wirdum>I think everyone agrees that a hard fork needs consensus. Just even if you want

00:37:19.440 --> 00:37:22.960
<v Aaron van Wirdum>to you know package it together it still needs consensus.

00:37:22.960 --> 00:37:28.160
<v Sjors Provoost>Yeah because otherwise someone else might say okay we're just going to fix this

00:37:28.160 --> 00:37:31.180
<v Sjors Provoost>bug but we're not going to do the other hard fork and then you still have a chain split

00:37:31.180 --> 00:37:36.730
<v Aaron van Wirdum>so hard fork just needs consensus. Whether you're packaging it or not. I think

00:37:36.730 --> 00:37:41.970
<v Aaron van Wirdum>the tricky thing with a hard fork requiring consensus is that some people don't

00:37:41.970 --> 00:37:47.970
<v Aaron van Wirdum>want a hard fork for the sake of not wanting a hard fork. So it makes it pretty

00:37:47.970 --> 00:37:52.290
<v Aaron van Wirdum>difficult to get consensus on a hard fork ever. But then maybe the packaging

00:37:52.290 --> 00:37:58.130
<v Aaron van Wirdum>thing kind of works because that argument sort of falls apart for the argument

00:37:58.130 --> 00:38:00.190
<v Aaron van Wirdum>that you don't want a hard fork for the sake of it.

00:38:00.190 --> 00:38:02.990
<v Sjors Provoost>Right, if you're saying you never want a hard fork for the sake of having a hard

00:38:02.990 --> 00:38:06.660
<v Sjors Provoost>fork, Except when it's an emergency, then you could say, well, okay, if there is

00:38:06.660 --> 00:38:11.780
<v Sjors Provoost>an emergency one day, here's the extra stuff we'll do as part of dealing with

00:38:11.780 --> 00:38:12.420
<v Sjors Provoost>that emergency.

00:38:14.280 --> 00:38:17.440
<v Sjors Provoost>Though my guess is if there really is an emergency, there's not going to be time

00:38:17.440 --> 00:38:19.220
<v Sjors Provoost>to combine it with anything else.

00:38:20.100 --> 00:38:24.540
<v Aaron van Wirdum>Well, in the example that you gave, there's an emergency in 100 years from now,

00:38:24.820 --> 00:38:25.380
<v Aaron van Wirdum>or what is it?

00:38:25.620 --> 00:38:29.460
<v Sjors Provoost>Exactly, that's not an emergency. That is basically something we know is going to

00:38:29.460 --> 00:38:35.340
<v Sjors Provoost>happen. And so you can debate a hard fork. Long before that moment, you could say

00:38:35.340 --> 00:38:38.220
<v Sjors Provoost>well okay we all agree on what the hard fork is going to look like. We're going

00:38:38.220 --> 00:38:43.960
<v Sjors Provoost>to deploy it you know in in five years, and then that deployment will be sitting

00:38:43.960 --> 00:38:47.580
<v Sjors Provoost>there for 50 years not doing anything, and in 50 years time everybody will have

00:38:47.580 --> 00:38:50.120
<v Sjors Provoost>upgraded to something that enforces the new rules.

00:38:50.120 --> 00:38:56.000
<v Aaron van Wirdum>Yes the point being if you need a hard fork for sure then it

00:38:56.000 --> 00:39:00.940
<v Aaron van Wirdum>maybe actually does make sense to package things together with that hard fork if

00:39:00.940 --> 00:39:05.390
<v Aaron van Wirdum>they have consensus. With the exception from the people that don't want a hard

00:39:05.390 --> 00:39:08.990
<v Aaron van Wirdum>fork for the sake of it, because their argument will fall apart when you have to

00:39:08.990 --> 00:39:09.730
<v Aaron van Wirdum>do a hard fork. Yeah,

00:39:09.810 --> 00:39:14.390
<v Sjors Provoost>so in the case of the 2106 thing, you could say, okay, you know what, in maybe 30

00:39:14.390 --> 00:39:20.090
<v Sjors Provoost>years time, you know, what's that? That's 2050. Maybe we should have

00:39:20.090 --> 00:39:25.870
<v Sjors Provoost>a hard fork in place to fix that bug that's only due in 2106. And then we'll

00:39:25.870 --> 00:39:29.370
<v Sjors Provoost>add the rest of the hard fork wishlist to it, which will only take effect in

00:39:29.370 --> 00:39:33.670
<v Sjors Provoost>2106, because it's not that urgent. Something like that.

00:39:34.150 --> 00:39:39.490
<v Aaron van Wirdum>Right. Okay, I think at this point we're really digressing. So it's time to cut

00:39:39.490 --> 00:39:39.910
<v Aaron van Wirdum>this off.

00:39:40.190 --> 00:39:40.630
<v Sjors Provoost>Sounds good.

00:39:40.890 --> 00:39:43.270
<v Aaron van Wirdum>Thank you for listening to Bitcoin Explained.

