WARNING: This is an academic proof-of-concept prototype, and in particular has not received careful code review. This implementation is NOT ready for production use.
If you find the code here useful, please consider to cite the following papers:
@inproceedings{SIGMOD19:vchain,
author = {Xu, Cheng and Zhang, Ce and Xu, Jianliang},
title = {{vChain}: Enabling Verifiable Boolean Range Queries over Blockchain Databases},
booktitle = {Proceedings of the 2019 ACM SIGMOD International Conference on Management of Data},
year = {2019},
month = jun,
address = {Amsterdam, Netherlands},
pages = {141--158},
isbn = {978-1-4503-5643-5},
doi = {10.1145/3299869.3300083}
}
@inproceedings{SIGMOD20:vchain-demo,
author = {Wang, Haixin and Xu, Cheng and Zhang, Ce and Xu, Jianliang},
title = {{vChain}: A Blockchain System Ensuring Query Integrity},
booktitle = {Proceedings of the 2020 ACM SIGMOD International Conference on Management of Data},
year = {2020},
month = jun,
address = {Portland, OR, USA},
pages = {2693--2696},
isbn = {978-1-4503-6735-6},
doi = {10.1145/3318464.3384682}
}- Install Rust from https://rustup.rs.
- Run
cargo testfor unit test. - Run
cargo build --releaseto build the binaries, which will be located attarget/release/folder.
The input is a text file with each line represent an object.
obj := block_id [ v_data ] { w_data }
v_data := v_1, v_2, ...
w_data := w_1, w_2, ...
For example
1 [1,2] {a,b,c}
1 [1,5] {a}
2 [3,4] {a,e}
Run simchain-build to build the database. You need to specify the bit length for each dimension of the v data. For example:
./target/release/simchain-build --bit-len 16,16 --skip-list-max-level 10 -i /path/to/data.txt -o /path/to/output_databaseRun simchain-build --help for more info.
Run simchain-server after the database is built. For example:
./target/release/simchain-server -b 127.0.0.1:8000 --db /path/to/databaseRun simchain-server --help for more info.
Use following API endpoints to inspect the blockchain. Returned response is a JSON object. Refer to source code for their definitions.
GET /get/param
GET /get/blk_header/{id}
GET /get/blk_data/{id}
GET /get/intraindex/{id}
GET /get/skiplist/{id}
GET /get/index/{id}
GET /get/obj/{id}
API endpoint is:
POST /query
Encode query parameter as a JSON object. The following example specifies range as [(1, *, 2), (3, *, 4)] for 3 dimension objects, and bool expression as "A" AND ("B" OR "C").
{
"start_block": 1,
"end_block": 10,
"range": [[1, null, 2], [3, null, 4]],
"bool": [["a"], ["b", "c"]]
}The response is a JSON object like:
{
"result": ...,
"vo": ...,
"query_time_in_ms": ...,
"vo_size": ... // in bytes
"stats": ...,
...
}Refer to the source code for their definitions.
Pass the query response directly to the following endpoint for verification.
POST /verify
The response is a JSON object like:
{
"pass": true,
"detail": ... // detail reason for failure
"verify_time_in_ms": ...
}Run vchain-node to start up a single node blockchain network. For example:
./vchain-node -- --bit-len 16,16 --skip-list-max-level 5 --db /path/to/databaseRun vchain-node --help for more info.
Run vchain-send-tx to send TX to the node. The data input format is the same as that in the SimChain.
./vchain-send-tx -- -i /path/to/data.txtRun vchain-send-tx --help for more info.
Run vchain-server to start a server. The REST APIs are the same as those in the SimChain.
./vchain-server -b 127.0.0.1:8000Run vchain-server --help for more info.