概要
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 から実際に呼んでみます。
<!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>
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 ライブラリによる鍵生成ができることを確認できました。
まとめ
ハッカソンという短い期間での実装の中で、concrete をスマートコントラクト上で実行しようとしたのは、
結果としては失敗することになるのですが、
このように、付随技術としてWebAssembly へのバインディングを実装できたりと、いろいろとやはり学んだものが多かったです。
今回は一旦実装をストップしてしまいましたが、
また時間を作ってconcrete ライブラリの活用については今一度チャレンジしてみたいです。
特に、スマートコントラクト上で動かさないとしても、今回のWasmバインディングを用いて、
ブラウザ上で鍵生成や復号、サーバへの暗号の送信など、いろいろなことを試してみれるかなと思いました。
試してみたらまた記事にしようと思います。
今回はこの辺で。