202 lines
18 KiB
Plaintext
202 lines
18 KiB
Plaintext
|
|
Episode: 2947
|
||
|
|
Title: HPR2947: The Mimblewimble Protocol
|
||
|
|
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr2947/hpr2947.mp3
|
||
|
|
Transcribed: 2025-10-24 13:43:35
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
This is HPR 2947 for Tuesday, the 19th of November 2019. Today's show is entitled
|
||
|
|
The Mimble Wimble Protocol and is hosted by Might be Mike. It's about 21 minutes long
|
||
|
|
and carries a clean flag. The summary is Mimble Wimble is a new blockchain protocol for
|
||
|
|
skillability, privacy and fungability. This episode of HPR is brought to you by archive.org.
|
||
|
|
Support universal access to all knowledge by heading over to archive.org forward slash donate.
|
||
|
|
Welcome back to Hacker Public Radio. This is Might be Mike. Here with another block
|
||
|
|
chain episode about Mimble Wimble. It sounds like a tongue twister and it is. Mimble Wimble is
|
||
|
|
actually from Harry Potter. I believe this is the spell to tie people's tongues to prevent them
|
||
|
|
from divulging secrets. Feel free to correct me if I'm wrong about this stuff. I'm not very knowledgeable
|
||
|
|
about Harry Potter and Mimble Wimble is full of Harry Potter references. Really Mimble Wimble Protocol
|
||
|
|
is all about scalability, privacy and fungability. This is a protocol for blockchains that scale
|
||
|
|
elegantly and provide privacy by default using strong cryptographic primitives.
|
||
|
|
Now Mimble Wimble started in August 2016 when some unknown person named Tom Elvis Jettosaur,
|
||
|
|
which is actually the French name for Voldemort, the bad guy in the Harry Potter series.
|
||
|
|
Anonymous Lee shows up and drops a link to a white paper that describes this protocol.
|
||
|
|
There's a mathematician at Blockstream named Andrew Polstra, who was one of the first people to
|
||
|
|
review it. He goes in and corrects errors, formalizes it and publishes it as a white paper a couple
|
||
|
|
months later, and then yet another anonymous character Ignotus Paravelle, which I don't know
|
||
|
|
who that is. He's something to do with Harry Potter though, somebody's brother perhaps. He appears
|
||
|
|
on that same IRC channel, Bitcoin Wizards, in late October and announced he has a project going,
|
||
|
|
an open source blockchain based on this, which would turn into one of the two blockchains that I think
|
||
|
|
is really interesting in this space, the one called Grin. Now the interesting thing about
|
||
|
|
Mimble Wimble is there's a realization on the part of this anonymous character or characters
|
||
|
|
that the transaction history does not need to be stored. This is a way to get better scalability.
|
||
|
|
You probably know if you join the Bitcoin network as a node, you need to verify the entire
|
||
|
|
blockchain and it's totally there to be done because the entire transaction history is saved
|
||
|
|
from the Genesis block all the way to the current. In this case, this character realized we don't
|
||
|
|
need to save that actually. If we know the coins that were created and we know the current state
|
||
|
|
of the blockchain and we have proofs that no funny business took place in between, that's all you
|
||
|
|
need. I think that characterizes the whole spirit of this cryptography over complexity.
|
||
|
|
So Mimble Wimble provides privacy and fungibility by, first of all, not having any addresses.
|
||
|
|
There are no amounts visible in the transactions or recorded anywhere on the blockchain.
|
||
|
|
The transactions themselves can be aggregated together, they are, and a lot of the inputs and outputs
|
||
|
|
are eliminated along the way. So it's very difficult to build a transaction graph. If you're
|
||
|
|
taking a look at the blockchain from a forensics perspective, there's just nothing to go on,
|
||
|
|
and we'll get into the detail of that shortly. Well, so let's look at the actual structure of the
|
||
|
|
blockchain. You might know already that blockchains represent the state of the system through one
|
||
|
|
of two means primarily. Bitcoin does it with a UTXO set. This is basically telling you where all
|
||
|
|
the coins are right now. So UTXO set is that set of all unspent transaction outputs. That is all
|
||
|
|
these unspent outputs from previous transactions. Where are they right now? Well, the answer to that
|
||
|
|
question would be a set of addresses in Bitcoin. Here we have no addresses, so it's a little bit
|
||
|
|
trickier. And for completeness sake, let me mention that the other popular technique is that
|
||
|
|
used by Ethereum, which is to keep a hash basically of all the addresses and balances.
|
||
|
|
So in Memblewimble, blocks have only the necessary inputs and outputs taken together in one big
|
||
|
|
transaction. This is a lot like the coin join that Bitcoin people might be familiar with. Bitcoin
|
||
|
|
mixing services commonly use a coin join technique. This is often implemented as a service where
|
||
|
|
a group of people, let's say 10, will also emit a transaction using the same amount for an input
|
||
|
|
like one Bitcoin. So if I have 10 inputs of one Bitcoin and 10 sets of outputs, they're combined
|
||
|
|
into one transaction and that makes it more difficult to match up inputs to outputs.
|
||
|
|
So it's not really hiding anything. It's just obfuscating. So you look at a big transaction like
|
||
|
|
that and you know that the address from which one of the inputs came matches with the address of one
|
||
|
|
of the outputs with a certain probability. In this case, 10%. So anyway, in this system, redundant
|
||
|
|
inputs and outputs are eliminated, but these remainders called kernels are still there.
|
||
|
|
These kernels are essentially proofs. At their simplest, I believe they can go down to almost
|
||
|
|
60 bytes or so. When I'm looking around on the blockchain here, I see they're typically about
|
||
|
|
100 bytes, which is pretty small. Privacy coins tend to have very large transactions as they
|
||
|
|
add a lot of bulk in their efforts to obfuscate. For example, Monero, probably the best example of a
|
||
|
|
privacy coin out there today. Their transactions are an order of magnitude larger. A transaction
|
||
|
|
might be 1,400 bytes, 1,500 bytes, something like that, and Zcash even larger. It's not a criticism
|
||
|
|
of those systems. Zcash was a real innovator when they started because they got these zero-knowledge
|
||
|
|
proofs called Zcashnarks to work. Before that, these were about 100K in size, if I'm not mistaken,
|
||
|
|
and they got them down to about 4K. Still, that's per transaction. Here, we're talking about storing
|
||
|
|
just little blobs, inputs, outputs, and kernels that are on the order of about 100 bytes each.
|
||
|
|
So very small, and a lot of the inputs and outputs are eliminated, as I said. So the way that happens
|
||
|
|
is, imagine a minor assembling a block. A minor in a member-wimble block chain will take pending
|
||
|
|
transactions from a mempool, just like a normal block chain, the difference being that they
|
||
|
|
combine them all into a single transaction. When you do that, you notice that some of the outputs
|
||
|
|
are subsequently used as inputs to what used to be subsequent transactions. Now, it's later on
|
||
|
|
in the same transaction, and these are redundant and can be thrown away. If you think about this
|
||
|
|
conceptually, imagine Alice sends coins to Bob. Bob sends those coins to Charlie. So what needs to
|
||
|
|
get recorded on the blockchain? The current UTXO set shows Alice has coins, and the next UTXO set
|
||
|
|
is going to reflect the fact that Charlie has the coins. There's no need to record activities
|
||
|
|
that Bob was involved in. So that other important function of eliminating inputs and outputs
|
||
|
|
is called cut-through. So what you have in these transactions is inputs, outputs, and some excess
|
||
|
|
values. Mainly, that's the kernel that I referred to before. And we're going to touch on this
|
||
|
|
in more detail in a little while. The inputs, of course, have no addresses associated with them.
|
||
|
|
Most of you have probably seen a Bitcoin transaction before. It has UTXOs used as inputs. These
|
||
|
|
have addresses with them. It has amounts that are just numbers you can read. And outputs,
|
||
|
|
addresses to which these UTXOs are going. This is where the UTXOs are going to reside in the
|
||
|
|
next state of the system. The new state, occurring when another block gets added onto the blockchain
|
||
|
|
each time. So in member-wimble transactions, the inputs still reference UTXOs. There's just no
|
||
|
|
addresses. The outputs include hidden values. In other words, there's no amount visible.
|
||
|
|
And this is because of the use of a blinding factor. Now, observers to the blockchain can see
|
||
|
|
obscured inputs and outputs and kernels. None of these disclose any information. They're just
|
||
|
|
blobs that reveal nothing. So an important point here is that miners can validate these transactions
|
||
|
|
without knowing the actual amount being transferred. This is done by a range proof. The range proof
|
||
|
|
operates in the same manner that it does on other blockchains. In Bitcoin, the miner is looking
|
||
|
|
to do two things to validate a transaction. First of all, they want to know that the sender had
|
||
|
|
the right to spend that Bitcoin. And secondly, they want to sum up the inputs and the outputs
|
||
|
|
and make sure the difference is zero. In other words, this transaction does not create any free
|
||
|
|
money out of thin air, and it didn't destroy any coins. So that's pretty straightforward in Bitcoin.
|
||
|
|
You just add up the sums and take the difference. It's just simple arithmetic. Here the amounts are
|
||
|
|
not visible, though, so it's a little trickier. In fact, that first step was a little trickier, too,
|
||
|
|
making sure the sender had the right to spend that UTXO. In Bitcoin, the miner receives the
|
||
|
|
transaction that's signed by a private key, and that signature can be checked with a public key.
|
||
|
|
And the public key, of course, is where the address comes from. In Bitcoin and other blockchains,
|
||
|
|
like Ethereum, addresses are directly derived from those public keys by hashing them.
|
||
|
|
So the miner can validate that the address that corresponds to that public key, which signed
|
||
|
|
the transaction, is the same one that's listed in the UTXO set. So the way that the miners
|
||
|
|
determine that no free money has been created out of thin air is through some fancy math. There are
|
||
|
|
these things called Peterson commitments, which are the building blocks of confidential transactions.
|
||
|
|
This comes out of the confidential transactions work from the Bitcoin OG Greg Maxwell.
|
||
|
|
Anyway, these Peterson commitments, all the inputs and the outputs look like this,
|
||
|
|
and it's hard to describe an audio without a whiteboard or a picture, but basically they take the
|
||
|
|
form of RG plus VH, where G and H are actually generator points. This is elliptic curve cryptography,
|
||
|
|
so G and H are points on a curve, and the V, remember the second term is VH,
|
||
|
|
that V is actually the UTXO value. This is the amount of the transaction,
|
||
|
|
and you can't tell what it is because of this blinding factor, the first term.
|
||
|
|
Now that RG in this formula, the R is actually a secret key. It's a private key generated by the
|
||
|
|
wallet of the sender in the input and by the receiver in the output. So if you picked up on the
|
||
|
|
nuance in that statement, what might occur to you is that transactions happen very differently
|
||
|
|
here than they do in Bitcoin. In Bitcoin, the sender assembles the transaction and signs it with
|
||
|
|
their private key and throws it over the wall basically. That's it. It's done. The receiver
|
||
|
|
just looks at some point and it shows up. There's nothing to be done. This is more interactive
|
||
|
|
because both parties need to participate. The sender and the receiver and the transaction
|
||
|
|
need to communicate out of band somehow and transfer information back and forth. For one thing,
|
||
|
|
the sender of the transaction needs to send the value and the blinding factor to the recipient,
|
||
|
|
and the recipient actually needs to send the new blinding factor back. Remember that blinding
|
||
|
|
factor has an R term in it, which represents the private key, which basically gives them the right
|
||
|
|
to spend it. So the output of the transaction is going to be the next UTXO, and the recipient
|
||
|
|
wants to be the one that has generated that R, that secret key, because they want to have
|
||
|
|
the right to spend that next UTXO. So both parties have to cooperate here. It is asynchronous. They
|
||
|
|
don't have to be engaged at the same time, but at the end of the process, one of them needs to go
|
||
|
|
online and broadcast the transaction. So this formula that is so hard to deal with over an audio
|
||
|
|
format like a podcast, RG plus VH. This is the form, the Peterson commitment that the inputs
|
||
|
|
and outputs take, and the minor simply adds up all of these inputs, R1G plus V1H, R2G plus V2H,
|
||
|
|
and so on, and adds up all of the outputs, and simply takes the difference. Now, if you're
|
||
|
|
following along at home closely, you probably notice that the second half of those terms that have
|
||
|
|
the V, the value, the UTXO value, are going to cancel out, and you're going to be left with the
|
||
|
|
sum of the blinding factors. If that's the case, then no new money was created, and the transaction
|
||
|
|
is valid. Well, not quite. Actually, there's one more complicating factor, and that is, if you can't
|
||
|
|
see the amounts, you do need to be concerned that somebody didn't find a way to pull some funny
|
||
|
|
business, for example, negative numbers. Let's say, just for the sake of example, that I constructed
|
||
|
|
a transaction where I'm sending coins to myself with inputs of four and four, and outputs of
|
||
|
|
minus two and ten. I'd send that minus two somewhere else and take the ten, including my two
|
||
|
|
free coins, if I could get away with it. But there is another mechanism here. There's actually a
|
||
|
|
bullet proof, which is a different kind of zero-knowledge proof. We don't need to get into the specifics
|
||
|
|
of distinguishing the various zero-knowledge proof types. It's a fascinating field, which is
|
||
|
|
changing rapidly at this point, but bullet proof is just a small, very efficient proof,
|
||
|
|
not a big drain on resources, and it's included in the block header, showing that the minor
|
||
|
|
didn't, does indeed have this proof that none of the values were negative. So no funny business
|
||
|
|
going on, even though they were not able to see the values. So once again, I know that was tough
|
||
|
|
stuff. G and H in these Peterson commitments are points on the elliptic curve. V is the value
|
||
|
|
being spent, R is a secret key, and the construction of a transaction between the center and the receiver
|
||
|
|
is an interactive process that requires both get involved. And this has consequences, which we'll
|
||
|
|
see in a few minutes. Of course, as you realize by now, if you look at the blockchain, wow, you're
|
||
|
|
not going to see any amounts, you're not going to see any addresses. So look at this from an
|
||
|
|
adversary's point of view. Look at this from a forensics point of view. If you're trying to build a
|
||
|
|
transaction graph, well, looking at the blockchain, you're not going to get a lot of clues. Amounts
|
||
|
|
would be a big clue, because if I know that Bob receives 3.6502 coins from somebody, I can, I
|
||
|
|
might be able to find a transaction that was generated by somebody for that same amount, that 3.6502,
|
||
|
|
how many people are sending that amount in the transaction? The sender of that transaction is
|
||
|
|
probably who I'm looking for, and eventually I might be able to piece together a transaction graph.
|
||
|
|
So without that capability, probably the good strategy for an adversary is to run a note on the
|
||
|
|
network and watch for transactions before they get to that point. In other words, the miner is
|
||
|
|
assembling a block, taking these transactions, combining them, pruning, throwing away inputs and
|
||
|
|
outputs, and at that point, by the time the block gets appended to the blockchain, there's no clues
|
||
|
|
left to be had. You need to look earlier on than that. So what an adversary really wants to do here
|
||
|
|
is watch the mempool when the transactions are pending and have not been included in the block yet.
|
||
|
|
None of that pruning has taken place, so all the inputs and outputs are in place. They haven't all
|
||
|
|
been aggregated into one giant transaction, so there's less confusion there and a little bit more
|
||
|
|
to go on. To combat this, the two main blockchains using this protocol are using what is called
|
||
|
|
the dandelion protocol. The dandelion protocol is used to prevent an observer from seeing
|
||
|
|
who actually generated a transaction, and here's how it works. Normally in Bitcoin, if I generate
|
||
|
|
a transaction, I sign it, and I broadcast it to all my peers. This is the basis of the Gossip
|
||
|
|
Protocol. All those peers broadcast it to all their peers, and it's available as a pending transaction,
|
||
|
|
hopefully for every minor around that is constructing a block. Here, the goal is to obscure the
|
||
|
|
source of the transaction. So instead of broadcasting a transaction to all the peers, what a node does
|
||
|
|
actually is pick one peer at random and send it to them, and that one peer basically flips a coin,
|
||
|
|
you might say, to determine whether or not they pass it along to a single randomly chosen peer
|
||
|
|
or broadcast it. It might get passed along one by one on several hops, but eventually somebody
|
||
|
|
is going to broadcast it. This is where the name comes from. The first hops along that process
|
||
|
|
are like the stem of a dandelion, and then at some point one node is going to broadcast it to
|
||
|
|
every peer they have, much like blowing on the spores of a dandelion that just go everywhere.
|
||
|
|
So to make things a little tougher still for an adversary that's active and watching on the
|
||
|
|
network, at each of those points along the stem of the dandelion as it were, what a node does is
|
||
|
|
before they pass it along to the next node, they combine this transaction with any other transactions
|
||
|
|
they see. So this transaction consolidation process happens even before the point of the
|
||
|
|
minor assembling the block. Every step along that way in the dandelion protocol,
|
||
|
|
these nodes are aggregating transactions to make it more difficult to correlate inputs and outputs.
|
||
|
|
So that's pretty much it for the introduction to Mimble Wimble. Tune into the next episode
|
||
|
|
where I continue and discuss a couple of topics I left out of this in the context of grin and
|
||
|
|
beam. The two major implementations of this protocol, these are both working blockchains and take
|
||
|
|
very different approaches to things. So be sure not to miss that. Until then, this is might be
|
||
|
|
for Hacker Public Radio. Have a great day.
|
||
|
|
You've been listening to Hacker Public Radio at HackerPublicRadio.org.
|
||
|
|
We are a community podcast network that releases shows every weekday Monday through Friday.
|
||
|
|
Today's show, like all our shows, was contributed by an HBR listener like yourself.
|
||
|
|
If you ever thought of recording a podcast and click on our contributing to find out how easy it
|
||
|
|
really is. Hacker Public Radio was founded by the digital dog pound and the infonomican computer club
|
||
|
|
and is part of the binary revolution at binrev.com. If you have comments on today's show,
|
||
|
|
please email the host directly, leave a comment on the website or record a follow-up episode yourself.
|
||
|
|
Unless otherwise stated, today's show is released on the creative comments,
|
||
|
|
attribution, share a like, 3.0 license.
|