憂鬱な午後のひととき

10月31日_

macOS(Catalina)にgdbを入れる

gdbじゃなくてGDB to LLDB command mapみながらlldbで頑張るかと思ったがやはりいろいろ不便. catch throwはbreak set -E c++らしい. それはともかく

process handle SIGSEGV --notify true --pass true --stop true

とかしてもlldbがSEGVをキャッチせずにプロセスが終了してしまう. にっちもさっちもいかないのでgdbを入れてみる.

PermissionsDarwinみながらgdbにコード署名をつけようとしたけどエラー. 試行錯誤のすえ, キーチェーンアクセスで作ったgdb-certの秘密鍵のアクセス制御を一時的に「すべてのアプリケーションに許可」してから

sudo codesign -s gdb-cert `which gdb`

したらsudo gdbを動かせるようになった. lldbと違ってSEGVしたらちゃんとそこで止まる. するととまらないlldbはバグなのか?(もう全然Macを信用してない)

落ちる箇所を見たが単なる構造体のコピーで落ちてるのでデータコピーのコード生成がおかしいのだろうか. 他の環境, コンパイラで全部ちゃんと動いてるのでまたMacのclangだけおかしいのかもしれない(以前も何度かそういうのがあった. しばらくしてコンパイラのバージョンが上がったら落ちなくなった).

これ以上は調べる気がないので一時停止.

10月30日_

-Wl,-no-as-needed -ldl

VTuneでJIT APIがうまく動かない件, Intelの人からコメントをもらった. CentOSだとちゃんと動く. Ubuntuのリンカオプションのデフォルト挙動が違うかららしい. 上記オプションをつけると動くことを確認した. でも忘れて動かないよりは強制的にdlopenを呼ぶ方が気が楽かな.

要望

最近いろんな人からTwitterやらメールやらGitHubで要望がくるので対応が大変. どうしたもんか.

10月29日_

blsがmacOS Catalinaで落ちる

調べたらGMPを使わないようにしたら自分のmake testは通る. どうやらGMPが悪さをしてるらしい. ところがGMPでもいくつかclang on Catalinaでおかしいという報告があった(segmentation fault in t-toom53 test with MAC OS X Catalina, gmp-6.1.2 on MacOS 10.15 using GCC and two Clang).

g++-9をinstallして試したらGMPありでも落ちない. Appleのclangのせいかーと他人のせいにする.

全く関係ないけどCVSも落ちる(cvs broken on MacOs-Catalina?). ちゃんとみてないけどgetcwd()の挙動が何か変わったの?

10月28日_

マルチペアリング

集約署名の実装で今までmillerLoopをぐるぐる回していたのをマルチ版のmillerLoopVecを使うように変更したら1.2倍ぐらい速くなった. WebAssemblyとかでも使うことを考えて途中でmallocを避けるために固定長バッファを回さないといけないのが面倒. でも, もっと早くにやっとけばよかった.

10月26日_

G2のcofactor倍の高速化

eth2ではG2のmap-to-functionのcofactorが決められている. 「そのoriginalの値 x adj」だと高速に計算できる方法があって, mclは実装済みなのだけどcofacotrの値が決められているなら対応は難しいかなと思った. けどよく考えたらうまくいきそうだ.

H(m)をmからG2への高速な写像, adj H(m)をETH2で決められているcofactor倍に対応するものとする. そうしたらPをG1の生成元をとして

s ; 秘密鍵
pub = sP ; 公開鍵
σ = s(adj H(m)) ; 署名
e(P, σ) == e(pub, adj H(m)) ; 検証

s ; 秘密鍵
sP ; 公開鍵
σ = (s adj) H(m)) ; 署名
e((1/adj) P, σ)) == e(pub, H(m)) ; 検証

にすれば高速なままで計算できる. s(adj H(m))はG2のスカラー倍算が2回だけど(s adj) H(m)なら1回. ペアリングでもadj倍が不要になる.

実装したらうまくいってるっぽい.

10月25日_

テストpass

動かない原因が分かった. map-to-functionでeth2に書かれているのと異なるcofactorを使っていたせいだった. 楕円の点からG2の元に入れるためのcofactor倍はとても重たい処理なので避けたいのだが, 定数を変えるのは難しいだろうなあ. でもpassしたので一段落. うれしい. とりあえずissueを立てて聞いてみる.

10月23日_

Fp2のserialize

Fp2の元 x + yiのxとyのどちらの元を先にserializeするか間違えていた. あと参照しているテストコードがlittle endianをいいつつbig endianを渡していたりして混乱に拍車をかける.

10月22日_

try-and-incremental

eth2のmap-to-point関数はx座標を1増やしながら対応するyが存在するまで探す方法. G2の元なので±yのどちらを選ぶかのところの仕様をちゃんと実装する.

10月21日_

serialize

G1, G2, Fr, Fpのserialize/deserializeはちゃんと動いてる模様. するとmap-to-functionかあ.

10月20日_

eth2対応

eth2の仕様にしたがってmap-to-pointなどの修正. ちゃんと動いてるのかな. テストが面倒そう.

10月19日_

『プログラミング言語Rust公式ガイド』

実践Rust入門』はマクロの説明がほとんどなかったのでこちらも購入. 紙であるとなにかと便利なので.

10月18日_

やること多し

やりたいことがいっぱいあって困るなあ. 誰か手伝ってくれないかな.

10月16日_

add(out, x, y);

Rustでaddみたいな3引数関数をどうやって扱うのだろう. &out == yxや&out == &yのとき&mutと&で困るのだけど. コピーするのはやだしな.

10月15日_

Rustのマクロ

Cより安全でC++のtemplateよりも書きやすいかも.

10月12日_

ライブラリがexit呼ぶな

もっともなので修正.

10月10日_

Devcon 3日目

Prysmatic Labsの人たちと会う. Goで使いやすいのがあるとうれしいらしい. それならすぐできるので準備しよう. 目的は達成したので疲れたし今日帰る.

10月9日_

Devcon 2日目

ごくたまに日本の人に会う. Rustバインディング実装しながら面白そうなのを聞いてみる. 英語まだ駄目だなあ. 今日も実家に泊まる.

10月8日_

Devcon 5参加

チケットを@unokovさんに頂いたので行ってみる. 新横浜から弁天町, コスモスクエア経由. 結構めんどい. ひたすら外国人. 受け付けも英語だった. すごい. 思い切ってAZTEC protocolの人に挨拶してみる. 実家に泊まる.

10月7日_

gomobile

とりあえずサンプルプログラムをAndroid端末に転送して動くところまで確認.

10月2日_

RustのFFI

呼び出しは簡単だけどバッファの使い方が難しいな.

10月1日_

mcl v1.00

とりあえず頑張ってドキュメント書いたのでv1.00にした. 次はRustバインディング用意したい.
ざっと読むには本が楽なので『実践Rust入門』を買ってみた.


御意見は光成滋生<herumi@nifty.com>までお願いします