用語集 / 開発者向けリファレンス
PP amount
- PP amountとは?
- PP amountは、BIP70のアウトプット内にあったサトシ単位のフィールドで、支払者に送金額を選ばせたい加盟店がゼロに設定するものでした。
BIP-70で規定されています。
支払いのバグは単位から生まれます。BIP70のamountはサトシを数える64ビットの整数でしたが、BIP21 URIのamountパラメーターはビットコインの小数値です。そのため同じ支払いが、前者では250000、後者では0.0025と書かれます。システム間で資金を移す人は、合計額を信用する前に、そのフィールドがどの単位を想定しているかを確認する必要があります。
仕組み
ステータス:歴史的。このフィールドはBIP70に属していましたが、Bitcoin Coreが0.19で非推奨とし、2020年6月3日に0.20.0で削除しました。
PaymentDetailsメッセージ内のOutputは2つのフィールドで構成されていました。資金の行き先を示すscriptと、金額を示すamountです。
amountはサトシを表す符号なしの64ビット整数で、デフォルトはゼロでしたが、このゼロには特定の意味がありました。何も支払わないという意味ではありません。加盟店が金額を示さず、ウォレットが顧客に尋ねるべきだという意味で、寄付ページはこの仕組みで動いていました。
1つのリクエストに複数のアウトプットが含まれることがあり、それぞれに独自のamountが付き、支払うウォレットはそれらすべてを1つのトランザクションで満たす必要がありました。これは見た目以上に有用です。加盟店は売上の一部を直接コールドストレージへ、一部を返金用のホットウォレットへ、一部をアフィリエイトへ振り分けられます。顧客が3回支払うことも、振り分けの存在を知ることもありません。
範囲が制約になったことはありません。64ビットの符号なし整数の上限は18,446,744,073,709,551,615サトシで、これは将来存在する2,100,000,000,000,000サトシのおよそ8,800倍です。興味深い境界はもう一方の端にありました。ダスト閾値を下回るamountは、ネットワークが中継しないアウトプットを生成し、Bitcoin Coreの方針ではその閾値は従来型のpay-to-public-key-hashアウトプットで546サトシ、単一鍵のsegwitアウトプットで294とされています。
どこで見られるか
現在、BIP70のamountフィールドを実装しているものはありませんが、その背後にある単位の混同は十分に生き続けています。
仕様が3つ、単位も3つです。BIP21 URIはビットコインで表します。BIP70はサトシで表していました。ライトニングネットワークのBOLT11インボイスはさらに細かく、ミリサトシ、つまり1サトシの1000分の1で表します。ウォレットの画面には表示設定も加わるため、同じ残高が、一度設定して忘れた好みに応じて0.00250000とも250,000とも表示されます。
これを間違える実際のコストは本物の資金です。手数料の見積もりはサトシ/仮想バイトで届くため、入力1つ、出力2つのsegwit支出が約141 vbytesなら、5 sat/vBで705サトシかかります。その数値をビットコインとして読めば、日常的なトランザクションがほとんどの人が1年に支払う手数料より高くつくと思うでしょう。
2つの習慣で解決します。ウォレット設定で単位を1つ選び、そのままにしておけば、期待する桁数が変わることはありません。そして、出金画面では数値より先に単位のラベルを読んでください。取引所の最低額、ネットワーク手数料、残高は、同じページ上でも異なる単位で示されることがよくあるからです。
PP amount vs Bitcoin URIのamount
BIP70のamountはサトシの整数で、BIP21のamountはビットコインの小数で、両者の倍率は100,000,000です。違いはこれだけですが、それだけで十分に重要です。ある形式で0.0025を保持するフィールドは、別の形式では250000を保持し、変換せずに両者を行き来するソフトウェアは、どちらに傾いても8桁の桁違いの誤りを生みます。現代の形式が勝ったため、今日支払いリンクで目にする数値は、何かが明示的にサトシと示さない限りビットコインです。