Towards Searchable and Verifjable Blockchain
Cheng Xu Ce Zhang April 8, 2019
Department of Computer Science Hong Kong Baptist University
Towards Searchable and Verifjable Blockchain Cheng Xu Ce Zhang - - PowerPoint PPT Presentation
Towards Searchable and Verifjable Blockchain Cheng Xu Ce Zhang April 8, 2019 Department of Computer Science Hong Kong Baptist University Background Blockchain is a distributed ledger maintained by a community of (untrusted) users
Department of Computer Science Hong Kong Baptist University
1/17
1/17
2/17
2/17
Miner Full Node Light Node Full Node Miner
Q R Q R
3/17
Miner Full Node Light Node Full Node Miner · · ·
Q R Q R
3/17
Miner Full Node Light Node Full Node Miner · · ·
Q R Q R
3/17
[Credit: Oscar W]
5/17
[Credit: Oscar W]
5/17
6/17
6/17
7/17
Full Node Light Node Full Node Miner
Q R VO Q R VO
8/17
Full Node Light Node Full Node Miner · · ·
Q R Q R
8/17
Miner Full Node Light Node Full Node Miner · · ·
Q R Q R
8/17
Miner Full Node Light Node Full Node Miner · · ·
Q R, VO Q R, VO
8/17
(Full Node) . . . . . . PreBkHash . . .
ti Vi Wi
t1 1 {a, b}
t2 2 {a}
t3 3 {c}
t4 5 {a, b}
t5 1 {c, d} blocki (Light Node) . . . . . . q1 : [ti, ti], [1, 2], b q2 : −, [1, 2], c ∨ d q3 : −, [1, 2], a ∧ d (Miner) Block Headers Block Headers & Data (incl. ADS) Q Service Provider (SP) Query User
{o1}, VO {o5}, VO ∅, VO
Block Header & Data Block Header
9/17
10/17
N0 = H(N1|N2) N1 = H(N3|N4) N2 = H(N5|N6) N2 = H(N5|N6) N3 = H(o1) N3 = H(o1) N4 = H(o2)
N5 = H(o3) N6 = H(o4)
sig(N0) Q
11/17
N0 = H(N1|N2) N1 = H(N3|N4) N2 = H(N5|N6) N2 = H(N5|N6) N3 = H(o1) N3 = H(o1) N4 = H(o2)
N5 = H(o3) N6 = H(o4)
sig(N0) Q
11/17
PreBkHash TS ConsProof ObjectHash AttDigest
blocki
“Sedan” “Benz” “BMW” “Sedan” “Benz” “BMW”
“Van” “Benz” , we have “Sedan” “Van” “Benz”
“Van” “Benz” “Sedan” pk to compute proof
acc “Van” “Benz” from the block header and uses VerifyDisjoint AttDigest acc “Sedan” pk to verify the mismatch 12/17
. . . PreBkHash TS ConsProof ObjectHash AttDigest
blocki
. . .
“Sedan” “Benz” “BMW” “Sedan” “Benz” “BMW”
“Van” “Benz” , we have “Sedan” “Van” “Benz”
“Van” “Benz” “Sedan” pk to compute proof
acc “Van” “Benz” from the block header and uses VerifyDisjoint AttDigest acc “Sedan” pk to verify the mismatch 12/17
. . . PreBkHash TS ConsProof ObjectHash AttDigest
blocki
. . .
“Sedan” “Benz” “BMW” “Sedan” “Benz” “BMW”
“Van” “Benz” , we have “Sedan” “Van” “Benz”
“Van” “Benz” “Sedan” pk to compute proof
acc “Van” “Benz” from the block header and uses VerifyDisjoint AttDigest acc “Sedan” pk to verify the mismatch 12/17
. . . PreBkHash TS ConsProof ObjectHash AttDigest
blocki
. . .
“Sedan” “Benz” “BMW” “Sedan” “Benz” “BMW”
“Van” “Benz” , we have “Sedan” “Van” “Benz”
“Van” “Benz” “Sedan” pk to compute proof
acc “Van” “Benz” from the block header and uses VerifyDisjoint AttDigest acc “Sedan” pk to verify the mismatch 12/17
. . . PreBkHash TS ConsProof ObjectHash AttDigest
blocki
. . .
“Sedan” “Benz” “BMW” “Sedan” “Benz” “BMW”
“Van” “Benz” , we have “Sedan” “Van” “Benz”
“Van” “Benz” “Sedan” pk to compute proof
acc “Van” “Benz” from the block header and uses VerifyDisjoint AttDigest acc “Sedan” pk to verify the mismatch 12/17
. . . PreBkHash TS ConsProof ObjectHash AttDigest
blocki
. . .
VerifyDisjoint(AttDigest, acc({“Sedan”}), π, pk) to verify the mismatch 12/17
13/17
00 000 001 01 010 011 1 10 100 101 11 110 111 q 0 6
14/17
00 000 001 01 010 011 1 10 100 101 11 110 111 q 0 6
14/17
∗ 0∗ 00∗ 000 001 01∗ 010 011 1∗ 10∗ 100 101 11∗ 110 111 q = [0, 6]
14/17
∗ 0∗ 00∗ 000 001 01∗ 010 011 1∗ 10∗ 100 101 11∗ 110 111 q = [0, 6]
14/17
PreBkHash TS ConsProof MerkleRoot Nr N5 N1 N2 N6 N3 N4 hashr Wr AttDigestr hash1 W1 AttDigest1
blocki
Node Object Set Attributes N1
W1 “Sedan” “Benz” N2
W2 “Sedan” “Audi” N3
W3 “Van” “Benz” N4
W4 “Van” “BMW”
PreBkHash MerkleRoot SkipListRoot L2 L4
PreSkippedHashL2 WL2 AttDigestL2 PreSkippedHashL4 WL4 AttDigestL4
blocki
PreBkHash
blocki
2
PreBkHash
blocki
4
q1 q2 q3 q4 N1 N2 N3 N4 x y 1 2 3 1 2 3 N0 N1 N5 N6 N7 N8 N2 N3 N4
ti 0 2 “Van” “Benz” ti 001 102 “Van” “Benz” Query Range Boolean Condition q1 0 2 1 3 “Van” “Benz” q2 0 0 1 3 “Van” “BMW” q3 0 2 0 2 “Sedan” “Audi” q4 2 0 3 3 “Sedan” “Benz” Grid Cell 0 2 1 3 0 1 1 2 RCIF: Query Cover Type q1 full q2 full q3 partial Query Condition Set Queries “Van” q1 q2 “Benz” q1 “BMW” q2 BCIF:
15/17
PreBkHash TS ConsProof MerkleRoot Nr N5 N1 N2 N6 N3 N4 hashr Wr AttDigestr hash1 W1 AttDigest1
blocki
. . . . . . Node Object Set Attributes N1
W1 = {“Sedan”, “Benz”} N2
W2 = {“Sedan”, “Audi”} N3
W3 = {“Van”, “Benz”} N4
W4 = {“Van”, “BMW”}
PreBkHash MerkleRoot SkipListRoot L2 L4
PreSkippedHashL2 WL2 AttDigestL2 PreSkippedHashL4 WL4 AttDigestL4
blocki
PreBkHash
blocki
2
PreBkHash
blocki
4
q1 q2 q3 q4 N1 N2 N3 N4 x y 1 2 3 1 2 3 N0 N1 N5 N6 N7 N8 N2 N3 N4
ti 0 2 “Van” “Benz” ti 001 102 “Van” “Benz” Query Range Boolean Condition q1 0 2 1 3 “Van” “Benz” q2 0 0 1 3 “Van” “BMW” q3 0 2 0 2 “Sedan” “Audi” q4 2 0 3 3 “Sedan” “Benz” Grid Cell 0 2 1 3 0 1 1 2 RCIF: Query Cover Type q1 full q2 full q3 partial Query Condition Set Queries “Van” q1 q2 “Benz” q1 “BMW” q2 BCIF:
15/17
PreBkHash TS ConsProof MerkleRoot Nr N5 N1 N2 N6 N3 N4 hashr Wr AttDigestr hash1 W1 AttDigest1
blocki
. . . . . . Node Object Set Attributes N1
W1 = {“Sedan”, “Benz”} N2
W2 = {“Sedan”, “Audi”} N3
W3 = {“Van”, “Benz”} N4
W4 = {“Van”, “BMW”}
PreBkHash MerkleRoot SkipListRoot L2 L4 . . .
PreSkippedHashL2 WL2 AttDigestL2 PreSkippedHashL4 WL4 AttDigestL4 . . .
blocki
. . . PreBkHash . . . . . . . . .
blocki−2
. . . PreBkHash . . . . . . . . .
blocki−4
. . . . . .
q1 q2 q3 q4 N1 N2 N3 N4 x y 1 2 3 1 2 3 N0 N1 N5 N6 N7 N8 N2 N3 N4
ti 0 2 “Van” “Benz” ti 001 102 “Van” “Benz” Query Range Boolean Condition q1 0 2 1 3 “Van” “Benz” q2 0 0 1 3 “Van” “BMW” q3 0 2 0 2 “Sedan” “Audi” q4 2 0 3 3 “Sedan” “Benz” Grid Cell 0 2 1 3 0 1 1 2 RCIF: Query Cover Type q1 full q2 full q3 partial Query Condition Set Queries “Van” q1 q2 “Benz” q1 “BMW” q2 BCIF:
15/17
PreBkHash TS ConsProof MerkleRoot Nr N5 N1 N2 N6 N3 N4 hashr Wr AttDigestr hash1 W1 AttDigest1
blocki
. . . . . . Node Object Set Attributes N1
W1 = {“Sedan”, “Benz”} N2
W2 = {“Sedan”, “Audi”} N3
W3 = {“Van”, “Benz”} N4
W4 = {“Van”, “BMW”}
PreBkHash MerkleRoot SkipListRoot L2 L4 . . .
PreSkippedHashL2 WL2 AttDigestL2 PreSkippedHashL4 WL4 AttDigestL4 . . .
blocki
. . . PreBkHash . . . . . . . . .
blocki−2
. . . PreBkHash . . . . . . . . .
blocki−4
. . . . . .
q1 q2 q3 q4 N1 N2 N3 N4 x y 1 2 3 1 2 3 N0 N1 N5 N6 N7 N8 N2 N3 N4
= ti, {001, 102, “Van”, “Benz”} Query Range Boolean Condition q1 [(0, 2), (1, 3)] {“Van” ∧ “Benz”} q2 [(0, 0), (1, 3)] {“Van” ∧ “BMW”} q3 [(0, 2), (0, 2)] {“Sedan” ∧ “Audi”} q4 [(2, 0), (3, 3)] {“Sedan” ∧ “Benz”} Grid Cell : [(0, 2), (1, 3)] → {0∗1 ∧ 1∗2} RCIF: Query Cover Type q1 full q2 full q3 partial Query Condition Set Υ Queries {“Van”} q1, q2 {“Benz”} q1 {“BMW”} q2 BCIF:
15/17
terms of SP CPU time
terms of user CPU time
from the SP to the user
100 200 300 400 2 (240) 4 (480) 6 (720) 8 (960) 10 (1200) SP CPU Time (s) Time Window (Hour)/(Blocks) nil-acc1 nil-acc2 intra-acc1 intra-acc2 both-acc1 both-acc2 0.01 0.1 1 10 100 2 (240) 4 (480) 6 (720) 8 (960) 10 (1200) User CPU Time (s) Time Window (Hour)/(Blocks) nil-acc1 nil-acc2 intra-acc1 intra-acc2 both-acc1 both-acc2 1 10 102 103 104 2 (240) 4 (480) 6 (720) 8 (960) 10 (1200) VO Size (KB) Time Window (Hour)/(Blocks) nil-acc1 nil-acc2 intra-acc1 intra-acc2 both-acc1 both-acc2
5 10 15 20 (20) 40 (40) 60 (60) 80 (80) 100 (100) SP CPU Time (s) Time Window (Hour)/(Blocks) nil-acc1 nil-acc2 intra-acc1 intra-acc2 both-acc1 both-acc2 0.01 0.1 1 10 20 (20) 40 (40) 60 (60) 80 (80) 100 (100) User CPU Time (s) Time Window (Hour)/(Blocks) nil-acc1 nil-acc2 intra-acc1 intra-acc2 both-acc1 both-acc2 10 102 103 20 (20) 40 (40) 60 (60) 80 (80) 100 (100) VO Size (KB) Time Window (Hour)/(Blocks) nil-acc1 nil-acc2 intra-acc1 intra-acc2 both-acc1 both-acc2
50 100 150 2 (480) 4 (960) 6 (1440) 8 (1920) 10 (2400) SP CPU Time (s) Time Window (Hour)/(Blocks) nil-acc1 nil-acc2 intra-acc1 intra-acc2 both-acc1 both-acc2 0.01 0.1 1 10 100 2 (480) 4 (960) 6 (1440) 8 (1920) 10 (2400) User CPU Time (s) Time Window (Hour)/(Blocks) nil-acc1 nil-acc2 intra-acc1 intra-acc2 both-acc1 both-acc2 1 10 102 103 104 2 (480) 4 (960) 6 (1440) 8 (1920) 10 (2400) VO Size (KB) Time Window (Hour)/(Blocks) nil-acc1 nil-acc2 intra-acc1 intra-acc2 both-acc1 both-acc2
16/17
... ... Hybrid Storage Cloud Service Provider Client Data Owners R, VOsp VOchain Q
Smart Contract
<key, value> ... Smart Contract <key, h(value)>
Hybrid-Storage Blockchain 17/17
... ... Hybrid Storage Cloud Service Provider Client Data Owners R, VOsp VOchain Q
Smart Contract
<key, value> ... Smart Contract <key, h(value)>
Hybrid-Storage Blockchain 17/17
... ... Hybrid Storage Cloud Service Provider Client Data Owners R, VOsp VOchain Q
Smart Contract
<key, value> ... Smart Contract <key, h(value)>
Hybrid-Storage Blockchain 17/17
... ... Hybrid Storage Cloud Service Provider Client Data Owners R, VOsp VOchain Q
Smart Contract
<key, value> ... Smart Contract <key, h(value)>
Hybrid-Storage Blockchain 17/17
17/17
[HCW+18]
decentralized, reliable and fair realization,” in IEEE INFOCOM, Honolulu, HI, USA, 2018, pp. 792–800. [Mer89]
[PTT11]
CRYPTO, Santa Barbara, CA, USA, 2011, pp. 91–110. [XZX19]
SIGMOD, Amsterdam, Netherlands, 2019. [ZXX+19]
in blockchain,” in IEEE ICDE, Macau SAR, China, 2019.