質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

7451閲覧

JavascriptをC言語に変換する方法

SoraSue

総合スコア30

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/02/15 23:03

編集2018/02/16 02:38

任意のJavaScriptをC言語に変換したいです。なぜなら、pequinというCのライブラリで任意のJavaScriptの関数をゼロ知識証明できるようにしたいからです。
(今回実装したいゼロ知識証明は、Ethereumのzk-SNARKのように任意のコードを正しく実行したかをゼロ知識・非対話で証明するようなものです。このサイトのような感じです。https://zoom-blc.com/what-is-ethereum-zk-snark)
もちろん、JavaScriptは動的型付け言語なのに対しC言語は静的型付け言語なので、実行しながら変換しても大丈夫です。

お忙しいところすみませんが、ご回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/15 23:08

なにができなかったの?
SoraSue

2018/02/16 00:20

今は何かできなかったというより、最初の一歩が見つからないという状況です。EmscriptenというJavaScriptとC言語を連携するライブラリを見つけたのですが、ゼロ知識証明では証明する関数の結果だけでなく過程も必要なので、やはりJavaScriptの処理をC言語に直接翻訳しないといけないんです。
SoraSue

2018/02/16 00:46

すみませんでした。もう少し自分で色々試し、検証してみます。
m.ts10806

2018/02/16 01:33

その旨、質問編集で追記するか、回答として自己解決としては?
SoraSue

2018/02/16 02:07

わかりました。自己解決ということにし、一旦質問を閉ざさせていただきます。今回はすみませんでした。
defghi1977

2018/02/16 02:13

いや, teratailの趣旨にそぐわない質問ではあるものの, 意図そのものを否定するわけではないので「自己解決」までは必要ないかと
m.ts10806

2018/02/16 02:43

確かにそうですね。私の方も失礼しました。
kei344

2018/02/16 03:26

JavaScript側でC言語の処理を行いたいということでしょうか?C言語内でJavaScriptの処理を行いたいのでしょうか。
SoraSue

2018/02/16 03:28

C言語内でJavaScriptの処理を行いたいです。
kei344

2018/02/16 03:33

JavaScriptの関数をチェックするならJavaScriptのコードからC言語の検証ライブラリを利用する形になるのでは?
SoraSue

2018/02/16 03:39

チェックしようと考えているのは、「ある信用できない人があるデータを提示してきたとき、そのデータが指定した関数を正しく実行して返ってきたデータなのか」ということです。(ピントがずれていたらすみません。)
guest

回答2

0

ベストアンサー

この質問では「何がゴールか」がかなり重要になってきます。
下記で幾つか理由をあげていますが、回答をポンと差し上げることは不可能でしょう。

そこで、私が理解している部分から、調査の手助けになるかと思った知識を共有します。
あまり役に立ってない気がしますが、参考になれば幸いです。


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というバイトコードに溶かし込んで評価すればある程度の所までは行けるかもしれません。

投稿2018/02/16 02:14

編集2018/02/16 02:25
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SoraSue

2018/02/16 02:28

率直な意見をくださりありがとうございます。 説明不足な点もたくさんありました。 まず、今回実装したいゼロ知識証明は、Ethereumのzk-SNARKのように任意のコードを正しく実行したかをゼロ知識・非対話で証明するようなものです。(このサイトのような感じです。https://zoom-blc.com/what-is-ethereum-zk-snark) そして、pequinというライブラリを使うと、C言語で任意のコードをゼロ知識証明できます。例えばこれです。https://github.com/pepper-project/pequin/blob/master/pepper/apps/mm_pure_arith.c もちろん、C言語で直接コードを書けば使えるのですが、僕は多くの開発者が簡単にゼロ知識証明できるようにしたいと考えておりますので、JavaScriptでアルゴリズムをかけるようにしようとしています。
miyabi-sun

2018/02/16 02:34 編集

あー、ゼロ知識証明者の代行を行う機能を提供したいんですね。 でもコードの静的解析がゴールならpequinでは役に立たないでしょうね。
SoraSue

2018/02/16 02:36

本家のlibsnarkの方がいいですか?
miyabi-sun

2018/02/16 02:53 編集

うーん、調べてみましたがよくわからないですね。 両方「静的なCのコードを投げ込むと、コードを静的解釈してゼロ知識証明してくれる」ライブラリのように思えますが合ってますか? だとすれば無理です。 JavaScriptを綺麗なC言語にコンパイルするトランスパイラはまだ見つかってませんよね? 見つけられて、そのトランスパイラにバグがなければ一瞬で終わることでしょう。 しかし、現状はC→LLVMと、JS→LLVMは可能という所までしか分かっていませんので、 どちらもLLVMというバイトコードとしてドロドロに溶かしあったもの同士にして沢山実行してみたり妥当かを検証するくらいしかなさそうです。 なのでpequin、libsnarkのどちらも、現状では役に立たない可能性が高いと判断しています。
miyabi-sun

2018/02/16 02:53 編集

私がもう少しCが強ければガンガン読んだりして、もっと詳細なアドバイスが出来るんですけどね。 JS回りは多少強いので、私の回答欄でもう少し調べ物が捗りそうといった意図で共有しただけなので、 もうガス欠で更に有益な情報は出せないと思います。 力不足で申し訳ないです。 自力で頑張ってみてください。
SoraSue

2018/02/16 02:56

ここまで助けていただきありがとうございました!まだ詰めの甘いところが今回わかったので、そこを直していき誰もが使えるようなシステムを作ります! 今後は、開発者に直接C言語のコードを書いてもらうか、自分でJavaScript用のゼロ知識証明ライブラリを作るかにしようと思います。
guest

0

すみませんでした。
みなさんに質問させていただく前に行うべきことを行なっていませんでした。
もう少し自分で色々試し、検証してみます。

投稿2018/02/16 02:08

SoraSue

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問