ビットコイン・インスティテュート

もっと細かい単位が必要――小数点を動かす

6件のメッセージ BitcoinTalk goblin, マイク・ハーン, ribuck, ギャビン・アンドレセン, ハル・フィニー, jon_smark 2011年2月10日 — 2011年2月11日
goblin 2011年2月10日13:27 UTC

こんにちは。

最近の値上がりで、1ビットセントがアメリカの通貨のいちばん小さな単位、つまり1セントより高くなった。ほかの通貨では、しばらく前からそうなっている。

今こそ、ビットコインをもっと細かく分けられるようにするときだと思う。つまり小数点を右へ一桁動かすか、それに近いことをする。

ついでにトランザクション手数料も下げられる。たとえば大きすぎるトランザクションなら0.001ビットコインにする。ただ、スパムのおそれがあるので、あまりいい考えではないかもしれない。0.001未満のトランザクションには0.001、大きすぎるトランザクションには0.005くらいを取るのはどうだろう?

そうすれば、現実の通貨の額をもっといろいろ表せるようになる。

「とにかく小数点を動かそう」と言うのは簡単だ。でもビットコインのこの部分は珍しく、サトシが前もって考え抜いていない。本人がいない以上、いい計画を出すのは私たちの役目なんだろう。

どういうことか。要するに、小数点をどこに置くかについて、全体の合意が要るということだ。動かす人と動かさない人がいれば、値段も支払いもひどく紛らわしくなり、取引しにくくなる。

ビットコインは、物事について全体の合意を作るのがもともと得意だ。そこで、こんな計画はどうだろう。

  1. bitcoindに、「getNanosPerCoin」のような名前の新しいRPCを足す。私たちが「ビットコイン」と呼んでいる、決まりごとでしかない単位が、何ナノコインでできているかを返すものだ。

  2. マイニングする人は誰でも、自分のビットコインに、小数点はここに置くべきだと思う位置を設定できる。このデータはコインベーストランザクションに埋め込める。コードをよく確かめる必要はあるが、コインベースのtxの末尾に余分なデータを詰めても、クライアントは文句を言わず、ブロックを拒否もしないと思う。普通に新しいフィールドを足すとバージョン番号を上げることになり、それは難しそうだ。だから、coinbase.in[0].scriptSigの末尾に何かを足し始めるなら、プロトコルバッファーか、バージョン管理を組み込んだ別のバイナリのデータ構造にしたらいいと思う。そうしておかないと、あとでもう一度やりたくなったときに苦労するかもしれない。

  3. 2週間ごとの調整期間の終わりに、クライアントは過去にさかのぼって、ネットワーク全体の票から新しいnanosPerCoinを計算する。ネットワークの80%超が新しいnanosPerCoinの値に賛成していれば、ビットコインのクライアントはそれを受け入れ、RPCで返し始める。

  4. 「X.Y BTC」の形の文字列を表示している既存のソフトは、今のnanosPerCoinの値をどこかのサーバーから取ってくるように変える必要がある。これを簡単にするために、JSON RPCのポートで、認証のないHTTPの要求を受けられるようにしてもいい。たとえば

http://server:1234/renderAmount?nanocoins=15000000,300000&style=unicode

に対して、「Ⓑ15.00\nⒷ0.03」のような整った文字列を、text/plainのUTF-8の応答で返す。このHTTPの呼び出しは、たいていの言語でライブラリの関数に包めるので、ビットコインの額を表示するのはそれほど難しくない。bitcoin.org経由で公開すれば、ウェブサイトはこう書くだけでいい。

<script src="http://www.bitcoin.org/render-amounts.js"></script>

This will cost you <script>bitcoin.render(15000000)</script>

すると、合意どおりの額が表示される。「本当の値段」をナノコインで書くのが不便すぎるなら、ふつうの額と日時で値段を書くこともできる。

This will cost you <script>bitcoin.render(1.50, "2011-02-10 17:00:00 UTC")</script>

こうしておけば、小数点が動いたとき、これは自動でⒷ15.00と表示される。

ribuck 2011年2月10日16:53 UTC · 解説

文字どおり小数点を動かすのは論外だし、goblinも文字どおりの意味で言ったのではない。

できることは二つある。(a) いまある精度を、ユーザーインターフェースでもっと見せる。(b) 呼び方と書き方について合意できるかを探る。

書き方は以前にも話し合ったが、はっきりした結論は出なかったようだ。まだ誰も出していない別の書き方を提案したい。

こうしてはどうだろう。

1ビットコイン=100ビットセント
1ビットセント=1,000ミリセント
1ビットセント=100万マイクロセント

