[予告] Dispenser の挙動を変えます。
非公式情報。まだ XMPIP は書いていません。コード修正先行の定常運転。
Ⓜ
Dispenser を使いやすくするための Counterblock API を生やそうとしていたのですが、検討すればするほど「Dispenser 周りだけ Counterparty API や内部 DB の作りが宜しくない」感が強くなってきました。
ただし、ウォレット開発運用勢に余計な負荷を掛けないよう、互換性は可能な限り取ります。以下は、変更点概要。
Ⓜ
まず、refill の廃止。同じアドレスに同じアセット(例えば XMP)の Dispenser を2回以上オープンしたとき、以前の残高を新しいコントラクトに継ぎ足してくれるという機能(refill)があります。便利なようでいて、残高の推移が DB から掴みづらくなる欠点があります。また、データがコントラクトに閉じなくなるので、設計として美しくありません。
変更後は、同じアドレス同じアセットの Dispenser を複数置けるようになります。
つまり、refill してくれると思って 1MONA→1000XMP を販売しているアドレスに 1MONA→1000XMP の Dispenser を置くと 1MONA→(1000+1000 == 2000)XMP の販売となり、損するようになります。
一方で、1MONA→1000XMP と 10MONA→100XMP の2種類の Dispenser を同じアドレスにおけるようになります。この例では 10MONA→((1000*10)+(100*1) == 10100)XMP です。このような大口購入者へのインセンティブを与えるには複数のアセットが必要でしたが、その制限が撤廃されます。
refill と同等のことをしたければ、一旦 close してから再度 open すれば叶います。
Ⓜ
次に Cancel メッセージが Dispenser をサポートします。これは、普通にモナパーティを使っている限りは気にならない、深い部分の話なのですが。たぶんウォレットを作っている人には少し影響があります。
Dispenser もモナパーティの組み込みコントラクトなので、識別は tx_hash で行えます。ならばコントラクトの取り下げは Cancel メッセージを経由するのが Counterparty の流儀に沿っています。現状のような close status を create するのは美しくありません。
しかし、create_dispenser API に破壊的変更を加えると既存のウォレットが軒並み動かなくなります。そこで、close status での create が飛んできた場合には、送信元アドレスが販売中で指定したアセットを販売中のすべての Dispenser を cancel (close) する挙動とします。これで完全ではないにせよ、後方互換性は保てるはずです。
Ⓜ
これらの変更は、次回のリリーストレインに含まれます。有効になるブロック以前に作成された Dispenser での販売では、有効になった後も、以前と同じ挙動を示します。ウォレット経由でモナパーティを利用なさっている方は、すぐに何かをする必要があるわけでもないです。