# VerifiableDB鍚堢害浣跨敤
浣跨敤鏂囨。璇峰弬鑰僛浣跨敤鏂囨。](./鍙獙璇佹暟鎹簱浣跨敤鏂囨。.md)銆�
寮€鍙戞枃妗o紝鏆ㄥ瓨鍌ㄥ紩鎿庣殑婧愮爜缂栬瘧鍜屾祴璇曟枃妗o紝璇峰弬鑰僛寮€鍙戞枃妗(./鍙獙璇佹暟鎹簱寮€鍙戞枃妗�.md)銆�
鎶€鏈枃妗h鍙傝€僛鎶€鏈枃妗(../tech/鍙獙璇佹暟鎹簱鎶€鏈枃妗�.md)銆�
椤圭洰浠g爜鍦板潃锛歔https://git.chainmaker.org.cn/ibpc/verifiable-database](https://git.chainmaker.org.cn/ibpc/verifiable-database)
## 鐜瑕佹眰
- 闀垮畨閾緑2.3.1
- 閾句笅鏁版嵁搴搗1.1.0锛圡ySQL v5.7.30锛�
- 閰嶅鍚堢害v1.1.0
- docker
- 7zip
## 璋冪敤娴佺▼
1. 閾句笅鏁版嵁搴撳畾鏈熼€氳繃update_offchain_status杩涜鏂囦欢鐨勫浠藉苟涓婁紶鏍瑰搱甯屽埌鍚堢害涓紝鐢ㄦ埛鍙互閫氳繃get_hash_by_time_table杩涜鏌ヨ
2. 鐢ㄦ埛閫氳繃璋冪敤search_from_offchain鍙戣捣涓€娆℃煡璇紝瑙﹀彂BeginSearch浜嬩欢
3. 閾句笅鏁版嵁搴撶洃鍚埌BeginSearch浜嬩欢锛屽紑濮嬭繘琛屾煡璇�
4. 鏌ヨ瀹屾瘯鍚庨摼涓嬫暟鎹簱涓婁紶鏌ヨ缁撴灉銆佽寖鍥磋瘉鏄庡拰榛樺厠灏旇瘉鏄庯紝骞舵洿鏂版煡璇簨浠跺厓淇℃伅锛岃Е鍙慐ndSearch浜嬩欢
5. 閾句笂瀹屾垚鏌ヨ缁撴灉銆佽寖鍥磋瘉鏄庡拰榛樺厠灏旇瘉鏄庣殑妫€楠�
6. 鐢ㄦ埛鍙互閫氳繃get_status_and_result闅忔椂鑾峰緱鏌ヨ鐩墠鐨勭姸鎬侊紝鏌ヨ鎴愬姛鍚庡彲鑾峰緱鏌ヨ缁撴灉
## 鍚堢害缁撴瀯
### 鍑芥暟缁撴瀯
```
鈹� update_offchain_status # 涓婁紶鎸囧畾鏃堕棿鍜岃〃鍚嶇殑鏍瑰搱甯�
鈹� get_hash_by_time_table # 浠庤〃鍚嶅拰鏃堕棿鏌ヨ鏍瑰搱甯屾槸鍚︿笂浼�
鈹� search_from_offchain # 浠庨摼涓婂彂璧锋煡璇簨浠�
鈹� upload_from_offchain # 浠庨摼涓嬩笂浼犳煡璇㈢姸鎬佸拰鍏冧俊鎭�
鈹� update_range_proof # 涓婁紶range proof
鈹� update_merkle_proof # 涓婁紶merkle proof
鈹� update_result # 涓婁紶鏌ヨ缁撴灉
鈹� result_and_range_proof_check # 杩涜鏌ヨ缁撴灉鍜宺ange proof鐨勬鏌�
鈹� merkle_proof_check # 杩涜merkle proof鐨勬鏌�
鈹� get_status_and_result # 鏍规嵁鏌ヨ鍙疯幏鍙栨煡璇㈢粨鏋滀笌鐘舵€�
```
### 瀛樺偍鏁版嵁缁撴瀯
#### TTHash
```
鈹� Time # 鎸囧畾鏃堕棿
鈹� Table # 鎸囧畾琛ㄥ悕
鈹� Hash # 瀵瑰簲鐨勬牴鍝堝笇
```
#### Proof
```
鈹� SearchId # 鏌ヨ鍙�
鈹� ProofId # 璇佹槑搴忓彿
鈹� Hash # 鑺傜偣鍝堝笇
鈹� RawString # 鑺傜偣鐨勫彾瀛愮粨鐐规暟鎹�
```
#### Result
```
鈹� SearchId # 鏌ヨ鍙�
鈹� ResultId # 璇佹槑搴忓彿
鈹� K # 涓婚敭
鈹� SK # 娆¢敭
鈹� Data # 缁撴灉鏁版嵁
鈹� Valid # 鏄惁婊¤冻绾︽潫锛堟爣璇嗕綅锛�
```
#### SearchInfo
```
鈹� SearchId # 鏌ヨ鍙�
鈹� Time # 鎸囧畾鏃堕棿
鈹� Table # 鎸囧畾琛ㄥ悕
鈹� SK # 涓婚敭涓嬮檺
鈹� EK # 涓婚敭涓婇檺
鈹� SSK # 娆¢敭涓嬮檺
鈹� SEK # 娆¢敭涓婇檺
鈹� Status # 鏌ヨ鐘舵€�
鈹� Merkle # Merkle璇佹槑妫€楠岀姸鎬�
鈹� ProofNum # 璇佹槑鏁伴噺
鈹� ResultNum # 鏌ヨ缁撴灉鏁伴噺
鈹� ProofLayer # 璇佹槑灞傛暟
鈹� LeftKey # 鏌ヨ绗竴鏉″墠涓€鏉′富閿€�
鈹� LeftValue # 鏌ヨ绗竴鏉″墠涓€鏉″€�
鈹� StartKey # 鏌ヨ绗竴鏉′富閿€�
鈹� StartValue # 鏌ヨ绗竴鏉″€�
鈹� EndKey # 鏌ヨ鏈€鍚庝竴鏉′富閿€�
鈹� EndValue # 鏌ヨ鏈€鍚庝竴鏉″€�
鈹� RightKey # 鏌ヨ绗竴鏉℃渶鍚庝竴鏉′富閿€�
鈹� RightValue # 鏌ヨ绗竴鏉℃渶鍚庝竴鏉″€�
```
### 瀛樺偍浜嬩欢缁撴瀯
#### new_status_update
```
鈹� Time # 鎸囧畾鏃堕棿
鈹� Table # 鎸囧畾琛ㄥ悕
鈹� Hash # 瀵瑰簲鐨勬牴鍝堝笇
```
#### BeginSearch
```
鈹� SearchId # 鏌ヨ鍙�
鈹� Time # 鎸囧畾鏃堕棿
鈹� Table # 鎸囧畾琛ㄥ悕
鈹� SK # 涓婚敭涓嬮檺
鈹� EK # 涓婚敭涓婇檺
鈹� SSK # 娆¢敭涓嬮檺
鈹� SEK # 娆¢敭涓婇檺
```
#### EndSearch
```
鈹� SearchId # 鏌ヨ鍙�
鈹� Time # 鎸囧畾鏃堕棿
鈹� Table # 鎸囧畾琛ㄥ悕
鈹� SK # 涓婚敭涓嬮檺
鈹� EK # 涓婚敭涓婇檺
鈹� SSK # 娆¢敭涓嬮檺
鈹� SEK # 娆¢敭涓婇檺
鈹� Status # 鏌ヨ鐘舵€�
鈹� ResultNum # 鏌ヨ缁撴灉鏁伴噺
鈹� ProofLayer # 璇佹槑灞傛暟
鈹� LeftKey # 鏌ヨ绗竴鏉″墠涓€鏉′富閿€�
鈹� LeftValue # 鏌ヨ绗竴鏉″墠涓€鏉″€�
鈹� StartKey # 鏌ヨ绗竴鏉′富閿€�
鈹� StartValue # 鏌ヨ绗竴鏉″€�
鈹� EndKey # 鏌ヨ鏈€鍚庝竴鏉′富閿€�
鈹� EndValue # 鏌ヨ鏈€鍚庝竴鏉″€�
鈹� RightKey # 鏌ヨ绗竴鏉℃渶鍚庝竴鏉′富閿€�
鈹� RightValue # 鏌ヨ绗竴鏉℃渶鍚庝竴鏉″€�
```
#### UploadProof
```
鈹� SearchId # 鏌ヨ鍙�
鈹� ProofId # 璇佹槑搴忓彿
鈹� Hash # 鑺傜偣鍝堝笇
鈹� RawString # 鑺傜偣鐨勫彾瀛愮粨鐐规暟鎹�
```
#### UploadResult
```
鈹� SearchId # 鏌ヨ鍙�
鈹� ResultId # 璇佹槑搴忓彿
鈹� K # 涓婚敭
鈹� SK # 娆¢敭
鈹� Data # 缁撴灉鏁版嵁
```
## 鍚堢害閮ㄧ讲
### 鍚姩涓€鏉℃敮鎸丏OCKER_VM鐨勯摼
璇﹁闀垮畨閾緑2.3.1[瀹樻柟鏁欑▼](https://docs.chainmaker.org.cn/v2.3.1/html/instructions/鍚姩鏀寔Docker_VM鐨勯摼.html)
> 娉細姝ゅ伐鍏峰吋瀹归暱瀹夐摼鐗堟湰v2.3.1
### 閮ㄧ讲閰嶅鍚堢害
缂栬瘧鍚堢害
```
go build -ldflags="-s -w" -o VerifiableDB
7z a VerifiableDB VerifiableDB
```
灏嗙紪璇戝ソ鐨勫悎绾�7z鏂囦欢绉诲姩鍒癱hainmaker-go/tools/cmc/testdata/VerifiableDB鐩綍涓嬶紝杩斿洖cmc鐩綍锛岃繍琛屼互涓嬪懡浠�
```
$ ./cmc client contract user create \
--contract-name=VerifiableDB \
--runtime-type=DOCKER_GO \
--byte-code-path=./testdata/VerifiableDB/VerifiableDB.7z \
--version=1.0 \
--sdk-conf-path=./testdata/sdk_config.yml \
--admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.sign.key,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.sign.key,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.sign.key \
--admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.sign.crt,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.sign.crt,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.sign.crt \
--sync-result=true \
--params="{}"
```
## 鍚堢害浣跨敤
### 鐢ㄦ埛闇€瑕佺敤鍒扮殑鎺ュ彛
#### et_hash_by_time_table
閫氳繃鎸囧畾Time鍜孒ash鍙傛暟锛屾煡璇㈡槸鍚︽湁瀵瑰簲鏃堕棿鐨勬寚瀹氳〃鏍瑰搱甯屽凡涓婁紶鍒板悎绾︿腑
绀轰緥锛�
```
./cmc client contract user invoke \
--contract-name=VerifiableDB \
--method=get_hash_by_time_table \
--sdk-conf-path=./testdata/sdk_config.yml \
--params="{\"Time\":\"1\",\"Table\":\"test_tb\"}" \
--sync-result=true
```
#### search_from_offchain
閫氳繃鎸囧畾Time锛孴able,SK(涓婚敭璧峰鍊�)锛孍K锛堜富閿粨鏉熷€硷級锛孲SK(娆¢敭璧峰鍊硷紝濡傛灉鏃犲垯璁句负NULL)锛孲EK锛堟閿粨鏉熷€硷紝濡傛灉鏃犲垯璁句负NULL锛夋潵鍙戣捣涓€娆℃煡璇€€傚緱鍒扮殑杩斿洖鍊间负鏈鏌ヨ鐨勬煡璇㈠彿銆�
绀轰緥锛�
```
./cmc client contract user invoke \
--contract-name=VerifiableDB \
--method=search_from_offchain \
--sdk-conf-path=./testdata/sdk_config.yml \
--params="{\"Time\":\"1\",\"Table\":\"test_tb\",\"SK\":\"18\",\"EK\":\"22\",\"SSK\":\"NULL\",\"SEK\":\"NULL\"}" \
--sync-result=true
```
#### get_status_and_result
閫氳繃鎸囧畾SearchId鍙傛暟锛屾潵鑾峰彇鐩墠鏌ヨ鐨勭姸鎬侊紝濡傛灉缁撴灉銆乵erkleproof鍜宺angeproof閮芥楠屾垚鍔熷垯浠ヤ簨浠剁殑褰㈠紡杩斿洖鏌ヨ鏈夋晥鐨勭粨鏋�
绀轰緥锛�
```
$ ./cmc client contract user invoke \
--contract-name=VerifiableDB \
--method=update_offchain_status \
--sdk-conf-path=./testdata/sdk_config.yml \
--params="{\"Time\":\"1\",\"Hash\":\"Hash\"}" \
--sync-result=true
```
### 鍏朵粬鎺ュ彛鍜屽姛鑳�
浠ヤ笅鎺ュ彛鍧囩敱閾句笅鑴氭湰鐩存帴璋冪敤
#### update_offchain_status
鍦ㄦ瘡娆$敤鎴峰浠藉悗璋冪敤涓婁紶澶囦唤鐗堟湰鎸囧畾琛ㄧ殑鏍瑰搱甯�
#### upload_from_offchain
鍦ㄦ煡璇㈠畬鍚庝笂浼犳煡璇㈢粨鏋滃拰璇佹槑鐨勫厓淇℃伅锛�
#### update_range_proof
#### update_merkle_proof
#### update_result
鍒嗗埆鐢ㄤ簬涓婁紶rangeproof锛宮erkleproof鍜宺esult
#### result_and_range_proof_check
鍦╮esult鍜宺angeproof涓婁紶瀹岀敱鑴氭湰璋冪敤锛岃繘琛屾鏌�
#### merkle_proof_check
鍦╩erkleproof涓婁紶瀹屽悗鐢辫剼鏈皟鐢紝杩涜妫€鏌