LoginSignup
1
0

More than 1 year has passed since last update.

準同型暗号ライブラリconcrete のWebAssembly化に取り組んだ話

Last updated at Posted at 2022-12-10

概要

Web3ハッカソンに出場し、(結局制約が多すぎて諦めたのだったが)Solanaスマートコントラクト上で格子暗号ライブラリを動かして、鍵交換などを実装した「セキュアな位置情報共有アプリ」を作ろうと考えていました。

SolanaチェーンはRustで実装されており、スマートコントラクトもRustで実装できるため、
開発当初は、「これは格子暗号ライブラリのconcrete」と相性が良いのでは(concrete はRust実装されている)
と考えて、スマートコントラクト上で動かしてみよう!となっていました。

結果として、そのスマートコントラクトへとアクセスするクライアントはJavascript (Vuejs)で実装しようと思っていたので、concrete の必要な部分の関数を、クライアント内で実行できるように、
concrete をWebassembly でラップしてみようじゃないか、と考え、実装した時の備忘録を書きたいと思います。

実装したレポジトリ

ここに、wasmへのエクスポートを実装しています。

実装の流れや、エクスポートのコマンド自体は上のドキュメントに沿って実装しました。

wasm-pack build --target web

によって pkg フォルダが生成され、

(myenv) kmihara ~/Documents/web3-hackathon/concrete-experiment $ ls -l pkg/
total 504
-rw-r--r-- 1 kmihara staff    208 Oct 30 13:56 README.md
-rw-r--r-- 1 kmihara staff   3490 Nov 28 23:06 concrete_experiment.d.ts
-rw-r--r-- 1 kmihara staff  14106 Nov 28 23:06 concrete_experiment.js
-rw-r--r-- 1 kmihara staff 481004 Nov 28 23:06 concrete_experiment_bg.wasm
-rw-r--r-- 1 kmihara staff   1192 Nov 28 23:06 concrete_experiment_bg.wasm.d.ts
-rw-r--r-- 1 kmihara staff    272 Nov 28 23:06 package.json

のような中身ができていたら完成です。

実際に pkg フォルダを生成できたら、javascript から実際に呼んでみます。

index.html
<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <title>hello-wasm example</title>
  </head>
  <body>
    <script type="module" src="index.js">
    </script>
  </body>
</html>
index.js
import init, {generate_sk} from "./pkg/concrete_experiment.js";
init()
.then(() => {
    console.log("will do generate_sk")
    let sk = generate_sk()
    console.log("finished generate_sk")
    console.log(sk)

とし、(非常に見難いですが)以下のようにクライアントサイドでconcrete ライブラリによる鍵生成ができることを確認できました。

Screen Shot 2022-11-28 at 23.05.07.png

まとめ

ハッカソンという短い期間での実装の中で、concrete をスマートコントラクト上で実行しようとしたのは、
結果としては失敗することになるのですが、
このように、付随技術としてWebAssembly へのバインディングを実装できたりと、いろいろとやはり学んだものが多かったです。

今回は一旦実装をストップしてしまいましたが、
また時間を作ってconcrete ライブラリの活用については今一度チャレンジしてみたいです。
特に、スマートコントラクト上で動かさないとしても、今回のWasmバインディングを用いて、
ブラウザ上で鍵生成や復号、サーバへの暗号の送信など、いろいろなことを試してみれるかなと思いました。

試してみたらまた記事にしようと思います。

今回はこの辺で。

@kenmaro

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0