{"id":18800,"date":"2026-03-29T23:25:38","date_gmt":"2026-03-29T23:25:38","guid":{"rendered":"https:\/\/cryptoted.net\/index.php\/2026\/03\/29\/privacy-on-the-blockchain-ethereum-foundation-blog\/"},"modified":"2026-03-29T23:25:38","modified_gmt":"2026-03-29T23:25:38","slug":"privacy-on-the-blockchain-ethereum-foundation-blog","status":"publish","type":"post","link":"https:\/\/cryptoted.net\/index.php\/2026\/03\/29\/privacy-on-the-blockchain-ethereum-foundation-blog\/","title":{"rendered":"Privacy on the Blockchain | Ethereum Foundation Blog"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div id=\"\">\n<p class=\"chakra-text css-gi02ar\">Blockchains are a powerful technology, as regular readers of the blog already likely agree. They allow for a large number of interactions to be codified and carried out in a way that greatly increases reliability, removes business and political risks associated with the process being managed by a central entity, and reduces the need for trust. They create a platform on which applications from different companies and even of different types can run together, allowing for extremely efficient and seamless interaction, and leave an audit trail that anyone can check to make sure that everything is being processed correctly.<\/p>\n<p class=\"chakra-text css-gi02ar\">However, when I and others talk to companies about building their applications on a blockchain, two primary issues always come up: scalability and privacy. Scalability is a serious problem; current blockchains, processing 3-20 transactions per second, are several orders of mangitude away from the amount of processing power needed to run mainstream payment systems or financial markets, much less decentralized forums or global micropayment platforms for IoT. Fortunately, <a class=\"chakra-link css-vezwxf\" href=\"https:\/\/blog.ethereum.org\/2015\/04\/05\/blockchain-scalability-chain-fibers-redux\">there<\/a> <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"http:\/\/www.arcturnus.com\/ethereum-lightning-network-and-beyond\/\">are<\/a> <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/docs.google.com\/presentation\/d\/1CjD0W4l4-CwHKUvfF5Vlps76fKLEC6pIwu1a_kC_YRQ\/edit#slide=id.p\">solutions<\/a>, and we are actively working on <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/www.reddit.com\/r\/ethereum\/comments\/40u54x\/eip_105_serenity_binary_sharding_plus_contract\/\">implementing<\/a> a roadmap to making them happen. The other major problem that blockchains have is privacy. As seductive as a blockchain&#8217;s other advantages are, neither companies or individuals are particularly keen on publishing all of their information onto a public database that can be arbitrarily read without any restrictions by one&#8217;s own government, foreign governments, family members, coworkers and business competitors. <\/p>\n<p class=\"chakra-text css-gi02ar\">Unlike with scalability, the solutions for privacy are in some cases easier to implement (though in other cases much much harder), many of them compatible with currently existing blockchains, but they are also much less satisfying. It&#8217;s much harder to create a &#8220;holy grail&#8221; technology which allows users to do absolutely everything that they can do right now on a blockchain, but with privacy; instead, developers will in many cases be forced to contend with partial solutions, heuristics and mechanisms that are designed to bring privacy to specific classes of applications.<\/p>\n<h3 class=\"chakra-heading group css-xuzltg\" id=\"the-holy-grail\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"the holy grail permalink\" href=\"#the-holy-grail\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>The Holy Grail<\/h3>\n<p class=\"chakra-text css-gi02ar\">First, let us start off with the technologies that <em class=\"chakra-text css-0\">are<\/em> holy grails, in that they actually do offer the promise of converting arbitrary applications into fully privacy-preserving applications, allowing users to benefit from the security of a blockchain, using a decentralized network to process the transactions, but &#8220;encrypting&#8221; the data in such a way that even though everything is being computed in plain sight, the underlying &#8220;meaning&#8221; of the information <em class=\"chakra-text css-0\">is completely obfuscated<\/em>.<\/p>\n<p class=\"chakra-text css-gi02ar\">The most powerful technology that holds promise in direction is, of course, cryptographically secure obfuscation. In general, obfuscation is a way of turning any program into a &#8220;black box&#8221; equivalent of the program, in such a way that the program still has the same &#8220;internal logic&#8221;, and still gives the same outputs for the same inputs, but it&#8217;s impossible to determine any other details about how the program works.<\/p>\n<p><center><br \/>\n<img decoding=\"async\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/2016\/01\/drawing-2.png\" class=\"chakra-image css-hw6q2r\"\/><img decoding=\"async\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/2016\/01\/drawing-3.png\" class=\"chakra-image css-hw6q2r\"\/><br \/><small><i>Think of it as &#8220;encrypting&#8221; the wires inside of the box in such a way that the encryption cancels itself out and ultimately has no effect on the output, but does have the effect of making it absolutely impossible to see what is going on inside.<\/i><\/small><br \/>\n<\/center><\/p>\n<p class=\"chakra-text css-gi02ar\">Unfortunately, absolutely perfect black-box obfuscation is mathematically <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/www.iacr.org\/archive\/crypto2001\/21390001.pdf\">known to be impossible<\/a>; it turns out that there is always at least <em class=\"chakra-text css-0\">something<\/em> that you can get extract out of a program by looking at it beyond just the outputs that it gives on a specific set of inputs. However, there is a weaker standard called <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eprint.iacr.org\/2013\/451.pdf\">indistinguishability obfuscation<\/a> that we can satisfy: essentially, given two <i>equivalent<\/i> programs that have been obfuscated using the algorithm (eg. <span class=\"chakra-text css-ons8vw\">x = (a + b) * c<\/span> and <span class=\"chakra-text css-ons8vw\">x = (a * c) + (b * c)<\/span>), one cannot determine which of the two outputs came from which original source. To see how this is still powerful enough for our applications, consider the following two programs:<\/p>\n<ol role=\"list\" class=\"css-vgl4zd\">\n<li class=\"css-0\"><span class=\"chakra-text css-ons8vw\">y = 0<\/span><\/li>\n<li class=\"css-0\"><span class=\"chakra-text css-ons8vw\">y = sign(privkey, 0) &#8211; sign(privkey, 0)<\/span><\/li>\n<\/ol>\n<p class=\"chakra-text css-gi02ar\">One just returns zero, and the other uses an internally contained private key to cryptographically sign a message, does that same operation another time, subtracts the (obviously identical) results from each other and returns the result, which is guaranteed to be zero. Even though one program just returns zero, and the other <strong>contains and uses a cryptographic private key<\/strong>, if indistinguishability is satisfied then we know that the two obfuscated programs cannot be distinguished from each other, and so someone in possession of the obfuscated program definitely has no way of extracting the private key &#8211; otherwise, that would be a way of distinguishing the two programs. That&#8217;s some pretty powerful obfuscation right there &#8211; and for about two years we&#8217;ve known how to do it!<\/p>\n<p class=\"chakra-text css-gi02ar\">So, how do we use this on a blockchain? Here&#8217;s one simple approach for a digital token. We create an obfuscated smart contract which contains a private key, and accepts instructions encrypted with the correponding public key. The contract stores account balances in storage encrypted, and if the contract wants to read the storage it decrypts it internally, and if the contract wants to write to storage it encrypts the desired result before writing it. If someone wants to read a balance of their account, then they encode that request as a transaction, and simulate it on their own machine; the obfuscated smart contract code will check the signature on the transaction to see if that user is entitled to read the balance, and if they are entitled to read the balance it will return the decrypted balance; otherwise the code will return an error, and the user has no way of extracting the information.<\/p>\n<p><center><img decoding=\"async\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/2016\/01\/drawing-4.png\" class=\"chakra-image css-hw6q2r\"\/><\/center><\/p>\n<p class=\"chakra-text css-gi02ar\">However, as with several other technologies of this type, there is one problem: the mechanism for doing this kind of obfuscation is horrendously inefficient. Billion-factor overhead is the norm, and often even highly optimistic; a <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/www22.in.tum.de\/fileadmin\/papers\/essos15a.pdf\">recent paper<\/a> estimates that &#8220;executing [a 2-bit multiplication] circuit on the same CPU would take 1.3 * 10<sup>8<\/sup> years&#8221;. Additionally, if you want to prevent reads and writes to storage from being a data leak vector, you must also set up the contract so that read and write operations always modify large portions of a contract&#8217;s entire state &#8211; another source of overhead. When, on top of that, you have the overhead of hundreds of nodes running the code on a blockchain, one can quickly see how this technology is, unfortunately, not going to change anything any time soon.<\/p>\n<h3 class=\"chakra-heading group css-xuzltg\" id=\"taking-a-step-down\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"taking a step down permalink\" href=\"#taking-a-step-down\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Taking A Step Down<\/h3>\n<p class=\"chakra-text css-gi02ar\">However, there are two branches of technology that can get you <em class=\"chakra-text css-0\">almost<\/em> as far as obfuscation, though with important compromises to the security model. The first is secure multi-party computation. Secure multi-party computation allows for a program (and its state) to be split among N parties in such a way that you need M of them (eg. N = 9, M = 5) to cooperate in order to either complete the computation or reveal any internal data in the program or the state. Thus, if you can trust the majority of the participants to be honest, the scheme is as good as obfuscation. If you can&#8217;t, then it&#8217;s worthless.<\/p>\n<p class=\"chakra-text css-gi02ar\">The math behind secure multi-party computation is complex, but much simpler than obfuscation; if you are interested in the technical details, then you can read more <a class=\"chakra-link css-vezwxf\" href=\"https:\/\/blog.ethereum.org\/2014\/12\/26\/secret-sharing-daos-crypto-2-0\">here<\/a> (and also the paper of Enigma, a project that seeks to actually implement the secret sharing DAO concept, <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"http:\/\/enigma.media.mit.edu\/enigma_full.pdf\">here<\/a>). SMPC is also much more efficient than obfuscation, the point that you can carry out practical computations with it, but even still the inefficiencies are very large. Addition operations can be processed fairly quickly, but every time an SMPC instance performs some very small fixed number of multiplication operations it needs to perform a &#8220;degree reduction&#8221; step involving messages being sent from every node to every node in the network. Recent work reduces the communication overhead from quadratic to linear, but even still every multiplication operation brings a certain unavoidable level of network latency.<\/p>\n<p class=\"chakra-text css-gi02ar\">The requirement of trust on the participants is also an onerous one; note that, as is the case with many other applications, the participants have the ability to save the data and then collude to uncover at any future point in history. Additionally, it is impossible to tell that they have done this, and so it is impossible to incentivize the participants to maintain the system&#8217;s privacy; for this reason, secure multi-party computation is arguably much more suited to private blockchains, where incentives can come from outside the protocol, than public chains.<\/p>\n<p class=\"chakra-text css-gi02ar\">Another kind of technology that has very powerful properties is zero-knowledge proofs, and specifically the recent developments in &#8220;<a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eprint.iacr.org\/2013\/507.pdf\">succinct arguments of knowledge<\/a>&#8221; (SNARKs). Zero-knowledge proofs allow a user to construct a mathematical proof that a given program, when executed on some (possibly hidden) input known by the user, has a particular (publicly known) output, <em class=\"chakra-text css-0\">without revealing any other information<\/em>. There are many <em class=\"chakra-text css-0\">specialized<\/em> types of zero-knowledge proofs that are fairly easy to implement; for example, you can think of a digital signature as a kind of zero-knowledge proof showing that you know the value of a private key which, when processed using a standard algorithm, can be converted into a particular public key. ZK-SNARKs, on the other hand, allow you to make such a proof for <em class=\"chakra-text css-0\">any<\/em> function.<\/p>\n<p class=\"chakra-text css-gi02ar\">First, let us go through some specific examples. One natural use case for the technology is in identity systems. For example, suppose that you want to prove to a system that you are (i) a citizen of a given country, and (ii) over 19 years old. Suppose that your government is technologically progressive, and issues cryptographically signed digital passports, which include a person&#8217;s name and date of birth as well as a private and public key. You would construct a function which takes a digital passport and a signature signed by the private key in the passport as input, and outputs 1 if both (i) the date of birth is before 1996, (ii) the passport was signed with the government&#8217;s public key, and (iii) the signature is correct, and outputs 0 otherwise. You would then make a zero-knowledge proof showing that you have an input that, when passed through this function, returns 1, and sign the proof with another private key that you want to use for your future interactions with this service. The service would verify the proof, and if the proof is correct it would accept messages signed with your private key as valid.<\/p>\n<p class=\"chakra-text css-gi02ar\">You could also use the same scheme to verify more complex claims, like &#8220;I am a citizen of this country, and my ID number is not in this set of ID numbers that have already been used&#8221;, or &#8220;I have had favorable reviews from some merchants after purchasing at least $10,000 worth of products from them&#8221;, or &#8220;I hold assets worth at least $250,000&#8221;.<\/p>\n<p class=\"chakra-text css-gi02ar\">Another category of use cases for the technology is digital token ownership. In order to have a functioning digital token system, you do not strictly need to have visible accounts and balances; in fact, all that you need is a way to solve the &#8220;double spending&#8221; problem &#8211; if you have 100 units of an asset, you should be able to spend those 100 units once, but not twice. With zero-knowledge proofs, we can of course do this; the claim that you would zero-knowledge-prove is something like &#8220;I know a secret number behind one of the accounts in this set of accounts that have been created, and it does not match any of the secret numbers that have already been revealed&#8221;. Accounts in this scheme become one-time-use: an &#8220;account&#8221; is created every time assets are sent, and the sender account is completely consumed. If you do not want to completely consume a given account, then you must simply create two accounts, one controlled by the recipient and the other with the remaining &#8220;change&#8221; controlled by the sender themselves. This is essentially the scheme used by <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/z.cash\/\">Zcash<\/a> (see more about how it works <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"http:\/\/zerocash-project.org\/how_zerocash_works\">here<\/a>).<\/p>\n<p class=\"chakra-text css-gi02ar\">For two-party smart contracts (eg. think of something like a financial derivative contract negotiated between two parties), the application of zero-knowledge-proofs is fairly easy to understand. When the contract is first negotiated, instead of creating a smart contract containing the actual formula by which the funds will eventually be released (eg. in a binary option, the formula would be &#8220;if index I as released by some data source is greater than X, send everything to A, otherwise send everything to B&#8221;), create a contract containing the <i>hash of the formula<\/i>. When the contract is to be closed, either party can themselves compute the amount that A and B should receive, and provide the result alongside a zero-knowledge-proof that a formula with the correct hash provides that result. The blockchain finds out how much A and B each put in, and how much they get out, but not <em class=\"chakra-text css-0\">why<\/em> they put in or get out that amount.<\/p>\n<p><center><img decoding=\"async\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/2016\/01\/drawing-8.png\" class=\"chakra-image css-hw6q2r\"\/><\/center><\/p>\n<p class=\"chakra-text css-gi02ar\">This model can be generalized to N-party smart contracts, and the <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"http:\/\/oblivm.com\/hawk\/\">Hawk<\/a> project is seeking to do exactly that.<\/p>\n<h3 class=\"chakra-heading group css-xuzltg\" id=\"starting-from-the-other-end-low-tech-approaches\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"starting from the other end low tech approaches permalink\" href=\"#starting-from-the-other-end-low-tech-approaches\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Starting from the Other End: Low-Tech Approaches<\/h3>\n<p class=\"chakra-text css-gi02ar\">The other path to take when trying to increase privacy on the blockchain is to start with very low-tech approaches, using no crypto beyond simple hashing, encryption and public key cryptography. This is the path that Bitcoin started from in 2009; though the level of privacy that it provides in practice is quite difficult to quantify and limited, it still clearly provided some value.<\/p>\n<p class=\"chakra-text css-gi02ar\">The simplest step that Bitcoin took to somewhat increase privacy is its use of one-time accounts, similar to Zcash, in order to store funds. Just like with Zcash, every transaction must <i>completely empty<\/i> one or more accounts, and <i>create<\/i> one or more new accounts, and it is recommended for users to generate a new private key for every new account that they intend to receive funds into (though it is possible to have multiple accounts with the same private key). The main benefit that this brings is that a user&#8217;s funds are not linked to each other by default: if you receive 50 coins from source A and 50 coins from source B, there is no way for other users to tell that those funds belong to the same person. Additionally, if you spend 13 coins to someone else&#8217;s account C, and thereby create a fourth account D where you send the remaining 37 coins from one of these accounts as &#8220;change&#8221;, the other users cannot even tell which of the two outputs of the transaction is the &#8220;payment&#8221; and which is the &#8220;change&#8221;.<\/p>\n<p><center><img decoding=\"async\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/2016\/01\/drawing-5.png\" class=\"chakra-image css-hw6q2r\"\/><\/center><\/p>\n<p class=\"chakra-text css-gi02ar\">However, there is a problem. If, at any point in the future, you make a transaction consuming from two accounts at the same time, then you irrevertibly &#8220;link&#8221; those accounts, making it obvious to the world that they come from one user. And, what&#8217;s more, these linkages are transitive: if, at any point, you link together A and B, and then at any other point link together A and C, and so forth, then you&#8217;ve created a large amount of evidence by which statistical analysis can link up your entire set of assets.<\/p>\n<p><center><img decoding=\"async\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/2016\/01\/drawing-6-1.png\" class=\"chakra-image css-hw6q2r\"\/><\/center><\/p>\n<p class=\"chakra-text css-gi02ar\">Bitcoin developer Mike Hearn came up with a mitigation strategy that reduces the likelihood of this happening called <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/medium.com\/@octskyward\/merge-avoidance-7f95a386692f\">merge avoidance<\/a>: essentially, a fancy term for trying really really hard to minimize the number of times that you link accounts together by spending from them at the same time. This definitely helps, but even still, privacy inside of the Bitcoin system has proven to be highly porous and heuristic, with nothing even close to approaching high guarantees.<\/p>\n<p class=\"chakra-text css-gi02ar\">A somewhat more advanced technique is called <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/bitcointalk.org\/index.php?topic=279249.0\">CoinJoin<\/a>. Essentially, the CoinJoin protocol works as follows:<\/p>\n<ol role=\"list\" class=\"css-vgl4zd\">\n<li class=\"css-0\">N parties come together over some anonymous channel, eg. Tor. They each provide a destination address <span class=\"chakra-text css-ons8vw\">D[1] &#8230; D[N]<\/span>.<\/li>\n<li class=\"css-0\">One of the parties creates a transaction which sends one coin to each destination address.<\/li>\n<li class=\"css-0\">The N parties log out and then separately log in to the channel, and each contribute one coin to the account that the funds will be paid out from.<\/li>\n<li class=\"css-0\">If N coins are paid into the account, they are distributed to the destination addresses, otherwise they are refunded.<\/li>\n<\/ol>\n<p><center><img decoding=\"async\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/2016\/01\/drawing-7.png\" class=\"chakra-image css-hw6q2r\"\/><\/center><\/p>\n<p class=\"chakra-text css-gi02ar\">If all participants are honest and provide one coin, then everyone will put one coin in and get one coin out, but <strong>no one will know which input maps to which output<\/strong>. If at least one participant does not put one coin in, then the process will fail, the coins will get refunded, and all of the participants can try again. An algorithm similar to this was implemented <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/sx.dyne.org\/anontx\/\">by Amir Taaki and Pablo Martin for Bitcoin<\/a>, and by <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/gist.github.com\/gavofyork\/dee1f3b727f691b381dc\">Gavin Wood and Vlad Gluhovsky for Ethereum<\/a>.<\/p>\n<p class=\"chakra-text css-gi02ar\">So far, we have only discussed token anonymization. What about two-party smart contracts? Here, we use the same mechanism as Hawk, except we substitute the cryptography with simpler cryptoeconomics &#8211; namely, the &#8220;auditable computation&#8221; trick. The participants send their funds into a contract which stores the hash of the code. When it comes time to send out funds, either party can submit the result. The other party can either send a transaction to agree on the result, allowing the funds to be sent, or it can publish the actual code to the contract, at which point the code will run and distribute the funds correctly. A security deposit can be used to incentivize the parties to participate honestly. Hence, the system is private by default, and only if there is a dispute does any information get leaked to the outside world.<\/p>\n<p><center><img decoding=\"async\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/2016\/01\/drawing-9-1.png\" class=\"chakra-image css-hw6q2r\"\/><\/center><\/p>\n<p class=\"chakra-text css-gi02ar\">A generalization of this technique is called <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"http:\/\/www.jeffcoleman.ca\/state-channels\/\">state<\/a> <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"http:\/\/www.arcturnus.com\/ethereum-lightning-network-and-beyond\/\">channels<\/a>, and also has scalability benefits alongside its improvements in privacy.<\/p>\n<h3 class=\"chakra-heading group css-xuzltg\" id=\"ring-signatures\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"ring signatures permalink\" href=\"#ring-signatures\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Ring Signatures<\/h3>\n<p class=\"chakra-text css-gi02ar\">A technology which is moderately technically complicated, but extremely promising for both token anonymization and identity applications, is ring signatures. A ring signature is essentially a signature that proves that the signer has a private key corresponding to one of a specific set of public keys, <em class=\"chakra-text css-0\">without revealing which one<\/em>. The two-sentence explanation for how this works mathematically is that a ring signature algorithm includes a mathematical function which can be computed normally with just a public key, but where knowing the private key allows you to add a seed to the input to make the output be whatever specific value you want. The signature itself consists of a list of values, where each value is set to the function applied to the previous value (plus some seed); producing a valid signature requires using knowledge of a private key to &#8220;close the loop&#8221;, forcing the last value that you compute to equal the first. Given a valid &#8220;ring&#8221; produced in this way, anyone can verify that it is indeed a &#8220;ring&#8221;, so each value is equal to the function computed on the previous value plus the given seed, but there is no way to tell at which &#8220;link&#8221; in the ring a private key was used.<\/p>\n<p><center><img decoding=\"async\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/2016\/01\/Screenshot-from-2016-01-15-122133.png\" class=\"chakra-image css-hw6q2r\"\/><\/center><\/p>\n<p class=\"chakra-text css-gi02ar\">There is also an upgraded version of a ring signature called a <strong>linkable ring signature<\/strong>, which adds an extra property: if you sign twice with the same private key, that fact can be detected &#8211; but no other information is revealed. In the case of token anonymization, the application is fairly simple: when a user wants to spend a coin, instead of having them provide a regular signature to prove ownership of their public key directly, we combine public keys together into groups, and ask the user to simply prove membership in the group. Because of the linkability property, a user that has one public key in a group can only spend from that group once; conflicting signatures are rejected.<\/p>\n<p class=\"chakra-text css-gi02ar\">Ring signatures can also be used for voting applications: instead of using ring signatures to validate spending from a set of coins, we use them to validate votes. They can also be used for identity applications: if you want to prove that you belong to a set of authorized users, without revealing which one, ring signatures are well-suited for just that. Ring signatures are more mathematically involved than simple signatures, but they are quite practical to implement; some sample code for ring signatures on top of Ethereum <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/github.com\/ethereum\/serpent\/blob\/develop\/examples\/ecc\/ringsig.se\">can be found here<\/a>.<\/p>\n<h3 class=\"chakra-heading group css-xuzltg\" id=\"secret-sharing-and-encryption\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"secret sharing and encryption permalink\" href=\"#secret-sharing-and-encryption\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Secret Sharing and Encryption<\/h3>\n<p class=\"chakra-text css-gi02ar\">Sometimes, blockchain applications are not trying to mediate the transfer of digital assets, or record identity information, or process smart contracts, and are instead being used on more data-centric applications: timestamping, high-value data storage, proof of existence (or <em class=\"chakra-text css-0\">proof of inexistence<\/em>, as in the case of certificate revocations), etc. A common refrain is the idea of using blockchains to build systems where &#8220;users are in control of their own data&#8221;.<\/p>\n<p class=\"chakra-text css-gi02ar\">In these cases, it is once again important to note that blockchains do NOT solve privacy issues, and are an authenticity solution only. Hence, putting medical records in plaintext onto a blockchain is a Very Bad Idea. However, they can be combined with other technologies that <em class=\"chakra-text css-0\">do<\/em> offer privacy in order to create a holistic solution for many industries that does accomplish the desired goals, with blockchains being a vendor-neutral platform where some data can be stored in order to provide authenticity guarantees.<\/p>\n<p class=\"chakra-text css-gi02ar\">So what are these privacy-preserving technologies? Well, in the case of simple data storage (eg. medical records), we can just use the simplest and oldest one of all: encryption! Documents that are hashed on the blockchain can first be encrypted, so even if the data is stored on something like <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"http:\/\/ipfs.io\">IPFS<\/a> only the user with their own private key can see the documents. If a user wants to grant someone else the right to view some specific records in decrypted form, but not all of them, one can use something like a <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/en.bitcoin.it\/wiki\/Deterministic_wallet\">deterministic wallet<\/a> to derive a different key for each document.<\/p>\n<p class=\"chakra-text css-gi02ar\">Another useful technology is secret sharing (described in more detail <a class=\"chakra-link css-vezwxf\" href=\"https:\/\/blog.ethereum.org\/2014\/08\/16\/secret-sharing-erasure-coding-guide-aspiring-dropbox-decentralizer\">here<\/a>), allowing a user to encrypt a piece of data in such a way that M of a given N users (eg. M = 5, N = 9) can cooperate to decrypt the data, but no fewer.<\/p>\n<h3 class=\"chakra-heading group css-xuzltg\" id=\"the-future-of-privacy\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"the future of privacy permalink\" href=\"#the-future-of-privacy\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>The Future of Privacy<\/h3>\n<p class=\"chakra-text css-gi02ar\">There are two major challenges with privacy preserving protocols in blockchains. One of the challenges is statistical: in order for any privacy-preserving scheme to be computationally practical, the scheme must only alter a small part of the blockchain state with every transaction. However, even if the <i>contents<\/i> of the alteration are privacy, there will inevitably be some amount of <i>metadata<\/i> that is not. Hence, statistical analyses will always be able to figure out <i>something<\/i>; at the least, they will be able to fish for patterns of <i>when<\/i> transactions take place, and in many cases they will be able to narrow down identities and figure out who interacts with whom.<\/p>\n<p class=\"chakra-text css-gi02ar\">The second challenge is the developer experience challenge. Turing-complete blockchains work very well for developers because they are very friendly to developers that are completely clueless about the underlying mechanics of decentralization: they create a decentralized &#8220;world computer&#8221; which looks just like a centralized computer, in effect saying &#8220;look, developers, you can code what you were planning to code already, except that this new layer at the bottom will now make everything magically decentralized for you&#8221;. Of course, the abstraction is not perfect: high transaction fees, high latency, gas and block reorganizations are something new for programmers to contend with, but the barriers are not <i>that<\/i> large.<\/p>\n<p class=\"chakra-text css-gi02ar\">With privacy, as we see, there is no such magic bullet. While there are <i>partial solutions<\/i> for specific use cases, and often these partial solutions offer a high degree of flexibility, the abstractions that they present are quite different from what developers are used to. It&#8217;s not trivial to go from &#8220;10-line python script that has some code for subtracting X coins from the sender&#8217;s balance and adding X coins to the recipient&#8217;s balance&#8221; to &#8220;highly anonymized digital token using linkable ring signatures&#8221;.<\/p>\n<p class=\"chakra-text css-gi02ar\">Projects like Hawk are very welcome steps in the right direction: they offer the promise of converting an arbitrary N-party protocol into a zero-knowledge-ified protocol that trusts only the blockchain for authenticity, and one specific party for privacy: essentially, combining the best of both worlds of a centralized and decentralized approach. Can we go further, and create a protocol that trusts zero parties for privacy? This is still an active research direction, and we&#8217;ll just have to wait and see how far we can get.<\/p>\n<\/div>\n<p><br \/>\n<br \/><a href=\"https:\/\/blog.ethereum.org\/en\/2016\/01\/15\/privacy-on-the-blockchain\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Blockchains are a powerful technology, as regular readers of the blog already likely agree. They allow for a large number of interactions to be codified and carried out in a way that greatly increases reliability, removes business and political risks associated with the process being managed by a central entity, and reduces the need for [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":18498,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"tdm_status":"","tdm_grid_status":"","footnotes":""},"categories":[24],"tags":[],"kronos_expire_date":[],"class_list":["post-18800","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ethereum"],"_links":{"self":[{"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/posts\/18800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/comments?post=18800"}],"version-history":[{"count":0,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/posts\/18800\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/media\/18498"}],"wp:attachment":[{"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/media?parent=18800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/categories?post=18800"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/tags?post=18800"},{"taxonomy":"kronos_expire_date","embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/kronos_expire_date?post=18800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}