wei、gwei、ether:本番で単位を正しく扱う
crypto backendで最も頻繁なバグは単位の誤りだ——weiをetherとして表示する、あるいはもっと悪いことに、そのまま送金する。修正は退屈だが絶対的だ:オンチェーンの金額に浮動小数点を決して使わず、常にある数値がどの単位なのかを把握しておくこと。
階梯
etherは18 decimalsを持つ。1 ether = 10^9 gwei = 10^18 wei。gwei(10^9 wei)はgas価格が提示される単位であり、weiはあらゆるRPC値が表される基本単位だ。Bitcoinの相当物はsatoshi(10^-8 BTC)、TRONのはsun(10^-6 TRX)、TONのはnanoton(10^-9 TON)だ。すべてのチェーンには基本の整数単位がある——その単位で作業せよ。
なぜfloatは壊れるのか
IEEE-754のdoubleは53ビットの仮数部を持ち、おおよそ15〜16桁の有効十進数字に相当する。wei値は19桁以上になりうるため、それをJavaScriptのnumberにパースした瞬間に精度を失う——静かに。丸め誤差は相対的には微小だが、ledgerにおいては壊滅的だ。ネイティブのBigInt、あるいはbig-decimalライブラリを端から端まで使え。
変換は端でのみ行う
システム内のあらゆる場所——ストレージ、算術、比較——で金額を基本単位の整数として保持せよ。表示の境界でのみ人間が読める十進文字列に変換し、入力の入り口ではユーザー入力を即座に基本単位へパースし戻す。もしその2つの端の間でfloatが金額に一度でも触れたら、それをバグとして扱え。
よくある質問
少額であればJavaScriptのnumberを使っても安全か?
いいえ——線引きはサイズではなく型で行え。いずれかのコードパスが金額にfloatを使えば、いつか大きな値がそこを流れる。大きさに関わらず、すべてのオンチェーン金額にBigIntを使え。
ライブラリなしでwei値をetherとして表示するには?
整数部は整数/BigInt演算で10^18で割り、余りを小数部の桁として整形せよ——決して浮動小数点除算を経由してはならない。当社の単位変換ツールはまさにこれを行っている。
関連記事
チャージして、キーを取得し、リリース。
セルフサーブ。暗号資産またはカードで支払い。クレジットで従量課金——重いプリミティブは高く、単純なものは安価。
APIキーを取得