# 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涓婁紶瀹屽悗鐢辫剼鏈皟鐢紝杩涜妫€鏌