ビットコインではなくビットセントを分けていけば、いちばん小さなかけら、つまり1ビットコインの1億分の1にも、うまく名前が付く。

こうした小さな単位には、いずれ愛称が生まれるに違いない。愛称の候補なら、「austrian」と「satoshi」がいいと思う。

いくらなんでも、いろんな論点がごちゃまぜになりすぎだ……。そもそも「小数点を動かす」なんて言い方をして、悪かった。

次のビットコインの版では、こうするべきだと思う。

  • GUIでビットコインを全桁表示する。1.5 BTC持っていれば、今と同じように表示する(「1.50」)。
    1.50001 BTC持っていれば、その細かい桁も表示する。

  • GUIからもJSONからも、全桁で送れるようにする。1.500001 BTC持っていれば、それだけ持っていると見えて、それだけ送れる。

  • 「ちりのようなお釣り」をなるべく失わないように、luke-jrのパッチを取り込む(たとえば1.5000001 BTCと20 BTCのトランザクションを受け取っていて1.5を送るなら、1.5000001のインプットだけを選ぶべきではない)。

こうした論点が出てくるのは、プールでのマイニングのせいだ。プールのシェアから、1セント未満のビットコインを受け取る人がたくさんいる。

それとは別に、「手数料を払わされるマイクロトランザクションとは何か」という論点がある。今は、0.01 BTC未満のアウトプットを持つトランザクションがそれに当たる。

さらに、「最低手数料はいくらか」という論点がある(今は同じく0.01 BTC)。

理想を言えば、トランザクション手数料は現実の費用を映すべきだ……。ただ、ビットコインを動かしている全員に薄く広がる見えない費用にしておくだけでも、十分うまくいくかもしれない。それでも、1件のトランザクションの現実の費用がおおよそいくらなのかは知りたい。

「靴下1足に0.001ビットコイン払う」心配をするのは、まだ早い。

ハル・フィニー(Hal) 2011年2月10日18:53 UTC

いい考えがたくさん出ているね!

UIで全桁を表示して、支払いでも使えるようにするギャビンの案はいいと思う。

ribuckの呼び方もいい。1ビットコインが100ビットセント、1ビットセントが1000ミリセント、1ミリセントが1000マイクロセント。

マイナーが費用や方針の情報を記録できるようにして、その情報からネットワークの動きを調整する、というマイクの提案もいい。使い道としては、とくに「スパム対策」の上限をそろえるのに使ったらいいと思う。大きなトランザクションの手数料と、手数料なしのトランザクションの、0.01という最低額のことだ。ビットコインには、こうした値を調整する方法がどう見ても要る。マイクの提案は、その有力な候補だと思うんだ。

それから、スパム対策の決まりは、どれか一つのアウトプットが小さいときではなく、いちばん大きなアウトプットが小さいときに働くように変えたほうがいいんじゃないかな。ギャビンの例なら、1.5と0.000001のお釣りのアウトプットは、問題ないと思う。

jon_smark 2011年2月11日19:12 UTC
ribuckの投稿(2011年2月10日16:53 UTC)

こうしてはどうだろう。

1ビットコイン=100ビットセント
1ビットセント=1,000ミリセント
1ビットセント=100万マイクロセント

ビットコインではなくビットセントを分けていけば、いちばん小さなかけら、つまり1ビットコインの1億分の1にも、うまく名前が付く。

こうした小さな単位には、いずれ愛称が生まれるに違いない。愛称の候補なら、「austrian」と「satoshi」がいいと思う。

面白い案だが、一つ強く反対する理由がある。3桁ずつの刻み(1ビットセント=10^3ミリセント=10^6マイクロセント)と2桁の刻み(1ビットコイン=100ビットセント)を混ぜると、いずれ混乱するのはほぼ間違いない。それに、セントにこだわるのは、今のビットコインのGUIが既定で小数2桁を表示していることから来た、おおむね偶然の産物だ。将来の版が既定を小数3桁に変えれば(賢い変更だと思う)、このセントへのこだわりは消える。

いちばん小さな額からいちばん大きな額まで、同じ桁の刻みで上がっていく尺度を選ぶべきだ。そしてその刻みは3桁にすべきだ。人がいちばん慣れているのがそれだからだ。とはいえ、ミリコインやマイクロコインと言い続けるのは面倒になりそうなので、倍の単位と分けた単位に愛称を付けるのはいい考えだ。「Satoshi」がいい候補だというのには賛成だが、「Austrian」には反対させてもらう……:-)

私の案はこうだ。

1 satoshi = 1000 BTC
1 BTC = 1000 koishi(「koishi」は日本語で小石)
1 koishi = 1000 suna(「suna」は日本語で砂)