この質問では「何がゴールか」がかなり重要になってきます。
下記で幾つか理由をあげていますが、回答をポンと差し上げることは不可能でしょう。
そこで、私が理解している部分から、調査の手助けになるかと思った知識を共有します。
あまり役に立ってない気がしますが、参考になれば幸いです。
EmscriptenというJavaScriptとC言語を連携するライブラリを見つけたのですが
Emscriptenは「JavascriptをC言語に変換する方法」ではありません。
あれはLLVMというバイトコードに変換掛けた後、JSで動作するコードに固め直したものです。
私はEmscriptenを使った事がありますが、ブラウザのメモリ空間上に仮想的なLLVMの実行環境を作ってそこでビット演算し始めるので、制約がかなり多いですし、そもそもJSと呼べるかどうかは怪しいものです。
そもそもJSがC言語になっているわけでもないですし役に立つのかは正直不明です。
ゼロ知識証明では証明する関数の結果だけでなく過程も必要なので
ゼロ知識証明は秘密鍵を公開せずに、私が秘密鍵を持っている事を証明する方法ですよね。
この質問のゼロ知識証明の言葉の定義は世間一般のものとは違うので、そこの説明は必要だと思います。
拡大解釈した場合、
関数そのものを隠して、引数を変更しつつ何度も関数を実行して、その戻り値が全て妥当ならば
ゼロ知識証明ができたというものを想像しますが、過程が必要なのでJSのコードが欲しいという本文の記載と矛盾しているように思えます。
JavaScriptの関数をゼロ知識証明できるようにしたい
JavaScriptの関数は2種類あることはご存知ですか?
- 数学的な意味合いに近い戻り値がちゃんと返ってくる函数
- 処理だけ行って「後はさようなら」なサブルーチン
多くの言語はfunctionといってもこの両面は当然のようにあるものですが、
特にJSは後者の役割がかなり重要です。
JSが得意とする非同期処理の大多数はほぼ全てこれ。
処理を行ってくださいね、終わったらこれ実行しておいてくださいね。
あー私の仕事は終わり、return。という関数が山のように存在します。
前者は言葉の定義次第ですが可能でしょう。
後者はどうやってゼロ知識証明するのですか?
JavascriptをC言語に変換する方法
解釈の仕方によっては可能だとは思いますが、普通に考えれば無理です。
特にオブジェクトという壁が厚く、JavaScriptは関数や配列や連想配列は全てオブジェクトです。
例えばこれどうするんですか?
JavaScript
1var items = [123, "234"];
2var results = items.map(function (it) {
3 return parseInt(it) + 100;
4});
5console.log(results);
items
は数値と文字列を両方所持している配列である
items
はObjectから派生した配列という型である為に、mapというメソッドを所持している
- C言語には関数の引数や戻り値に関数を設定することは出来ない(ポインタ渡しで解決出来ましたっけ?)
- mapに流し込んでいる関数の引数の型はどうするんだろう…
これらの問題があるので、100人のエンジニアにこの4行をCに変換してねと言えば、
100通りとは言わないまでも相当の混乱が発生することは目に見えています。
意地悪はさておき、「JavaScript to LLVM」という感じのワードで検索すると下記の記事がヒットしました。
英語はあまり得意ではないのでリンクだけ貼り付けておきます。
Introducing the WebKit FTL JIT
詳細は分かりませんが、JSからLLVMに変換することは可能なようです。
お互いをLLMVというバイトコードに溶かし込んで評価すればある程度の所までは行けるかもしれません。