🚀

zkSQLさわる

2023/02/27に公開

概要

https://github.com/timoftime/zk-SQL
信頼できない環境で動いているデータベースに対して実行されるSQLクエリの正しさを証明するための基本的なツールとインフラストラクチャ, zk-SQLを触ってみる

Goal

Insert, Select, Update を動かす。

Result

動かなかった。終わり

Environments

circom verison

$ circom  -V
circom compiler 2.1.3

Prepare

Deploy Contract

hardhat.config.ts のNetworkをPolygonに修正しDeployした。

npx hardhat run scripts/deploy-contracts.ts   --network mainnet
insertVerifier deployed to: 0x4c34F545DECBC5a854bdb9B126a735c6AC7119D5
updateVerifier deployed to: 0xFD504c7a7b8BD69617A3cD27f4fdB96832A3C3aa
deleteVerifier deployed to: 0x6F6a91921B0C948Cc7C3bb769B1d81e2Db633e98
zkSQL deployed to: 0xf5618d055A146675A366B27E0AD1D0232A1B2b99

Change .env values

  1. HARMONY_PRIVATE_KEY を設定する。Harmonyで試したら動かなかったのでPolygonで動かす。
mv .env.sample .env
- HARMONY_PRIVATE_KEY=
+ HARMONY_PRIVATE_KEY=01234abc...
mv node/.env.sample node/.env
PORT=8083
- HARMONY_PRIVATE_KEY=
+ HARMONY_PRIVATE_KEY=01234abc...
- ZK_SQL_CONTRACT=0x45c09D0C0CAa0b9CD9BAB98c2D7774a22EDACeFa
+ ZK_SQL_CONTRACT=0xf5618d055A146675A366B27E0AD1D0232A1B2b99
- CHAIN_RPC=https://api.s0.ps.hmny.io
+ CHAIN_RPC=https://polygon-mainnet.infura.io/v3/<*key*>
- DEPLOYMENT_BLOCK=6655268
+ DEPLOYMENT_BLOCK=39698236
DEPLOYMENT_BLOCK=6655268
DB_CACHE_PATH=../cache/database.sqlite

なおここで、ContractAddrをDeploy済みに、RPCをPolygonのものに変更した。

Run

$ yarn install
$ make build
...
✨  Done in 4.54s.
INFO] 00:10:18 ts-node-dev ver. 2.0.0 (using ts-node ver. 10.8.1, typescript ver. 4.7.4)
Debugger listening on ws://127.0.0.1:9229/6e649ebd-ede1-48fa-8b23-fe7790e42051
For help, see: https://nodejs.org/en/docs/inspector
[2023-02-26T00:10:21.547] [INFO ] [TSED] - Injector created... +5ms
[2023-02-26T00:10:21.549] [INFO ] [TSED] - Build providers +2ms
tableCommitments: Map(0) {}
knownTables: Map(0) {}
started listening...
[2023-02-26T00:10:24.392] [INFO ] [TSED] - Settings and injector loaded... +2843ms
[2023-02-26T00:10:24.395] [INFO ] [TSED] - Load routes +3ms
[2023-02-26T00:10:24.398] [INFO ] [TSED] - Routes mounted... +3ms
[2023-02-26T00:10:24.398] [INFO ] [TSED] - 
┌────────────────┬────────────────┬───────────────────────────────────────┐
│ Method         │ Endpoint       │ Class method                          │
│────────────────│────────────────│───────────────────────────────────────│
│ POST           │ /api/create/   │ CreateTableController.updatePayload() │
│────────────────│────────────────│───────────────────────────────────────│
│ GET            │ /api/query/:id │ QueryController.updatePayload()       │
│────────────────│────────────────│───────────────────────────────────────│
│ POST           │ /api/request/  │ RequestController.updatePayload()     │
│────────────────│────────────────│───────────────────────────────────────│
│ GET            │ /api/tables/   │ TablesController.updatePayload()      │
└────────────────┴────────────────┴───────────────────────────────────────┘
[2023-02-26T00:10:24.400] [INFO ] [TSED] - Listen server on http://0.0.0.0:8083
[2023-02-26T00:10:24.401] [INFO ] [TSED] - [default] Swagger JSON is available on http://0.0.0.0:8083/doc/swagger.json
[2023-02-26T00:10:24.401] [INFO ] [TSED] - [default] Swagger UI is available on http://0.0.0.0:8083/doc/
[2023-02-26T00:10:24.401] [INFO ] [TSED] - Started in 2859 ms +3ms

もう一つターミナルを立ち上げUIを動かす

yarn start-ui
yarn run v1.22.19
$ yarn workspace zk-sql-ui dev
$ next dev
ready - started server on 0.0.0.0:3000, url: http://localhost:3000

Tableはできたっぽいがエラーが出た。

TypeError: Cannot read properties of undefined (reading 'map')

This error happened while generating the page. Any console logs will be displayed in the terminal window.
Source
components/ui/TableView.tsx (31:58) @ TableView

  29 | export const TableView: FC<TableViewProps> = ({tableName, columnNames}) => {
  30 |   const [values, setValues] = useState([]);
> 31 |   const [tableColumns, setColumns] = useState(columnNames.map(cn => ({
     |                                                          ^
  32 |       Header: cn,
  33 |       accessor: cn,
  34 |       isNumeric: true,
Show collapsed frames

どうも node(local)に table が登録されてないっぽい。どうも、 id をParam名にすると重複エラーがでてこける。

$ curl localhost:8083/api/tables | jq
{}

なので、もう一度別のTableを作成。
id を消すとうまくいった。

データを登録する。

Insertはできた。

なぜかSelectできない。

error: "LinkError: WebAssembly.instantiate(): Import #1 module=\"runtime\" function=\"printErrorMessage\" error: function import requires a callable"
ready: true

Node側のここでエラーが出る。

const {plonk} = require("snarkjs");
...
await plonk.fullProve(
    result.inputs,
    `${circuitsPath}/insert/insert_js/insert.wasm`,
    `${circuitsPath}/insert/circuit_final.zkey`
));

調べ中。
https://github.com/iden3/snarkjs/issues/217

Discussion