NanoWalletの2.1.2がリリースされ、オフライントランザクションの作成と送信機能が実装されていました。

(キャプチャは翻訳されていますが、これは私の作業中の画面であり、翻訳は記事執筆時にはまだマージもリリースされていません)

オフライントランザクションの準備

上部のメニューより画面を開きます。見た目は通常の送信と同じですね。

nanowallet-offlinetx-01

それぞれを埋めてパスワードをいれたら、「作成」ボタンを押すと、右側のフィールドに署名済みJSONトランザクションが生成されます。

フィールドの右にあるボタンで、クリップボードにコピーとQRコードで表示するのを切り替えられます。

これが署名済みトランザクションです。

オフライントランザクションの送信

そうして生成した署名済みトランザクションを送信するには、リリースモジュールの画面を開きます。

nanowallet-offlinetx-02

署名済みトランザクションがメインネットのものかテストネットのものかを選んで、ノードを選びます。

ここに先程のトランザクションを貼り付けて「送信」ボタンで送信できます。

パスワードは必要ありません。署名済みだからです。

原状、QRコードによる送信はこのモジュールではできないみたいですね。

そのうちQRコードをドロップしたら読み込むとか、別途モバイルウォレットにも実装されるんでしょう。

もしくは、簡単に実装できる(QRコードをjsで解析して中身を読むライブラリがあったような)気がするのでブロードキャスターを作ってみてもいいかもです。

nem-rubyにも一応オフライントランザクションのサンプルがあります。

やっていることは同じです。一度署名済みJSONオブジェクトを作り、別のタイミングで送信するだけです。

オフライントランザクションのデータ

実のところ、オフライントランザクションは通常のトランザクションの送信の過程を途中で中断しただけの仕組みです。

  1. 送信するxemの量や宛先などの情報をもたせた構造を作る
  2. その構造をシリアライズ(データを16進数で表現)する
  3. シリアライズしたデータに対して秘密鍵で署名をする
  4. データに署名を添付して、NISへ送信する

おおまかこのような過程が送信時には行われますが、3までを実行するのがオフライントランザクションの準備、4を実行するのがオフライントランザクションの送信ということになります。

生成された署名済みのトランザクションはシリアライズされたdata部分の送信xem量や宛先を改ざんしても、署名によって確認されるため、送信しても不正なトランザクションとして受けつけてもらえません。

3の時点で署名が終わり、後はNISに送信するだけなので、送信時にはパスワードが必要なく、誰が送信してもよいという状態になります。

デシリアライズ

こうしてシリアライズされたデータはデコードすることで中身をみることができます。

nem-rubyでも愚直ですがデシリアライズを実装していますので、暇があればデコードを試してみると仕組みがより理解できるかもしれません。

用途

いまのところあんまりおもしろい用途が思いついてません。

小切手…的な?

原状のNanoWalletだと、TimeStampとDeadlineが実行時時点とそこから24時間で固定されているため、作ったオフライントランザクションは24時間以内に有効という使い方しかできません。

しかしプログラムを書けばそれぞれを任意に設定できるので、例えば任意の時刻を過ぎないと送信できないトランザクションというのを作ることはできます。

これで予め支払いの量と時刻を固定した小切手を受取側に渡して、契約が履行されたら受取側でも支払主でもいいのでトランザクションをリリースするとかという使い方ができそうですね。

ただし資金を拘束できるわけではないので、支払主が資金を移動できてしまいますのであまり実用的ではないですが。

まぁそのうち誰かが何かおもしろいアイディアを実現してくれるといいですね。(雑な締め