貧民的DAppsプログラミング

ビットマップによる注文情報保持

前回の続きです。Gasを節約しつつ、オーダーブックをオンチェーンで保持する方法の解決編です。

アセンブラやC言語でプログラムを書いていた(る)人は、ビット操作というものに馴染みがあると思います。ブロックチェーンで、Gasを節約しながらできるだけ大きめのデータを扱おうとするとき、ビットマップで何とかできないかと考えると、けっこう解決できることがあります。大きめのデータを圧縮した形にしたり、複数回の操作を1回にまとめられたりします。

このやり方は、オーダーブックで扱う価格に制限をかけることで実現できます。

  • 価格の範囲を 0.000001 ~ 1000000(106~10-6)に制限する
  • 有効数字3桁とする

株のことはよく知らないんですが、こういう制限をしても問題にはならないようです。

この制限によって、とりえる価格が 10800 種類に制限されます。これを、10800ビットのビットマップで表現します。”1″のビットはその価格で注文があり、”0″のビットは注文がない価格です。

オーダーブックのビットマップ

とりえる価格を制限したオーダーブックを、ビットマップで表現した図(出典:https://ubitok.io/2017-08-24-maintain-order-book-blockchain-bitmap/

最小の価格が一番左の0.000000100、最大の価格が一番右の999000、中間付近に1.23があるということですね。有効数字3桁に制限されているので、997000、998000、999000という並びになるんだと思います。有効数字とか懐かしい・・・。最小価格も同じでしょう。

Solidityで実装するなら、uint256の43要素の配列を使えばよいわけです(10800 / 256 = 42.1875)

ヤック・デカルチャー・・・(最近マクロスFにハマっています)

ビットマップを使うことまでは、いつも最初に思い浮かびはしますが、株の価格をこんな形で保持する発想は、Web屋の脳のままでは難しいでしょう。作ろうとしているシステムで受け入れられる制限を考えて、ビットマップに落とし込む方法を考えるのは、なんだか楽しそうです。(雑誌のアセンブラコードを読んで悦に入っていただけの)昔を思い出します(笑)。

ビットマップオーダーブックから注文を検索するSolidityコードについては、次の上のURL下部にアイディア部分だけ示したものが、下のURLに全体が掲載されています。

https://ubitok.io/2017-08-24-maintain-order-book-blockchain-bitmap/

https://github.com/bonnag/ubitok-contracts/blob/master/contracts/BookERC20EthV1.sol

富豪的プログラミングがどうこうと、2000年代にいわれてました。ブロックチェーンプログラミングでは、けっこうチマチマと節約しながらプログラムするシーンが戻ってきたようです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です