憂鬱な午後のひととき
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だけおかしいのかもしれない(以前も何度かそういうのがあった. しばらくしてコンパイラのバージョンが上がったら落ちなくなった).
これ以上は調べる気がないので一時停止.
-Wl,-no-as-needed -ldl
VTuneでJIT APIがうまく動かない件, Intelの人からコメントをもらった.
CentOSだとちゃんと動く. Ubuntuのリンカオプションのデフォルト挙動が違うかららしい.
上記オプションをつけると動くことを確認した.
でも忘れて動かないよりは強制的にdlopenを呼ぶ方が気が楽かな.
要望
最近いろんな人からTwitterやらメールやらGitHubで要望がくるので対応が大変.
どうしたもんか.
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()の挙動が何か変わったの?
マルチペアリング
集約署名の実装で今までmillerLoopをぐるぐる回していたのをマルチ版のmillerLoopVecを使うように変更したら1.2倍ぐらい速くなった.
WebAssemblyとかでも使うことを考えて途中でmallocを避けるために固定長バッファを回さないといけないのが面倒.
でも, もっと早くにやっとけばよかった.
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倍が不要になる.
実装したらうまくいってるっぽい.
テストpass
動かない原因が分かった.
map-to-functionでeth2に書かれているのと異なるcofactorを使っていたせいだった.
楕円の点からG2の元に入れるためのcofactor倍はとても重たい処理なので避けたいのだが,
定数を変えるのは難しいだろうなあ. でもpassしたので一段落. うれしい.
とりあえずissueを立てて聞いてみる.
Fp2のserialize
Fp2の元 x + yiのxとyのどちらの元を先にserializeするか間違えていた.
あと参照しているテストコードがlittle endianをいいつつbig endianを渡していたりして混乱に拍車をかける.
try-and-incremental
eth2のmap-to-point関数はx座標を1増やしながら対応するyが存在するまで探す方法.
G2の元なので±yのどちらを選ぶかのところの仕様をちゃんと実装する.
serialize
G1, G2, Fr, Fpのserialize/deserializeはちゃんと動いてる模様.
するとmap-to-functionかあ.
eth2対応
eth2の仕様にしたがってmap-to-pointなどの修正.
ちゃんと動いてるのかな.
テストが面倒そう.
『プログラミング言語Rust公式ガイド』
『
実践Rust入門』はマクロの説明がほとんどなかったのでこちらも購入.
紙であるとなにかと便利なので.
やること多し
やりたいことがいっぱいあって困るなあ.
誰か手伝ってくれないかな.
add(out, x, y);
Rustでaddみたいな3引数関数をどうやって扱うのだろう.
&out == yxや&out == &yのとき&mutと&で困るのだけど.
コピーするのはやだしな.
Rustのマクロ
Cより安全でC++のtemplateよりも書きやすいかも.
Devcon 3日目
Prysmatic Labsの人たちと会う. Goで使いやすいのがあるとうれしいらしい.
それならすぐできるので準備しよう.
目的は達成したので疲れたし今日帰る.
Devcon 2日目
ごくたまに日本の人に会う. Rustバインディング実装しながら面白そうなのを聞いてみる.
英語まだ駄目だなあ.
今日も実家に泊まる.
Devcon 5参加
チケットを@unokovさんに頂いたので行ってみる.
新横浜から弁天町, コスモスクエア経由. 結構めんどい.
ひたすら外国人. 受け付けも英語だった. すごい. 思い切ってAZTEC protocolの人に挨拶してみる.
実家に泊まる.
gomobile
とりあえずサンプルプログラムをAndroid端末に転送して動くところまで確認.
RustのFFI
呼び出しは簡単だけどバッファの使い方が難しいな.
mcl v1.00
とりあえず頑張ってドキュメント書いたのでv1.00にした.
次はRustバインディング用意したい.
ざっと読むには本が楽なので『実践Rust入門』を買ってみた.
昔
御意見は光成滋生<herumi@nifty.com>までお願いします