26-Mar-2023
[nostr.ch/Nostridおぼえがき。]

nostr.chがデフォルトで使用するリレーはmain.jsに書かれている。

Nostridがデフォルトで使用するリレーはNostrid.Core/Data/RelayService.csに書かれている。自分が当時使っていたv1.18だとおそらくこの辺りのコードになるので、

とでもなるはず。過去の発言を探すとなると、iris/snortに登録している以外のリレーも参照しないといけないので、こういう記録が必要になるんですよ…。

secp256k1ライブラリのバイナリサイズ、多くの部分はprecomputed_ecmult_gen.cによるものなのですが、このテーブルサイズを規定するECMULT_GEN_PREC_BITSは2(32kB), 4(64kB), 8(512kB)以外の選択肢は基本的にないと考えた方が良さそうです。

テーブルのサイズはecmult_gen.hにあるECMULT_GEN_PREC_G(bits)とECMULT_GEN_PREC_N(bits)で規定されるのですが、この定義を使って計算するとECMULT_GEN_PREC_BITSが1でもテーブルサイズは32kB、16だとなんと64MBに膨れます。

なので、このライブラリを使う場合は(テーブルだけを使っている訳ではないので)最低でも64kBのROM容量が必須であるように思われます。55.7kg(22:00)

25-Mar-2023
[こんなん作ってみました]

nsdemu (Nostr Signing Device EMUlator)という、nostr-signing-device (NSD)の真似事をするプログラムです。面倒なのでOpenBSD以外のOSでの動作テストはしていませんが、arc4random()を使っているのでLinux上での動作は面倒なことになると思います(イマドキのglibcはarc4random()を持っているという話もあるようですが)。書いたコードの半分くらいが19-Mar-2023のbech32パーサというのは秘密。

nsdemuのREADME.mdにも書いていますが…secp256k1ライブラリが意外と大きく、小さなマイコンで実現するには別のライブラリを使わないと難しそうな気がしています。ROM 64kくらいに収めたいのが正直なところですが、AliExpressでRP2040搭載ボードが安価に売られているのを見るとこれで動かすのが良いのかもしれません。

とはいえRP2040なんて未だに触ったことがないので、開発環境その他含めてじたばた足掻くことになりそうです。56.5kg(20:35)

19-Mar-2023
[Nostrの秘密鍵(hex)をbech32形式に]

Nostrで使っている秘密鍵、実はnostr.chで作成したものをそのまま引き継いでいて、Amethystへ入力する際も必死に64桁の16進数を打ち込んでいたりするのですが…正しく入力できているかという不安もあり(※)bech32化したいと考えていました。bech32ならチェックサムが付くので、打ち間違いに気づくことができますから。

(※)秘密鍵と公開鍵は一対一対応になっているので、公開鍵のhexもしくはbech32が正しければ秘密鍵の入力は正しいと考えることは可能なんですけどね。

扱う対象が対象なだけに、web上で動く変換ツールを使うのもちょっと気が進まないのでBIP-173等を参考にちょっとしたコードを作っています。hex形式の鍵だけでなく、bech32形式の鍵も変換します(意味があるかどうかはともかく)。今回は08-Mar-2023に作成した物と異なり、OpenBSD-7.2のportsで提供される古いsecp256k1ライブラリでビルド可能です。

折角なので、秘密鍵から公開鍵を生成する機能も仕込んでいます。

一種のアカウントハッキングになってしまうことは重々承知しているのですが、簡単な作りの秘密鍵から公開鍵を作成し、Snortで覗いてみることにしました。

秘密鍵は秘密にしておくべきものなので鍵の詳細については書きませんが、「簡単な作り」である以上推測は容易でしょう。上に挙げたもの全てが実際に使われている訳ではないものの、いくつかは使われているように見えます。ここにあるような公開鍵を生成するような秘密鍵を使うのは、テスト目的であっても避けた方が良さそうだというのが個人的な結論です。

iris.toのBackup→Profile & FollowsのDownloadで得られるnostr-my-profile-and-follows.jsonを、NostrFluで処理可能な形式に変換するコードも作っているのですが…今のところ動いていても、iris.toの状況によって使えなくなる可能性もあります。56.4kg(12:10)

11-Mar-2023
[これで良いはず]

janssonのドキュメントを見るに、malloc()/free()を任意のコードに置き換えることができるようなのでこれを使って確保/解放した領域のポインタを表示するコードを仕込み、ログを取ってソートしてみました。メモリリークを結構起こしていますね…

