Blockchain Privacy Preserving Techniques
XU Cheng <chengxu@comp.hkbu.edu.hk> October 12, 2019 @ NDBC 2019
Department of Computer Science, Hong Kong Baptist University
Blockchain Privacy Preserving Techniques XU Cheng < - - PowerPoint PPT Presentation
Blockchain Privacy Preserving Techniques XU Cheng < chengxu@comp.hkbu.edu.hk > October 12, 2019 @ NDBC 2019 Department of Computer Science, Hong Kong Baptist University Blockchain Technology Blockchain: Append-only data structure
Department of Computer Science, Hong Kong Baptist University
1/17
Blockchain Applications [Credit: FAHM Technology Partners] 1/17
2/17
[Credit: Gergely Acs] [Credit: David Alayón]
3/17
[Credit: Gergely Acs] [Credit: David Alayón]
3/17
[Credit: Pixabay]
4/17
[Credit: Pixabay]
4/17
y2 m1m2hy1 y2
5/17
y2 m1m2hy1 y2
5/17
5/17
[Credit: Vitalik Buterin]
6/17
[Credit: Vitalik Buterin]
6/17
function C(x, w) { return sha256(w) == x; }
7/17
function C(x, w) { return sha256(w) == x; }
7/17
function C(x, w) { return sha256(w) == x; }
7/17
mapping(address => bytes32) balanceHashes; function senderFunction(x, w) { return (w.senderBalanceBefore > w.value && sha256(w.value) == x.hashValue && sha256(w.senderBalanceBefore) == x.hashSenderBalanceBefore && sha256(w.senderBalanceBefore - w.value) == x.hashSenderBalanceAfter); } function receiverFunction(x, w) { return (sha256(w.value) == x.hashValue && sha256(w.receiverBalanceBefore) == x.hashReceiverBalanceBefore && sha256(w.receiverBalanceBefore + w.value) == x.hashReceiverBalanceAfter); } function transfer(address _to, bytes32 hashValue, bytes32 hashSenderBalanceAfter, bytes32 hashReceiverBalanceAfter, bytes zkProofSender, bytes zkProofReceiver) { bytes32 hashSenderBalanceBefore = balanceHashes[msg.sender]; bytes32 hashReceiverBalanceBefore = balanceHashes[_to]; bool senderProofIsCorrect = zksnarkverify(confTxSenderVk, [hashSenderBalanceBefore, hashSenderBalanceAfter, hashValue], zkProofSender); bool receiverProofIsCorrect = zksnarkverify(confTxReceiverVk, [hashReceiverBalanceBefore, hashReceiverBalanceAfter, hashValue], zkProofReceiver); if (senderProofIsCorrect && receiverProofIsCorrect) { balanceHashes[msg.sender] = hashSenderBalanceAfter; balanceHashes[_to] = hashReceiverBalanceAfter; } } [Credit: Christian Lundkvist]
1
1 are well formed
1
1 are well formed
8/17
mapping(address => bytes32) balanceHashes; function senderFunction(x, w) { return (w.senderBalanceBefore > w.value && sha256(w.value) == x.hashValue && sha256(w.senderBalanceBefore) == x.hashSenderBalanceBefore && sha256(w.senderBalanceBefore - w.value) == x.hashSenderBalanceAfter); } function receiverFunction(x, w) { return (sha256(w.value) == x.hashValue && sha256(w.receiverBalanceBefore) == x.hashReceiverBalanceBefore && sha256(w.receiverBalanceBefore + w.value) == x.hashReceiverBalanceAfter); } function transfer(address _to, bytes32 hashValue, bytes32 hashSenderBalanceAfter, bytes32 hashReceiverBalanceAfter, bytes zkProofSender, bytes zkProofReceiver) { bytes32 hashSenderBalanceBefore = balanceHashes[msg.sender]; bytes32 hashReceiverBalanceBefore = balanceHashes[_to]; bool senderProofIsCorrect = zksnarkverify(confTxSenderVk, [hashSenderBalanceBefore, hashSenderBalanceAfter, hashValue], zkProofSender); bool receiverProofIsCorrect = zksnarkverify(confTxReceiverVk, [hashReceiverBalanceBefore, hashReceiverBalanceAfter, hashValue], zkProofReceiver); if (senderProofIsCorrect && receiverProofIsCorrect) { balanceHashes[msg.sender] = hashSenderBalanceAfter; balanceHashes[_to] = hashReceiverBalanceAfter; } } [Credit: Christian Lundkvist]
1
1 are well formed
8/17
mapping(address => bytes32) balanceHashes; function senderFunction(x, w) { return (w.senderBalanceBefore > w.value && sha256(w.value) == x.hashValue && sha256(w.senderBalanceBefore) == x.hashSenderBalanceBefore && sha256(w.senderBalanceBefore - w.value) == x.hashSenderBalanceAfter); } function receiverFunction(x, w) { return (sha256(w.value) == x.hashValue && sha256(w.receiverBalanceBefore) == x.hashReceiverBalanceBefore && sha256(w.receiverBalanceBefore + w.value) == x.hashReceiverBalanceAfter); } function transfer(address _to, bytes32 hashValue, bytes32 hashSenderBalanceAfter, bytes32 hashReceiverBalanceAfter, bytes zkProofSender, bytes zkProofReceiver) { bytes32 hashSenderBalanceBefore = balanceHashes[msg.sender]; bytes32 hashReceiverBalanceBefore = balanceHashes[_to]; bool senderProofIsCorrect = zksnarkverify(confTxSenderVk, [hashSenderBalanceBefore, hashSenderBalanceAfter, hashValue], zkProofSender); bool receiverProofIsCorrect = zksnarkverify(confTxReceiverVk, [hashReceiverBalanceBefore, hashReceiverBalanceAfter, hashValue], zkProofReceiver); if (senderProofIsCorrect && receiverProofIsCorrect) { balanceHashes[msg.sender] = hashSenderBalanceAfter; balanceHashes[_to] = hashReceiverBalanceAfter; } } [Credit: Christian Lundkvist]
8/17
mapping(address => bytes32) balanceHashes; function senderFunction(x, w) { return (w.senderBalanceBefore > w.value && sha256(w.value) == x.hashValue && sha256(w.senderBalanceBefore) == x.hashSenderBalanceBefore && sha256(w.senderBalanceBefore - w.value) == x.hashSenderBalanceAfter); } function receiverFunction(x, w) { return (sha256(w.value) == x.hashValue && sha256(w.receiverBalanceBefore) == x.hashReceiverBalanceBefore && sha256(w.receiverBalanceBefore + w.value) == x.hashReceiverBalanceAfter); } function transfer(address _to, bytes32 hashValue, bytes32 hashSenderBalanceAfter, bytes32 hashReceiverBalanceAfter, bytes zkProofSender, bytes zkProofReceiver) { bytes32 hashSenderBalanceBefore = balanceHashes[msg.sender]; bytes32 hashReceiverBalanceBefore = balanceHashes[_to]; bool senderProofIsCorrect = zksnarkverify(confTxSenderVk, [hashSenderBalanceBefore, hashSenderBalanceAfter, hashValue], zkProofSender); bool receiverProofIsCorrect = zksnarkverify(confTxReceiverVk, [hashReceiverBalanceBefore, hashReceiverBalanceAfter, hashValue], zkProofReceiver); if (senderProofIsCorrect && receiverProofIsCorrect) { balanceHashes[msg.sender] = hashSenderBalanceAfter; balanceHashes[_to] = hashReceiverBalanceAfter; } } [Credit: Christian Lundkvist]
8/17
mapping(address => bytes32) balanceHashes; function senderFunction(x, w) { return (w.senderBalanceBefore > w.value && sha256(w.value) == x.hashValue && sha256(w.senderBalanceBefore) == x.hashSenderBalanceBefore && sha256(w.senderBalanceBefore - w.value) == x.hashSenderBalanceAfter); } function receiverFunction(x, w) { return (sha256(w.value) == x.hashValue && sha256(w.receiverBalanceBefore) == x.hashReceiverBalanceBefore && sha256(w.receiverBalanceBefore + w.value) == x.hashReceiverBalanceAfter); } function transfer(address _to, bytes32 hashValue, bytes32 hashSenderBalanceAfter, bytes32 hashReceiverBalanceAfter, bytes zkProofSender, bytes zkProofReceiver) { bytes32 hashSenderBalanceBefore = balanceHashes[msg.sender]; bytes32 hashReceiverBalanceBefore = balanceHashes[_to]; bool senderProofIsCorrect = zksnarkverify(confTxSenderVk, [hashSenderBalanceBefore, hashSenderBalanceAfter, hashValue], zkProofSender); bool receiverProofIsCorrect = zksnarkverify(confTxReceiverVk, [hashReceiverBalanceBefore, hashReceiverBalanceAfter, hashValue], zkProofReceiver); if (senderProofIsCorrect && receiverProofIsCorrect) { balanceHashes[msg.sender] = hashSenderBalanceAfter; balanceHashes[_to] = hashReceiverBalanceAfter; } } [Credit: Christian Lundkvist]
8/17
[Credit: Paige Peterson] [Credit: Jack Gavigan]
9/17
[Credit: Paige Peterson] [Credit: Jack Gavigan]
9/17
[Credit: Paige Peterson] [Credit: Jack Gavigan]
9/17
[Credit: Paige Peterson] [Credit: Jack Gavigan]
9/17
[Credit: Alexandre Adamski]
EuroS&P, 2019 10/17
[Credit: Alexandre Adamski]
EuroS&P, 2019 10/17
[Credit: Alexandre Adamski]
EuroS&P, 2019 10/17
11/17
11/17
11/17
root 1 2 3 path Stash Block B0 B1 B2 B3 B4 Path Position Map
12/17
root 1 2 3 path Stash Block B0 B1 B2 B3 B4 Path Position Map
12/17
(B3, 0) root (B0, 0) 1 (B2, 3) 2 (B1, 3) 3 path (B4, 1) Stash Block B0 B1 B2 B3 B4 Path 3 3 1 Position Map
12/17
(B3, 0) root (B0, 0)
dummy dummy
1 (B2, 3)
dummy
2 (B1, 3) 3 path (B4, 1) Stash Block B0 B1 B2 B3 B4 Path 3 3 1 Position Map
12/17
(B3, 0) root (B0, 0)
dummy dummy
1 (B2, 3)
dummy
2 (B1, 3) 3 path (B4, 1) Stash Block B0 B1 B2 B3 B4 Path 3 3 1 Position Map
12/17
root (B0, 0)
dummy dummy
1
dummy
2 3 path (B4, 1) (B1, 3) (B2, 3) (B3, 0) Stash Block B0 B1 B2 B3 B4 Path 3 3 1 Position Map
12/17
root (B0, 0)
dummy dummy
1
dummy
2 3 path (B4, 1) (B1, 3) (B2, 3) (B3, 0) Stash Block B0 B1 B2 B3 B4 Path 3 3 1 Position Map
12/17
root (B0, 0)
dummy dummy
1
dummy
2 3 path (B4, 1) (B1, 1) (B2, 3) (B3, 0) Stash Block B0 B1 B2 B3 B4 Path 1 3 1 Position Map
12/17
(B3, 0) root (B0, 0)
dummy dummy
1
dummy dummy
2 (B2, 3) 3 path (B4, 1) (B1, 1) Stash Block B0 B1 B2 B3 B4 Path 1 3 1 Position Map
12/17
13/17
13/17
13/17
[Credit: Pixabay]
14/17
[Credit: Pixabay]
14/17
15/17
hprev nonce … tx …
Original Block
hprev nonce … h(tx), tx′ …
Redacted Block
16/17
hprev nonce … tx …
Original Block
hprev nonce … h(tx), tx′ …
Redacted Block
16/17
[Credit: Pixabay]
17/17
17/17
[AAUC18]
Surveys, 2018. [AMVA17]
friends,” in IEEE EuroS&P, 2017. [CD16]
[CZJ+17]
PVORM,” in ACM CCS, 2017. [CZK+19]
confjdentiality-preserving, trustworthy, and performant smart contracts,” in IEEE EuroS&P, 2019. [DMT19]
2019. [DSSS19]
Chameleon-hashing gone attribute-based,” in NDSS, 2019. [KMS+16]
privacy-preserving smart contracts,” in IEEE S&P, 2016.
[NWI+15]
easy,” in IEEE S&P, 2015. [PHGR13]
2013. [SCG+14]
anonymous payments from bitcoin,” in IEEE S&P, 2014. [SVS+13]