The following content is provided under a Creative
Commons license.
Your support will help MIT OpenCourseWare
continue to offer high quality educational resources for free.
To make a donation or to view additional materials
from hundreds of MIT courses, visit MIT OpenCourseWare
at ocw.mit.edu.
PROFESSOR: Sorry.
I have a bit of a sore throat, hoarse voice.
I was talking a lot this weekend.
OK.
Also, today we're going to do transaction malleability,
segregated witness, and I'm endorsing
an ICO for the first time ever publicly,
and it's Anne's intermittent cookie offering.
So if you guys want cookies.
It's an airdrop and you just get them.
so it's my first ICO I'm endorsing.
OK.
So malleability.
So malleability is the ability to deform
under pressure formateer.
And so bitcoin is modeled off of gold, which
is the most malleable metal.
You can make gold leaf and stuff.
So clearly we need to design bitcoin to be malleable.
No, I'm joking.
OK.
Actually in the context of cryptography,
it's not super hard definition, but it
started with Cipher text, where if you can modify a Cipher
text and that modification will carry over into the plain text
when it's encrypted.
It also applies to sort of messages and signatures.
In our case, signatures can be malleable,
which means you can change the signature
and it's still a valid signature.
So given a signature S1 on message M1,
you modify the signature to S2 or S prime
and it still signs the same message.
It still validates as true.
So when we were defining signatures
this wasn't really an attack we'd considered.
There's still a signature and you can't forge a signature,
but you can dot an I or something
and the signature is slightly different.
You can't create one yourself, but given a valid signature
you can make a slightly different valid signature.
And that's how it works in the bitcoin signing algorithm.
But there's all sorts of different contexts
where malleability exists in cryptography.
And then part of it is things still
have to work for whatever definition.
So if you malleates a signature and it no longer validates,
well, that's sort of a trivial, like--
yeah, sure, you can do that to any bunch of bytes.
You can just flip some of them and the whole thing
doesn't work anymore.
That's easy.
But properties where it still works.
So this leads to some weird stuff in bitcoin
where you can change a transaction
and it's still valid.
And that's generally not what you want.
If you've got some kind of contract
or some kind of payment and you write a check,
you don't want someone to be able to modify the check
and still be able to cash it.
And I don't really use checks much, but they draw the line.
Like $100 and then they draw a line
so someone doesn't write and $0.99 or something after.
Not that that's like the greatest attack ever.
Or $100 and then someone puts like $1,000.
I don't know.
But it's sort of like that where someone
can change the thing you sign, can
change the thing you are agreeing to after the fact,
and it's still valid and it does something you don't expect.
OK.
So a review of the transaction format,
which should be probably in people's minds
if you were looking at the homework, the problem set.
And one thing to focus on is that the outputs
don't look like the inputs.
These are fundamentally different things.
The outputs specify a transaction ID and the inputs,
and then the outputs specify a script and an amount.
There's another 4 byte field here that doesn't matter.
So basically you're spending from a transaction and a sort
of row and you're spending too just this arbitrary pub key,
but you're not spending from a pub key
and you're not spending to a transaction.
You don't identify your transaction itself here.
Almost every website that shows blockchains is it
gets this wrong.
So if you look at like, I don't know,
blockchain.info is probably the most popular
and you just look at a transaction.
They don't have it anymore.
OK.
So you look at a block and then you look at a transaction
in the block.
We're going.
No.
No, not yet.
There we go OK.
So you look at a transaction.
Yeah, it shows.
This address is sending to these two addresses.
And blockchain.info is particularly egregious
and that there may actually be more than one input and two
outputs in this transaction.
They hide change transactions.
So it looks like, hey, this address had some money in it
and it sent it to these two addresses.
And if I click, oh, where did this money come?
It come from 18eecz, and it shows
here's the bitcoin address, and, oh, it's
got multiple transactions this addresses has been involved in.
This is not how bitcoin works.
They are running their own database and sort
of making up this view of the network, which is incorrect.
Transactions don't send from an address,
they send from another transactions previous output.
And this is very confusing because in the case,
let's say in this transaction, there is a--
what is it?
767 something.
So it says, yeah, it's coming from 18ee whatever,
and if I click on it I get three different transactions.
There is a specific transaction that 18ee
was involved in that is being spent from in this transaction.
I can look it up because I have an actual full node.
So if I say get raw transaction and I put it in here
and I can see, OK, it was spending from c838.
It was spending from this transaction, not just
an address.
So I mean if you're coming at this sort of new it's like, OK,
fine, why do you keep talking about this?
But if you've been working on these things, a lot of people,
myself included, for like six months a year
I looked at these websites and I'm like,
oh, this is how it works and then six months in or something
looking for code, and I'm like, wait, huh?
This code is wrong, but no, this is the bitcoin code
that actually is running.
And so it's a weird thing to sort of get used to.
Like no, you're not spending from an address.
You don't show the address at all when you spend from it,
you spend from a specific output.
OK.
So that leads to some weird issues.
Specifically, what gets signed?
So to some extent you're signing the whole transaction.
You sign.
You want to sign everything.
When you're saying I'm sending money from here,
I'm sending it to here, you want to make sure
that your signature covers the entire transaction so
that people can't add stuff after or remove stuff.
So you want to sign the inputs and outputs.
But the inputs contain signatures
and you can't sign the signature.
That doesn't make any sense.
The signature is the thing you're putting on at the end.
So it's sort of weird.
You've got this document and you have a little line
at the bottom for the signature.
But should the signatures be maybe a separate page that
refers to the previous page?
It's actually kind of a weird confusing problem.
So in practice, in bitcoin, what Satoshi did in 2009,
you take the whole transaction, but you
remove the signature fields.
You basically zero them out.
Just put a zero there and then you
sign that sort of signatureless transaction.
And then you put that signature in after the fact.
And so that means if you change any bit of the stuff that gets
signed other than the signature, the signature will break.
So does that make sense?
You have these empty lines kind of,
and the idea is you empty them out, you make them blank lines,
and then you take that whole message, hash it, including
the empty parts, and then paste in those signatures
after you've signed.
You don't empty out every line, the line that you're
specifically putting the signature in,
you actually put a different few bytes
in there, which leads to other problems
that I can maybe mention if I've done.
So this seems OK.
It's like well, look, I can't sign the signatures, sure,
but if you change any bit of the stuff I'm signing,
the signatures now break.
So this seems perfectly safe.
No one can change the amounts I'm sending.
No one can change where I'm sending it to.
No one can change where I'm sending from.
All these things get covered in my signature, so I'm good.
Problem.
The transaction ID, the way you refer to transactions
is the hash of the whole thing.
The txid does not zero out the signature fields.
So the identity of the transaction itself, the way
to point to and indicate where you're spending from,
that includes the signatures.
So that also seems like, well, that's OK.
When I point to something I'm indicating
the whole transaction, the whole signed transaction.
But the problem is that can change.
The signature itself may be malleable,
and in bitcoin it is.
There's third party malleability problems.
So the simplest one was leading zeros
where all these things are numbers.
You could say, OK, someone's got a signature.
It's this big, long string of bytes.
I'm just going to put zeros in the front.
I'm going to put a zero byte in the front of it,
and that doesn't change the meaning.
If someone says, I'm sending you $1,000
and I put a 0 front of the one and 1,000.
Well, it's still 1,000.
However, for the purpose of a hash function,
if you have a zero byte in front,
that changes the whole hash.
And so they got rid of this pretty early.
They sort of made it so that you had
to have the exact right number.
You can't have any leading zeros.
But the first one was just, oh, I put a 0 in the front.
The harder one is called low s, where part
of the ecdsa signature scheme.
I showed before that it's this curve that's
symmetric about the x-axis.
Whether the thing you're indicating
is on top of the curve or it's sort of reflection
on the bottom, it's valid either way.
So for any given signature, there's
another signature that will be valid.
You just sort of flip it, make it negative or positive.
So now there's a standard, OK, you need to have high s.
Low s signatures should be invalid.
Both of these are really tricky because they're
third party malleability.
Anyone can just listen on the network, see a transaction,
change the signature.
And in doing so they will change the txid,
which is how all the software refers to transactions.
So it looks like a new transaction
to most of the software.
And the transactions are still valid.
The signatures are still valid and you're not
sure which one will get in.
There's also first party malleability, or in some cases
second party if you're doing transactions
with multiple people signing.
So I'm not going to go back into the elliptic curve signature
algorithms, but there is a nonce.
There's randomness that you inject
into the signing process.
It's not deterministic.
It's not that given a message and my private key.
I always compute the same signature.
No, that's not how it works.
There are signature schemes like that,
but in the case of the elliptic curve stuff that bitcoin uses,
you have to make up a random number to make each signature,
and no one knows what that random number is.
So you could make up different random numbers.
You can make as many signatures as you want.
So given a message and your private key,
you can make arbitrary number of signatures
that are all different signatures,
but they're all valid signatures.
There is a sort of standard for how to make them
the right way not randomly.
It's basically take the hash of your private key
and the message being signed.
Put them together, hash that, and use that
as your random number because then the idea is well,
it's got secret information in it
as well as the message specific information in it.
So no one's going to be able to guess what it is so,
and it's still kind of message dependent
so it'll change each time.
So there is that, but that's something you can do.
It's a really good idea because if you
use a non-random k, if someone can guess k
or if your random number generator's broken,
they can steal all your money.
They can figure out your private key.
So you don't want to be dependent on generating
randomness.
A nice way to model it is, OK, have some initial event where
you're putting in random numbers and you're storing them
and then from then on you want everything to be deterministic,
then you don't have to rely on random number generators.
So it's really a good idea to use this.
And I use it in my software.
Most things use this kind of standard.
However, you can't verify that anyone's actually using it.
It's purely internal.
It's a internal way for you to make your own signatures,
but no one can actually--
can you prove?
No.
I'm not going to say you can't prove you're using it,
but not in any reasonable fashion.
Yeah.
So no one knows if you're doing it.
So this is an attack where you can say, OK,
I'm going to make a whole bunch of different signatures.
They're all going to be valid, but that
will mean I've got a whole bunch of different transactions
that are doing the same thing.
So maybe the question is, what does this really do?
Does this really hurt?
If someone dots an eye on your check, it's the same amount.
It's going to the same place.
Who cares.
Outputs are the same.
Inputs it's pointing to are the same.
It's just this sort of annoying thing.
OK, I tweaked it and I changed the txid.
No big deal.
Well, in some ways, yeah, it's no big deal,
but a lot of wallets didn't deal with this well.
So let's say you're running a wallet, you make a transaction
and you sign and you broadcast transaction 2d5cac
and it never gets confirmed, and instead someone out there flips
a bit, changes your transaction to 9cba3e
and that gets confirmed, and your wallet just
says, yeah, this transaction you sent never got confirmed.
There's wallets that did that.
Most of them have fixed it by now.
But if you're thinking of transaction IDs
as the identity txid, this is the name of the transaction.
I create it, I'm watching it to see when it gets confirmed,
and I'm not looking for some malleated version.
I'm just watching this thing that I created, never
gets in a block.
Weird, and it's just stuck in the wallet.
So there are definitely wallets, and I think
everyone's fixed it by now.
But a couple years ago, definitely wallets
that would have these problems.
It's a wallet problem.
Your money got to the right place.
You just need to sort of either delete stuff in your wallet
or upgrade the software or tell it to somehow forget
about this transaction and actually
look on the blockchain for everything
similar to your transaction.
But it did do some damage.
So, I don't know, 2014 the Mt.
Gox thing where Mt.
Gox got hacked supposedly and lost all the money,
they blamed transaction malleability,
which was kind of interesting.
There may have been an attack on Mt Gox that used transaction
malleability.
The attack probably was this, which was log into Mt.
Gox, withdraw some coins, modify the txid to this,
and then it gets confirmed, you get your coins,
and then log into Mt.
Gox and say, hey, this never happened.
My withdrawal didn't work and then
their system would automatically issue a new withdrawal
transaction.
And so you could just start taking all the money out
and your balance on the system's like,
well, we keep trying to send you money
and it keeps never getting confirmed.
And so we keep making new ones.
I don't know to what extent that that actually happened.
It couldn't have been the whole thing for Mt.
Gox definitely.
There's still a lot of uncertainty about that.
But it's indicative.
If you write your own software and it's not
accounting for these things, you may be losing money
once people say, hey, this didn't work, make a new one,
and then you keep doing that and losing a ton of money.
But that's pretty sloppy practice.
Another issue.
If you're spending from a unconfirmed change
output or an unconfirmed output--
so you make a transaction, you send the two different outputs,
you've got a txid.
And you're sending five coins to this person
and three coins back to yourself.
That three coins back to yourself output,
you might want to use it again pretty quickly.
Sometimes this happens.
And so you've got a change output that's
from transaction 1, 7feec1.
So you're going to now spend that change output, however
the txid of transaction one changes.
So you're saying where you're spending
from is no longer valid.
And this is a big problem because now you've
signed a transaction that you think is going to be valid,
but the money you thought you were spending sort of
moves out from under you.
And so that transaction's no longer valid.
tx2 is now invalid.
It refers to something which can never
be confirmed because there's a different transaction that's
almost the same, but they're mutually exclusive that
did get confirmed.
OK.
So this is bad.
It doesn't seem that bad.
And so for years in bitcoin this was a problem
that while it dealt with, software and people
would be like, oh yeah, you have to backup your keys,
delete your whole database, and rethink the blockchain
and then it'll find the right transactions.
Kind of hacky work arounds like that where
it didn't happen too much.
It wasn't a great attack.
You can annoy people.
You don't get any money.
So wasn't a huge deal, but it was annoying.
But the idea is you can always re-sign.
You've got your private keys.
If the money you are receiving sort of shifts around
and changes its location, well it's still yours.
You just need to re-sign.
But what if you can't re-sign?
So the case of multisig where in most cases when you're
doing transactions if you just have one key, it's just you,
that's fine.
In the case of multisig usually you're
all friends to some extent and you're
all in the same organization or multiple devices that you own.
But you can have sort of adversarial multisig
where you're assigning transactions
with people who are you're sort of cooperating with them,
but you may not really trust them,
or they might be potentially attackers, things like that.
You can definitely sort of extend your multisig model
into that.
And there could be multisig pre-signed transactions
where, OK, we've got this two of three output
address, this output that exists,
and one of the two or three has pre-signed a transaction
and hands it over to me and then they disappear.
And they say, oh OK, well I'm going to now sign my side.
But if malleability occurs and the transaction ID changes,
that signature is no longer valid, signing something
that's not there anymore.
So this is very important in payment channels lightning
network stuff that I'll get to in a few days.
And so it wasn't so much that malleability
was like a showstopper bug and everyone was losing tons
of money, it was that it was preventing
kind of new, cool things from happening
because there were a lot of problems with,
OK, let's make this construction where we put money
into a multisig account and then I sign like a refund
transaction that's got a lock time before I actually fund it
and things like that where you couldn't reliably do it
because if either party modified their signature,
they could break the whole thing and they could have a tax where
it's like, OK, we're doing something together.
Oh look, it's got stuck.
Well both of our coins got stuck in this place.
Hmm.
Now it's sort of a hostage situation and you can say,
well, I think I should get 1 and 1/2 and you should get 1.5.
It's like wait, we both wanted 1.
So there is a tax that could happen.
And so this malleability was a problem
for people trying to do new, cool things.
So how do you fix this?
Any ideas?
Non-malleable signatures?
So the one we did for the first homework.
Does anyone have an idea about why the lamport signatures were
non-malleable, like from problems at one?
Yes, it was right.
But yeah, they weren't.
There's no randomness for one.
I'm pretty sure if you flip any of the bits it's not
going to work.
So lamport signatures are an example where, yeah, it's
non-malleable.
You can't produce multiple different signatures
on the same message.
So that's good.
The thing is many useful signature schemes
are malleable.
So to just say no, you have to use a non-malleable signature
scheme, it's not a great answer to the question.
I'm pretty sure there's some weird malleability
stuff in RSA.
A lot of the systems have randomness in there
and they're malleable.
So an idea that I had like 2014 and I
was sort of going for was just don't sign your inputs at all,
only sign your outputs.
So you don't actually specify where you're sending money
from in your signature.
You do have to still specify in your transaction
because people need to know, but you
say I'm only going to sign off on the outputs.
The endorsement of my inputs is implicit
because the keys match.
So I don't actually sign off on which
key I'm sending from to something that's redundant.
You know I'm sending from these inputs
because the keys match up and the signature's
valid for this key.
I really like this idea still.
I think it's really fun.
You can do a lot of cool stuff with it.
It's also dangerous.
It allows signatures to be replayed,
which is sort of one of the big points of having
utxo's because if you send two outputs--
I have address one.
I send two outputs.
So I've got output one, output two, and this one
has five coins, this one has three coins,
and they're both the same address,
both the same public key, and then I want to spend them.
And if I use this sort of signature scheme
where I don't actually sign which input I'm spending from,
it can be used on either.
So maybe I'm not aware of this 5-1 yet,
or it just hasn't happened yet, or I haven't seen it,
and I say, yeah, I'm going to make a signature sending
three coins over here and then someone
can malleate the transaction without touching the signature,
and pointing over here, and the signature
wouldn't apply to either.
And then this is a really good deal for the miners
because now I'm spending five coins and only outputting three
and the miners get the two coins difference.
And so that's pretty dangerous.
And also, even if they're the same I just say, hey,
I'm sending three coins to you and then as
soon as the receiver sees this output,
oh, it'll also work here.
I'm going to take another three coins.
So this is mitigated by not reusing addresses,
but people reuse addresses.
So it is dangerous.
I think in the context of multisig you can reliably
say like, OK, we're not reusing addresses
because these addresses are the combination of multiple people
working together.
But it would allow really cool things
where you could sort of work backwards, compute a public key
that you could prove no one knew the private key to,
but you could still sign with it.
Like really weird crazy stuff.
Anyway, people were still talking about it
a week or two ago.
Like, oh, we could do these cool things with it.
But it's dangerous and so it's like we're not sure
if it's worth it.
OK.
Any questions about this transaction malleability
so far?
OK.
So any ideas of what you actually
do to fix malleability?
Nobody?
OK.
we'll find out in one minute.
Segregated Witness.
I don't think it's a good name.
Separate signatures would be a much easier to understand name.
So Peter Wuille who is really good at bitcoin
and makes all these cool things, he's
not the best at naming things.
Makes lots of cool stuff, but just makes
whatever weird technical name.
So it's a pretty straightforward idea.
The idea is when you're signing a transaction you hash
a bunch of data design, but you don't include the signatures
in the data you're hashing to sign them
because that wouldn't make any sense.
You can't.
Do the same thing when you're referring to transactions
themselves as txids.
So in the exact same way that when you're signing,
you hash the data without the signatures.
When you're pointing to a transaction
to say I'm spending from there, also
don't include the signature data.
Just take the hash of the data without the signatures.
Yeah.
You just sort of have this pointer.
You've got a pointer of previous input
and you've got the outputs, but the signatures aren't in there.
So the idea is the signature can change and the transaction ID
doesn't.
But what about backwards compatibility?
So this is a great idea.
Why not go for it?
But how do you make it backwards compatible so that old software
can still work with it?
This seems like a soft fork is I'm
adding new rules to the system I'm putting
further restrictions on.
This seems like just a change.
It seems like, look, I'm now defining
something in a different way.
I'm removing the signatures from the txid.
How do we make this not appear to be a hard fork?
Hard fork's easy.
You just say, look, we're changing the entire system.
From now on txids don't have signatures.
So any ideas how you do this in a backwards compatible way
or just give up hard fork?
AUDIENCE: Adding restrictions that screw with [INAUDIBLE]..
PROFESSOR: So you can't change old transactions,
but having both at the same time is tricky.
So the idea is it would have been easier
to start off this way.
If Satoshi had just started this way, it would have went great.
He didn't think of it.
It wasn't a super obvious thing that--
so you can do it as a soft fork.
The way you do it is you make new outputs
which don't require any signatures at all
and then you just don't have any signatures.
This seems kind of silly.
Signatures are pretty important, otherwise any arbitrary person
could just take all the money.
But you redefine things in a way that new people know about
and old people don't.
So this is actually what a segwit output looks like.
The output script is just a zero and then a pubkey hash,
and then the sig script, the field for a signature
is just nothing.
You just don't put a signature there.
And then when you're running the stack
you end up with a pubkey hash on the top of the stack, which
is some number and the interpreter
looks at a number that's non-zero as true.
Like in C or things like that.
And the bitcoins move.
It's great.
Someone was joking that you could potentially make this
into a hard fork, because what if the pubkey hash was zero,
and you found a pubkey that hashed to zero and then you
signed signed with it and then segwit would accept it but old
nodes wouldn't.
Actually, that doesn't work, but it's sort of--
Anyway, if you're running the regular bitcoin software,
you see this and no signature, and you're like yeah,
this doesn't need a signature.
It's just a hash.
I don't know what this is.
Fine, the coins move.
It evaluates to true.
But the new version of the software
sort of adds a restriction to this kind of output.
It says, look.
If you see this, this is a template.
This doesn't actually mean put a zero on the stack
and put a pubkey hash on the stack.
It means something else.
Now, it means this is a pubkey hash and look for a signature.
But look for a signature in a different place.
Don't actually put it in the place
you're supposed to put signatures,
put it in a new place.
And don't tell the old software about this place.
We add a new field to the transaction inputs.
It's sort of in the inputs, but they put it at the end.
It's kind of weird.
Logically, it's in the input.
It's the same, but physically it's not, which is silly.
I don't like that aspect of it.
But the idea is there's this new field in the inputs called
the witness field, and in cryptography,
witness sort of means signature in this case anyway.
It's a little bit more general.
But the old software never sees it.
So the idea for here's the old transaction format.
You've got your tx id and index, 36 bytes sort of pointer
to what you're spending, and then
a signature which is 100 bytes, and then this stays the same.
And the new tx format.
The idea is, yeah, the signatures field
is still there.
You just leave it empty.
So you're not putting any signature.
It doesn't look like you need to put a signature
to the old software.
And then you have this third thing,
which is witness, which is the same as signature basically.
Slightly different format.
And technically, they put them all together
and put it at the end, which is kind of annoying.
But anyway, logically this is how they do it.
They make a new version of the transaction format.
So the old version looks like empty signatures.
The new version looks like here's
this useless empty signature field,
and here's where the real signatures are.
And you omit this to the old nodes.
So when people ask for witness transactions,
when people know about this new system,
yeah, you give it to them.
So they say hey, yeah, I'm hip to this new segwit thing.
Give me a segwit transaction.
And you're like, OK, here's the witnesses at the end.
But when they don't seem to know about this
and they're running older software
and they say, hey, just give me the transaction,
you give it to them without the witness at all.
It still looks valid to--
either one looks valid.
However, the new people, they know that if you see this,
it does not mean push a zero, push up pubkey has.
There is a new rule that no, this is a template.
This is segwit.
I need a signature, and I need it to be in the witness field.
So if a new node gets a transaction without a witness
that they know needs a witness, they will declare it invalid.
But the old nodes won't be able to distinguish.
They'll say, well, it looks like no signature is needed here.
OK.
So you're sort of tricking the old software
into accepting things that they shouldn't actually
accept in some cases.
There may not be a valid signature that
goes into the segwit transaction,
but old software will still think it's OK.
So this is how you make it into a softfork.
It's kind of ugly.
But, yeah.
Do you have a question?
AUDIENCE: Yeah.
Is this still implicitly?
So when the signature is zero, [INAUDIBLE]..
PROFESSOR: No, because it's based on the output script.
You could make you a different output script that
would have a signature that no signature requirement,
and it would still work even with this new system.
So it's just based on--
we changed the definition of an output script.
So have this sort of template.
You can still do weird--
like you could put without a zero in front.
You could put just a pubkey hash,
and that's not defined in segwit.
That's not defined anywhere.
It would just be, OK, yeah, it evaluates
to true without a signature.
Anyone can spend it.
And you could do that--
that would have to be a non-segwit transaction.
The only way to use a segwit transaction
is to have the special format for the output script.
Any other questions about network stuff?
Yeah, and this solves malleability
in a pretty good way.
For the old software, the old nodes,
well, they can't change the signature
because there isn't one.
There's nothing to malleate.
And from the new node's perspective,
yes, the signature can change, but that doesn't
affect the transaction ID.
Both old and new nodes still agree
on the exact same transaction ID.
The transaction ID does not include the witness field.
So when you're calculating a transaction,
you include all this for backwards.
And if there's this actual signature there,
that gets into that the txid.
But if you're using empty signature
and only using witness, then it doesn't get into the txid
at all.
So both old and new software agree,
and that's important, because if they didn't the merkle routes
would look wrong.
You take all the txids, put them into a merkle route,
put that in the header.
And that's really important that everyone agrees on that.
So they do work together, So that's cool.
So this is kind of interesting.
You've got two different old version,
new version operating at the same time on the network.
And they agree on a lot of stuff,
but they also sort of disagree on some things.
So they agree on outputs of the transactions,
and they agree on which inputs there are.
But they have a slightly different view
of what these inputs are.
Some of them think, no signatures here.
Some of them think, yeah, there's a signature here.
That's weird.
They don't agree on how things got spent.
What are some other things that these two different classes
of nodes would not agree on?
Any ideas?
So you understand how they see different transactions.
What are some other aspects that may
be sort of interesting for this consensus system
that we have different views on?
I forget what I put.
I put two things.
Any?
Hint.
Biggest argument since 2010 in bitcoin.
What do these two different classes of nodes not agree on?
Yeah.
AUDIENCE: Size?
PROFESSOR: Well, the transaction size.
Yeah.
So they both see two different transactions.
One of them sees it with these signatures, one of them
sees it without.
They don't agree on how big the transaction is.
They agree on the txid.
They agree on where the money is going, where it's coming from,
but they have completely different views
of how big this transaction is in terms of number of bytes.
So this is really interesting, For many, many years
since 2010, everyone's been arguing.
And one of the big aspects of, oh, if we
want to increase the block size, that's a hard fork.
Everyone up to now, we're enforcing.
The block size must be one million bytes or less.
There's no way around that, right?
You can't just increase it.
We've got this rule.
You're breaking that rule.
This is a sneaky way to break the rule but still not tell
people you're breaking the rule.
Say, OK, I'm enforcing a rule that there's one million bytes.
As far as I'm concerned, there are less than one million bytes
in this set of transactions.
The new nodes know, yeah, there's more than one million.
There's like two million bytes in here.
We just didn't tell the old software
about all these extra bytes.
So this is kind of an interesting thing you can do.
So you can increase the transaction size
without telling the old nodes.
So yeah, the old nodes don't see the hundred something bytes
with the pubkey signature.
So they see transactions that are much smaller.
Around half the size--
depends, but half the size ish.
So those bytes, they won't count those bites
towards the one million byte block size limit.
So this ends up being a soft fork that allows
you to increase the block size.
In a kind of sneaky way, right?
The old nodes don't think the block size is increased.
They think it's less than a megabyte, and they also think,
this is weird.
I haven't seen any signatures for a while.
| seems to be using these transactions that don't require
signatures, and somehow everyone's
getting along and not stealing each other's money
despite the lack of a need for signatures.
But these are not intelligent people.
These are software programs, and it'll just run.
And it'll, OK, yup, yup, yup.
This evaluates to true.
So it's kind of cool.
Block size entry softfork.
However, you Institute a new rule with segwit.
You don't want to just say for the new rules,
we don't count signatures towards the one megabyte limit,
right?
You could do that, but then people might spam signatures.
Let me make a giant signature or some kind of like 50
out of a million pubkeys thing and spam the network,
and then it will still be under a megabyte of non witness data.
So yes, so now I've got two classes of data.
You've got all the data that everyone sees,
and all the witness data that only the new nodes see.
So what they did is they said, OK, the witness data still
counts towards that limit.
But each witness byte counts as a 1/4 of a regular byte.
OK, kind of weird, but yeah.
So in practice in the software, what they do is they say, OK.
We multiply the non witness bytes by four.
So every byte in the outputs and every byte in the txid input
things counts as like four bytes.
And then, the witnesses just count as one regular byte.
And then we now say, OK, the new block size
is four million bytes.
But four million weight units, because they're sort of, OK,
we've got different weights for things.
This actually makes sense, because the utxo set
is what you really want to minimize,
that database we keep updating every block.
And the signatures don't go into the utxo set.
So the signatures you don't actually
have to store on a fast, low latency storage.
So in a very real sense, the signatures
are sort of OK to make bigger.
They don't really cost as much to the network to store.
So having this discount where you say,
OK, the signatures, you can have a bunch of them that
doesn't really count as much.
But the outputs we really need to minimize.
So this one fourth is somewhat arbitrary,
but there are some calculations and a little handwaving.
But it's like yeah, this is about what it should
be to try to balance things.
So the end result. If you have this discount,
you can put about 80% more transactions in a block.
You get about 1.8 megs.
It depends, right?
It depends how big your signatures are.
So the maximum would be you have a block that
has one transaction with just a giant signature that's
like almost four megabytes.
And the old software would see this block
as being really tiny, like 100 something bytes.
And the new software would see, oh yeah,
this block is almost four megabytes.
But that's sort of the extreme case.
I remember generating some like 3.7 meg transaction blocks
and testing that awhile ago just to test it out.
It works, but in practice you're seeing about this.
In practice today, as segwit has been seeing more adoption,
you see like 1.3 megabyte blocks.
Not everyone's using it.
The idea is it's backwards compatible,
but you can still use your old software.
But it seems like more and more software is using this.
You get a discount on your fees because your transaction
seems to be smaller.
You can fit more of them in a block.
So that's kind of cool, and that's
sort of an incentive to use it.
OK, other thing you can do.
You can commit to signatures.
This is a little tricky.
If the signatures aren't in the transaction ID,
then they aren't in the merkle route, right?
So there's nothing really committing the signatures
into the block chain.
And this would actually work.
You could say, no, I have a signature.
I'll give it to you, but it could change.
It could be maleated, so it could be weird, though.
You could agree on a utxo set, but you could disagree
on how exactly you got there.
So one example would be multisig,
where there's two of three multisig, Alice, Bob and Carol.
Two of them need to sign.
And then on my computer, it says that Alice and Bob signed,
and on your computer, it says that Alison and Carol signed.
That's weird, right?
For accountability.
If we want to know who exactly endorsed these things,
we might disagree on it.
There would be no canonical here's the blockchain,
here's who signed.
The transactions themselves would all still
be the same but not the signatures.
So that's kind of weird, but it also seems like well,
maybe that's part of the price you pay for fixing malleability
in this way.
If we're not putting the signatures into the thing that
gets committed to in the block chain, then yeah,
signatures can change.
So anyway around this?
It sort of seems like yeah, that's the trade off.
Sneaky way around it?
Sneaky fun?
No?
You know.
OK, so what you do actually, you commit the signatures
but in a weird way.
OK, so here's the regular old merkle tree, right?
This is the merkle route that you put in the header.
Here's all the transaction IDs, and so you
make these intermediate hashes.
This is the hash of these two things concatenated together,
this is the hash of these two things concatenated together.
Now, if the txids don't have signatures,
there's no commitment to the signatures in the top hash.
What you do is this.
You say, OK.
I'm going to make these new witness
txids, hashes of transactions that do include the signatures.
In practice, you could just make a hash of just the signatures.
That would also work.
They just take the whole thing.
And now I've got this other reflected
merkle tree kind of thing, where OK, I
take the hash of these two witness transaction IDs,
put it here, and this one just drops down.
It's another merkle tree, and then you
get a root for all those things called the witness root.
And then what you do is you put the witness root
in the coinbase transaction.
Put in an opp return.
And the idea is the coinbase transaction
doesn't have any signatures anyway, right?
So you can put it in there.
You don't need to include the transaction
zero in this witness tree.
Wait, they do though, right?
But maybe this is slightly inaccurate in that I think
they actually do make a witness txid
for the coinbase transaction, but they define it
as being zero or something.
I think-- I don't remember.
So it's weird, right?
But you could do that.
They define a zero, or they let you pick anything you want.
I would have to look at the code.
But anyway, the basic idea is for these anyway,
you take the hash of the whole thing including the signatures,
put it in the witness root, put the witness root
in the coinbase transaction, and the coinbase this transaction
gets in to the merkle root.
So you are committing to all the signatures
but on the block level, not the transaction level.
So in the case where I think Alice and Bob signed.
Oh, I think Alice and Carol signed.
You can have those two transactions floating around
on the network, and they have the same txid.
And so who knows which one's getting into a block?
They look almost the same.
Some of the software won't be able to pick between them.
However, once it gets into a block, one of them
will be committed to.
It's like, oh, ended up being Alice and Carol.
Those two signatures actually got into the blockchain.
However, you could prove, hey, no I
had this Alice Bob signature, but then it
never got into the blockchain, and maybe
you made it after the fact.
It never gets committed to.
Yeah.
AUDIENCE: Also, a bunch of pool software
just doesn't always do this.
PROFESSOR: A bunch of pool software doesn't do this?
What you mean?
AUDIENCE: It's the responsibility
of the pool software to make this construction,
but [INAUDIBLE]
PROFESSOR: Have it implemented as in they just
don't support segwit?
AUDIENCE: No, so they do the first part,
but [INAUDIBLE] segwit support.
PROFESSOR: OK, but wouldn't that just not work?
How--
AUDIENCE: It works, because--
[INAUDIBLE]
PROFESSOR: But to the new software, if you don't have--
so segwit is the software, right?
You say, OK, we define these new transaction types.
We define this template where if you have a zero and then
this pubkey hash.
It also says, I require the coinbase transaction
to have this output that says, op return aa9c
whatever this little four random bytes,
and then I'd require it to have the witness root in here.
AUDIENCE: I'm guessing they just don't
include segwit transactions?
PROFESSOR: So I've seen that a lot.
Yeah, so a lot of--
AUDIENCE: [INAUDIBLE]
PROFESSOR: Yeah, a lot of the software
says, I'm not going to do this.
So the other thing that's nice--
segwit transactions to old software look non-standard.
So I mentioned before that there's standardness rules
where, this looks weird.
I'm not going to mine it.
I'm not going to relay it to my peers, but if I it in a block,
well, OK, fine.
So segwit transactions look very non-standard.
It looks like there's no signature.
That's weird.
There's this zero.
What's going on?
So yeah, you can you can still run a miner
and just not even know about segwit.
It's a little dangerous, because you
might see a block that is segwit invalid,
but you wouldn't know it and so you
might try to mine on top of it.
So there are some risks, but in general
if most people are doing the right thing,
you could still mine without knowing about this stuff.
So any questions about committing to the signatures?
What else?
Oh yeah, so you've got this upgrade path.
That's kind of cool.
So it defined zero pubkey hash as hey,
this is now pay to pubkey hash, right?
Interpret this weird template as the regular hey,
verify this signature.
It also, when segwit softfork happened,
redefined a whole bunch of other templates like this.
So one and then some data, or two and then some data.
Just put a number, and then put a bunch of data.
All of these are defined as future upgrades.
So if you see a three block of data, you now say, yeah, OK.
I know that's segwit version three.
My software will maybe pop up something saying hey,
people are using segwit version three.
You're only aware of segwit version zero.
But you'll consider it non-standard.
You won't relay it.
But if it's in a block, yeah, sure.
And you don't require anything about the signature.
You'll just say, yeah, whatever weird witness data
you provide for these outputs, I don't
know how to interpret them.
I'm just going to let it all go through.
What that means is--
there's no witness needed.
If a witness is provided, you just
ignore it and you think everything's fine.
This allows easier upgrades.
You have 16 new versions to upgrade to.
Yeah, you don't require any specific things about this,
so you can make new scripts, you can make a completely different
script interpreter.
You could say, OK, we're going to port EVM
to bitcoin and disable some of the op codes
that don't apply, and have that kind of thing.
Have new smart contracts.
So it's kind of a fun, like yeah, we will--
and it's a nice, easy upgrade path.
You could have multiple different things,
things like that.
The code will be easier.
Don't do it today.
You could construct an output that's
a two byte and then your pubkey and send it out there.
It will be probably stealing by miners, because everyone else's
node will say, yeah, I don't know how to interpret this yet.
There's no rules about this yet.
OK, let me show you some segwit stuff I looked for.
OK, so there's actually nested segwit.
There's an an ugly--
I didn't like it, but--
this is like somewhat designed by committee E. There's also--
this is 2016, right?
AUDIENCE: People lose so much money on segwit two years ago.
PROFESSOR: So the other thing I would say with this,
I was like, OK.
You've got this witness txid.
And I remember people working on segwit
and I said, hey, why don't you make the transaction IDs
a merkle tree of the inputs and outputs instead
of just the hash of everything all together?
Then, if you had a really big transaction,
you could prove that an input had been spent without sending
the whole transaction over.
And I thought that was a cool idea.
And then when I talked to people, they're like yeah,
Peter Todd already said that like three weeks ago.
And whatever, we're not going to do it.
It's too late.
We already coded stuff.
Oh well.
And that's the fundamental aspect of segwit.
You can't really upgrade that in the new script versions,
so whatever.
There's also still a hard rule on transactions themselves
being less than a megabyte, I think.
So it's not a huge deal, but it would have been cool.
Another thing is there's actually a way--
so there's no address defined for this, right?
Address is mapped to output scripts in all the software.
And so when you say, OK, I'm sending
into 1aeecc or whatever, it knows
how to interpret that address, build the 20 byte pubkey hash
script, and send to it.
And vise versa, right?
So from the address, you can get this output script,
and from the output script you can get an address.
So when an old software sees this,
it's just like, there's no address.
I don't even know what that is.
I've never seen that.
And so people worried that oh, it's going to be weird.
People are going to have to upgrade to even send to people
using segwit.
So it's backwards compatible, but if you want to say, hey,
send me some money at the segwit address and then they can't.
And so you say, OK, fine.
Send me the money with a regular address,
and then we still have this malleability problem.
And then I have a wallet that supports both,
and I can move money to my own addresses,
and it's kind of ugly.
So they made this nested address thing, which I don't like,
because then it actually has both.
So you've got a signature and a witness.
And the signature is not a real signature.
It's just pointing to the witness.
It's really ugly.
There's a bunch of weird stuff in the segwit code
that I'm not super into.
I don't have to use it though, right?
That's the beauty of these permission-less innovation
kind of systems.
Like ew, I don't like that code.
OK, I'm not supporting it.
OK, so here's one that's nested.
So I was just randomly looking through a block.
Here's one, and you can see it's like, OK.
The outputs are probably also nested segwit,
and the input has got both a script sig and a tx witness,
right?
A tx input witness.
A pure one is this one f7.
OK, so you can see--
oh wait, am I not running-- what version am I running?
I think I'm running to 15-1 still.
So I'm not seeing the address.
There's a new address format called beck 32, bech 32,
which will turn--
so it's zero and then a script hash.
Zero and then a pubkey hash.
It says, witness, version zero, key hash.
There's also an address associated with these.
I think this version of bitcoin CLI does not show it,
but the new version does.
So I think if you guys have version 0.16.0, it will show,
here's the address.
And then you can see in the single input
for this transaction, there is a tx in witness.
And there's no scripts.
There's a script sig field, and it's just empty.
There's no actual signature traditionally.
There's instead this big thing.
Here's the signature, and here's the pubkey being revealed.
And then it also says, OK, here's the txid
without the signature, and then here's the hash or witness
transaction ID.
The hash of the whole thing including the signature,
and they're different, right?
Also you've got size so this is actually 235 bytes, right?
Because you're including the witnesses.
And then, v size, which is virtual size.
This is how big it looks to old software that
doesn't know about segwit.
So the new software, this knows about both.
The actual size or witness size is 235, v size is 153.
So yeah, it's not quite 50%, because this one has
two outputs, and the outputs don't get any smaller,
and the input just gets smaller.
And then, size, v size, and then you
can see what block it's in when we
get the coinbase transaction.
OK, so the first transaction in the list
is going to be the coinbase transaction.
And I can get that one.
And yeah, the coinbase transaction
has a different txid and hash.
Its size is 259, its v size 232.
Coinbase has whatever random data they want,
and there's the actual output, which
is sending to this address, and it's sending 12.79 coins.
And then, there's this zero value output.
So you can have an output that's got
an amount of coins set to zero.
It's still OK, and it's got this op return.
And the op return starts with aa21a9ed,
and those four bytes mean here's the segwit commitment.
Here's the witness commitment to the segwit transaction
hashes, the root of all those.
And you have to have that in order
to have a valid segwit block.
And so then we can--
this is segwit in action.
I think most blocks now will have that.
So there is size and v size, right?
And that makes sense.
But then you have strip--
no, v size is not size.
It's really confusing.
And size, weight, height, like what?
So size is--
I don't actually know.
I think size is interpreted the same.
This is the actual number of bytes for this block.
Weight is you multiply all non witness bytes by four,
and you leave all witness bytes as weight one,
and that has to be less than four million.
And you can see here, it's just under four million.
And then stripped size is the size that old nodes see.
Yeah.
Pretty sure.
Anyway, so it's kind of confusing.
One of the biggest problems in bitcoin
is names, where it's like, wait.
Script pubkey, and script sig script?
Like, what?
All these terms and names are really confusing,
and it's sort of getting worse.
So yeah.
Also, there's no v size here.
I think this is actually v size.
Anyway, so that's how segwit works in the actual thing.
But it's nice, because now you can reliably spend from things
before they're confirmed.
So segwit is cool.
Fixes malleability.
Increases the block size.
Oh, it does a whole bunch of other stuff, too.
OK, so one of the aspects that it fixes.
When you're signing a transaction,
let's say you have five inputs.
Each time you sign, you need to hash the whole transaction,
because it's slightly different, right?
You zero out all the signature fields,
but in the signature field for the one
you're actually signing, you don't zero it out.
You put the previous script there.
So it's slightly different.
It's totally redundant.
There's no reason to put it there
because it's already in the txid,
but you change things around a little bit.
So the idea is, I'm going to put a signature here,
I'm going to put a signature here,
put a signature-- all five of them.
Each time I put a signature here,
I hash the transaction to get a slightly different thing
to sign for each one.
It might not jump out at you, but this is actually
o and squared, which is bad.
Because the idea is, as I extend the number of signatures
required in a transaction, the number of inputs
in a transaction, the amount of data that needs to be processed
goes up with the square of the number of inputs.
Because I had an input.
Now, the total size of the transaction gets bigger,
so each time I sign, I need to take a bigger amount of data
through my hash function.
Also, the number of signatures gets bigger.
Or the number of inputs.
So this is in squared.
It seems fine, right?
You never notice, except when you do.
So there's pathological block.
There was one like 2015 early in the year where some miner was
like, I'm going to make this block that's
one giant transaction with thousands
and thousands of inputs.
And a lot of software choked on it, and it took gigs of RAM
to process the transaction, and things like that.
So that was bad.
Just in general, if you have a lot of little dust outputs,
if you're trying to aggregate them into one big--
I'm going to have 100 inputs and one output,
it takes forever to sign.
And it also takes forever to verify.
So it's pretty bad.
I remember sort of a silly story.
Tim Draper's coins.
He had all this dust.
And it was nerve wracking, because it was way more money
than I'm going to make in my life.
And moving Tim Draper's coins to somewhere else.
And the software by default just swept all the inputs
with that wallet controlled.
And they were looking at me like, why doesn't this work?
Is it frozen?
I'm like, no, I'm not trying to steal the money, guys.
Because everyone was sending all these little outputs to Tim
Draper's 30,000 coins or whatever, because he's--
and then when he tried to spend it,
it took five minutes to sign.
AUDIENCE: When people use P2 pool,
the software really struggles with this.
PROFESSOR: Yeah, so it's bad.
Any o event squared, this is sort of a bug.
Segwit actually fixed this.
The way they do it is they say, OK,
we sort of pre compute these three intermediate hashes.
Take the whole transaction.
This is sort of the global transaction data,
and pre compute these three things.
And then for each of the inputs, add another thing.
Here's this input specific.
So this is global.
It's the hash of all the tx ends, the hash of all
the outputs, the hash of this.
And then here is that the input specific.
Input specific.
And then hash all these things into one thing
and then sign that.
So the idea is it's o of n in that you compute these three
and then you sort of go down and keep
changing this for each one.
So that saves a lot of time.
It's a much nicer--
oh, you also put in the amount being spent in your signature
hash, which is also redundant, because that's
committed to in the txid that you're sending.
But it's really nice for hardware wallets,
because a lot of times hardware wallets are essentially
presented with here's a hash.
Sign it.
And it's a very small system.
It's a little chip somewhere, and it doesn't really
know too much about bitcoin.
It's just, here's a hash.
Sign it.
OK, and they don't know how much they're spending,
so there could be attacks on hardware wallets,
where they get a hardware wallet to sign something where it's
actually moving too much money.
So it's nice to be able to have the actual amount.
So there's a bunch of stuff like that.
It was a giant grab bag of all these different little fixes,
things like that.
Fixes malleability.
It increases the block size.
Does all these other cool things.
People didn't like it.
I never really understood why.
AUDIENCE: For the reasons you've been telling everyone about?
PROFESSOR: All these reasons?
Wait, these seem like good things, right?
AUDIENCE: Well, yeah, but [INAUDIBLE]
PROFESSOR: Oh.
No, that wasn't what--
it wasn't like people were like, oh,
here's some little things I don't like about it.
Because that was what I said.
That was like what everyone working on Bitcoin was like.
No one thinks it's perfect.
Everyone was like, oh, but this thing is weird.
Why did you do that?
Or why didn't you put this in kind of things.
But no, the people who didn't like it really didn't like it.
There's still a bounty on [INAUDIBLE] head, right?
There's death threats.
Someone's like, I'll pay someone to kill this guy.
It's all, this is going to destroy Bitcoin,
that segwit isn't bitcoin anymore,
because there aren't any signatures.
It's like no, signatures are still committed to, just
in a different way.
You have to build this other tree.
So lots of weird conspiracies.
I don't know.
It became this really sticking point,
and so that sort of led to Bitcoin Cash.
The whole idea is segwit is bad.
We're making Bitcoin Cash.
And Bitcoin Cash forked off before segwit
activated in the main network.
Interestingly, Bitcoin Cash uses this.
So they took a bunch of the code from segwit,
because this is a really good improvement
to signing that Bitcoin Cash used,
but they didn't like segwit.
Yeah, I'm still not like--
I don't know.
There's problems I have with it, too, but it's an upgrade,
and it's cool.
I think a lot of it was people wanted a hard fork,
and this was a softfork.
And so there's backwards compatibility,
and they wanted to show that people
have more control over bitcoin than they maybe do.
It might never be possible to have a hard fork
to get everyone on board to really switch.
So who knows.
So yeah, it was interesting.
It took forever, and that was the last change
to the bitcoin code in terms of consensus code.
And it was initially announced late 2015
in Hong Kong, and then all of 2016
it never-- so it activated in August of last year.
And now you can use it.
AUDIENCE: People had big interest in stopping it,
though.
At one point they were spending hundreds of thousands
of dollars a day to stop it from activating.
PROFESSOR: Yeah, so on your vert coin, you're like,
I'll just take the segwit code and activate it, and like cool.
And then people tried to stop it and spend a lot of money
to stop it.
OK, I want to say unclear why, because I don't know.
It's sort of weird.
There's a whole lot of opinions.
One theory is that this breaks some mining
chips optimizations.
One of the optimizations--
it doesn't work with a tree of height two.
But if you have a really tall tree, you can swap txids,
or you can swap intermediate nodes of the tree
and you'll get a different merkle route.
So you can see--
so it doesn't work here, because this has to stay in place.
But in many cases, the order of the transactions is arbitrary.
So I could flip these two.
It's still valid.
So what I might do is say, OK.
I have this merkle route I'm mining,
and then I want to flip these two, calculate
a different merkle route, and mine.
And there were some chips that maybe did this and had
these kinds of optimizations.
There was also a patent on it and all this weird stuff
going on.
It doesn't break, but it essentially
loses the optimization if you have this.
Because you're saying, OK, I'm going to have this big tree.
I'm going to swap something near the top,
and it only has to recompute two hashes
to get a new merkle route.
However, if I now have this mirror image witness merkle
tree underneath, if I say, OK, I'm going to swap this,
I'm also swapping all these.
And I have to recompute this.
Maybe I can swap some of it, but I have to recompute what this.
This is going to change just as well.
And then I have to put that in here,
and this is going to be at the bottom.
And then, I'm going to have to recompute everything
all the way up to the merkle route.
So this was called AsicBoost, and then there was a post--
Greg Maxwell posted this sort of like,
you guys, like accusatory mail on the mailing list last spring
saying, look.
We were trying to figure out a way to break AsicBoost,
because we think miners have this patented algorithm that
optimizes and it gives a 20%, 30% speed up.
And we're worried that the patents will make one miner,
have a monopoly, and everyone else won't be competitive.
So we're trying to think, is there
a way we make software to prevent this
from this optimization?
And then once they tried to look at it,
they were like, oh, wait.
Segwit does that.
We want to make it costly to swap things in the tree,
and segwit does that.
Oh, so basically, we're good.
And then he was like, oh, wait.
Maybe that's why all these people hate segwit.
Maybe this is these miners who have billions of dollars
worth of equipment with these optimizations in it,
which would be rendered unusable by this new software change,
maybe they're trying to prevent it from activating.
It's a theory, and the mining companies said,
oh, no that's a bunch of nonsense.
Although, the way they said it was sort of suspicious.
They were like, yeah, we put circuitry in our chips
to do this, but we never used it.
That's strange.
So who knows.
But that's one theory.
I'm not sure how much I believe that's the real reason,
but yeah.
AUDIENCE: but if they want to calculate Merkle roots
in bitcoin, don't just--
order all of the transaction fees by transaction ID?
PROFESSOR: You can't, because the order matters.
Because when you validate, this transaction
might create an output that this transaction spends.
And so if you swap them, so if you didn't have intra block
dependencies, then it would all be arbitrary
and you could put in ordering.
But there are intra block dependencies,
and so the order does matter.
In many cases, it doesn't.
In many cases, these are two separate transactions.
You can swap them.
But the software does use the ordering.
And there's all sorts of other things that would be better.
What I would want is prepend or append the height
at each stage of the merkle tree.
That would have helped me out for some things.
Because then, it's like you know,
since you're at the bottom just put
a zero at the end of each hash.
And then when you get up here, put a one
at the end of each hash.
Doesn't really change anything.
But one problem is what if I request--
so what I want to do in my software.
I want to request all the transaction IDs in a block.
I don't actually care about the transactions.
I just want to see all the txids.
Like this.
If I get rid of the head 20, I get a giant list of txids.
The thing is, what this let me do is to look for transactions.
If I have a txid I know I'm looking, I can say,
oh, I can look for it in here.
The problem is, what if the person I'm asking
is giving me this instead of this?
I won't know.
They all look like random numbers.
If I do the merkle tree algo, I'll get to the merkle route.
That's good.
But I don't really know that I'm at the bottom.
It's OK if I'm running a full node
and I actually download all the transactions and look,
and OK, it works.
But to have a way to say, hey, give me a list of all the txids
and I can verify that it's correct,
I can't do that right now.
There's ways around it.
But it would have been nice if then they
appended a zero or something.
Or even, all you have to do is just
append something at the bottom row
or just append higher or something.
Then, it would've been kind of cool.
It would've been easier for me.
But oh well.
And there's people who've written about this.
Yeah.
AUDIENCE: Did James say that's pool operators are leaving off
the [? whipper? ?] And if so, does it
weaken the whole system?
PROFESSOR: I think what they really
do is they just don't support segwit.
So I've seen, especially--
AUDIENCE: [INAUDIBLE] it's expensive but then they--
PROFESSOR: Yeah, they say they're going to support it,
and then they don't.
So they sort of flag their transactions, yeah, segwit,
and then they haven't actually upgraded their software,
so they can't use it.
They can't mine it.
So you see this a lot on TestNet as well.
If you're making TestNet segwit transactions,
sometimes they just don't get confirmed
for a few hours, because all the blocks that come out
don't support it, and so they won't use it.
AUDIENCE: The badly written pool software,
if they use segwit supporting full load with it,
it will give them segwit transactions,
and they'll try to include it but it won't do this, so--
PROFESSOR: So it's invalid.
Yes, so it's invalid.
AUDIENCE: I guess my question is does it
weaken the security in the system if for six months
they're not supporting this?
PROFESSOR: No, no.
It hurts the usability.
If I want to use a segwit transact--
but as me running a segwit compatible node,
I require signatures.
I require all this whole construction.
If you make something that looks like it
spends the segwit transaction without this, I just reject it.
So security wise, it's fine.
Yes.
AUDIENCE: I think it might be important to note
that the way that these things are designed, and in particular
that softforks are designed, is that anyone who doesn't update
the new functionality can't hurt the security
of the new functionality.
That's sort of part of the design process.
PROFESSOR: Although, their security might get hurt.
Not a ton, but yeah.
If you haven't upgraded, you might
see these segwit transactions, and--
AUDIENCE: [INAUDIBLE]
PROFESSOR: Yeah, they look weird,
but you're like, OK, fine.
But you can't actually verify the whole thing.
Given an invalid and a valid segwit transaction,
the old software can't distinguish
but the new software can.
AUDIENCE: That's even though the pool operators, whether there's
six or eight key pool operators, might not
be supporting the witrootsub
PROFESSOR: If they don't support it,
you have to wait until someone that does
support it mines the block.
So if they try to support it and support it wrong,
you ignore them.
You don't use their data.
You don't use their block.
AUDIENCE: you just want segwit transactions stay
in the node pool a bit longer.
PROFESSOR: Yeah.
So I think in bitcoin now, it's OK.
TestNet is kind of weird, but there's segwit.party,
and you can see what people are doing with segwit.
So yeah, it's about 30.
This is by transaction, it's somewhere around 30 something
percent of the transactions are using segwit,
and then you can see witness size percentage, block size.
OK, so sometimes you got--
oh wow, I had no idea.
Blocks are way under a megabyte now.
Oh, OK, well free transactions for everyone.
If you want to use bitcoin, now's the time.
You don't have to pay anything.
That looks very different a month ago where
you had a solid red line.
You had to sort of--
nothing went below a million, and then you
had a little bit of segwit stuff going on here.
But now you've got most things are below a million.
So interesting.
OK, so yeah.
So that's the basic idea of segwit.
And if people have any questions,
stick around and ask.
There's office hours tomorrow at 4:00 to 6:00 over there.
Look at the homework, and next time
I'll talk about lightning network payment--
I'll try to get into payment channels
and see how far we get into lightning network stuff.