🚀
zkSQLさわる
概要
信頼できない環境で動いているデータベースに対して実行される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
-
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`
));
調べ中。
Discussion