という訳で、json_{object_set,array_append}_new()を適切に使うよう修正し、ログを見て問題ないことを確認してからデバッグ用のコードを取り払ったのがこちら。これで完成と言えそうです。

大規模なプロジェクトにおいては、ドキュメントにあるようにBoehm GCを導入しておいた方が安全なのかもしれません。json_object_set_new()とすべきところをうっかりjson_object_set()としてしまうケースは多そうな気がしますし、やらない自信は自分にはないです(既にやってしまいましたからね)。58.3kg(20:30)

10-Mar-2023
[いや、良くないみたい]

一昨日作ったコード、どうもjanssonのドキュメントを見るとJSONオブジェクト操作時に(内部的に操作される)参照カウントを適切に扱わないとメモリリークが発生するようなので…見直しが必要です。

ただ、何をすると参照カウントが増えるのかがよく分からないのでjansson.hを見ているのですが、こういうことで良いのでしょうか…?

・json_incref()を呼んでいるAPI

別のオブジェクトを構成するために一時的に作ったオブジェクトに対しては、上記の関数を実行することで参照カウントを増やしてしまってはマズいのではないかと。janssonのAPIリファレンスにあるjson_deref()の項を見るに、単にJSONのarrayへ値を突っ込むだけならjson_array_append_new(array, json_integer(42))で良いと書かれていますので、こちらに置き換える必要があるのかなと…

さらに詳細に見てみると、json_t *型の戻り値にはnew reference(新しく作成されたJSONオブジェクトへのポインタ)とborrowed reference(既にあるJSONオブジェクト内のオブジェクトを示すポインタ)の二種類があり、borrowed referenceを返すのは以下の関数のみのようです。

また、引数に指定したオブジェクトの参照を取ってしまう(reference stealing)関数は以下のものがあります。

…修正は、もう少しドキュメントを読んでから行いたいと思います。56.1kg(07:05)

08-Mar-2023
[おそらく、これで良いはず?]

Nostrプロトコルで使用する、イベントをシュノア署名で署名する、という処理を行うコードを書いてみました。secp256k1とjanssonを使って…C言語で。この時点で出ている最新のsecp256k1ライブラリ(0.2.0)がパッケージで提供されており、arc4random()が使えるという理由で、今回はFreeBSD-13.1上で作成しています。おそらくこれから出るであろうOpenBSD-7.3でも対応すると思います。

JSONのサンプルとして、検証に成功するもの(event.json)と失敗するもの(event2.json)を用意しました(失敗するものはidの一部をいじっただけです)。単にevent-sign event2.jsonとすると検証に失敗した旨が表示されますが、event-sign event2.json -とでもすると乱数で作った秘密鍵を使用して再署名するため検証に成功するようになります。

janssonによるJSONの構築法とシュノア署名の行い方はなんとなく分かったので、あとはlibwebsocketを使ってリレーサーバとの通信方法を理解すれば、何か遊べるものが作れるのでしょうか。55.9kg(21:25)

10-Mar-2023補足:10-Mar-2023にあるように、現状はメモリリークを起こすバグが入っている可能性があります。

05-Mar-2023
[OpenGD77の]

MK22搭載機(GD-77, DM-1801, etc)向けリリースがreleases/MK22/R20230304に出ているので、例によってMCUXpressoを使わずにビルドします。ビルド用のパッチはこんな感じです。

Makefile, linkerscripts/{firmware_picolibc,firmware_library_picolibc}.ld
追加
source/dmr_codec/codec_interface.c, source/hardware/SPI_Flash.c
最適化(-Os)対応
include/user_interface/uiLocalisation.h, source/user_interface/uiLocalisation.c
LANGUAGE_BUILD_ENGLISH_ONLYによる多言語対応化off(英語専用版)
include/functions/satellite.h
bool satellitePredictNextPassFromDateTimeSecs()の定義を修正

コードはすべて-Osによる最適化を行った状態でコンパイルします。newlib/picolibc共にredlibよりコードサイズが大きくなってしまうため、多言語対応は切っています。手元のDM-1801はGPS未搭載のため人工衛星関連の機能も無効化したいところですが、有効のままでも問題なさそうだったのでこの部分には手を入れていません。

なんか花粉症になってしまったみたいで、鼻がずびずびします…山に植えられているスギの木を切り倒したくなったり、燃やしたくなる気持ち、なんか分かった気がします。56.5kg(16:00)