summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenning Kopp <henning.kopp@uni-ulm.de>2016-08-09 09:26:35 +0200
committerbitcoindev <bitcoindev@gnusha.org>2016-08-09 07:26:49 +0000
commit9132b5d0a96d6ed92fff94060419d076aec87ea6 (patch)
treead0934051e3c03461cc322a464c029d9d6cff13e
parent171874938e4b7141d1c324d4d544b1e2b001310d (diff)
downloadpi-bitcoindev-9132b5d0a96d6ed92fff94060419d076aec87ea6.tar.gz
pi-bitcoindev-9132b5d0a96d6ed92fff94060419d076aec87ea6.zip
Re: [bitcoin-dev] Hiding entire content of on-chain transactions
-rw-r--r--c8/0e088c3f5f2d9f50a1d2c2e8595761d9c30faa329
1 files changed, 329 insertions, 0 deletions
diff --git a/c8/0e088c3f5f2d9f50a1d2c2e8595761d9c30faa b/c8/0e088c3f5f2d9f50a1d2c2e8595761d9c30faa
new file mode 100644
index 000000000..aa7dddaea
--- /dev/null
+++ b/c8/0e088c3f5f2d9f50a1d2c2e8595761d9c30faa
@@ -0,0 +1,329 @@
+Return-Path: <henning.kopp@uni-ulm.de>
+Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org
+ [172.17.192.35])
+ by mail.linuxfoundation.org (Postfix) with ESMTPS id D962B721
+ for <bitcoin-dev@lists.linuxfoundation.org>;
+ Tue, 9 Aug 2016 07:26:49 +0000 (UTC)
+X-Greylist: from auto-whitelisted by SQLgrey-1.7.6
+Received: from smtp.uni-ulm.de (smtp.uni-ulm.de [134.60.1.26])
+ by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 687951B4
+ for <bitcoin-dev@lists.linuxfoundation.org>;
+ Tue, 9 Aug 2016 07:26:48 +0000 (UTC)
+X-Virus-Scanned: amavisd-new at uni-ulm.de
+Received: from banane.informatik.uni-ulm.de (banane.informatik.uni-ulm.de
+ [134.60.77.114]) (authenticated bits=0)
+ by mail.uni-ulm.de (8.14.9/8.14.9) with ESMTP id u797QZRR020366
+ (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256 verify=NOT);
+ Tue, 9 Aug 2016 09:26:42 +0200 (CEST)
+Date: Tue, 9 Aug 2016 09:26:35 +0200
+From: Henning Kopp <henning.kopp@uni-ulm.de>
+To: tony.991@gmail.com
+Message-ID: <20160809072635.GA2178@banane.informatik.uni-ulm.de>
+References: <CAL3p6zpADtYFQnQUr3Efk6V59+K+bB3tPQQMGT9weiafU=43zA@mail.gmail.com>
+ <20160808154707.GB2196@banane.informatik.uni-ulm.de>
+ <CAL3p6zo1xBEu90MDHSK4TNX0DL2QXxq5vC48a2cFnX0JCD=RvQ@mail.gmail.com>
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Disposition: inline
+Content-Transfer-Encoding: 8bit
+In-Reply-To: <CAL3p6zo1xBEu90MDHSK4TNX0DL2QXxq5vC48a2cFnX0JCD=RvQ@mail.gmail.com>
+User-Agent: Mutt/1.6.2 (2016-07-01)
+X-DCC-EATSERVER-Metrics: poseidon 1166; Body=2 Fuz1=2 Fuz2=2
+X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE,
+ RP_MATCHES_RCVD autolearn=ham version=3.3.1
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ smtp1.linux-foundation.org
+Cc: Bitcoin Protocol Discussion <bitcoin-dev@lists.linuxfoundation.org>
+Subject: Re: [bitcoin-dev] Hiding entire content of on-chain transactions
+X-BeenThere: bitcoin-dev@lists.linuxfoundation.org
+X-Mailman-Version: 2.1.12
+Precedence: list
+List-Id: Bitcoin Protocol Discussion <bitcoin-dev.lists.linuxfoundation.org>
+List-Unsubscribe: <https://lists.linuxfoundation.org/mailman/options/bitcoin-dev>,
+ <mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=unsubscribe>
+List-Archive: <http://lists.linuxfoundation.org/pipermail/bitcoin-dev/>
+List-Post: <mailto:bitcoin-dev@lists.linuxfoundation.org>
+List-Help: <mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=help>
+List-Subscribe: <https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev>,
+ <mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=subscribe>
+X-List-Received-Date: Tue, 09 Aug 2016 07:26:50 -0000
+
+Hi Tony,
+
+> > Regarding the blinding factor, I think you could just use HMAC.
+> How exactly?
+
+I am not entirely sure if this works. You wrote:
+
+> There is one technical nuance that I omitted above to avoid distraction.
+> Unlike regular bitcoin transactions, every output in a private payment
+> must also include a blinding factor, which is just a random string. When
+> the output is spent, the corresponding spend proof will therefore depend on
+> this blinding factor (remember that spend proof is just a hash of the
+> output). Without a blinding factor, it would be feasible to pre-image the
+> spend proof and reveal the output being spent as the search space of all
+> possible outputs is rather small.
+
+Instead of a hash function you may use a keyed hash function (HMAC) where
+the key is just the random string. They key needs to be stored in the
+history of the coin to allow for verification.
+
+Best
+Henning
+
+On Mon, Aug 08, 2016 at 07:03:28PM +0300, Tony Churyumoff wrote:
+> Hi Henning,
+>
+> 1. The fees are paid by the enclosing BTC transaction.
+> 2. The hash is encoded into an OP_RETURN.
+>
+> > Regarding the blinding factor, I think you could just use HMAC.
+> How exactly?
+>
+> Tony
+>
+>
+> 2016-08-08 18:47 GMT+03:00 Henning Kopp <henning.kopp@uni-ulm.de>:
+>
+> > Hi Tony,
+> >
+> > I see some issues in your protocol.
+> >
+> > 1. How are mining fees handled?
+> >
+> > 2. Assume Alice sends Bob some Coins together with their history and
+> > Bob checks that the history is correct. How does the hash of the txout
+> > find its way into the blockchain?
+> >
+> > Regarding the blinding factor, I think you could just use HMAC.
+> >
+> > All the best
+> > Henning
+> >
+> >
+> > On Mon, Aug 08, 2016 at 06:30:21PM +0300, Tony Churyumoff via bitcoin-dev
+> > wrote:
+> > > This is a proposal about hiding the entire content of bitcoin
+> > > transactions. It goes farther than CoinJoin and ring signatures, which
+> > > only obfuscate the transaction graph, and Confidential Transactions,
+> > which
+> > > only hide the amounts.
+> > >
+> > > The central idea of the proposed design is to hide the entire inputs and
+> > > outputs, and publish only the hash of inputs and outputs in the
+> > > blockchain. The hash can be published as OP_RETURN. The plaintext of
+> > > inputs and outputs is sent directly to the payee via a private message,
+> > and
+> > > never goes into the blockchain. The payee then calculates the hash and
+> > > looks it up in the blockchain to verify that the hash was indeed
+> > published
+> > > by the payer.
+> > >
+> > > Since the plaintext of the transaction is not published to the public
+> > > blockchain, all validation work has to be done only by the user who
+> > > receives the payment.
+> > >
+> > > To protect against double-spends, the payer also has to publish another
+> > > hash, which is the hash of the output being spent. We’ll call this hash
+> > *spend
+> > > proof*. Since the spend proof depends solely on the output being spent,
+> > > any attempt to spend the same output again will produce exactly the same
+> > > spend proof, and the payee will be able to see that, and will reject the
+> > > payment. If there are several outputs consumed by the same transaction,
+> > > the payer has to publish several spend proofs.
+> > >
+> > > To prove that the outputs being spent are valid, the payer also has to
+> > send
+> > > the plaintexts of the earlier transaction(s) that produced them, then the
+> > > plaintexts of even earlier transactions that produced the outputs spent
+> > in
+> > > those transactions, and so on, up until the issue (similar to coinbase)
+> > > transactions that created the initial private coins. Each new owner of
+> > the
+> > > coin will have to store its entire history, and when he spends the coin,
+> > he
+> > > forwards the entire history to the next owner and extends it with his own
+> > > transaction.
+> > >
+> > > If we apply the existing bitcoin design that allows multiple inputs and
+> > > multiple outputs per transaction, the history of ownership transfers
+> > would
+> > > grow exponentially. Indeed, if we take any regular bitcoin output and
+> > try
+> > > to track its history back to coinbase, our history will branch every time
+> > > we see a transaction that has more than one input (which is not
+> > uncommon).
+> > > After such a transaction (remember, we are traveling back in time), we’ll
+> > > have to track two or more histories, for each respective input. Those
+> > > histories will branch again, and the total number of history entries
+> > grows
+> > > exponentially. For example, if every transaction had exactly two inputs,
+> > > the size of history would grow as 2^N where N is the number of steps back
+> > > in history.
+> > >
+> > > To avoid such rapid growth of ownership history (which is not only
+> > > inconvenient to move, but also exposes too much private information about
+> > > previous owners of all the contributing coins), we will require each
+> > > private transaction to have exactly one input (i.e. to consume exactly
+> > one
+> > > previous output). This means that when we track a coin’s history back in
+> > > time, it will no longer branch. It will grow linearly with the number of
+> > > transfers of ownership. If a user wants to combine several inputs, he
+> > will
+> > > have to send them as separate private transactions (technically, several
+> > > OP_RETURNs, which can be included in a single regular bitcoin
+> > transaction).
+> > >
+> > > Thus, we are now forbidding any coin merges but still allowing coin
+> > > splits. To avoid ultimate splitting into the dust, we will also require
+> > > that all private coins be issued in one of a small number of
+> > > denominations. Only integer number of “banknotes” can be transferred,
+> > the
+> > > input and output amounts must therefore be divisible by the denomination.
+> > > For example, an input of amount 700, denomination 100, can be split into
+> > > outputs 400 and 300, but not into 450 and 250. To send a payment, the
+> > > payer has to pick the unspent outputs of the highest denomination first,
+> > > then the second highest, and so on, like we already do when we pay in
+> > cash.
+> > >
+> > > With fixed denominations and one input per transaction, coin histories
+> > > still grow, but only linearly, which should not be a concern in regard to
+> > > scalability given that all relevant computing resources still grow
+> > > exponentially. The histories need to be stored only by the current owner
+> > > of the coin, not every bitcoin node. This is a fairer allocation of
+> > > costs. Regarding privacy, coin histories do expose private transactions
+> > > (or rather parts thereof, since a typical payment will likely consist of
+> > > several transactions due to one-input-per-transaction rule) of past coin
+> > > owners to the future ones, and that exposure grows linearly with time,
+> > but
+> > > it is still much much better than having every transaction immediately on
+> > > the public blockchain. Also, the value of this information for potential
+> > > adversaries arguably decreases with time.
+> > >
+> > > There is one technical nuance that I omitted above to avoid distraction.
+> > > Unlike regular bitcoin transactions, every output in a private payment
+> > > must also include a blinding factor, which is just a random string. When
+> > > the output is spent, the corresponding spend proof will therefore depend
+> > on
+> > > this blinding factor (remember that spend proof is just a hash of the
+> > > output). Without a blinding factor, it would be feasible to pre-image
+> > the
+> > > spend proof and reveal the output being spent as the search space of all
+> > > possible outputs is rather small.
+> > >
+> > > To issue the new private coin, one can burn regular BTC by sending it to
+> > > one of several unspendable bitcoin addresses, one address per
+> > denomination.
+> > > Burning BTC would entitle one to an equal amount of the new private
+> > coin,
+> > > let’s call it *black bitcoin*, or *BBC*.
+> > >
+> > > Then BBC would be transferred from user to user by:
+> > > 1. creating a private transaction, which consists of one input and
+> > several
+> > > outputs;
+> > > 2. storing the hash of the transaction and the spend proof of the
+> > consumed
+> > > output into the blockchain in an OP_RETURN (the sender pays the
+> > > corresponding fees in regular BTC)
+> > > 3. sending the transaction, together with the history leading to its
+> > input,
+> > > directly to the payee over a private communication channel. The first
+> > > entry of the history must be a bitcoin transaction that burned BTC to
+> > issue
+> > > an equal amount of BCC.
+> > >
+> > > To verify the payment, the payee:
+> > > 1. makes sure that the amount of the input matches the sum of outputs,
+> > and
+> > > all are divisible by the denomination
+> > > 2. calculates the hash of the private transaction
+> > > 3. looks up an OP_RETURN that includes this hash and is signed by the
+> > > payee. If there is more than one, the one that comes in the earlier
+> > block
+> > > prevails.
+> > > 4. calculates the spend proof and makes sure that it is included in the
+> > > same OP_RETURN
+> > > 5. makes sure the same spend proof is not included anywhere in the same
+> > or
+> > > earlier blocks (that is, the coin was not spent before). Only
+> > transactions
+> > > by the same author are searched.
+> > > 6. repeats the same steps for every entry in the history, except the
+> > first
+> > > entry, which should be a valid burning transaction.
+> > >
+> > > To facilitate exchange of private transaction data, the bitcoin network
+> > > protocol can be extended with a new message type. Unfortunately, it
+> > lacks
+> > > encryption, hence private payments are really private only when bitcoin
+> > is
+> > > used over tor.
+> > >
+> > > There are a few limitations that ought to be mentioned:
+> > > 1. After user A sends a private payment to user B, user A will know what
+> > > the spend proof is going to be when B decides to spend the coin.
+> > > Therefore, A will know when the coin was spent by B, but nothing more.
+> > > Neither the new owner of the coin, nor its future movements will be
+> > known
+> > > to A.
+> > > 2. Over time, larger outputs will likely be split into many smaller
+> > > outputs, whose amounts are not much greater than their denominations.
+> > > You’ll have to combine more inputs to send the same amount. When you
+> > want
+> > > to send a very large amount that is much greater than the highest
+> > available
+> > > denomination, you’ll have to send a lot of private transactions, your
+> > > bitcoin transaction with so many OP_RETURNs will stand out, and their
+> > > number will roughly indicate the total amount. This kind of privacy
+> > > leakage, however it applies to a small number of users, is easy to avoid
+> > by
+> > > using multiple addresses and storing a relatively small amount on each
+> > > address.
+> > > 3. Exchanges and large merchants will likely accumulate large coin
+> > > histories. Although fragmented, far from complete, and likely outdated,
+> > it
+> > > is still something to bear in mind.
+> > >
+> > > No hard or soft fork is required, BBC is just a separate privacy
+> > preserving
+> > > currency on top of bitcoin blockchain, and the same private keys and
+> > > addresses are used for both BBC and the base currency BTC. Every BCC
+> > > transaction must be enclosed into by a small BTC transaction that stores
+> > > the OP_RETURNs and pays for the fees.
+> > >
+> > > Are there any flaws in this design?
+> > >
+> > > Originally posted to BCT https://bitcointalk.org/index.
+> > php?topic=1574508.0,
+> > > but got no feedback so far, apparently everybody was consumed with
+> > bitfinex
+> > > drama and now mimblewimble.
+> > >
+> > > Tony
+> >
+> > > _______________________________________________
+> > > bitcoin-dev mailing list
+> > > bitcoin-dev@lists.linuxfoundation.org
+> > > https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev
+> >
+> >
+> > --
+> > Henning Kopp
+> > Institute of Distributed Systems
+> > Ulm University, Germany
+> >
+> > Office: O27 - 3402
+> > Phone: +49 731 50-24138
+> > Web: http://www.uni-ulm.de/in/vs/~kopp
+> >
+
+--
+Henning Kopp
+Institute of Distributed Systems
+Ulm University, Germany
+
+Office: O27 - 3402
+Phone: +49 731 50-24138
+Web: http://www.uni-ulm.de/in/vs/~kopp
+